ChatGLM-6B在Linux环境下的高效部署与优化
最近有不少朋友在问,想在自己的Linux服务器上跑一个开源的对话模型,有没有什么推荐?ChatGLM-6B算是一个不错的选择。它支持中英文对话,对中文优化得挺好,而且开源免费,部署门槛相对较低。
不过,在Linux服务器上部署,尤其是资源有限的情况下,还是会遇到一些问题。比如显存不够怎么办?模型下载太慢怎么办?怎么让推理速度更快一些?这篇文章我就结合自己的经验,聊聊在Linux环境下部署ChatGLM-6B的完整流程,以及一些实用的优化建议,希望能帮你少走点弯路。
1. 环境准备:打好基础很重要
在开始部署之前,先确认一下你的Linux环境是否满足基本要求。ChatGLM-6B对硬件的要求不算特别高,但也有一些基本门槛。
1.1 硬件与系统要求
首先说说硬件。ChatGLM-6B有不同量化版本,对显存的要求也不一样:
- FP16版本:需要大约13GB显存
- INT8量化版本:需要大约8GB显存
- INT4量化版本:只需要大约6GB显存
如果你用的是消费级显卡,比如RTX 3060(12GB显存),跑INT4版本完全没问题。如果是服务器上的专业卡,比如T4(16GB显存),跑FP16版本也够用。
内存方面,建议至少16GB,如果要在CPU上运行,需要32GB左右的内存。
系统方面,主流的Linux发行版都可以,比如Ubuntu 20.04/22.04、CentOS 7/8、Alibaba Cloud Linux等。我这次演示用的是Ubuntu 22.04。
1.2 基础环境安装
登录你的Linux服务器,先更新一下系统包:
sudo apt update sudo apt upgrade -y安装一些必要的工具:
sudo apt install -y git git-lfs wget curl gcc gcc-c++ make cmake python3 python3-pip python3-venvGit LFS(Large File Storage)很重要,因为模型文件很大,需要用这个工具来下载。
2. 快速部署:三步搞定基础版
如果你只是想快速体验一下ChatGLM-6B,可以按照这个简化流程来。
2.1 下载模型和代码
先创建一个工作目录:
mkdir ~/chatglm-demo && cd ~/chatglm-demo下载ChatGLM-6B的代码:
git clone https://github.com/THUDM/ChatGLM-6B.git cd ChatGLM-6B下载模型文件。这里有个小技巧,如果从Hugging Face下载太慢,可以用国内的镜像源:
# 方法一:从ModelScope下载(国内速度较快) git clone https://www.modelscope.cn/ZhipuAI/ChatGLM-6B.git chatglm-6b cd chatglm-6b git checkout v1.0.16 cd .. # 方法二:如果已经有下载好的模型文件,可以直接复制过来 # cp -r /path/to/your/chatglm-6b ./2.2 安装Python依赖
创建并激活Python虚拟环境:
python3 -m venv venv source venv/bin/activate安装必要的Python包:
pip install -r requirements.txt这里有个需要注意的地方,transformers库的版本建议用4.27.1,但4.23.1以上版本基本都可以。如果安装过程中遇到问题,可以尝试指定版本:
pip install transformers==4.27.12.3 启动Web演示界面
现在可以启动Web界面了:
python web_demo.py如果一切正常,你会看到类似这样的输出:
Running on local URL: http://127.0.0.1:7860在浏览器中打开这个地址,就能看到聊天界面了。输入问题,比如"你好",就能得到回复。
3. 生产环境部署:更稳定、更高效
如果你要在生产环境部署,或者需要长时间运行,上面的简单方法就不太够用了。下面介绍一些更专业的做法。
3.1 使用Screen或Tmux保持会话
在服务器上,如果你直接断开SSH连接,刚才启动的服务就会停止。这时候可以用Screen或Tmux来保持会话。
使用Screen:
# 安装screen(如果还没安装) sudo apt install screen -y # 创建一个新的screen会话 screen -S chatglm # 在新的会话中启动服务 cd ~/chatglm-demo/ChatGLM-6B source venv/bin/activate python web_demo.py # 按Ctrl+A,然后按D,可以分离会话 # 重新连接会话:screen -r chatglm使用Tmux:
# 安装tmux sudo apt install tmux -y # 创建新会话 tmux new -s chatglm # 启动服务 cd ~/chatglm-demo/ChatGLM-6B source venv/bin/activate python web_demo.py # 按Ctrl+B,然后按D,分离会话 # 重新连接:tmux attach -t chatglm3.2 使用量化模型节省显存
如果你的显卡显存不够,可以用量化版本来减少显存占用。ChatGLM-6B提供了INT8和INT4量化版本。
修改代码来使用量化模型:
# 在web_demo.py或你自己的代码中,修改模型加载部分 from transformers import AutoTokenizer, AutoModel # INT4量化版本 tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True) model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True).half().cuda() # 或者INT8量化版本 # model = AutoModel.from_pretrained("THUDM/chatglm-6b-int8", trust_remote_code=True).half().cuda()INT4版本只需要6GB显存,INT8版本需要8GB,比原来的13GB节省了不少。
3.3 多GPU部署
如果你有多张GPU,但是单张卡的显存不够,可以把模型切分到多张卡上。
首先安装accelerate:
pip install accelerate然后修改代码:
from utils import load_model_on_gpus # 将模型部署到2张GPU上 model = load_model_on_gpus("THUDM/chatglm-6b", num_gpus=2)这样就能利用多张显卡的显存来运行更大的模型。
4. 性能优化:让推理更快更稳
部署好了,接下来聊聊怎么优化性能。毕竟在实际使用中,推理速度和稳定性都很重要。
4.1 使用半精度浮点数
默认情况下,PyTorch使用FP32(单精度浮点数),但我们可以用FP16(半精度)来加速推理,同时减少显存占用。
在模型加载时加上.half():
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()这样能提升推理速度,同时显存占用也能减少差不多一半。
4.2 调整生成参数
ChatGLM-6B的生成参数会影响输出质量和速度:
response, history = model.chat( tokenizer, "你的问题", history=history, max_length=2048, # 最大生成长度 top_p=0.7, # 核采样参数 temperature=0.95 # 温度参数 )- max_length:控制生成文本的最大长度,设小一点能加快生成速度
- top_p:值越小,生成越确定;值越大,生成越多样
- temperature:值越小,输出越确定;值越大,输出越随机
在实际使用中,可以根据需求调整这些参数。比如需要快速响应时,可以把max_length设小一些。
4.3 使用缓存加速
对于重复的问题,可以使用缓存来避免重复计算。虽然ChatGLM-6B本身没有内置缓存机制,但我们可以自己实现一个简单的缓存:
import hashlib from functools import lru_cache @lru_cache(maxsize=100) def get_cached_response(prompt): # 这里放实际的模型调用代码 response, history = model.chat(tokenizer, prompt, history=[]) return response # 使用缓存 def chat_with_cache(prompt): # 用prompt的hash作为缓存key cache_key = hashlib.md5(prompt.encode()).hexdigest() return get_cached_response(cache_key)这样对于相同的问题,第二次询问时就能直接从缓存中获取答案,大大加快响应速度。
5. 常见问题与解决方案
在实际部署过程中,可能会遇到一些问题。这里整理了一些常见问题和解决方法。
5.1 显存不足怎么办?
如果遇到CUDA out of memory错误,可以尝试:
- 使用量化模型:INT4版本只需要6GB显存
- 减少batch size:如果自己微调模型,减少batch size
- 使用梯度检查点:在训练时使用梯度检查点技术
- 使用CPU卸载:把部分计算放到CPU上
5.2 模型下载太慢怎么办?
国内从Hugging Face下载模型可能会很慢,可以:
- 使用国内镜像:比如ModelScope
- 手动下载:先在其他地方下载好,再上传到服务器
- 使用代理:如果有的话
5.3 推理速度慢怎么办?
如果觉得生成速度太慢,可以:
- 使用半精度:
.half()能显著加速 - 减少生成长度:设置合理的max_length
- 升级硬件:使用更好的GPU
- 使用推理优化库:比如ONNX Runtime或TensorRT
5.4 如何监控资源使用?
在Linux上,可以用这些命令监控资源:
# 查看GPU使用情况 nvidia-smi # 查看内存使用 free -h # 查看CPU使用 top # 查看进程资源使用 htop6. 进阶技巧:让部署更专业
如果你需要更专业的部署方案,可以考虑下面这些进阶技巧。
6.1 使用Docker容器化部署
用Docker部署有很多好处:环境隔离、易于迁移、版本控制等。
先创建一个Dockerfile:
FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime WORKDIR /app # 安装系统依赖 RUN apt-get update && apt-get install -y \ git \ git-lfs \ wget \ curl \ && rm -rf /var/lib/apt/lists/* # 启用Git LFS RUN git lfs install # 复制代码 COPY . . # 安装Python依赖 RUN pip install --no-cache-dir -r requirements.txt # 下载模型(或者从外部挂载) # RUN git clone https://www.modelscope.cn/ZhipuAI/ChatGLM-6B.git chatglm-6b EXPOSE 7860 CMD ["python", "web_demo.py"]然后构建和运行:
# 构建镜像 docker build -t chatglm-6b . # 运行容器 docker run -p 7860:7860 --gpus all chatglm-6b6.2 使用API服务部署
如果你需要通过API调用模型,可以使用ChatGLM-6B自带的API服务:
# 安装额外依赖 pip install fastapi uvicorn # 启动API服务 python api.py默认会在8000端口启动服务,可以通过HTTP POST请求调用:
curl -X POST "http://127.0.0.1:8000" \ -H 'Content-Type: application/json' \ -d '{"prompt": "你好", "history": []}'6.3 安全考虑
在生产环境部署时,还需要考虑安全问题:
- 限制访问:只允许特定的IP访问
- 使用HTTPS:如果对外提供服务,一定要用HTTPS
- 输入验证:对用户输入进行验证和过滤
- 速率限制:防止被滥用
- 日志记录:记录所有访问日志
可以在Nginx后面部署,实现这些安全功能:
# nginx配置示例 server { listen 443 ssl; server_name your-domain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { proxy_pass http://127.0.0.1:7860; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 限制请求速率 limit_req zone=one burst=10 nodelay; # 限制连接数 limit_conn addr 10; } # 只允许特定IP访问 allow 192.168.1.0/24; deny all; }7. 实际使用体验与建议
我自己在几台不同的服务器上部署过ChatGLM-6B,这里分享一些实际体验。
在RTX 3060(12GB显存)上,跑INT4版本很流畅,响应速度也很快,基本上输入问题后几秒钟就能得到回复。显存占用大概在6-7GB左右,还有不少余量。
在T4(16GB显存)服务器上,可以跑FP16版本,效果更好一些,但速度会稍慢一点。如果对响应速度要求高,还是建议用INT4版本。
在只有CPU的机器上(32GB内存),也能跑起来,但速度就比较慢了,一个问题可能要等十几秒甚至更久。所以如果可能的话,还是尽量用GPU。
关于模型效果,ChatGLM-6B的中文对话能力确实不错,日常聊天、问答、写作辅助都能胜任。当然,它毕竟只有60亿参数,有些复杂问题可能处理得不够好,或者会"一本正经地胡说八道",这是所有小模型的通病。
如果你刚开始接触,建议先用INT4量化版本,部署简单,资源要求低。等熟悉了之后,再根据实际需求调整。如果是生产环境,一定要做好压力测试,看看在实际负载下的表现如何。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。