swift微调Qwen-7B大模型

环境说明:

CUDA相关环境已搭建完成,不会装CUDA环境可参照我的其它文章;

显卡:4张3090

1、安装swift环境

复制代码
#从源码安装
git clone https://github.com/modelscope/swift.git
cd swift
pip install -e .[llm]
pip install -e .[eval]

2、下载Qwen2-7B-Instruct模型

复制代码
from modelscope import snapshot_download
from transformers import AutoModelForCausalLM, AutoTokenizer

model_dir = snapshot_download('qwen/Qwen2-7B-Instruct')

# Loading local checkpoints
# trust_remote_code is still set as True since we still load codes from local dir instead of transformers
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    model_dir,
    device_map="auto",
    trust_remote_code=True
).eval()

3、微调

复制代码
CUDA_VISIBLE_DEVICES=0,1,2,3 \
swift sft --model_type qwen2-7b-instruct \
    --model_id_or_path /root/.cache/modelscope/hub/qwen/Qwen2-7B-Instruct \
    --sft_type lora \
    --dtype AUTO \
    --dataset AI-ModelScope/alpaca-gpt4-data-zh#200 \
    --self_cognition_sample 3000 \
    --model_name 阿盛 Master \
    --model_author 盛世芳华 LLM_ROME \
    --num_train_epochs 1 \
    --lora_rank 8 \
    --lora_alpha 32 \
    --lora_dropout_p 0.05 \
    --lora_target_modules ALL \
    --gradient_checkpointing true \
    --batch_size 1 \
    --weight_decay 0.1 \
    --learning_rate 1e-4 \
    --gradient_accumulation_steps 16 \
    --output_dir output

--model_id_or_path:指定模型路径

--dataset:指定魔搭的数据集ID,我用的是AI-ModelScope/alpaca-gpt4-data-zh数据集

--self_cognition_sample:开启自我认知微调,开启后自动使用魔搭的swift/self-cognition数据集(自我认知微调数据集 · 数据集 (modelscope.cn)

--model_name: 默认为None, None. 如果开启了自我认知数据集的采样(即self_cognition_sample>0), 需要传入两个值, 分别代表模型的中文名和英文名. 例如: --model_name 小黄 'Xiao Huang'

--model_author: 默认为None, None. 如果开启了自我认知数据集的采样, 你需要传入两个值, 分别代表作者的中文名和英文名. 例如: --model_author 魔搭 ModelScope

其它参数可自己调整。

4、pytorch作为后端推理

复制代码
CUDA_VISIBLE_DEVICES=0,1,2,3 swift infer --ckpt_dir ./output/qwen2-7b-instruct/v2-20240822-174710/checkpoint-199

5、合并lora

复制代码
CUDA_VISIBLE_DEVICES=0,1,2,3 swift export --ckpt_dir ./output/qwen2-7b-instruct/v2-20240822-174710/checkpoint-199 --merge_lora true

此时会生成./output/qwen2-7b-instruct/v2-20240822-174710/checkpoint-199-merged,里面就包含了*.safetensors模型文件四个。

6、使用vllm作为后端加速推理

复制代码
pip install vllm

RAY_memory_monitor_refresh_ms=0 CUDA_VISIBLE_DEVICES=0,1,2,3 swift infer --ckpt_dir ./output/qwen2-7b-instruct/v2-20240822-174710/checkpoint-199-merged --infer_backend vllm --tensor_parallel_size 1 --max_model_len 8192 --gpu_memory_utilization 0.95

加速效果非常明显。

7、使用WebUI推理

之前的互动都在CLI中,同时还可通过web界面来互动。

复制代码
swift app-ui --ckpt_dir ./output/qwen2-7b-instruct/v2-20240822-174710/checkpoint-199-merged

访问:127.0.0.1:7860即可。

常见错误

1、ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /home/wuye/anaconda3/envs/tf2/lib/python3.8/site-packages/google/protobuf/pyext/_message.cpython-38-x86_64-linux-gnu.so)

这个是默认路径下的libstdc++.so.6缺少GLIBCXX_3.4.29,解决方法,如下所示:

(1)使用指令先看下系统目前都有哪些版本的

复制代码
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

我这里只到3.28,所以确定是缺少GLIBCXX_3.4.29。

(2)来查看当前系统中其它的同类型文件,找到一个版本比较高的

复制代码
sudo find / -name "libstdc++.so.6*"

找到/opt/conda/lib/libstdc++.so.6.0.29,看看其是否包含需要的版本:

复制代码
strings /opt/conda/lib/libstdc++.so.6.0.29 | grep GLIBCXX

可以看到有需要的版本,接下来就是建立新的链接到这个文件上

复制代码
cp /opt/conda/lib/libstdc++.so.6.0.29 /usr/lib/x86_64-linux-gnu/
rm /usr/lib/x86_64-linux-gnu/libstdc++.so.6
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.29 /usr/lib/x86_64-linux-gnu/libstdc++.so.6

2、Qwen2报错------RuntimeError: "triu_tril_cuda_template" not implemented for 'BFloat16'

说明torch版本太低,我当前版本是2.0.1,升级torch版本到2.2.2即可。

复制代码
pip install torch==2.2.2

参考:

基于SWIFT微调专属于自己的大模型 - 知乎 (zhihu.com)

如何解决version `GLIBCXX_3.4.29' not found的问题_glibcxx not found-CSDN博客

Qwen2报错------RuntimeError: "triu_tril_cuda_template" not implemented for 'BFloat16'_automodelforcausallm runtimeerror: probability ten-CSDN博客 部署llama3时出现RuntimeError: "triu_tril_cuda_template" not implemented for 'BFloat16'报错_the attention mask is not set and cannot be inferr-CSDN博客

Swift微调命令参数 - 岁 - 博客园 (cnblogs.com)

Qwen2-7B-微调-训练-评估_哔哩哔哩_bilibili

相关推荐
Scott9999HH4 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海5 小时前
python 列表、元组、集合和字典
开发语言·python
2501_916008895 小时前
iOS应用开发工具全面解析:如何选择与优化开发效率
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
马优晨6 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区8 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大9 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai9 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜9 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript