【大模型专栏—实战篇】从0到1带你QLora微调


【大模型专栏—实战篇】从0到1带你QLora微调_人工智能

大模型专栏介绍

????你好,我是小航,一个正在变秃、变强的文艺倾年。

????本文为大模型专栏子篇,大模型专栏将持续更新,主要讲解大模型从入门到实战打怪升级。如有兴趣,欢迎您的阅读。

????适合人群:本科生、研究生、大模型爱好者,期待与你一同探索、学习、进步,一起卷起来叭!



目录

  • QLora微调
  • 环境准备
  • 代码准备
  • 模型来源
  • 模型微调
  • 模型评估



QLora微调

环境准备

安装教程请移步大模型自学:从入门到实战打怪升级(一)

conda activate pytorch

python
>>> import torch
>>> torch.cuda.is_available()
>>> True

>>> print(torch.__version__)  #注意是双下划线
>>> 2.4.0
>>> exit()

代码准备

代码仓库:????qwen_qlora

【大模型专栏—实战篇】从0到1带你QLora微调_人工智能_02


上传代码至阿里云盘

模型来源

【大模型专栏—实战篇】从0到1带你QLora微调_人工智能_03


qwen_download.py

from modelscope.hub.snapshot_download import snapshot_download
# 使用Library Hub下载模型
model_dir = snapshot_download('qwen/Qwen-14B-Chat', cache_dir='/root/autodl-tmp/artboy/base_model/', revision='v1.0.8')

模型微调

????AutoDL:https://www.autodl.com/home

服务器选择:

显卡:A40;GPU memory:48GB;
版本镜像:pytorch 1.11.0  python3.8  Ubuntu

FP32:32Bits = 4Bytes;FP16:16Bits = 2Bytes
BatchSize = 1;SequenceLen = 1024;HiddenSize = 5120;AttentionHead = 40;Layer = 40;

模型参数大小:14B
- Model Weight:28GB
- Gradient:28GB(即 Model Weight)
- Optimizer State:168GB(即 Model Weight * 2 * 3)
	- 梯度指数平滑值:56GB(即 Model Weight * 2)
	- 梯度平方指数平滑值:56GB(即 Model Weight * 2)
	- 模型参数:56GB(即 Model Weight * 2)
- Activation:14.5GB【BatchSize * SequenceLen * HiddenSize * Layer * (34 + 5 * AttentionHead / HiddenSize)】
全参微调至少需要238.5GB;

模型参数大小:14B
- Model Weight:28GB
- Adapter weight:0.7GB(即 Origin Adapter weight * 2.5%)
- Gradient:0.7GB(即 Origin Gradient * 2.5%)
- Optimizer State:4.2GB(即 Origin Optimizer State * 2.5%)
- Activation:0.36GB(即 Origin Activation * 2.5%)
Loar微调至少需要47.96GB;

模型参数大小:14B
- Model Weight:7GB(4bit量化)
- Double Quantization:3.6GB(即 Origin Model Weight * 0.127)
- Adapter weight:0.7GB(即 Origin Adapter weight * 2.5%)
- Gradient:0.7GB(即 Origin Gradient * 2.5%)
- Optimizer State:4.2GB(即 Origin Optimizer State * 2.5%)
- Activation:0.36GB(即 Origin Activation * 2.5%)
QLoar微调至少需要16.56GB;

创建基本目录并移动代码:

mkdir -p /root/autodl-tmp/artboy /root/autodl-tmp/tmp
cd /root/autodl-tmp/artboy
mkdir -p finetune data base_model

cd finetune
mv ~/autodl-tmp/qwen_qloar/ .
ls

下载模型:

conda create -n modelscope_env python=3.8
source activate modelscope_env 
pip install modelscope
python qwen_download.py

安装依赖:

conda create -n qwen_env python=3.8
source activate qwen_env
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# 也可以编写一个安装脚本
# bash install_req.sh

修改训练参数:

如果是单卡训练:train_qwen_qlora.shCUDA_VISIBLE_DEVICES=0

CUDA_VISIBLE_DEVICES=0 torchrun --nproc_per_node=1 train_qlora.py --train_args_file config/qwen-14b-qlora.json

修改模型路径:config/qwen-14b-qlora.json中model_name_or_path

{
    "output_dir": "trained_models/Qwen-14B-Chat-Keywords-1118-match-1124",
    "model_name_or_path": "/root/autodl-tmp/artboy/base_model/Qwen-14B-Chat",
    "train_file": "./data/text_matching_data_train.jsonl",
    "num_train_epochs": 1,
    "per_device_train_batch_size": 8,
    "gradient_accumulation_steps": 4,
    "learning_rate": 5e-5,
    "max_seq_length": 1024,
    "logging_steps": 10,
    "save_steps": 500,
    "save_total_limit": 1,
    "lr_scheduler_type": "constant_with_warmup",
    "warmup_steps": 300,
    "lora_rank": 64,
    "lora_alpha": 16,
    "lora_dropout": 0.05,
    "gradient_checkpointing": true,
    "disable_tqdm": false,
    "optim": "paged_adamw_32bit",
    "seed": 42,
    "fp16": true,
    "report_to": "tensorboard",
    "dataloader_num_workers": 0,
    "save_strategy": "steps",
    "weight_decay": 0,
    "max_grad_norm": 0.3,
    "remove_unused_columns": false
}

启动:【日志命名规则:日期_时间.log

nohup bash train_qwen_qlora.sh > 202400806_1153.log &
tail -f 202400806_1153.log

开启新的窗口,关注显卡使用情况:【动态调整batch_size来合理利用GPU资源】

watch -n -1 nvidia-smi

模型评估

这里我们跑500个case测测准确率【正常应该在90%以上】,文件在data/text_matching_data_test_result.csv

tail data/text_matching_data_test_result.csv

句子1:今日也是爱你的一天。句子2:今天一天都是爱着你的歌词。判断这两个句子的意思是否相同:	不相同	不相同
判断下面两个句子是否表达了相同的语义:。文本1:马上关机马上关机。文本2:马上去了	答案:不相同	答案:不相同
句子1:单位怎么合法的办理给员工调动岗位和工资呢?。句子2:不接受公司调岗的劳动争议应该怎么办。判断这两个句子的意思是否相同:	不相同	不相同
下面两个句子是否表达了相同的意思:。文本1:怎么在淘宝上投诉卖家。文本2:如何投诉淘宝卖家?。答案:	相同	相同
下面两句话的意思是否相同:。文本1:这是什么时候的旗帜?。文本2:这是什么旗帜。选项:相似,不相似。答案:	不相同	不相同
下面两个句子表达的意思相同吗:。句子1:保证人可以以自己没钱,不履行担保责任么?。句子2:借款人没有钱还担保人也还不上担保人结果怎么样。选项:相似,不相似。答案:	不相同	不相同
文本1:我因为工作经常弯腰得了腰间盘突出的病,这属于工伤吗?。文本2:腰间盘突出可以作为职业病的鉴定吗?单位该如何赔偿?。这两个句子是否表达了相同的意思:	不相同	不相同
下面两个句子表达的意思相同吗?。文本1:如何使用level2软件。文本2:l2购买过以后在哪里打开使用。答案:	相同	相同
下面两个句子表达的意思相同吗:。句子1:如何查看自己购买的基金。句子2:我想查看自己的帐号怎么看。选项:相似,不相似。答案:	不相同	不相同
文本1:阿莫西林哺乳期可以吃吗。文本2:哺乳期能吃阿莫西林么?。这两个句子表达了相同的语义吗:	相同	相同
下面句子是否表示了相同的语义:。文本1:公民、法人对行政机关作出的行政处罚不服的,是否可以申请行政复议?。文本2:对行政处罚不服的公民、法人,能否申请行政复议?。选项:相似,不相似。答案:	相同	相同

执行评估脚本:

python model_evaluation.py
???? [ 笔者 ]   文艺倾年
???? [ 更新 ]   2024.9.24
❌ [ 勘误 ]   /* 暂无 */
???? [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

【大模型专栏—实战篇】从0到1带你QLora微调_大模型_04


上一篇:【ShuQiHere】 智能代理与软件机器人:引领自动化未来的技术