LLaMA-Factory是大模型微调框架,内部集成了多种微调方法,可以直接调用。
具体做法可以从官方github上找到:https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md
安装依赖
- git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
- cd LLaMA-Factory
- pip install -e ".[torch,metrics]"
复制代码 碰到包辩论时,可使用 pip install --no-deps -e . 解决。
使用ModelScope下载模型
设置环境变量:
- export USE_MODELSCOPE_HUB=1 # Windows 使用 `set USE_MODELSCOPE_HUB=1`
复制代码 更改yaml文件
↓这是github上的一段形貌,我们更改其中yaml的内容可以快速切换模型和参数。

将github中的examples/train_lora/llama3_lora_sft.yaml修改一下,得到qwen_14b_lora_sft.yaml
- ### model
- model_name_or_path: qwen/Qwen1.5-14B-Chat # 指定了要使用的模型或模型路径
- ### method
- stage: sft # 微调阶段,sft通常表示有监督微调
- do_train: true # 指定是否进行训练
- finetuning_type: lora # 微调类型,LoRA
- lora_target: all # LoRA 的目标层,'all'表示应用于所有层
- ### dataset
- dataset: novel_zh # 数据集名称,可以是逗号分隔的多个数据集
- template: qwen # 模板名称,用于指定模型或预处理模板
- cutoff_len: 1024 # 截断长度,通常用于限制序列的最大长度
- max_samples: 1000 # 最大样本数量,指定要处理的样本的最大数量
- overwrite_cache: true # 是否覆盖缓存,设为true表示每次运行都会重新处理数据
- preprocessing_num_workers: 16 # 预处理的并行工作线程数,指定同时进行预处理的线程数量
- ### output
- output_dir: saves/qwen1.5-14b-chat/lora/sft # 输出目录,保存微调后的模型和其他文件
- logging_steps: 10 # 记录日志的步骤间隔
- save_steps: 500 # 保存模型的步骤间隔
- plot_loss: true # 是否绘制损失曲线
- overwrite_output_dir: true # 是否覆盖输出目录
- ### train
- per_device_train_batch_size: 1 # 每个设备上的训练批量大小
- gradient_accumulation_steps: 8 # 梯度累积步骤数,梯度会在这些步骤后更新
- learning_rate: 1.0e-4 # 学习率
- num_train_epochs: 3.0 # 训练的总轮数
- lr_scheduler_type: cosine # 学习率调度器类型,余弦退火
- warmup_ratio: 0.1 # 预热比例
- bf16: true # 是否使用 bfloat16 精度
- ddp_timeout: 180000000 # DDP(Distributed Data Parallel)超时时间
- ### eval
- val_size: 0.1 # 验证集的比例
- per_device_eval_batch_size: 1 # 每个设备上的验证批量大小
- eval_strategy: steps # 评估策略,这里选择在特定步骤进行评估
- eval_steps: 500 # 每隔多少步骤进行一次评估
复制代码 留意:YAML 不允许使用制表符作为缩进或在其他地方。确保所有缩进都使用空格,而不是制表符。
model_name_or_path
在modelscope上搜索想要的模型。
template
最右边那一列找模型对应的template
对于所有“基座”(Base)模型,template 参数可以是 default, alpaca, vicuna 等任意值。但“对话”(Instruct/Chat)模型请务必使用对应的模板。
请务必在训练和推理时接纳完全一致的模板。
base/instruct/chat的区别是什么?
Base 模型:通用的基础语言模型,未经特定使命微调。
Instruct 模型:在基础模型上进一步微调,以便更好地理解和实行指令。训练数据集包含明确指令和使命形貌。
Chat 模型:专门针对对话和聊天场景进行优化,能够天生自然的多轮对话。这类模型使用大量的对话数据进行训练,以增强其在多轮对话中的表现。
stage 和 finetuning_type
https://github.com/hiyouga/LLaMA-Factory/blob/main/examples/README_zh.md
这里做的是:用lora做指令监督微调
dataset
使用自界说数据集时,请更新 data/dataset_info.json 文件。
本地文件就在其中加入:
- "identity": {
- "file_name": "identity.json"
- },
- "alpaca_en_demo": {
- "file_name": "alpaca_en_demo.json"
- },
- "novel_zh" : {
- "file_name": "novel_zh.json"
- },
复制代码 仅支持 alpaca 格式和 sharegpt 格式的数据集。具体的计划方式详见https://github.com/hiyouga/LLaMA-Factory/blob/main/data/README_zh.md,这里只形貌指令微调数据集的构建方式。
alpaca格式
这是alpaca_zh_demo.json
也就是将数据写成这种情势:
- [
- {
- "instruction": "人类指令(必填)",
- "input": "人类输入(选填)",
- "output": "模型回答(必填)",
- "system": "系统提示词(选填)",
- "history": [
- ["第一轮指令(选填)", "第一轮回答(选填)"],
- ["第二轮指令(选填)", "第二轮回答(选填)"]
- ]
- }
- ]
复制代码 sharegpt格式
这是glaive_toolcall_zh_demo.json
它支持更多的角色种类,留意其中 human 和 observation 必须出现在奇数位置,gpt 和 function 必须出现在偶数位置。
- [
- {
- "conversations": [
- {
- "from": "human",
- "value": "人类指令"
- },
- {
- "from": "function_call",
- "value": "工具参数"
- },
- {
- "from": "observation",
- "value": "工具结果"
- },
- {
- "from": "gpt",
- "value": "模型回答"
- }
- ],
- "system": "系统提示词(选填)",
- "tools": "工具描述(选填)"
- }
- ]
复制代码 human和gpt的写法简单易懂,function_call和observation是什么,可以详见这篇博客:
https://www.cnblogs.com/zhiyong-ITNote/p/18093770
涉及到了api调用。
LoRA 微调 推理 归并
- llamafactory-cli train examples/train_lora/qwen_14b_lora_sft.yaml
- llamafactory-cli chat examples/inference/qwen_14b_lora_sft.yaml
- llamafactory-cli export examples/merge_lora/qwen_14b_lora_sft.yaml
复制代码 先做微调,微调后的模型保存在了LLaMA-Factory/saves/qwen1.5-14b-chat/lora/sft中。
和之前一样的方式改动yaml文件,推理。
因为还会继续训练,暂时没有归并。
碰到的题目
我用下面这段代码先把模型下载下来,再运行微调指令
- from modelscope import AutoModelForCausalLM
- model = AutoModelForCausalLM.from_pretrained("qwen/Qwen1.5-14B-Chat", device_map="auto", trust_remote_code=True).eval()
复制代码- RuntimeError: RuntimeError"triu_tril_cuda_template" not implemented for 'BFloat16'
- : "triu_tril_cuda_template" not implemented for 'BFloat16
复制代码 transformers版本不兼容
- pip install transformers==4.41.2
复制代码
- 24G显存跑不起来,只能换了更大的机器,不过之后有机会尝试deepspeed,它可以进步分布式训练的效率和性能,优化显存使用。
画个大饼:之后有机会写一写源码分析、优化方法和大模型加快相关技能吧!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |