一、背景介绍
ChatGLM-6B 是有清华大学开源的、支持中英双语对话的大语言模型,该模型基于 General Language Model(GLM)架构,具有 62 亿参数,并针对中文问答和对话进行了优化,可以生成符合人类偏好的回答。ChatGLM-6B 具备基本的中文问答能力,可以部署为一个聊天机器人。官方提供了几个使用实例:自我认知、提纲写作、文案写作、邮件助手、信息抽取、角色扮演、评论比较以及旅游向导等。
本文将基于阿里云 AMD 服务器和 ChatGLM-6B 大模型,快速搭建出个人版聊天机器人。
特别提醒:
阿里云不对第三方模型 ChatGLM-6B 的合法性、安全性、准确性进行任何保证,阿里云不对由此引发的任何损害承担责任。ChatGLM-6B 的代码依照 Apache-2.0 协议开源,ChatGLM-6B 模型权重的使用遵循 Model License。您应自觉遵守第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。
二、创建 ECS 实例
创建 ECS 实例时需要根据模型的大小对实例规格进行选择。根据官方文档中对 CPU 部署的说明,ChatGLM-6B 大概需要 32GB 内存,为了保证模型运行的稳定,实例规格至少需要选择 ecs.g8a.4xlarge(64GB 内存)。同时,整个 ChatGLM-6B 模型下载完会占用 26GB 的存储空间,为了保证运行环境能顺利安装,存储盘至少需要 100GB。最后,为了保证环境安装以及模型下载的速度,实例带宽分配 100Mbps。
实例操作系统选择 Alibaba Cloud Linux 3.2104 LTS 64 位。
三、部署流程
1.软件安装配置
在部署 ChatGLM-6B 之前,需要安装一些必备软件,以及 Python 3.8(系统自带的 Python 版本为 3.6,不满足部署 ChatGLM-6B 的最低版本要求)。
# yum install tmux git git-lfs wget curl gcc gcc-c++ \ tar unzip hwloc python38
安装完成后需要指定系统默认的 Python 版本为 3.8,有多种方法可以实现,这里使用 update-alternatives
命令,需要根据提示选择上一步安装的 Python 3.8。
# update-alternatives --config python
随后需要更新对应版本的 pip,方便后续部署 Python 环境。
# python -m ensurepip --upgrade # python -m pip install --upgrade pip
后续下载预训练模型需要启用 Git LFS 的支持。
# git lfs install
2.下载源码与模型
下载 GitHub 项目源码,以及预训练模型。ChatGLM-6B 模型权重对学术研究完全开放,免费商用需填写 问卷 登记。这里的模型下载仅作为演示,不承担任何法律责任。
下载预训练模型耗时较长,且成功率受网络情况波动较大,建议在 tmux 中运行。
# git clone https://github.com/THUDM/ChatGLM-6B.git # git clone https://huggingface.co/THUDM/chatglm-6b
下载完毕后,当前目录如下所示。
# ls -l total 8 drwxr-xr-x 3 root root 4096 Jul 19 13:24 chatglm-6b drwxr-xr-x 9 root root 4096 Jul 19 12:34 ChatGLM-6B
3.部署运行环境
Python 的运行环境使用 pip 进行安装。由于后续安装的 ZenDNN 要求使用 CPU 版本的 PyTorch,所以需要手动安装所有依赖。
注意 pip 对应的 Python 版本,使用 pip -V
查看。系统自带 Python 版本过低,与依赖包版本不兼容。
# pip install protobuf transformers==4.27.1 cpm_kernels gradio \ mdtex2html sentencepiece accelerate streamlit streamlit-chat # pip install torch==1.12.0+cpu torchvision==0.13.0+cpu \ --extra-index-url https://download.pytorch.org/whl/cpu
下载安装 ZenDNN。
解压完成后务必进入 ZenDNN 目录进行操作。
# wget https://download.amd.com/developer/eula/zendnn/zendnn-4-0/pytorch-end-user-license/PT_v1.12_ZenDNN_v4.0_Python_v3.8.zip # unzip PT_v1.12_ZenDNN_v4.0_Python_v3.8.zip # cd PT_v1.12_ZenDNN_v4.0_Python_v3.8/ # source scripts/PT_ZenDNN_setup_release.sh
ZenDNN 的安装日志中明确说明了,需要我们针对硬件平台显式设置两个环境变量 OMP_NUM_THREADS
、GOMP_CPU_AFFINITY
。
# cat > /etc/profile.d/env.sh <<EOF export OMP_NUM_THREADS=\$(nproc --all) export GOMP_CPU_AFFINITY=0-\$(( \$(nproc --all) - 1 )) EOF # source /etc/profile
4.模型调用
运行环境安装完毕后,可以直接在 Python 解释器中调用模型进行测试。
# python >>> from transformers import AutoTokenizer, AutoModel >>> tokenizer = AutoTokenizer.from_pretrained("/root/chatglm-6b", trust_remote_code=True) >>> model = AutoModel.from_pretrained("/root/chatglm-6b", trust_remote_code=True).float() >>> model = model.eval() >>> response, history = model.chat(tokenizer, "你好", history=[]) >>> print(response) 你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。 >>> response, history = model.chat(tokenizer, "晚上睡不着应该怎么办", history=history) >>> print(response) 以下是一些可能有助于改善睡眠质量的建议: 1. 保持舒适的睡眠环境:确保房间安静、黑暗、凉爽和舒适,并尽可能减少噪音和干扰。 2. 放松身心:在睡前进行一些放松活动,如冥想、深呼吸、瑜伽或温水泡脚等,有助于缓解压力和焦虑。 3. 避免刺激性物质:避免饮用含咖啡因的饮料,如咖啡、茶和可乐,以及食用过多糖分和高脂肪的食物。 4. 限制屏幕时间:睡前避免使用手机、平板电脑和其他电子设备,因为这些设备会发出蓝光,可能会干扰睡眠。 啜饮一杯温牛奶或食用一些含丰富蛋白质和碳水化合物的食物,如面包或饼干,有助于提供身体所需的营养和能量。 如果这些方法不能改善睡眠质量,建议咨询医生或睡眠专家。
5.部署命令行 Demo
ChatGLM-6B 源码中提供了命令行 Demo,可以通过命令行实现模型交互。命令行 Demo 中可以输入问题对模型提问,或者输入 clear
清除对话历史,输入 stop
退出程序。
# cd ChatGLM-6B # sed -i 's?THUDM/chatglm-6b?/root/chatglm-6b?g' cli_demo.py # sed -i 's/.half().cuda()/.float()/g' cli_demo.py # python cli_demo.py
6.部署网页版 Demo
ChatGLM-6B 源码中提供了网页版 Demo,可以进行部署实现网页交互。
# cd ChatGLM-6B # sed -i 's?THUDM/chatglm-6b?/root/chatglm-6b?g' web_demo.py # sed -i 's/.half().cuda()/.float()/g' web_demo.py # sed -i 's/share=False/share=True/g' web_demo.py # python web_demo.py ... Running on local URL: http://127.0.0.1:7860 Running on public URL: https://5d485bf0e420b5be3f.gradio.live ...
运行成功后,打开命令回显信息中的公开链接(public URL)就能够访问部署的服务。
该网页 Demo 会将所有网络请求经过 Gradio 服务器转发,在国内访问较为缓慢,体验较差。可以部署基于 Streamlit 的网页版 Demo。
# cd ChatGLM-6B # sed -i 's?THUDM/chatglm-6b?/root/chatglm-6b?g' web_demo2.py # sed -i 's/.half().cuda()/.float()/g' web_demo2.py # streamlit run web_demo2.py --server.port 7860 ... Network URL: http://<ECS INTERNAL IP>:7860 External URL: http://<ECS EXTERNAL IP>:7860 ...
部署完成后可以通过外部链接(External URL)访问服务。
访问服务前需要在实例的安全组中添加端口(7860)规则。具体操作参见 添加安全组规则。
四、自动化部署
除了手动进行部署 ChatGLM-6B 大模型之外,本文还提供了 自动部署脚本,可以实现一键部署运行。
# wget https://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/file-manage-files/zh-CN/20230804/bfkf/deploy_chatglm-6b.sh # chmod +x deploy_chatglm-6b.sh # ./deploy_chatglm-6b.sh
脚本运行中会下载模型文件,耗时较长。运行时请保持网络连接,或者使用 tmux 等工具保持脚本的运行。脚本出现下图的回显信息,则说明脚本运行完毕,服务已经在后台运行了,此时通过外部链接(External URL)即可访问服务。