前言:
ChatGLM-6B是清华大学知识工程和数据挖掘小组(Knowledge Engineering Group (KEG) & Data Mining at Tsinghua University)发布的一个开源的对话机器人,由清华技术成果转化的公司智谱 AI 开源,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。
本文档在火山引擎上使用一台两卡A10或A30的 GPU云服务器,利用Conda创建虚拟环境部署ChatGLM-6B模型,并进行模型推理和精调训练的Demo实践。
准备工作:
创建GPU云服务器
-
进入ECS云服务器控制台界面,点击创建实例
-
在实例类型中,选择GPU计算型,可以看到有A30、A10、V100等GPU显卡的ECS云主机,操作系统镜像选择Ubuntu 带GPU驱动的镜像,火山引擎默认提供的GPU驱动版本为CUDA11.3,如果需要升级版本的话可以参考后面的步骤,配置GPU服务器。
配置网际快车加速下载服务(可选)
网际快车是火山引擎提供的海外资源加速下载网络服务,可以加速火山引擎VPC中的ECS云服务下载如Github、Huggingface等海外网站,当前该服务需要开白名单才能使用,可以通过提工单方式开启白名单功能。
- 进入VPC私有网络服务的控制台,点击左边菜单栏的公网访问服务,可以看到网际快车子服务。
- 点击创建网际快车,在配置界面中选择相应的服务所在地域、带宽大小,并且关联要加速的VPC私有网络。
- 网际快车服务创建完成后在服务列表界面可以看创建好的服务名称,以及分配到的加速IP地址和加速的端口号3128,接下来只需要将网际快车关联VPC中的ECS云服务器上配置该加速IP和端口。
- 登录到ECS中进行配置
- 常规加速 HTTP/HTTPS
export HTTP_PROXY=http://vip:3128 export HTTPS_PROXY=http://vip:3128 或 export http_proxy=http://vip:3128 export https_proxy=http://vip:3128
-
注意部分命令的大小写敏感,如wget只能设置成小写http_proxy和https_proxy而非HTTP_PROXY和HTTPS_PROXY
- 加速 docker 镜像拉取可参考 Docker 官网文档,配置 「HTTP/HTTPS proxy」
HTTP_PROXY=http://proxy.example.com:80 HTTPS_PROXY=https://proxy.example.com:443 替换为 HTTP_PROXY=http://加速ip:3128 HTTPS_PROXY=http://加速ip:3128
-
注意 HTTPS_PROXY 中的配置的是 http,而不是 https
- 加速 Github HTTPS 方式 clone 代码
// for github.com and git version > 1.8.5 git config --global http.https://github.com.proxy http://vip:3128 // for other cases git config --global http.proxy http://vip:3128 git config --global https.proxy http://vip:3128
安装配置GPU服务器
- 更新apt资源列表:apt-get update
- 安装Git工具包
apt install git glf
- 使用nvidia-smi查看ECS的GPU信息,包括显卡规格型号、数量、CUDA驱动版本等信息,火山引擎默认提供11.4的CUDA驱动版本。
-
升级CUDA驱动(可选): 火山引擎为GPU机型提供的Ubuntu操作系统默认采用11.4的CUDA驱动,可以选择自己升级CUDA驱动版本,方法如下。
- 升级新CUDA驱动版本前需要把使用旧版本驱动的服务进程都关闭,否则会报错无法升级。因为火山引擎Ubuntu20.04的操作系统中的监控服务默认使用CUDA驱动,使用下面的命令先关闭监控服务。
systemctl stop cloud-monitor-agent
- 从英伟达官网https://developer.nvidia.com/cuda-downloads下载所需版本的CUDA工具包到ECS本地云盘中的某个文件中,工具下载页面会自动生成下载和安装运行命令,下图下载了11.6版本的cuda_11.6.0_510.39.01_linux.run工具包。
- 运行sh cuda_11.6.0_510.39.01_linux.run命令安装更新,会跳出用户授权界面,输入accept后选择需要安装的工具组件。
- 更新完驱动后,再次输入nvidia-smi命令,可以看到CUDA驱动的版本由原来的11.4升级到了11.6。
-
重新开启火山引擎默认的ECS监控服务、
systemctl start cloud-monitor-agent
- 升级新CUDA驱动版本前需要把使用旧版本驱动的服务进程都关闭,否则会报错无法升级。因为火山引擎Ubuntu20.04的操作系统中的监控服务默认使用CUDA驱动,使用下面的命令先关闭监控服务。
-
安装Conda环境:
-
下载Conda安装包到ECS本地 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2022.10-Linux-x86_64.sh,然后运行bash ./Anaconda3-2022.10-Linux-x86_64.sh命令安装Conda程序。
-
同意安装条款,默认会安装到/root/Anaconda3目录下,选择yes将Conda的安装路径写入到.bashrc中。
-
因为Conda安装在Ubuntu服务器上,所以选择不安装Visual Studio Code开发工具
-
Conda安装成功后需要重新打开一个终端窗口才能生效,输入Conda -V查看版本信息。
-
更新Conda国内镜像源:因为conda默认使用的是官方镜像源是在国外,安装下载速度会很慢,一般建议添加国内的清华镜像源
#添加Anaconda的TUNA镜像 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ #第三方镜像源 ## Conda Forge conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ ## msys2 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/ ## bioconda conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/ ## menpo conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/ ## pytorch conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
-
设置SSL认证方式为false,确保后续创建conda虚拟环境时从镜像源能成功安装组件。
conda config --set ssl_verify false
-
输入 conda config --show channels查看镜像源是否添加成功
-
部署ChatGLM模型:
部署推理服务
-
创建一个chatglm的Conda虚拟环境
conda create -n chatglm python=3.8
-
使用conda activate chatglm命令激活conda虚拟环境
-
下载ChatGLM-6B源代码到服务器本地上
git clone https://github.com/THUDM/ChatGLM-6B
-
进入到ChatGLM-6B文件夹中,使用pip命令安装requirements.txt中的组件,-i 参数使用火山的pip源
pip install -r requirements.txt -i https://mirrors.ivolces.com/pypi/simple/
-
下载ChatGLM-6B模型:因为从Hugging Face Hub 上下载模型的checkpoint 的速度很慢,我们把模型先保存到本地。在ChatGLM-6B文件夹中用mkdir命令创建一个model文件夹,从Huggingface上下载ChatGLM-6B的model card (https://huggingface.co/THUDM/chatglm-6b)到model文件夹中,从 Hugging Face Hub 下载模型需要先安装Git LFS,我们在准备工作阶段已经安装过。
git clone https://huggingface.co/THUDM/chatglm-6b
- ChatGLM-6B的源代码中提供了网页版Demo和CLI版Demo,根据我们的配置环境修改对应的代码
-
网页版demo
-
修改文件web_demo.py中模型的本地加载地址为存放ChatGLM-6B是checkpoint地址,如model/chagtlm-6b。
-
修改web_demo.py最后一行,增加server_name="0.0.0.0", server_port=1234两个参数,使得我们能从浏览器1234端口访问web端的demo页面。
- 在命令行中输入python web_demo.py启动web_demo
- 在ECS控制台上找到GPU ECS的EIP地址,加上1234端口在浏览器中进行web demo的体验
-
-
CLI版Demo
-
修改cli_demo.py文件中模型的本地加载地址为存放ChatGLM checkpoint的地址,如model/chagtlm-6b。
-
运行python cli_demo.py启动CLI Demo
-
单卡精调训练
对于ChatGLM-6B 模型基于 P-Tuning v2 的微调。P-Tuning v2 将需要微调的参数量减少到原来的 0.1%,再通过模型量化、Gradient Checkpoint 等方法,最低只需要 7GB 显存即可运行。下面以 ADGEN (广告生成) 数据集为例介绍精调的使用方法。
-
安装依赖包
pip install rouge_chinese nltk jieba datasets -i https://mirrors.ivolces.com/pypi/simple/
-
安装cuda toolkit,cuda tookit在火山内部有ubuntu的镜像源,下载安装会非常快。
apt install nvidia-cuda-toolkit
-
安装成功后可以在命令行输入nvcc -V查看cuda编译工具版本号
-
进入ptuning文件夹,下载并解压ADGEN广告训练数据集,数据集为根据输入(content)生成一段广告词(summary)如下
{ "content": "类型#上衣*版型#宽松*版型#显瘦*图案#线条*衣样式#衬衫*衣袖型#泡泡袖*衣款式#抽绳", "summary": "这件衬衫的款式非常的宽松,利落的线条可以很好的隐藏身材上的小缺点,穿在身上有着很好的显瘦效果。领口装饰了一个可爱的抽绳,漂亮的绳结展现出了十足的个性,配合时尚的泡泡袖型,尽显女性甜美可爱的气息。" }
-
使用单GPU卡精调:编辑train.sh 可以修改精调训练的配置参数,为了保证单卡显存不会OOM,可以参考如下图配置。
-
命令行中输入bash train.sh启动模型精调训练
多卡精调训练
通过使用DeepSpeed分布式并行训练框架进行模型全参数的精调,多机多卡的分布式训练可以大大节约精调训练的时间,此处以A10双卡并行精调训练。
- 安装DeepSpeed组件
pip install deepspeed -i https://mirrors.ivolces.com/pypi/simple/
-
修改ds_train_finetune.sh文件,将--num_gpu修改为多卡训练中的gpu卡数量,为了保证双卡并行训练时显存不会OOM,其他参数可以参考如下图配置。
-
运行bash ds_train_finetune.sh命令进行双卡训练精调,大约只需要40分钟就能完成精调训练训练。
-
在ECS的监控服务中可以查看到两张A10卡显存和GPU使用率。