当前位置: 首页 > news >正文

基于SWIFT和Qwen1.5-14B-Chat进行大模型LoRA微调测试

基于SWIFT和Qwen1.5-14B-Chat进行大模型LoRA微调测试

环境准备

基础环境

  • 操作系统:Ubuntu 18.04.5 LTS (GNU/Linux 3.10.0-1127.el7.x86_64 x86_64)
  • Anaconda3:Anaconda3-2023.03-1-Linux-x86_64
  • 根据服务器网络情况配置好conda源和pip源,此处使用的是超算山河源
  • 服务器硬件配置:CPU 96核;GPU 8×NVIDIA A100 40GB

环境安装

通过源代码安装SWIFT:

创建一个新的conda环境:

conda create --name swift python=3.8

激活刚刚创建的conda环境:

conda activate swift

下载SWIFT源码:

git clone https://github.com/modelscope/swift.git

SWIFT(ms-swift) 1.8.0

切换到SWIFT路径:

cd /yldm0226/swift

安装SWIFT:

pip install -e .[llm]

非必要步骤:检查服务器cuda版本是否与当前安装的pytorch对应

数据集准备

对于数据集,我们均采用json或jsonl的格式。

在做大模型SFT(Supervised Fine-Tuning)时,可以准备两种数据:

  1. 单轮问答
  2. 多轮对话

对于单轮问答数据,其格式可以为:

{"query": "11111", "response": "22222"}

对于多轮对话数据,其格式可以为:

{"query": "eeeee", "response": "fffff", "history": []}
{"query": "EEEEE", "response": "FFFFF", "history": [["AAAAA", "BBBBB"], ["CCCCC", "DDDDD"]]}

同时,也可以用以下两种格式的数据:

{"conversations": [{"from": "user", "value": "11111"}, {"from": "assistant", "value": "22222"}]}
{"conversations": [{"from": "user", "value": "aaaaa"}, {"from": "assistant", "value": "bbbbb"}, {"from": "user", "value": "ccccc"}, {"from": "assistant", "value": "ddddd"}]}
{"conversations": [{"from": "user", "value": "AAAAA"}, {"from": "assistant", "value": "BBBBB"}, {"from": "user", "value": "CCCCC"}, {"from": "assistant", "value": "DDDDD"}]}
{"messages": [{"role": "user", "content": "11111"}, {"role": "assistant", "content": "22222"}]}
{"messages": [{"role": "user", "content": "aaaaa"}, {"role": "assistant", "content": "bbbbb"}, {"role": "user", "content": "ccccc"}, {"role": "assistant", "content": "ddddd"}]}
{"messages": [{"role": "user", "content": "AAAAA"}, {"role": "assistant", "content": "BBBBB"}, {"role": "user", "content": "CCCCC"}, {"role": "assistant", "content": "DDDDD"}]}

在本文中,共使用了9个数据集,数据集的详细信息如下:

序号数据集简介数据量
1Chinese_medical_dialogue_six_department中文医疗问答数据集,包括男科、内科、妇产科、肿瘤科、儿科、外科六个科室的问题。792K
2HuatuoGPT2_sft_instruct_GPT4华佗GPT(HuatuoGPT)第二版训练数据集。50K
3ChatMed_Consult-v0.3中文医疗在线问诊数据集ChatMed_Consult_Dataset的50w+在线问诊+ChatGPT回复。500K
4ChatMed_TCM-v0.2以开源的中医药知识图谱为基础,采用以实体为中心的自指令方法(entity-centric self-instruct),调用ChatGPT得到11w+的围绕中医药的指令数据。110K
5QiZhen_sft_20k包含20k训练数据(该数据集来自于启真医学知识库收集整理的真实医患知识问答数据以及在启真医学知识库的药品文本知识基础上,通过对半结构化数据设置特定的问题模板构造的指令数据)。20K
6Huatuo_LiteHuatuo-Lite 是在Huatuo26M数据集的基础上经过多次提纯和重写而精炼优化的数据集。它包含了18万个高质量的医疗问答对,并具有医院科室和相关疾病两个额外的数据维度。180K
7ZhongJing_CMtMedQA仲景SFT训练集。70K
8DISC-Med-SFT_released包含了超过47万个衍生于现有的医疗数据集重新构建得到的样本。采用了目标导向的策略,通过对于精心选择的几个数据源进行重构来得到SFT数据集。这些数据的作用在于帮助模型学习医疗领域知识,将行为模式与人类偏好对齐,并对齐真实世界在线医疗对话的分布情况。514K
9SZY_TCM_QA私有数据集。12K

以下是加载后的数据集信息:

[INFO:swift] train_dataset: Dataset({features: ['query', 'response', 'history'],num_rows: 2223540
})
[INFO:swift] val_dataset: Dataset({features: ['query', 'response', 'history'],num_rows: 22460
})

数据总量为2,246,000,从中抽取出约1%作为验证集,其余的作为训练集。

通过max_lengt=4096进行过滤后的数据集信息如下:

[INFO:swift] Dataset Token Length: 224.276768±159.001432, min=25.000000, max=4089.000000, size=2223411
[INFO:swift] Dataset Token Length: 224.254464±157.600093, min=28.000000, max=3086.000000, size=22459

编写微调脚本

SWIFT框架提供了部分大模型的微调脚本,可以在我们下载的源码中的_swift/examples/pytorch/llm/scripts_路径中找到这些脚本。如果这些脚本能够满足我们大部分的微调需求,我们可以选择直接对这些脚本进行修改。如果找不到我们需要的脚本,需要我们根据_swift/docs/source/LLM_中的命令行参数文档自行编写训练脚本。

以下是对Qwen1.5-14B-Chat进行LoRA微调的一个训练脚本:

nproc_per_node=8CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
NPROC_PER_NODE=$nproc_per_node \
MASTER_PORT=29500 \
swift sft \--model_type qwen1half-14b-chat \--model_id_or_path /yldm0226/models/Qwen1.5-14B-Chat \--model_revision master \--sft_type lora \--tuner_backend swift \--template_type qwen \--dtype AUTO \--output_dir /yldm0226/llm_sft_output \--ddp_backend nccl \--custom_train_dataset_path /yldm0226/data/1-Chinese_medical_dialogue_six_department.jsonl /yldm0226/data/2-HuatuoGPT2_sft_instruct_GPT4.jsonl /yldm0226/data/3-ChatMed_Consult-v0.3.jsonl /yldm0226/data/4-ChatMed_TCM-v0.2.jsonl /yldm0226/data/5-QiZhen_sft_20k.jsonl /yldm0226/data/6-Huatuo_Lite.jsonl /yldm0226/data/7-ZhongJing_CMtMedQA.jsonl /yldm0226/data/8-DISC-Med-SFT_released.jsonl /yldm0226/data/9-SZY_TCM_QA.jsonl \--train_dataset_sample -1 \--num_train_epochs 1 \--max_length 4096 \--check_dataset_strategy warning \--lora_rank 8 \--lora_alpha 32 \--lora_dropout_p 0.05 \--lora_target_modules ALL \--gradient_checkpointing true \--batch_size 1 \--weight_decay 0.01 \--learning_rate 1e-4 \--gradient_accumulation_steps $(expr 64 / $nproc_per_node) \--max_grad_norm 0.5 \--warmup_ratio 0.03 \--eval_steps 100 \--save_steps 100 \--save_total_limit 3 \--logging_steps 10 \--use_flash_attn false \--deepspeed default-zero3 \--save_only_model true

lora_rank:微调中的秩大小。秩的值并不是越大越好,此处设置的8是LoRA原论文中测试的最优解,根据论文中的结果,1或者2这种很小的秩的表现也是很好的。

lora_alpha:LoRA 微调中的缩放系数。

lora_dropout_p:LoRA 微调中的 Dropout 系数。

lora_target_modules:指定lora模块, 默认为['DEFAULT']. 如果lora_target_modules传入'DEFAULT' or 'AUTO', 则根据model_type查找MODEL_MAPPING中的lora_target_modules(默认指定为qkv)。如果传入'ALL', 则将所有的Linear层(不含head)指定为lora模块。 如果传入'EMBEDDING', 则Embedding层指定为lora模块。 如果内存允许, 建议设置成’ALL’。 当然, 你也可以设置['ALL', 'EMBEDDING'], 将所有的Linear和embedding层指定为lora模块。该参数只有当sft_type指定为’lora’时才生效。

deepspeed:用于指定deepspeed的配置文件的路径或者直接传入json格式的配置信息, 默认为None, 即不开启deepspeed. deepspeed可以节约显存。 SWIFT书写了默认的[ZeRO-2配置文件], [ZeRO-3配置文件]。你只需要指定’default-zero2’, 就会使用默认zero2配置文件; 指定’default-zero3’, 就会使用默认的zero3配置文件。

测试

以下是训练过程中的部分输出:

{'loss': 3.91967845, 'acc': 0.46053511, 'learning_rate': 0.0, 'epoch': 0.0, 'global_step': 1}                                                                                                                                                             
{'loss': 3.13938289, 'acc': 0.50242286, 'learning_rate': 3.313e-05, 'epoch': 0.0, 'global_step': 10}                                                                                                                                                      
{'loss': 2.02636986, 'acc': 0.56641636, 'learning_rate': 4.31e-05, 'epoch': 0.0, 'global_step': 20}                                                                                                                                                       
{'loss': 1.51573572, 'acc': 0.62124624, 'learning_rate': 4.894e-05, 'epoch': 0.0, 'global_step': 30}                                                                                                                                                      
{'loss': 1.37469482, 'acc': 0.65222416, 'learning_rate': 5.308e-05, 'epoch': 0.0, 'global_step': 40}                                                                                                                                                      
{'loss': 1.44527245, 'acc': 0.64013515, 'learning_rate': 5.629e-05, 'epoch': 0.0, 'global_step': 50}                                                                                                                                                      
{'loss': 1.36220665, 'acc': 0.65485716, 'learning_rate': 5.891e-05, 'epoch': 0.0, 'global_step': 60}                                                                                                                                                      
{'loss': 1.34706726, 'acc': 0.65729899, 'learning_rate': 6.113e-05, 'epoch': 0.0, 'global_step': 70}                                                                                                                                                      
{'loss': 1.3558219, 'acc': 0.65412712, 'learning_rate': 6.305e-05, 'epoch': 0.0, 'global_step': 80}                                                                                                                                                       
{'loss': 1.38924046, 'acc': 0.6498558, 'learning_rate': 6.475e-05, 'epoch': 0.0, 'global_step': 90}                                                                                                                                                       
{'loss': 1.31848869, 'acc': 0.66292844, 'learning_rate': 6.626e-05, 'epoch': 0.0, 'global_step': 100}                                                                                                                                                     
Train:   0%|| 100/34740 [20:07<113:54:29, 11.84s/it]
Val:  22%|████████████████████████████████████████████                            | 615/2808 [04:56<17:36,  2.07it/s]                                                                                                                    

训练一个epoch大约需要114小时;进行一次验证大约需要22分钟。(这里的时间只是一个大概值,在训练时,不同数据的处理速度不同,花费的总时间会一直变化)。

相比于全参,LoRA的微调方式能够节约大量的显存,因此我们可以将nproc_per_node设置的大一些,以提高训练的速度。

最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

五、面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下。
在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

相关文章:

  • 易舟云财务软件:数字化时代的财务管家
  • C/C++ 进阶(6)红黑树
  • Linux基础 (十四):socket网络编程
  • Ansible——fetch模块
  • 计划任务 之 一次性的计划任务
  • Java与MySQL的数据迁移与同步及事务与性能抉择
  • SQL进阶day12——高级条件语句
  • JMH309【亲测】典藏3D魔幻端游【剑踪3DⅢ】GM工具+开区合区工具+PC客户端+配置修改教程+Win一键服务端+详细外网视频教程
  • 那些年我看过的技术书(持续更新,大佬的成长之路)
  • 输入apt update 报错无法获得锁 /var/lib/apt/lists/lock, 锁正由进程1974持有
  • 微信小程序和支付宝小程序生成二维码
  • Django中drf动态过滤查询
  • 温泉镇旅游微信小程序的设计与实现(论文+源码)_kaic
  • 测试smooth_funct_1d_gauss
  • 算法:94. 二叉树的中序遍历--扩展前中后层序遍历
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【刷算法】从上往下打印二叉树
  • ES6简单总结(搭配简单的讲解和小案例)
  • express + mock 让前后台并行开发
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 每天一个设计模式之命令模式
  • 批量截取pdf文件
  • 通信类
  • 小程序 setData 学问多
  • 一个SAP顾问在美国的这些年
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​一些不规范的GTID使用场景
  • #QT(一种朴素的计算器实现方法)
  • $.ajax()方法详解
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (floyd+补集) poj 3275
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .NET 反射 Reflect
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET运行机制
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • 。。。。。
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @Bean, @Component, @Configuration简析
  • @ModelAttribute使用详解