文章目录
- 在CFFF云平台使用llama-factory部署及微调Qwen2.5-7B-Instruct
-
- [1. 部署](#1. 部署)
-
- [1. 创建实例](#1. 创建实例)
- [2. 安装环境](#2. 安装环境)
- [3. 下载模型](#3. 下载模型)
- [4. 部署和推理](#4. 部署和推理)
- [2. 微调](#2. 微调)
-
- [1. 数据集准备](#1. 数据集准备)
- [2. 设置微调参数并进行训练](#2. 设置微调参数并进行训练)
- [3. 推理](#3. 推理)
在CFFF云平台使用llama-factory部署及微调Qwen2.5-7B-Instruct
1. 部署
1. 创建实例
24GB的显存基本可以满足7B模型的部署和微调,不过由于CFFF平台都是A100显卡,因此选择一张GPU创建云服务器实例(AI4S_share_queue, A100 * 1, 80G)
2. 安装环境
首先参照官方文档拉取并安装LLaMA-Factory,CFFF的DSW似乎不支持conda创建虚拟环境(可能一个实例就是一个环境?),因此直接在默认环境下安装依赖
安装依赖时需要管理员权限
sh
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
sudo pip install -e ".[torch,metrics]"
配置一下Model Scope下载模型的环境
sh
export USE_MODELSCOPE_HUB=1
# 更改模型缓存地址
export MODELSCOPE_CACHE=/cpfs01/projects-SSD/cfff-d4f7bbbfa159_SSD/zfy_20301030034/modelscope
pip install modelscope vllm
# 安装vllm时可能导致进程killed,需要降低内存安装
# pip install modelscope vllm --no-cache-dir
3. 下载模型
在LLaMa-Factory
目录下新建一个model_download.py
脚本,内容如下:
python
#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen2.5-7B-Instruct')
命令行中运行该脚本,开始模型下载:
sh
python model_download.py
模型下载好会被存在/cpfs01/projects-SSD/cfff-d4f7bbbfa159_SSD/zfy_20301030034/models/modelscope
目录下。
4. 部署和推理
在LLaMa-Factory
目录下新建一个run.sh
脚本,内容如下:
sh
CUDA_VISIBLE_DEVICES=0 python src/webui.py \
--model_name_or_path /cpfs01/projects-SSD/cfff-d4f7bbbfa159_SSD/zfy_20301030034/models/modelscope/hub/Qwen/Qwen2___5-7B-Instruct \
--template qwen \
--infer_backend vllm \
--vllm_enforce_eager
# 默认端口为7860
即可启动webui界面。利用autodl提供的ssh隧道工具,即可在本地访问云服务器的7860端口。修改下图中的配置,点击加载模型,即可完成部署。
加载完成后,问一下模型他是谁,可以看到他认为自己是阿里云开发的通义千问。
2. 微调
1. 数据集准备
使用自我认知微调数据集 · 数据集对Qwen-7B-Instruct进行SFT微调。
该自我认知数据集由modelsope swift创建, 可以通过将通配符进行替换:{{NAME}}、{{AUTHOER}},来创建属于自己大模型的自我认知数据集,总共108条。
不过,该数据集中指令对是以jsonl格式存储的,不符合LLaMA-Factory微调数据集的格式,因此我们首先需要对数据集进行格式的转换。我让cursor给我写了个Python脚本,在进行格式转换的同时顺便进行了通配符的替换。转换后的数据集符合Alpaca格式(详见LLaMA-Factory/data/README_zh.md)
python
import json
# 定义替换值
REPLACEMENTS = {
'zh': {
'{{NAME}}': '小猫',
'{{AUTHOR}}': '瀚海雪豹'
},
'en': {
'{{NAME}}': 'cattt',
'{{AUTHOR}}': 'PolarSnowLeopard'
}
}
def convert_to_alpaca_format(data):
# 获取语言类型的替换值
replacements = REPLACEMENTS[data['tag']]
# 替换响应中的占位符
response = data['response']
for placeholder, value in replacements.items():
response = response.replace(placeholder, value)
# 构建 Alpaca 格式的数据
return {
'instruction': data['query'],
'input': '', # 这个数据集没有额外的输入
'output': response,
'system': '', # 这个数据集没有系统提示词
'history': [] # 这个数据集没有对话历史
}
def main():
# 读取 JSONL 文件
with open('self_cognition.jsonl', 'r', encoding='utf-8') as f:
lines = f.readlines()
# 转换每一行数据
converted_data = []
for line in lines:
if line.strip(): # 跳过空行
data = json.loads(line)
converted_data.append(convert_to_alpaca_format(data))
# 保存为 JSON 文件
with open('self_cognition.json', 'w', encoding='utf-8') as f:
json.dump(converted_data, f, ensure_ascii=False, indent=2)
if __name__ == '__main__':
main()
完成转换后的self_cognition.json
中的数据大概长这样:
json
[
{
"instruction": "你是?",
"input": "",
"output": "我是小猫,由瀚海雪豹训练的人工智能助手。我的目标是为用户提供有用、准确和及时的信息,并通过各种方式帮助用户进 行有效的沟通。请告诉我有什么可以帮助您的呢?",
"system": "",
"history": []
}
....
]
此外,修改一下dataset_info.json
中的数据集元信息:
json
{
"self_cognition": {
"file_name": "self_cognition.json",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output",
"system": "system",
"history": "history"
}
}
}
完成修改后,将self_cognition.json
和dataset_info.json
两个文件上传到云实例。我放在了/cpfs01/projects-SSD/cfff-d4f7bbbfa159_SSD/zfy_20301030034/modelscope/hub/datasets/self_cognition
路径下。
2. 设置微调参数并进行训练
由于对LLM的训练不是很了解,因此大部分参数我都使用的,默认值。主要是设置一下数据集路径,然后把训练轮数调成了100
(默认的3没有收敛,可能是因为这个数据集只有108条数据,有点少)
3. 推理
训练完成后,切换至chat
选项卡,选择"检查点路径"后加载模型,就可以和微调之后的模型对话了
问一下模型他是谁,可以看到他认为自己是瀚海雪豹开发的小猫而不是阿里云开发的通义千问,这说明我们的微调成功了。