【项目记录】LLaMA-Factory + ModelScope 指令监督微调

打印 上一主题 下一主题

主题 1702|帖子 1702|积分 5106

LLaMA-Factory是大模型微调框架,内部集成了多种微调方法,可以直接调用。
具体做法可以从官方github上找到:https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md
安装依赖

  1. git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
  2. cd LLaMA-Factory
  3. pip install -e ".[torch,metrics]"
复制代码
碰到包辩论时,可使用 pip install --no-deps -e . 解决。
使用ModelScope下载模型

设置环境变量:
  1. 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
  1. ### model
  2. model_name_or_path: qwen/Qwen1.5-14B-Chat                                  # 指定了要使用的模型或模型路径
  3. ### method
  4. stage: sft                                              # 微调阶段,sft通常表示有监督微调
  5. do_train: true                                          # 指定是否进行训练
  6. finetuning_type: lora                                   # 微调类型,LoRA
  7. lora_target: all                                        # LoRA 的目标层,'all'表示应用于所有层
  8. ### dataset
  9. dataset: novel_zh                                                        # 数据集名称,可以是逗号分隔的多个数据集
  10. template: qwen                                          # 模板名称,用于指定模型或预处理模板
  11. cutoff_len: 1024                                        # 截断长度,通常用于限制序列的最大长度
  12. max_samples: 1000                                       # 最大样本数量,指定要处理的样本的最大数量
  13. overwrite_cache: true                                   # 是否覆盖缓存,设为true表示每次运行都会重新处理数据
  14. preprocessing_num_workers: 16                           # 预处理的并行工作线程数,指定同时进行预处理的线程数量
  15. ### output
  16. output_dir: saves/qwen1.5-14b-chat/lora/sft             # 输出目录,保存微调后的模型和其他文件
  17. logging_steps: 10                                       # 记录日志的步骤间隔
  18. save_steps: 500                                         # 保存模型的步骤间隔
  19. plot_loss: true                                         # 是否绘制损失曲线
  20. overwrite_output_dir: true                              # 是否覆盖输出目录
  21. ### train
  22. per_device_train_batch_size: 1                          # 每个设备上的训练批量大小
  23. gradient_accumulation_steps: 8                          # 梯度累积步骤数,梯度会在这些步骤后更新
  24. learning_rate: 1.0e-4                                   # 学习率
  25. num_train_epochs: 3.0                                   # 训练的总轮数
  26. lr_scheduler_type: cosine                               # 学习率调度器类型,余弦退火
  27. warmup_ratio: 0.1                                       # 预热比例
  28. bf16: true                                              # 是否使用 bfloat16 精度
  29. ddp_timeout: 180000000                                  # DDP(Distributed Data Parallel)超时时间
  30. ### eval
  31. val_size: 0.1                                           # 验证集的比例
  32. per_device_eval_batch_size: 1                           # 每个设备上的验证批量大小
  33. eval_strategy: steps                                    # 评估策略,这里选择在特定步骤进行评估
  34. 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 文件。
本地文件就在其中加入:
  1. "identity": {
  2.     "file_name": "identity.json"
  3.   },
  4. "alpaca_en_demo": {
  5.     "file_name": "alpaca_en_demo.json"
  6.   },
  7. "novel_zh" : {
  8.         "file_name": "novel_zh.json"
  9.   },
复制代码
仅支持 alpaca 格式和 sharegpt 格式的数据集。具体的计划方式详见https://github.com/hiyouga/LLaMA-Factory/blob/main/data/README_zh.md,这里只形貌指令微调数据集的构建方式。
alpaca格式

这是alpaca_zh_demo.json

也就是将数据写成这种情势:
  1. [
  2.   {
  3.     "instruction": "人类指令(必填)",
  4.     "input": "人类输入(选填)",
  5.     "output": "模型回答(必填)",
  6.     "system": "系统提示词(选填)",
  7.     "history": [
  8.       ["第一轮指令(选填)", "第一轮回答(选填)"],
  9.       ["第二轮指令(选填)", "第二轮回答(选填)"]
  10.     ]
  11.   }
  12. ]
复制代码
sharegpt格式

这是glaive_toolcall_zh_demo.json

它支持更多的角色种类,留意其中 human 和 observation 必须出现在奇数位置,gpt 和 function 必须出现在偶数位置。
  1. [
  2.   {
  3.     "conversations": [
  4.       {
  5.         "from": "human",
  6.         "value": "人类指令"
  7.       },
  8.       {
  9.         "from": "function_call",
  10.         "value": "工具参数"
  11.       },
  12.       {
  13.         "from": "observation",
  14.         "value": "工具结果"
  15.       },
  16.       {
  17.         "from": "gpt",
  18.         "value": "模型回答"
  19.       }
  20.     ],
  21.     "system": "系统提示词(选填)",
  22.     "tools": "工具描述(选填)"
  23.   }
  24. ]
复制代码
human和gpt的写法简单易懂,function_call和observation是什么,可以详见这篇博客:
https://www.cnblogs.com/zhiyong-ITNote/p/18093770
涉及到了api调用。
LoRA 微调 推理 归并

  1. llamafactory-cli train examples/train_lora/qwen_14b_lora_sft.yaml
  2. llamafactory-cli chat examples/inference/qwen_14b_lora_sft.yaml
  3. llamafactory-cli export examples/merge_lora/qwen_14b_lora_sft.yaml
复制代码
先做微调,微调后的模型保存在了LLaMA-Factory/saves/qwen1.5-14b-chat/lora/sft中。
和之前一样的方式改动yaml文件,推理。
因为还会继续训练,暂时没有归并。
碰到的题目


  • 无法下载模型
我用下面这段代码先把模型下载下来,再运行微调指令
  1. from modelscope import AutoModelForCausalLM
  2. model = AutoModelForCausalLM.from_pretrained("qwen/Qwen1.5-14B-Chat", device_map="auto", trust_remote_code=True).eval()
复制代码

  • RuntimeError
  1. RuntimeError: RuntimeError"triu_tril_cuda_template" not implemented for 'BFloat16'
  2. : "triu_tril_cuda_template" not implemented for 'BFloat16
复制代码
transformers版本不兼容
  1. pip install transformers==4.41.2
复制代码

  • 24G显存跑不起来,只能换了更大的机器,不过之后有机会尝试deepspeed,它可以进步分布式训练的效率和性能,优化显存使用。
画个大饼:之后有机会写一写源码分析、优化方法和大模型加快相关技能吧!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

渣渣兔

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表