Docker - 本地部署运行ChatGLM模型、及镜像构建教程(使用CPU运行、ChatGLM.cpp)
一、基本介绍
1,ChatGLM3 介绍
(1)ChatGLM3 是智谱 AI 和清华大学 KEG 实验室联合发布的对话预训练模型。
- GitHub 主页:https://github.com/THUDM/ChatGLM3
(2)ChatGLM3-6B 是 ChatGLM3 系列中的开源模型,在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上,ChatGLM3-6B 引入了如下特性:
- 更强大的基础模型: ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不同角度的数据集上测评显示,ChatGLM3-6B-Base 具有在 10B 以下的基础模型中最强的性能。
- 更完整的功能支持: ChatGLM3-6B 采用了全新设计的 Prompt 格式 ,除正常的多轮对话外。同时原生支持工具调用(Function Call)、代码执行(Code Interpreter)和 Agent 任务等复杂场景。
- 更全面的开源序列: 除了对话模型 ChatGLM3-6B 外,还开源了基础模型 ChatGLM3-6B-Base、长文本对话模型 ChatGLM3-6B-32K 和进一步强化了对于长文本理解能力的 ChatGLM3-6B-128K。以上所有权重对学术研究完全开放 ,在填写问卷进行登记后亦允许免费商业使用。
2,ChatGLM.cpp 介绍
(1)ChatGLM.cpp 是基于 ggml 的纯 C++ 实现,工作方式与 llama.cpp 相同。可以支持在 CPU 上面跑模型,而无需 GPU 显卡支持。
- GitHub 主页:https://github.com/li-plus/chatglm.cpp
(2)ChatGLM.cpp 通过 int4/int8 量化、优化的 KV 缓存和并行计算加速内存高效的 CPU 推理。
(3)ChatGLM.cpp 支持的模型有 ChatGLM-6B、ChatGLM2-6B、ChatGLM3-6B、CodeGeeX2、Baichuan-13B、Baichuan-7B、Baichuan-13B、Baichuan2、InternLM
二、使用 Docker 运行 ChatGLM3-6B 模型
1,准备工作
(1)首先需要准备一台服务器,由于模型比较大,配置要求如下:
- 内存:8G 及以上
- 硬盘:100G 及以上
(2)服务器需要安装 Docker 环境,具体可以参考我之前写的文章:
(3)由于要从 GitHub 上面下载项目,服务器还需要安装 Git 工具,比如 CentOS 系统执行如下命令安装:
yum install git
2,下载项目代码
(1)首先执行如下命令将 ChatGLM.cpp 以及它依赖的项目下载到本地:
(2)为了之后我们能够从外面访问 Web 服务,需要修改项目里的 web_demo.py 文件:
(3)将文件最下放的 IP 修改成 0.0.0.0 并指定端口。
(4)注意 web_demo.py 文件内容的最上方指定了默认使用的 ggml 模型名称为 chatglm-ggml.bin,如何后面我们转换后的模型使用的不是这个名称则可以在此修改(当然也可以执行 web_demo.py 时通过 -m 参数指定模型)
git clone --recursive https://github.com/li-plus/chatglm.cpp.git
- 如果同时下载超时的话,也可以使用如下命令分开下载:
git clone https://github.com/li-plus/chatglm.cpp.git cd chatglm.cpp/third_party git clone https://github.com/ggerganov/ggml.git git clone https://github.com/pybind/pybind11.git git clone https://github.com/google/sentencepiece.git
- 如果无法直接访问 GitHub,或者网络不好,也可以使用如下命令通过 GitHub 代理下载:
git clone https://mirror.ghproxy.com/https://github.com/li-plus/chatglm.cpp.git cd chatglm.cpp/third_party git clone https://mirror.ghproxy.com/https://github.com/ggerganov/ggml.git git clone https://mirror.ghproxy.com/https://github.com/pybind/pybind11.git git clone https://mirror.ghproxy.com/https://github.com/google/sentencepiece.git
(2)为了之后我们能够从外面访问 Web 服务,需要修改项目里的 web_demo.py 文件:
vi chatglm.cpp/examples/web_demo.py
(3)将文件最下放的 IP 修改成 0.0.0.0 并指定端口。
demo.queue().launch(share=False, inbrowser=True, server_name="0.0.0.0", server_port=7860)
(4)注意 web_demo.py 文件内容的最上方指定了默认使用的 ggml 模型名称为 chatglm-ggml.bin,如何后面我们转换后的模型使用的不是这个名称则可以在此修改(当然也可以执行 web_demo.py 时通过 -m 参数指定模型)
3,准备基础镜像
(1)首先我们执行如下命令拉取 python 的基础镜像:
(2)接着执行如下命令运行容器:
docker pull python:slim-bullseye
(2)接着执行如下命令运行容器:
docker run -itd --name python -p 8000:8000 -p 7860:7860 -v `pwd`/chatglm.cpp:/data python:slim-bullseye
4,安装依赖包
(1)首先执行如下命令进入刚才运行的容器:
(2)如果是国内服务器可以执行如下命令配置 python 的源,避免后续依赖包安装失败。如果是国外服务器可以跳过此步骤。
docker exec -it python bash
(2)如果是国内服务器可以执行如下命令配置 python 的源,避免后续依赖包安装失败。如果是国外服务器可以跳过此步骤。
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ pip config set install.trusted-host mirrors.aliyun.com/pypi/simple/ echo "deb https://mirrors.aliyun.com/debian/ bullseye main contrib non-free" > /etc/apt/sources.list && \ echo "deb https://mirrors.aliyun.com/debian/ bullseye-updates main contrib non-free" >> /etc/apt/sources.list && \ echo "deb https://mirrors.aliyun.com/debian/ bullseye-backports main contrib non-free" >> /etc/apt/sources.list && \ echo "deb https://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list
(3)接着执行如下命令更新 apt 软件包列表并安装 g++ 编译器和 cmake 构建系统
apt-get update && apt-get -y install g++ cmake
(4)然后执行如下命令安装 pytorch,这里我们只安装 cpu 版本的 pytorch ,可以减少镜像大小。
pip install torch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 --index-url https://download.pytorch.org/whl/cpu
(5)接着执行如下命令安装一些必要的依赖库:
pip3 install uvicorn fastapi sse_starlette chatglm-cpp tabulate tqdm gradio transformers accelerate sentencepiece
5,下载模型
(1)首先进入 data 目录:cd /data
(2)接着执行如下命令安装 Git LFS,以支持 git 大文件下载:
apt-get install git-lfs
(3)然后执行如下命令从 huggingface 上下载模型:
git clone https://huggingface.co/THUDM/chatglm3-6b
- 如果国内网络无法访问 huggingface,我们也可以从魔塔社区上下载:
git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git
(4)由于模型比较大,需要耐心等待一段时间(大概一个小时左右):
6,模型转换
(1)接下来我们要使用 convert.py 将下载下来的 ChatGLM3-6B 转换为量化的 GGML 格式。转换时我们可以自由选择以下量化类型之一,通过指定 -t 来指定:
- q4_0:使用 fp16 尺度的 4 位整数量化。
- q4_1:使用 fp16 尺度和最小值的 4 位整数量化。
- q5_0:使用 fp16 尺度的 5 位整数量化。
- q5_1:使用 fp16 尺度和最小值的 5 位整数量化。
- q8_0:使用 fp16 尺度的 8 位整数量化。
- f16:半精度浮点权重,无量化。
- f32:单精度浮点权重,无量化。
(2)不同的量化类型最终生成的模型大小、占用内存、推理耗时都有差别:
(3)比如下面命令将原始模型转换为 q4_0(量化 int4)GGML 模型,可以看到转换后的模型体积只有 3.3G:
python3 chatglm_cpp/convert.py -i chatglm3-6b -t q4_0 -o chatglm-ggml.bin
7,启动 web 服务
(1)执行如下命令启动 web demo 服务:
(2)如果没有报错,说明启动成功了,端口是 7860:
python3 /data/examples/web_demo.py
(2)如果没有报错,说明启动成功了,端口是 7860:
(3)使用浏览器访问 http://服务器IP:7860,即可通过对话使用 ChatGLM 模型了:
附:将模型服务打包镜像,方便在其他服务器上部署使用
方法1:直接使用 docker commit 通过容器创建镜像
(1)首先我们执行前面的一系列操作后得到一个可以运行 ChatGLM 模型的容器,然后执行如下命令使用该容器创建一个镜像:
docker commit python mychatglm:1.0
(2)镜像制作完毕后,如果需要使用模型服务执行下面命令启动容器:
注意:这种方式镜像内仅包含运行环境,没有模型。如果要迁移至其他服务上,除了需要将镜像导入过去外,还需要把 chatglm.cpp 复制过去,并在容器启动时进行映射。
docker run -itd --name mychatglm -p 8000:8000 -p 7860:7860 -v `pwd`/chatglm.cpp:/data mychatglm:1.0
docker exec mychatglm python3 /data/examples/web_demo.py
方法2:使用 docker commit+Dockerfile 创建镜像
(1)如果想将模型一起打包到镜像中,我们首先通过方法 1 创建一个不带模型的镜像,为了减小最终模型的体积,我们可以将 chatglm.cpp 里面的原始模型删除(因为我们实际用的是量化后的 gglm 模型):
rm -rf chatglm.cpp/chatglm3-6b/
(2)然后执行如下命令进入 chatglm.cpp,并创建一个 Dockerfile 文件:
(4)保存退出后执行如下命令制作镜像:
cd chatglm.cpp vi Dockerfile
(3)Dockerfile 文件内容如下:
FROM mychatglm:1.0 # 拷贝本地文件到目录 COPY . /data WORKDIR /data EXPOSE 8000 7860 ENTRYPOINT ["python3", "/data/examples/web_demo.py"]
(4)保存退出后执行如下命令制作镜像:
docker build . -t mychatglm:2.0
(5)镜像制作完毕后,如果需要使用模型服务执行下面命令启动容器:
docker run -itd --name mychatglm -p 8000:8000 -p 7860:7860 mychatglm:2.0