GLM-4是智谱AI在2024年推出的新一代基座大语言模型,该模型在整体性能上相比上一代有显著提升,接近GPT-4的水平。
GLM-4具有多项先进特性,包括更强的多模态处理能力、支持更长上下文输入(最长可达128k)等,展示了国产大模型在技术和创新应用方面的最新进展。
微调(Fine-tuning)是自然语言处理领域常用的一种技术,通过在预训练模型的基础上,使用特定领域的数据集对其进行进一步训练,使得模型能够适应特定任务的需求,从而提高模型在该任务上的表现。
对于GLM-4这样的大型语言模型而言,微调尤为重要,因为它允许模型在保留广泛知识和语言理解能力的同时,学习针对特定场景或行业的专业语言习惯、术语和要求。
在实践层面,GLM-4提供了如LoRA、sift等微调方法,这是一种轻量级的微调技术,能够在不显著增加模型参数量的前提下,有效地调整模型权重以适应下游任务。
一、swift微调
1、原理:swift微调是一种针对大型预训练模型的微调技术,它旨在提高模型在特定下游任务上的性能。Swift微调的核心原理是利用少量的可训练参数来调整模型,以适应新任务,而不是对整个模型进行完整的微调。同时swift是魔搭社区的大模型训练框架,github项目地址:https://github.com/modelscope/swift。
2、环境安装
git clone https://github.com/modelscope/swift.git
cd swift
pip install -e '.[llm]'
3、下载glm-4模型:
这里主要以glm-4-9b-chat和glm-4-9b-chat为例。
(1)GLM-4-9B-Chat模型下载命令:
git clone https://www.modelscope.cn/ZhipuAI/glm-4-9b-chat.git
(2)GLM-4V-9B模型下载命令:
git clone https://www.modelscope.cn/ZhipuAI/glm-4-9b-chat.git
4、自定义数据集:
swift支持支持直接命令行传参、添加数据集到dataset_info.json、注册数据集等三种自定义数据集的方法,这里主要介绍直接命令行传参的方式。
(1)直接命令行传参的方式。
用户可以通过命令行参数--dataset灵活指定数据来源,可接受dataset_id或dataset_path。
其中,dataset_id用于引用已注册的数据集,默认访问'default'子集,并设定split为'train'模式。
如果数据集已注册,将沿用注册时的配置,包括子集、分割方式和预处理函数。
dataset_path接受相对或绝对路径指向本地数据文件,为数据集的自托管提供了便利。
允许混合使用数据集ID和路径,并为每个数据源指定采样数量。
例如,可以同时从某个dataset_name的默认子集中抽取20000条记录,从另一个已注册dataset_id的特定子集(subset1和subset2)各抽取20000条,或者从本地路径指定的文件中抽取10000条数据。
脚本兼容五种数据集格式,并特别指出支持csv、json、jsonl等文件类型。这覆盖了常见的数据交换格式,便于用户直接利用现有数据资源。
数据格式样例如下:
(a)预训练数据样例
预训练数据通常关注于独立的响应或文本块,用于学习语言的一般规律。下面的样例去除了不一致的格式,并统一为JSON对象列表,每个对象包含一个明确的响应字段。
[
{"response": "11111"},
{"response": "aaaaa"},
{"response": "AAAAA"}
]
(b)单轮对话数据样例
单轮对话数据格式应当清晰地划分系统提示(如果存在)、查询和响应。所有行应遵循同一结构,以保持数据一致性。这里,我们统一采用JSON格式,并确保每条记录都包含“system”、“query”和“response”字段。
[
{"system": "00000", "query": "11111", "response": "22222"},
{"system": "00001", "query": "aaaaa", "response": "bbbbb"},
{"system": "00002", "query": "AAAAA", "response": "BBBBB"}
]
(c)多轮对话数据样例
多轮对话数据不仅包含查询和响应,还包括历史对话记录(history)。历史记录应明确表示为一系列的问答对。这里,我们将所有记录统一为JSON对象列表,并确保历史记录的格式正确无误。
[
{
"system": "00000",
"query": "55555",
"response": "66666",
"history": []
},
{
"query": "eeeee",
"response": "fffff",
"history": []
},
{
"query": "EEEEE",
"response": "FFFFF",
"history": [
["AAAAA", "BBBBB"],
["CCCCC", "DDDDD"]
]
}
]
(2)添加数据集到dataset_info.json中。
相较于直接通过命令行指定数据集,此方法允许用户对数据集应用更细致的配置,特别是能够指定两种预处理器(RenameColumnsPreprocessor与ConversationsPreprocessor)及它们的参数。
默认情况下,会使用智能预处理器SmartPreprocessor来优化数据处理流程。
尽管第二种方法在操作上可能略显复杂,但它通过允许用户深度定制数据集处理逻辑、灵活选择预处理器及参数,并支持内外部dataset_info.json的灵活运用,极大地增强了数据集管理的灵活性和项目的可扩展性。
(3)注册数据集的方式。
第三种方法通过允许用户自定义预处理函数并在代码层面进行深度集成或利用外部脚本扩展,实现了前所未有的数据集处理灵活性。
尽管这可能需要更多的开发工作,但对于追求极致定制化和功能拓展的项目来说,这是一种极为有力的工具。
5、swift微调指令:
对于glm4v-9b-chat模型进行微调的指令如下:
CUDA_VISIBLE_DEVICES=0 swift sft \
--model_type glm4v-9b-chat \
--dataset my_dataset \
#DDP
NPROC_PER_NODE=2 \
CUDA_VISIBLE_DEVICES=0,1 swift sft \
--model_type glm4v-9b-chat \
--dataset my_dataset \
--ddp_find_unused_parameters true \
7、swift微调后模型推理验证:
下面以第一张显卡推理为例:
(1)直接推理:
CUDA_VISIBLE_DEVICES=0 swift infer \
--ckpt_dir glm4v-9b-chat/swift/checkpoint \
--load_dataset_config true \
(2)merge-lora并推理:
CUDA_VISIBLE_DEVICES=0 swift export \
--ckpt_dir glm4v-9b-chat/swift/checkpoint \
--merge_lora true
CUDA_VISIBLE_DEVICES=0 swift infer \
--ckpt_dir glm4v-9b-chat/swift/checkpoint-merged \
--load_dataset_config true
二、lora微调
未完......
更多详细的欢迎关注:杰哥新技术
标签:glm,--,模型,9b,dataset,最强,swift,response,经验总结 From: https://blog.csdn.net/m0_71062934/article/details/139689660