前言
小白微调部署笔记
系统:
图形化Ubuntu20.04
主要硬件:
RTX4090 24G
使用的工具:
Miniconda、pip、git等
Ubuntu系统初始化配置:
1.安装vim编辑器
sudo apt install vim
2.安装Miniconda
自行查找教程安装
一、部署
1.创建下载路径并切换到下载路径
mkdir modes
cd modes
2.下载Qwen1.5-7B源代码
git clone https://github.com/QwenLM/Qwen.git
3.养成好习惯,使用conda创建conda环境,然后激活创建的环境
conda create -n qwen1.5 python==3.10.1
conda activate qwen1.5
4.在conda环境中安装pytorch
在安装之前建议先升级pip版本
python -m pip install --upgrade pip
然后安装pytorch(这里需要根据自己的GPU来选择合适的pytorch版本)
新开一个终端使用命令查询支持的cuda版本
nvidia-smi
然后去官网:https://pytorch.org/get-started/locally/#/选择合适的版本下载即可
pip3 install torch torchvision torchaudio
没看懂的自行百度学习
5.使用pip安装模型运行的项目依赖
pip install -r requirements.txt
6.切换至模型源代码位置
cd Qwen
7.下载魔塔社区的权重模型
在下载权重模型前需要先安装git-lfs这个工具
sudo apt-get install git-lfs
然后就可以初始化git lfs并且下载权重模型
git lfs install
git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat.git
8.安装web UI的依赖包
pip install -r requirements_web_demo.txt
9.完成以上操作后就可以尝试运行部署的本地模型了
python web_demo.py --server-name 0.0.0.0 -c /home/intel/modes/Qwen/Qwen-7B-Chat
#/home/intel/modes/Qwen/Qwen-7B-Chat为权重模型文件路径
二、微调
这里使用法律条文为数据集来微调模型
1.选择一个路径来下载数据集
这里新建了一个文件夹来放置数据集
mkdir shujuji
cd shujuji
git lfs install
git clone https://www.modelscope.cn/datasets/Robin021/DISC-Law-SFT.git
2.然后将下载的文件进行格式转换
cd ..
vim process_date_law.py
import json
# 读取以.jsonl结尾的文件
json_data = []
with open('/home/intel/modes/Qwen/shujuji/DISC-Law-SFT/DISC-Law-SFT-Triplet-released.jsonl', 'r', encoding='utf-8') as file:
for line in file:
data = json.loads(line)
json_data.append(data)
# 待填入的模板
template = []
# 遍历json数据集
for idx, data in enumerate(json_data[:]):
conversation = [
{
"from": "user",
"value": data["input"]
},
{
"from": "assistant",
"value": data["output"]
}
]
template.append({
"id": f"identity_{idx}",
"conversations": conversation
})
print(len(template))
# 输出填充数据后的模板
print(json.dumps(template[2], ensure_ascii=False, indent=2))
# 将template写入到本地文件
output_file_path = "train_data_law.json"
with open(output_file_path, 'w', encoding='utf-8') as f:
json.dump(template, f, ensure_ascii=False, indent=2)
print(f"处理好的数据已写入到本地文件: {output_file_path}")
编辑完成后按键盘上的 Esc 键,在英文输入法下输入 :wq 退出文本编辑
3.运行转换脚本
python process_date_law.py
4.安装微调所需的依赖包
pip install "peft<0.8.0" deepspeed
5.更改微调脚本中的路径
vim finetune/finetune_lora_single_gpu.sh
# MODEL="/home/intel/modes/Qwen/Qwen-7B-Chat"
# DATA="/home/intel/modes/Qwen/train_data_law.json"
# 更改脚本中模型和数据集位置
编辑完成后按键盘上的 Esc 键,在英文输入法下输入 :wq 退出文本编辑
6.开始微调训练
运行下面的命令,然后就是漫长的等待
bash finetune/finetune_lora_single_gpu.sh
7.合并训练后的模型
训练完成后就会有一个文件夹output_qwen,选择其中的一个checkpoint-xxxx
vim qwen_lora_merge.py
# 将path_to_adapter = "/home/intel/modes/Qwen/output_qwen/checkpoint-xxxx"中的checkpoint-xxxx换成具体的
# 1. 模型合并
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
# 确保路径字符串使用正确的引号
path_to_adapter = "/home/intel/modes/Qwen/output_qwen/checkpoint-xxxx"
new_model_directory = "/home/intel/modes/Qwen/Qwen-7B-Chat_law"
# 使用AutoPeftModelForCausalLM类从预训练的模型中加载模型
model = AutoPeftModelForCausalLM.from_pretrained(
path_to_adapter, # 模型输出目录的路径
device_map="auto", # 让模型自动选择设备
trust_remote_code=True # 信任远程代码
).eval() # 评估模式
# 合并模型并卸载不需要的部分
merged_model = model.merge_and_unload()
# 保存合并后的模型,max_shard_size和safe_serialization参数根据需要设置
merged_model.save_pretrained(
new_model_directory,
max_shard_size="2048MB", # 设置分片大小
safe_serialization=True # 安全序列化
)
# 2. 分词器保存
# 使用AutoTokenizer类从预训练的模型中加载分词器
tokenizer = AutoTokenizer.from_pretrained(
path_to_adapter, # 分词器的输出目录路径
trust_remote_code=True # 信任远程代码
)
# 保存分词器到指定目录
tokenizer.save_pretrained(new_model_directory)
8.至此微调训练也完成了
然后可以运行微调后的模型尝试一番
python web_demo.py --server-name 0.0.0.0 -c /home/intel/modes/Qwen/Qwen-7B-Chat_law