0. 模型选择
表1. 一些常见的大模型
名称 | 厂商 | 参数量 | 开源 |
---|---|---|---|
GPT-4 | OpenAI | >175B | N |
Gemini | 谷歌 | 1370B | N |
文心一言4.0 | 百度 | 230B | N |
通义千问 | 阿里云 | >70B | Y |
盘古大模型 | 华为 | >100B | N |
GLM-130B | 智谱AI | 130B | N |
ChatGLM-6B | 智谱AI | 6B | Y |
LLaMA2 | Meta | 7B | Y |
由于显存限制,选择参数量小的ChatGLM3-6B
进行实战。
1. 部署
在以下两种环境中进行了部署测试,其中本地由于GPU显存小而部署失败(见附录)。云环境部署成功,后续都基于该环境。
测试环境 | 操作系统 | 显卡 |
---|---|---|
本地 | windows11 | RTX 4060 (8G) |
算家云 | ubuntu 20.04 | RTX 3090 (24G) |
首先,下载代码库,配置环境,安装依赖。
# 克隆代码
git clone https://gitee.com/mirrors/chatglm3
# 安装依赖
cd chatglm3
##安装配置python和pip
apt-get update
apt-get install python3-dev python3-pip
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
##安装依赖
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install -r requirements.txt
然后,从魔搭(国内网络可以直接访问)下载模型。模型大小约11.6GB,使用cache_dir
指定存放路径。
#git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git
pip install modelscope
# execute in python scripts
from modelscope import snapshot_download
model_dir = snapshot_download('ZhipuAI/chatglm3-6b', cache_dir='/root/chatglm3/model')
最后,通过命令行启动模型。启动前将模型路径修改为存放路径。
basic_demo/cli_demo.py
##修改模型路径
MODEL_PATH = os.environ.get('MODEL_PATH', '/root/chatglm3/model/ZhipuAI\chatglm3-6b')
python cli_demo.py
下图展示了模型启动后的对话界面。
此外,ChatGLM3-6B
还有 3 个超参数。max_length
指定输入和输出 token 的长度限制。temperature
指定模型的温度。温度用于调整单词的概率分布,数值越小,给出的答案越精确。top_p
指定模型采样策略参数。每一步只从累积概率超过 p 的最小单词集合中进行随机采样,而不考虑其它低概率的词。
场景 | temperature 推荐值 | top_p 推荐值 |
---|---|---|
调用工具并根据工具内容回复 | 0.0 | 0.7 |
代码注释生成 | 0.1 | 0.2 |
代码生成 | 0.2 | 0.1 |
数据脚本分析 | 0.2 | 0.1 |
探索性代码编写 | 0.6 | 0.7 |
聊天机器人回复 | 0.5 | 0.5 |
创意写作 | 0.7 | 0.8 |
2. 微调
增强模型能力的方法包括微调、外挂知识库和调用API等。常见的微调方法如下:
- 全量微调FFT
- 参数高效微调PEFT
- Prompt Tuning
- Prefix Tuning
- LoRA
- QLoRA
示例1. 法律小助手
1)需求分析
场景:以问答的方式帮助员工解决日常生活中遇到的法律问题。
落地方式:微调(推理能力强)或知识库(能频繁更新数据)。
2)数据准备
# 1. 下载公共数据集
##https://github.com/SophonPlus/ChineseNlpCorpus/blob/master/datasets/lawzhidao/intro.ipynb
##原始数据是CSV格式,包含4列:title、question、reply、is_best,
# 2. csv格式转换成以下官方微调数据格式(可用GPT生成)
#{
# "conversations":
# [{"role":"user","content":"value1"},
# {"role":"assistant","content":"value2"}]
#},
import csv
import json
import sys
csv_file = sys.argv[1]
json_file = sys.argv[2]
with open(csv_file, 'r') as IN, open(json_file, 'w') as OUT:
for row in csv.DictReader(IN):
title = row['title']
reply = row['reply']
entry = {
'conversations':
[{'role':'user', 'content':title},
{'role':'assistant', 'content':reply}
]}
line = json.dumps(entry, ensure_ascii=False)
OUT.write(line+'\n')
执行上述脚本python csv2json.py lawzhidao_filter.csv law.json
即可。
3)微调
首先,安装微调的依赖。
cd finetune_demo
pip install -r requirements.txt
#deepspeed...op_builder.builder.MissingCUDAException: CUDA_HOME does not exist, unable to compile CUDA op(s)
#apt install nvidia-cuda-toolkit
#mpi4py...ERROR: Could not build wheels for mpi4py which use PEP 517 and cannot be installed directly
#(x)pip install --upgrade pip setuptools wheel #version
#
#
然后,准备测试集和验证集。
#wc -l law.json
head -n 36000 law.json > law_train.json
tail -n 368 law.json > law_val.json
接着,通过finetune_demo/configs/lora.yaml
文件修改配置。
- data_config
- train_file:训练集路径
- val_file:验证集路径
- test_file:测试集路径
- num_proc:进程数
- max_(input|output)_length:(输入|输出)序列的最大长度。
- training_args
- output_dir:模型输出目录
- max_steps:最大训练轮数
- per_device_train_batch_size:每个设备的训练批次大小
- …
- peft_config
- peft_type:微调类型,LORA
- task_type:任务类型
- r:lora矩阵的秩
- lora_alpha
- lora_dropout
然后,开始微调。
python3 finetune_hf.py data ../model configs/lora.yaml
4)验证
python3 inference_hf.py \
output/checkpoint-3000/ \ #新权重
--prompt "xxxxxxxxxxxx" #输入的提示
5)提供服务
可以通过 API 组件将模型的输入输出封装成接口对外提供服务。实际生产环境中,还需要考虑:
- 模型的推理性能(效果);
- 模型的推理吞吐量;
- 服务的限流,适当保护大模型集群;
- 服务降级,隐藏暂停使用。
具体见第4部分。
附录
部署失败记录-RTX4060
(1)源码下载和依赖安装–pass
# 克隆代码
git clone https://gitee.com/mirrors/chatglm3
# 安装依赖
cd ChatGLM3
## 虚拟环境
#pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
#pip install virtualenv
virtualenv -p D:\py\py311\python.exe vtenv
vtenv\Scripts\activate
## 安装依赖:出现的问题包括 fbgemm.dll依赖缺失 和 vLLM无法安装
pip install -r requirements.txt
#Error loading "...\overlay\Lib\site-packages\torch\lib\fbgemm.dll
#(x)pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
#(√)https://www.jb51.net/python/3260230n0.htm
#https://www.bilibili.com/opus/967745334024339490
#AssertionError: vLLM only supports Linux platform
#(√)delete vllm from requirement.txt
#print(torch.cuda.is_available())
#True
(2)模型下载–pass
#git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git
pip install modelscope
# execute in python
from modelscope import snapshot_download
model_dir = snapshot_download('ZhipuAI/chatglm3-6b', cache_dir='E:\chatglm3_6b_model')
(3)通过命令行启动模型–failed(torch.OutOfMemoryError)
basic_demo/cli_demo.py
##修改模型路径
MODEL_PATH = os.environ.get('MODEL_PATH', '..\chatglm3_6b_model\ZhipuAI\chatglm3-6b')
##修改CPU或精度
###模型默认以FP16 精度加载,需要约13GB显存。
###如果修改为通过CPU启动,需要约32G内存。
###如果将精度修改为4-bit,需要约6GB显存。
model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True).float() #CPU
model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True).quantize(bits=4,device="cuda").cuda().eval() #4-bit
python cli_demo.py
#torch.OutOfMemoryError
#(x)set 'PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128'
参考
独行.《AI大模型实战高手课》
御坂19610号.【经验分享】ChatGLM3-6B大模型本地部署 Windows + Pycharm