当前位置:   article > 正文

五步炼丹,qwen通义千问1.5版本微调实战_通义本地微调

通义本地微调

前言

          最近阿里大模型通义千问qwen推出了1.5版本的开源模型,涉及了0.5B, 1.8B, 4B, 7B, 14B, 及72b在内的多种参数模型与量化模型因此本篇文章是基于一个开源大模型微调训练工具包使用lora对qwen1.5的微调,但是对于每个人的机器配置以及cuda环境,可能会导致一些问题,如果遇到问题可以发在评论区,大家一起研究,同时测试数据及GPU算力白嫖教程我放到下面了,需要的自行获取。

炼丹第一步(数据准备)

数据样例

        我们需要至少两个json文件放在data目录,一个命名为dataset_info.json(注意:这个文件是固定的名称,不要更改),还有一个是微调训练数据json文件名可以随意如train.json

        下面我们展开说说每个文件的具体格式:

        dataset_info.json:

  1. {
  2. "train": {
  3. "file_name": "train.json",
  4. "columns": {
  5. "prompt": "instruction",
  6. "query": "input",
  7. "response": "output",
  8. }}
  9. }
  10. 这个文件是用来加载训练数据的配置文件,格式就是这个样子如果想要替换训练数据new_train.json那么格式如下:
  11. {
  12. "new_train": {
  13. "file_name": "new_train",
  14. "columns": {
  15. "prompt": "instruction",
  16. "query": "input",
  17. "response": "output",
  18. }}
  19. }
  20. columns中的值如果训练数据不变也不需要变,那么训练数据格式什么样子呢

train.json:

  1. [
  2. {
  3. "instruction": "我们如何在日常生活中减少用水?",
  4. "input": "",
  5. "output": "1. 使用节水装置,如节水淋浴喷头和水龙头。 \n2. 使用水箱或水桶收集家庭废水,例如洗碗和洗浴。 \n3. 在社区中提高节水意识。 \n4. 检查水管和灌溉系统的漏水情况,并及时修复它们。 \n5. 洗澡时间缩短,使用低流量淋浴头节约用水。 \n6. 收集雨水,用于园艺或其他非饮用目的。 \n7. 刷牙或擦手时关掉水龙头。 \n8. 减少浇水草坪的时间。 \n9. 尽可能多地重复使用灰水(来自洗衣机、浴室水槽和淋浴的水)。 \n10. 只购买能源效率高的洗碗机和洗衣机。"
  6. },
  7. {
  8. "instruction": "编辑文章,使其更吸引读者。",
  9. "input": "自主机器人是计算机控制的机器,被编程执行特定任务而不需要任何人类输入。自主机器人在各个行业中被越来越广泛地应用,从制造业到医疗保健再到安全。",
  10. "output": "自主机器人是计算机控制的机器,被编程执行特定任务而不需要任何人类输入,从而实现了新的效率、精确度和可靠性水平。自主机器人在各个行业中被越来越广泛地应用,从制造业,它们可以使用精度和一致的质量组装复杂的组件,到医疗保健,可以协助进行医疗测试和处理,再到安全,可以监控大面积地区,保障人们和财产的安全。自主机器人还可以减少在危险或有害环境中的错误和增加安全,在工业流程的检查或维修期间等。由于其多样性,自主机器人将彻底改变我们工作方式的方式,使任务变得更加简单、快速,最终更加愉悦。"
  11. },
  12. {
  13. "instruction": "政府可以采取哪些策略来减少空气污染?",
  14. "input": "",
  15. "output": "1. 实施强制的车辆排放标准和基于激励的计划,以降低车辆的碳足迹。\n2. 增加公共交通工具,减少公众对车辆的依赖。\n3. 增加对空气污染的影响的认识,鼓励市民减少污染物的生成。\n4. 投资于可再生能源的研究和开发,如太阳能和风能。\n5. 在工厂和发电厂安装空气污染控制装置,例如洗涤器。\n6. 对车辆和工厂使用清洁燃料。\n7. 实施更好的城市规划和控制拓展。\n8. 改善农业效率,减少化肥和杀虫剂的使用。\n9. 种植更多的树木以减少空气污染。\n10. 减少木材、煤炭和生物质的燃烧。"
  16. },
  17. {
  18. "instruction": "可再生能源的存在对环境有什么影响?",
  19. "input": "",
  20. "output": "可再生能源的存在可以帮助减少空气污染和温室气体排放,因为它们几乎不会排放二氧化碳、二氧化硫等空气污染物。此外,使用可再生能源可以促进能源效率的进一步提高和能源利用的改善。可再生能源也可以帮助减少对化石燃料的依赖,这不仅可以减少排放,而且还可以帮助减少全球气候变化的风险。最后,可再生能源可以帮助保护自然资源,减少为了能源生产而开发更多土地和资源的需要。"
  21. },
  22. {
  23. "instruction": "解释神经网络如何学习。",
  24. "input": "",
  25. "output": "神经网络是一种机器学习算法,它使用连接的节点集合来近似可以将输入变量映射到输出的函数。为了学习神经网络的参数,计算机需要调整节点之间连接的权重,以便网络为给定输入产生正确的输出。这个调整过程称为学习,通过比较网络产生的输出和期望的结果,然后使用优化算法来调整权重,使得网络输出逼近期望的结果。这个过程在多个输入和期望的输出上重复进行多次迭代。最终,连接节点之间的权重将被调整,以便神经网络的输出与期望的结果相匹配,学习过程将完成。"
  26. },
  27. {
  28. "instruction": "给出一个机器学习算法的例子,并解释它是如何工作的。",
  29. "input": "",
  30. "output": "一个流行的机器学习算法的例子是支持向量机(SVM)。它是一个用于分类和回归任务的监督学习算法。它通过在n维空间中绘制数据点,由空间中的决策边界或超平面进行分离。该算法使用最大边距,这些边距尽可能远离两类数据点。这些边距有助于创建最优的决策超平面。然后,算法通过考虑分类任务中发生的错误来调整决策超平面,并相应地修改超平面。\n\n最终,支持向量机可以使用最优的决策超平面执行分类任务,预测数据点的类别。"
  31. }]

        可以看出我们的训练数据时一个大列表中存在n条字典数据,那么如果自己微调也请输出一个这种的文件,该格式对应官方的 alpaca 格式的数据集,其中是可以件系统提示语,和历史,但是我们微调的话,不建议
        其次,如果训练数据中增加字段了system或history,别忘了dataset_info.json中的columns中也要增加 “system”: "system"或 “history”: “history”

炼丹第二步(环境搭建(可跳过))

  1. git clone https://github.com/hiyouga/LLaMA-Factory.git
  2. conda create -n llama_factory python=3.10
  3. conda activate llama_factory
  4. cd LLaMA-Factory
  5. pip install -r requirements.txt
  6. pip install modelscope -U

这里一定要注意python选择大于等于3.10版本,推荐3.10,稳定

使用魔搭社区(可跳过)

如果您在 Hugging Face 模型和数据集的下载中遇到了问题,可以通过下述方法使用魔搭社区。

export USE_MODELSCOPE_HUB=1

 炼丹第三步(单GPU训练)

首先,把我们准备的两个json文件放入data文件下 ,dataset_info.json需要覆盖源文件

指令监督微调

  1. CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \
  2. --stage sft \
  3. --do_train \
  4. --model_name_or_path qwen/Qwen1.5-1.8B-Chat \
  5. --dataset trian \
  6. --template qwen \
  7. --finetuning_type lora \
  8. --lora_target q_proj,v_proj \
  9. --output_dir output\
  10. --overwrite_cache \
  11. --per_device_train_batch_size 2 \
  12. --gradient_accumulation_steps 32 \
  13. --lr_scheduler_type cosine \
  14. --logging_steps 10 \
  15. --save_steps 1000 \
  16. --learning_rate 5e-5 \
  17. --num_train_epochs 3.0 \
  18. --plot_loss \
  19. --fp16

这里我使用的是1.5的小参数模型

回车之后静静地等待,如果报错就是你的数据或者环境有问题,或者是GPU驱动什么乱七八糟的bug,这里我建议使用云服务器(大厂的),我自己测试玩用的是白嫖的服务器(wx公众号:AI疯人院  ),我写了个白嫖教程放在公众号需要自取,没问题就开始训练了

训练参数说明

  1. CUDA_VISIBLE_DEVICES=0:设置可见的GPU设备为0号设备
  2. python src/train_bash.py:运行Python脚本train_bash.py
  3. --stage sft:指定训练阶段为sft
  4. --do_train:表示进行训练
  5. --model_name_or_path qwen/Qwen1.5-1.8B-Chat:指定预训练模型的名称或路径为qwen/Qwen1.5-1.8B-Chat
  6. --dataset trian:指定数据集名称为trian
  7. --template qwen:指定模板为qwen
  8. --finetuning_type lora:指定微调类型为lora
  9. --lora_target q_proj,v_proj:指定LoRA目标为q_proj和v_proj
  10. --output_dir output:指定输出目录为output
  11. --overwrite_cache:表示覆盖缓存
  12. --per_device_train_batch_size 2:指定每个设备的批量大小为2
  13. --gradient_accumulation_steps 32:指定梯度累积步数为32
  14. --lr_scheduler_type cosine:指定学习率调度器类型为余弦退火
  15. --logging_steps 10:指定日志记录间隔为10
  16. --save_steps 1000:指定保存模型的间隔为1000
  17. --learning_rate 5e-5:指定学习率为5e-5
  18. --num_train_epochs 3.0:指定训练轮数为3.0
  19. --plot_loss:表示绘制损失曲线
  20. --fp16:表示使用半精度浮点数(float16)进行计算

重点说一下这个model_name_or_path这个我是用的modelscope的模型地址想要修改模型的自行查询复制即可

f948edc93d7e47848265692f07f7678c.png

还有--dataset要指定自己的训练数据名,模板不要改,其他的参数自行调整

炼丹第四步(模型合并) 

训练时间可能比较长,训练完成后,将微调的模型与原模型合并

  1. CUDA_VISIBLE_DEVICES=0 python src/export_model.py \
  2. --model_name_or_path qwen/Qwen1.5-1.8B-Chat\
  3. --adapter_name_or_path output \
  4. --template qwen \
  5. --finetuning_type lora \
  6. --export_dir Qwen1.5-1.8B-Chat_fine \
  7. --export_size 2 \
  8. --export_legacy_format Fal

炼丹第五步(模型预测)

浏览器测试

  1. CUDA_VISIBLE_DEVICES=0 python src/web_demo.py \
  2. --model_name_or_path qwen/Qwen1.5-1.8B-Chat\
  3. --adapter_name_or_path output \
  4. --template qwen \
  5. --finetuning_type lora

这里的两个模型一个是原模型,一个是输出的模型不是合并的模型

终端界面不用关闭,打开浏览器输入   ip:7680 进入页面

python代码测试

这里加载合并后的模型

  1. from modelscope import AutoModelForCausalLM, AutoTokenizer
  2. device = "cuda" # the device to load the model onto
  3. model = AutoModelForCausalLM.from_pretrained(
  4. "Qwen1.5-1.8B-Chat_fine",
  5. device_map=device
  6. )
  7. tokenizer = AutoTokenizer.from_pretrained("Qwen1.5-1.8B-Chat_fine")
  8. def chat(messages, max_new_tokens=1024,temperature=0.95,top_p=0.7):
  9. text = tokenizer.apply_chat_template(
  10. messages,
  11. tokenize=False,
  12. add_generation_prompt=True
  13. )
  14. model_inputs = tokenizer([text], return_tensors="pt").to(device)
  15. generated_ids = model.generate(
  16. model_inputs.input_ids,
  17. max_new_tokens= max_new_tokens,
  18. temperature = temperature,
  19. top_p = top_p
  20. )
  21. generated_ids = [
  22. output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
  23. ]
  24. response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
  25. return response
  26. if __name__ == '__main__':
  27. prompt = "你能预测未来吗,请告诉我人工智能以后得发展趋势"
  28. messages = [
  29. {"role": "user", "content": prompt}
  30. ]
  31. print(chat(messages))

 这里message 为传入的数据,也可以加系统提示词如:

  1. messages = [
  2. {"role": "system", "content": "你是一个幽默的知识博主,请说话幽默一些"},
  3. {"role": "user", "content": prompt}
  4. ]

测试数据我将官方的整理到了一个目录,地址:https://github.com/liukangjia666/LLM_fine_tuning/tree/main/LLM_data

算力白嫖 

公众号:AI疯人院

标题:GPU算力白嫖!用免费GPU线上跑大模型项目实践

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/290730
推荐阅读
相关标签
  

闽ICP备14008679号