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

devtools/2024/9/24 20:13:18/

在这里插入图片描述

大模型专栏介绍

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

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

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

🔗篇章一:本篇主要讲解Python基础、数据分析三件套、机器学习、深度学习、CUDA等基础知识、学习使用AutoDL炼丹
🔗篇章二:本篇主要讲解基本的科研知识、认识数据和显卡、语言模型如RNN、LSTM、Attention、Transformer、Bert、T5、GPT、BLOOM、LLama、Baichuan、ChatGLM等系列、强化学习教程、大模型基础知识及微调
🔗篇章三:本篇主要讲解智能对话、大模型基础实战如Ollama、Agent、QLoar、Deepspeed、RAG、Mobile Agent等、大模型领域前沿论文总结及创新点汇总


目录

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


QLoar微调

环境准备

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

conda activate pytorchpython
>>> import torch
>>> torch.cuda.is_available()
>>> True>>> print(torch.__version__)  #注意是双下划线
>>> 2.4.0
>>> exit()

代码准备

代码仓库:🔗qwen_qlora

在这里插入图片描述
上传代码至阿里云盘

模型来源

在这里插入图片描述
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  UbuntuFP32: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_modelcd 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
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!

在这里插入图片描述


http://www.ppmy.cn/devtools/116651.html

相关文章

Debezium日常分享系列之:将容器镜像移至 quay.io

Debezium日常分享系列之:将容器镜像移至 quay.io 在Debezium 3.0.0.Final发布之后,我们将不再向docker.io发布容器镜像更新。旧版本的Debezium 2.x和1.x镜像将继续保留在docker.io上;然而,所有未来的Debezium 2.7.x和3.x或更高版本…

python | huey,一个非常厉害的 任务调度 Python 库!

本文来源公众号“python”,仅用于学术分享,侵权删,干货满满。 原文链接:huey,一个非常厉害的 Python 库! 大家好,今天为大家分享一个非常厉害的 Python 库 - huey。 Github地址:h…

图片切换示例2【JavaScript】

这段代码实现了一个简单的图片切换效果。当用户将鼠标悬停在不同的小缩略图上时&#xff0c;主显示框&#xff08;#box&#xff09;的背景图片会切换为相应的缩略图所代表的图片。 实现效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh"…

project generator 简单使用(二)之 CLion 与 AC6

文章目录 1 AC6 之于 CLion2 配置 progen3 可执行文件 size 显示优化4 测试 1 AC6 之于 CLion 1&#xff09;在上一篇文章中&#xff0c;我们知道 project generator 通过其 “Write Once, Compile any Tool” &#xff08;跨工具&#xff09;的特性&#xff0c;可以让我们使用…

Vue3:$refs和$parent实现组件通信

在Vue3中&#xff0c;refs和refs和parent是用于组件间通信的重要机制 一.$refs 1.操作子组件数据 一旦获取到子组件的实例&#xff0c;父组件可以修改子组件暴露的变量值&#xff0c;实现父子组件间的直接数据交换。 2.批量处理子组件 $refs可以用于同时获取多个子组件的…

Vue相关

Vue2 组件传递事件&#xff1a; props $emit sync v-model $parent / $children $parent获取父组件的实例&#xff0c;任意调用父组件的方法&#xff0c;修改父组件的数据 ref 父组件获取 子组件 实例&#xff0c;任意调用子组件的方法获取子组件的属性 provide / injectp…

【Linux】环境变量

一、引入环境变量 1.1 引入环境变量 main函数是有参数的&#xff0c;该参数就用来接收命令行参数的。当我们在执行文件的过程中&#xff0c;我们可以输入一些选项。 1.1.1 参数说明 argc&#xff08;argument count&#xff09;&#xff1a;表示命令行参数的数量&#xff0c…

c++ pair

C中的pair是一个模板类&#xff0c;用来存储两个不同类型的对象。它位于<utility>头文件中&#xff0c;并定义在std命名空间中。 pair的定义如下&#xff1a; template <class T1, class T2> struct pair {using first_type T1;using second_type T2;T1 first;…