GLM-Image部署实战:从start.sh脚本执行到WebUI成功访问完整排错
GLM-Image部署实战:从start.sh脚本执行到WebUI成功访问完整排错
1. 为什么这次部署总卡在“打不开网页”?
你是不是也遇到过这种情况:
输入 bash /root/build/start.sh 后,终端里一串日志飞快滚动,最后停在 Running on local URL: http://127.0.0.1:7860 ——
但浏览器一打开 http://localhost:7860,却只显示“无法连接”或“连接被拒绝”?
别急,这不是模型没装好,也不是代码写错了。
绝大多数人卡在这一步,根本原因不是技术问题,而是环境信号没对齐:
Gradio服务确实启动了,但它可能监听在 127.0.0.1(仅本地回环),而你用的是宿主机IP访问;
或者防火墙悄悄拦下了7860端口;
又或者GPU显存不足导致模型加载中途静默失败,界面根本没真正跑起来……
这篇实战笔记不讲概念、不堆参数,只聚焦一件事:
从你敲下那行 bash /root/build/start.sh 开始,每一步发生了什么、怎么验证、出错了怎么看、怎么修。
全程基于真实部署场景,所有命令、路径、报错截图都来自可复现的Linux环境(Ubuntu 22.04 + CUDA 12.1 + RTX 4090),不跳步、不假设、不甩锅。
2. 启动前必须确认的三件事
在运行任何脚本前,请花2分钟做这三件小事——它们能帮你避开80%的“启动失败”陷阱。
2.1 检查磁盘空间是否真的够用
GLM-Image模型本身约34GB,但实际部署需要额外空间:
- Hugging Face缓存目录(
/root/build/cache/huggingface/)会临时下载分片文件 - PyTorch模型权重解压后占用比下载包更大
- 生成图像默认保存在
/root/build/outputs/,长期运行会持续增长
执行这条命令,看剩余空间是否 ≥50GB:
df -h /root
如果显示 Available < 45G,请先清理:
# 清理pip缓存(安全)
pip cache purge
# 清理系统旧内核(Ubuntu适用)
sudo apt autoremove --purge
# 重点:检查/root/build/cache/下是否有残留的半下载模型
ls -lh /root/build/cache/huggingface/hub/models--zai-org--GLM-Image
# 如果看到大量 `.incomplete` 或空文件夹,直接删掉重来
rm -rf /root/build/cache/huggingface/hub/models--zai-org--GLM-Image
2.2 验证CUDA与PyTorch是否真正协同
很多报错表面是“找不到GPU”,实则是CUDA版本和PyTorch编译版本不匹配。
别信 nvidia-smi 显示有卡就万事大吉——得让PyTorch亲自说“我看见了”。
运行这个Python小检查(复制粘贴即可):
import torch
print("PyTorch版本:", torch.__version__)
print("CUDA可用:", torch.cuda.is_available())
print("CUDA版本:", torch.version.cuda)
print("可见GPU数量:", torch.cuda.device_count())
if torch.cuda.is_available():
print("当前GPU:", torch.cuda.get_device_name(0))
正常输出应类似:
PyTorch版本: 2.1.2+cu121
CUDA可用: True
CUDA版本: 12.1
可见GPU数量: 1
当前GPU: NVIDIA GeForce RTX 4090
如果 CUDA可用: False,说明PyTorch没链接到CUDA:
→ 重新安装匹配版本的PyTorch(去 pytorch.org 选CUDA 12.1)
→ 或检查 LD_LIBRARY_PATH 是否包含CUDA库路径:
echo $LD_LIBRARY_PATH | grep cuda
# 若无输出,临时添加(替换你的CUDA路径)
export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH
2.3 确认端口7860未被其他进程占用
Gradio默认绑定7860,但Docker、Jupyter、甚至另一个Gradio实例都可能抢走它。
别等启动失败再排查——先扫一遍。
执行命令查端口占用:
sudo lsof -i :7860
# 或更轻量的
ss -tuln | grep :7860
如果返回结果非空(比如显示 python 进程PID),说明端口正被占:
→ 杀掉它:sudo kill -9 <PID>
→ 或换端口启动:bash /root/build/start.sh --port 7861
3. start.sh执行时的关键日志解读与排错
现在,正式运行启动脚本。但别让它“黑盒运行”——盯着终端输出,每一行都是线索。
3.1 正常启动流程的标志性日志段
当你看到以下三段日志连续出现,说明基础环境已通过:
[INFO] Setting HF_HOME to /root/build/cache/huggingface
[INFO] Loading model from zai-org/GLM-Image...
[INFO] Using GPU: cuda:0 (NVIDIA GeForce RTX 4090)
这表示:
- 环境变量已正确注入(HF_HOME指向项目缓存目录)
- 模型加载逻辑已触发(不是卡在依赖安装)
- GPU设备被成功识别(不是fallback到CPU)
3.2 四类高频报错及秒级修复方案
报错1:OSError: Can't load tokenizer... 或 ConnectionError: Connection refused
现象:脚本卡在 Loading model... 后长时间无响应,或直接报错退出。
本质:模型权重文件下载失败(网络中断/镜像源不可达/权限不足)。
秒修方案:
- 手动测试Hugging Face镜像源连通性:
curl -I https://hf-mirror.com
# 应返回 HTTP/2 200
- 若超时,临时切回官方源(修改启动脚本):
sed -i 's|HF_ENDPOINT=https://hf-mirror.com|HF_ENDPOINT=https://huggingface.co|' /root/build/start.sh
- 清理缓存重试:
rm -rf /root/build/cache/huggingface/hub/models--zai-org--GLM-Image
bash /root/build/start.sh
报错2:RuntimeError: CUDA out of memory 或 OutOfMemoryError
现象:日志快速闪过 Loading model...,然后报错退出,或WebUI打开后点击“生成”立即崩溃。
本质:显存不足(24GB是推荐值,非绝对下限;CPU Offload需额外内存)。
秒修方案:
- 强制启用CPU Offload(降低GPU压力):
# 编辑webui.py,在model加载处添加(通常在第XX行附近)
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained(
"zai-org/GLM-Image",
torch_dtype=torch.float16,
use_safetensors=True,
).to("cuda")
# ↓ 在.to("cuda")后插入这行 ↓
pipe.enable_model_cpu_offload() # 关键!
- 或限制最大分辨率(避免首次加载高分辨率权重):
# 启动时指定参数(需webui.py支持)
bash /root/build/start.sh --max-resolution 1024
报错3:ModuleNotFoundError: No module named 'gradio' 或 diffusers
现象:脚本刚运行就报缺模块,甚至 command not found: bash(极少见,但真发生过)。
本质:Python环境混乱(系统Python vs conda vs venv混用;或pip未升级)。
秒修方案:
# 确保使用项目专属Python(检查脚本头部#!/usr/bin/env python3是否指向正确解释器)
head -1 /root/build/start.sh
# 强制重装核心依赖(不加--user,避免权限问题)
pip install --upgrade pip
pip install gradio diffusers transformers accelerate safetensors torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu121
报错4:Address already in use 或 OSError: [Errno 98] Address in use
现象:日志显示 Running on local URL: http://127.0.0.1:7860,但浏览器打不开。
本质:Gradio绑定了 127.0.0.1(仅本机),而你用宿主机IP或域名访问。
秒修方案:
- 启动时强制监听所有接口:
bash /root/build/start.sh --host 0.0.0.0 --port 7860
- 或修改
webui.py中Gradio启动参数:
# 找到 launch() 调用,添加 host 参数
demo.launch(server_name="0.0.0.0", server_port=7860, share=False)
4. WebUI访问成功的验证清单
当浏览器终于打开 http://localhost:7860,别急着输提示词——先完成这五项验证,确保后端真正健康:
4.1 页面元素完整性检查
应看到完整UI组件:
- 左侧:正向/负向提示词输入框、参数滑块(宽度/高度/步数/CFG)、生成按钮
- 右侧:空白预览区(带“生成图像”文字提示)
- 底部:状态栏显示
Ready或Idle
若缺失某区域(如右侧空白区不显示),说明Gradio前端JS加载失败 → 检查浏览器控制台(F12 → Console)是否有404或CORS错误。
4.2 模型加载状态确认
点击页面右上角「加载模型」按钮(如果存在),观察:
成功时:按钮变灰,状态栏提示 Model loaded successfully,且下方出现 GLM-Image 字样
失败时:按钮无变化,控制台报 Failed to fetch 或 500 Internal Server Error → 回退到3.2节检查模型路径与权限。
4.3 生成功能最小闭环测试
用最简提示词验证全流程:
- 正向提示词输入:
a red apple - 宽度/高度设为
512x512(最低分辨率,最快) - 推理步数设为
20(降低耗时) - 点击「生成图像」
成功:右侧预览区出现苹果图片,下方显示Generated in XX.XX seconds
失败:按钮一直转圈,或报Error: Generation failed→ 查看终端日志末尾,定位具体异常(通常是CUDA内存或模型层报错)。
4.4 输出文件落地验证
生成成功后,立刻检查文件系统:
ls -lt /root/build/outputs/
应看到最新生成的PNG文件(如 20240520_142235_123456789.png)
若目录为空,说明自动保存逻辑失效 → 检查 webui.py 中 save_image() 函数路径是否写死为绝对路径,或权限不足(chmod -R 755 /root/build/outputs/)。
4.5 日志实时监控技巧
部署后别关终端!用以下命令盯住关键日志流:
# 实时追踪Gradio服务日志(过滤无关信息)
tail -f /root/build/start.sh.log 2>/dev/null | grep -E "(Starting|Running|ERROR|Exception)"
# 或直接监控Python进程输出(更底层)
journalctl -u your-service-name -f 2>/dev/null | grep -i "glm\|error"
当你修改提示词点击生成时,终端应即时打印:
[INFO] Generating image with prompt: 'a red apple'
[INFO] Using resolution: 512x512, steps: 20, cfg: 7.5
[INFO] Generated image saved to /root/build/outputs/20240520_142235_123456789.png
没有这些日志?说明请求根本没进到后端——回头检查Nginx反向代理或防火墙规则。
5. 从“能用”到“好用”的三个提效配置
搞定基础访问只是起点。这三个配置能让日常使用效率翻倍:
5.1 让WebUI开机自启(省去每次手动bash)
创建systemd服务(生产环境推荐):
sudo tee /etc/systemd/system/glm-image.service << 'EOF'
[Unit]
Description=GLM-Image WebUI
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/root/build
ExecStart=/bin/bash /root/build/start.sh --host 0.0.0.0 --port 7860
Restart=always
RestartSec=10
Environment="HF_HOME=/root/build/cache/huggingface"
Environment="HUGGINGFACE_HUB_CACHE=/root/build/cache/huggingface/hub"
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable glm-image
sudo systemctl start glm-image
效果:重启服务器后,http://your-server-ip:7860 直接可访问。
5.2 为低显存机器定制轻量模式
若只有12GB显存(如RTX 3060),在 start.sh 中加入:
# 在python命令前添加
export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128
# 启动时强制fp16 + CPU offload
python webui.py --precision fp16 --cpu-offload
效果:1024x1024生成时间增加约40%,但显存占用从22GB降至10GB内。
5.3 用Nginx反向代理实现域名访问
避免暴露端口,用域名直连:
# 安装Nginx
sudo apt install nginx
# 配置反向代理(替换your-domain.com)
sudo tee /etc/nginx/sites-available/glm-image << 'EOF'
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1:7860;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
EOF
sudo ln -sf /etc/nginx/sites-available/glm-image /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl restart nginx
效果:直接访问 http://your-domain.com,无需记端口号。
6. 总结:排错的本质是建立确定性
部署GLM-Image WebUI,从来不是“一键奇迹”。
它是一次对环境、依赖、硬件、网络的全链路校准。
本文列出的所有步骤,核心逻辑只有一个:
把模糊的“可能出了问题”,变成确定的“哪一行日志不对”、“哪个文件不存在”、“哪个端口被占了”。
当你下次再遇到 Connection refused,别再盲目重装——
先 ss -tuln | grep 7860 看端口;
看到 CUDA out of memory,别急着换卡——
先 pipe.enable_model_cpu_offload() 试一下;
生成图片不保存?别猜权限问题——
直接 ls -ld /root/build/outputs/ 看属主。
真正的排错能力,不在于记住多少命令,而在于养成“验证-定位-修复”的肌肉记忆。
现在,回到你的终端,敲下第一行 bash /root/build/start.sh ——
这一次,你知道每一行输出意味着什么。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐

所有评论(0)