当前位置: > > > Docker - 本地部署运行ChatGLM模型、及镜像构建教程(使用CPU运行、ChatGLM.cpp)

Docker - 本地部署运行ChatGLM模型、及镜像构建教程(使用CPU运行、ChatGLM.cpp)

一、基本介绍

1,ChatGLM3 介绍

(1)ChatGLM3 是智谱 AI 和清华大学 KEG 实验室联合发布的对话预训练模型。
(2)ChatGLM3-6BChatGLM3 系列中的开源模型,在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上,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 显卡支持。
(2)ChatGLM.cpp 通过 int4/int8 量化、优化的 KV 缓存和并行计算加速内存高效的 CPU 推理。
(3)ChatGLM.cpp 支持的模型有 ChatGLM-6BChatGLM2-6BChatGLM3-6BCodeGeeX2Baichuan-13BBaichuan-7BBaichuan-13BBaichuan2InternLM

二、使用 Docker 运行 ChatGLM3-6B 模型

1,准备工作

(1)首先需要准备一台服务器,由于模型比较大,配置要求如下:
  • 内存8G 及以上
  • 硬盘100G 及以上
(2)服务器需要安装 Docker 环境,具体可以参考我之前写的文章:
(3)由于要从 GitHub 上面下载项目,服务器还需要安装 Git 工具,比如 CentOS 系统执行如下命令安装:
yum install git

2,下载项目代码

(1)首先执行如下命令将 ChatGLM.cpp 以及它依赖的项目下载到本地:
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 的基础镜像:
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)首先执行如下命令进入刚才运行的容器:
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(量化 int4GGML 模型,可以看到转换后的模型体积只有 3.3G
python3 chatglm_cpp/convert.py -i chatglm3-6b -t q4_0 -o chatglm-ggml.bin

7,启动 web 服务

(1)执行如下命令启动 web demo 服务:
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

(3)然后执行如下命令启动 web 服务即可:
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 文件:
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
评论0