ChatGLM-6B部署教程:解决常见报错(CUDA OOM/Gradio启动失败)
1. 为什么你需要这个部署教程
你是不是也遇到过这样的情况:刚下载好ChatGLM-6B镜像,满怀期待地执行supervisorctl start chatglm-service,结果终端里跳出一串红色报错,服务根本起不来?要么是显存爆了提示“CUDA out of memory”,要么是Gradio界面压根打不开,浏览器显示“无法连接”……别急,这不是你的环境有问题,而是ChatGLM-6B这类62亿参数的双语大模型,在实际部署时确实有几个“经典坑”——它们不写在官方文档里,却真实卡住90%的新手。
本教程不讲原理、不堆参数,只聚焦一件事:让你的ChatGLM-6B服务稳稳跑起来。我们会从真实报错日志出发,逐条拆解两个最高频问题:CUDA显存不足(OOM)和Gradio WebUI启动失败。每一步都基于CSDN镜像的实际运行环境(PyTorch 2.5.0 + CUDA 12.4),所有命令可直接复制粘贴,所有修改都在镜像内完成,无需重装系统或更换驱动。
你不需要懂CUDA架构,也不用研究transformers源码。只要你会看日志、会改几行配置、会重启服务,就能搞定。
2. 先确认你的环境是否“健康”
在修bug之前,得先知道你的服务到底卡在哪一步。CSDN镜像已经预装了Supervisor守护进程,所以服务状态一查便知。
2.1 查看服务实时状态
打开终端,输入:
supervisorctl status chatglm-service你会看到类似这样的输出:
chatglm-service STARTING pid 1234, uptime 0:00:05或者更糟的情况:
chatglm-service FATAL Exited too quickly (process log may have details)如果状态是STARTING但卡住超过30秒,大概率是模型加载阶段出问题;如果是FATAL,说明启动脚本直接崩溃了——这时候必须看日志。
2.2 定位问题根源:读日志比猜更高效
别跳过这步。很多同学反复重启服务,却不看日志,结果问题始终没变。执行:
tail -n 50 /var/log/chatglm-service.log重点关注最后10行。真正的报错信息永远在最底部。我们来模拟两种典型场景:
场景A:CUDA OOM报错长这样
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 2.10 GiB (GPU 0; 24.00 GiB total capacity)场景B:Gradio启动失败长这样
OSError: [Errno 98] Address already in use或
ModuleNotFoundError: No module named 'gradio'记下你看到的具体错误,接下来我们就对症下药。
3. 解决CUDA显存不足(OOM)问题
ChatGLM-6B默认以FP16精度加载,需要约13GB显存。但CSDN镜像部署的GPU实例(如A10/A100)虽然标称24GB,实际被系统和其他进程占用后,常只剩16–18GB可用。当模型权重+推理缓存+Gradio前端同时抢占显存,OOM就来了。
3.1 方案一:启用量化加载(推荐,零代码改动)
CSDN镜像已内置bitsandbytes库,支持4-bit量化。只需修改一行配置,显存占用直接从13GB降到6GB以内,且对话质量几乎无损。
打开配置文件:
nano /ChatGLM-Service/app.py找到这一行(通常在第35–40行之间):
model = AutoModelForSeq2SeqLM.from_pretrained(model_path, trust_remote_code=True)把它替换成:
from transformers import BitsAndBytesConfig import torch bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16, ) model = AutoModelForSeq2SeqLM.from_pretrained( model_path, trust_remote_code=True, quantization_config=bnb_config )保存退出(Ctrl+O → Enter → Ctrl+X),然后重启服务:
supervisorctl restart chatglm-service验证效果:再次查看日志,tail -f /var/log/chatglm-service.log,你会看到加载时间变长(量化需要额外计算),但不再报OOM,且nvidia-smi显示显存占用稳定在5.8GB左右。
3.2 方案二:降低批处理大小(适合多用户场景)
如果你的服务器要同时响应多个请求,可以进一步限制单次推理的上下文长度。在app.py中搜索max_length,找到类似这行:
output = model.generate(**inputs, max_length=2048, ...)把2048改成1024:
output = model.generate(**inputs, max_length=1024, ...)这个改动让模型每次生成更短的回答,显存峰值下降约15%,对日常单轮问答影响极小。
3.3 方案三:关闭不必要的GPU进程(临时急救)
如果以上都不行,先腾出显存救急:
# 查看谁占着GPU nvidia-smi # 杀掉非关键进程(比如其他用户的jupyter notebook) sudo fuser -v /dev/nvidia* # 查进程号 sudo kill -9 <PID>注意:此操作需root权限,且仅限临时排障,长期请用方案一。
4. 解决Gradio WebUI启动失败问题
Gradio打不开,90%的原因不是代码问题,而是端口冲突、依赖缺失或权限异常。我们按发生概率从高到低排查。
4.1 端口被占用:Address already in use
这是最高频的报错。CSDN镜像默认用7860端口,但可能被其他服务(如旧版服务残留、测试脚本)霸占。
一键释放端口:
sudo lsof -i :7860 | grep LISTEN | awk '{print $2}' | xargs kill -9 2>/dev/null再启动服务:
supervisorctl start chatglm-service验证:netstat -tuln | grep 7860应该显示LISTEN状态。
4.2 Gradio模块未安装:ModuleNotFoundError
虽然镜像声明已集成Gradio,但极少数情况下pip环境损坏会导致模块丢失。
手动重装Gradio(兼容当前Python环境):
# 进入镜像Python环境 source /opt/conda/bin/activate # 卸载并重装(指定版本避免冲突) pip uninstall -y gradio pip install gradio==4.25.0 # 重启服务 supervisorctl restart chatglm-service验证:日志中应出现Running on local URL: http://0.0.0.0:7860。
4.3 权限问题:WebUI无法绑定0.0.0.0
Gradio默认绑定0.0.0.0:7860,但某些安全策略会阻止。修改app.py中Gradio启动部分:
找到类似这行(通常在文件末尾):
demo.launch(server_name="0.0.0.0", server_port=7860)改为:
demo.launch( server_name="127.0.0.1", server_port=7860, share=False )这个改动让Gradio只监听本地回环地址,完全不影响SSH隧道访问,且绕过所有网络策略限制。
5. 启动后必做的三件事
服务跑起来了,不代表万事大吉。这三步能帮你避开后续90%的“突然崩掉”问题。
5.1 检查Supervisor自动重启是否生效
Supervisor的守护价值在于崩溃后自启。验证它是否真在工作:
# 手动杀掉进程(模拟崩溃) sudo pkill -f "app.py" # 等5秒,再查状态 supervisorctl status chatglm-service如果状态从STOPPED自动变回RUNNING,说明守护正常。如果还是STOPPED,检查Supervisor配置:
nano /etc/supervisor/conf.d/chatglm.conf确保里面有这两行:
autostart=true autorestart=true5.2 调整日志轮转,防止磁盘塞满
默认日志不清理,跑一周可能占满10GB。添加自动轮转:
echo "logfile_maxbytes=10MB" | sudo tee -a /etc/supervisor/conf.d/chatglm.conf echo "logfile_backups=5" | sudo tee -a /etc/supervisor/conf.d/chatglm.conf supervisorctl reread supervisorctl update5.3 设置对话超时,避免长请求拖垮服务
默认Gradio不设超时,一个卡死的请求会让整个服务无响应。在app.py的demo.launch()前加:
import gradio as gr gr.set_static_paths(paths=["/ChatGLM-Service/static"]) # 添加超时控制 demo.queue(default_concurrency_limit=10).launch( server_name="127.0.0.1", server_port=7860, share=False, show_api=False )default_concurrency_limit=10表示最多同时处理10个请求,超出的自动排队,不会OOM。
6. 进阶技巧:让服务更省心
到这里,你的ChatGLM-6B已经稳定运行。下面这些技巧,能让它真正变成“开箱即用”的生产力工具。
6.1 一键切换模型精度(FP16 ↔ INT4)
把量化开关做成命令行参数,不用每次改代码。编辑/etc/supervisor/conf.d/chatglm.conf:
[program:chatglm-service] command=/opt/conda/bin/python /ChatGLM-Service/app.py --quantize 4bit然后在app.py开头加解析逻辑:
import argparse parser = argparse.ArgumentParser() parser.add_argument("--quantize", type=str, default="none", help="none|4bit") args = parser.parse_args() if args.quantize == "4bit": # 启用量化加载(复用3.1节代码)以后只需改配置文件里的--quantize参数,重启即生效。
6.2 监控显存使用,提前预警
把显存监控集成进日志,方便排查:
# 创建监控脚本 echo '#!/bin/bash nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits | awk "{sum += \$1} END {print \"GPU Memory Used: \" sum \" MB\"}" >> /var/log/chatglm-monitor.log' | sudo tee /usr/local/bin/monitor-gpu.sh sudo chmod +x /usr/local/bin/monitor-gpu.sh # 每5分钟记录一次 (crontab -l 2>/dev/null; echo "*/5 * * * * /usr/local/bin/monitor-gpu.sh") | crontab -6.3 备份权重文件,防误删
模型权重在/ChatGLM-Service/model_weights/,但镜像重启后可能丢失。创建保护性软链接:
sudo mkdir -p /data/chatglm-models sudo cp -r /ChatGLM-Service/model_weights/* /data/chatglm-models/ sudo rm -rf /ChatGLM-Service/model_weights sudo ln -s /data/chatglm-models /ChatGLM-Service/model_weights7. 总结:你已经掌握的实战能力
现在回看开头那个“启动就报错”的困境,你手里已经有了一套完整的排障工具箱:
- 看到CUDA OOM:立刻想到量化加载(改3行代码)或调小
max_length(改1个数字); - Gradio打不开:先
lsof查端口,再pip install补依赖,最后检查绑定地址; - 服务莫名中断:用
supervisorctl status看状态,用tail -f盯日志,用pkill模拟崩溃测守护; - 长期运行隐患:加日志轮转、设请求并发上限、做权重备份,三步让服务真正“无人值守”。
这些不是理论,而是CSDN镜像用户在真实GPU实例上反复验证过的路径。你不需要成为CUDA专家,只需要记住:报错是线索,日志是地图,重启是验证。
下一步,你可以试着用这个稳定的服务接入企业微信机器人,或者批量生成产品文案——而不再是卡在第一步。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。