2026/6/1 12:20:32
网站建设
项目流程
室内设计网站界面,长春网易网站建设,装饰工程有限公司,怎样制作网站?GLM-4v-9b部署教程#xff1a;Docker Compose编排vLLMFastAPIWebUI三服务
1. 为什么你需要这个部署方案
你是不是也遇到过这些情况#xff1a;
想试试最新的多模态模型#xff0c;但卡在环境配置上#xff0c;装完PyTorch又报CUDA版本冲突#xff1b;下载了GLM-4v-9b权…GLM-4v-9b部署教程Docker Compose编排vLLMFastAPIWebUI三服务1. 为什么你需要这个部署方案你是不是也遇到过这些情况想试试最新的多模态模型但卡在环境配置上装完PyTorch又报CUDA版本冲突下载了GLM-4v-9b权重却不知道怎么让它真正“看懂图片”——不是简单跑个demo而是能上传截图、分析表格、回答图表问题看到别人用Web界面点点选选就能和模型对话自己搭了个API却连前端都接不上明明手头有RTX 4090结果部署时内存爆掉提示“OOM”最后发现是没做量化、没调参数、没分服务。这篇教程不讲原理不堆术语只做一件事让你在一台带单张4090的机器上30分钟内跑起一个真正可用的GLM-4v-9b服务——支持图片上传、中英双语多轮对话、高分辨率输入且所有组件推理引擎、API网关、交互界面彼此解耦、独立启停、日志分明。它不是“本地跑通就行”的玩具方案而是按生产级思路设计的轻量编排vLLM负责高性能视觉语言推理FastAPI封装结构化接口Open WebUI提供开箱即用的对话体验。三者通过Docker网络通信互不干扰升级某一部分不影响其余。你不需要懂vLLM源码不用手动写API路由也不用改一行前端代码——只需要复制粘贴几段YAML和命令剩下的交给Docker。2. 部署前必读硬件与前提条件2.1 硬件要求实测有效组件最低要求推荐配置实测备注GPUNVIDIA RTX 409024GB显存两张4090或A100 40GB单卡可运行INT4量化版全量fp16需双卡见后文说明CPU8核16核vLLM预填充阶段较吃CPU内存32GB64GBWebUI和FastAPI共用主机内存磁盘35GB空闲空间50GB权重镜像缓存合计约32GBINT4版注意文中演示使用的是INT4量化版本9GB可在单张4090上全速运行。若坚持使用fp16全量权重18GB则必须启用--tensor-parallel-size 2并挂载两张GPU——这也是原文强调“使用两张卡”的原因。本教程默认按单卡友好路线展开。2.2 软件前提确保你的Linux服务器Ubuntu 22.04 LTS推荐已安装Docker ≥ 24.0.0Docker Compose ≥ 2.20.0非旧版docker-composeNVIDIA Container Toolkit 已正确配置nvidia-smi在容器内可见验证命令docker --version docker compose version nvidia-docker run --rm --gpus all nvidia/cuda:12.1.1-runtime-ubuntu22.04 nvidia-smi如未安装NVIDIA Container Toolkit请先执行curl -sL https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -sL https://nvidia.github.io/nvidia-docker/ubuntu22.04/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update sudo apt-get install -y nvidia-docker2 sudo systemctl restart docker3. 三步完成部署拉取、编排、启动整个流程无需克隆仓库、无需pip install、无需手动下载权重——所有依赖均由Docker镜像内置权重通过Hugging Face Hub按需拉取首次启动稍慢后续秒启。3.1 创建项目目录并写入docker-compose.yml新建目录进入后创建docker-compose.ymlmkdir glm4v-deploy cd glm4v-deploy nano docker-compose.yml粘贴以下内容已适配单卡4090 INT4量化 中文优化version: 3.8 services: vllm-engine: image: vllm/vllm-openai:latest deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu, compute, utility] command: --model ZhipuAI/glm-4v-9b --dtype half --quantization awq --tensor-parallel-size 1 --pipeline-parallel-size 1 --max-model-len 8192 --enforce-eager --enable-chunked-prefill --max-num-batched-tokens 8192 --trust-remote-code --disable-log-stats --host 0.0.0.0 --port 8000 --chat-template /app/vllm/modeling/chat_templates/glm4.json ports: - 8000:8000 volumes: - ./models:/root/.cache/huggingface/hub restart: unless-stopped fastapi-api: build: context: . dockerfile: Dockerfile.api ports: - 8001:8001 environment: - VLLM_ENGINE_URLhttp://vllm-engine:8000 depends_on: - vllm-engine restart: unless-stopped webui: image: ghcr.io/open-webui/open-webui:main-nvidia ports: - 3000:8080 environment: - WEBUI_URLhttps://your-domain.com - OPEN_WEBUI_SECRET_KEYglm4v-secret-key-change-me volumes: - ./data/webui:/app/backend/data - ./models:/root/.cache/huggingface/hub depends_on: - fastapi-api restart: unless-stopped说明该编排将vLLM设为底层推理引擎监听8000端口FastAPI作为中间层8001端口统一处理图片base64编码、多模态请求组装与响应解析WebUI则通过反向代理对接FastAPI——完全规避了Open WebUI原生对多模态支持不足的问题。3.2 编写FastAPI服务Dockerfile在同一目录下创建Dockerfile.apiFROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY main.py . CMD [uvicorn, main:app, --host, 0.0.0.0:8001, --port, 8001, --workers, 2]再创建requirements.txtfastapi0.115.0 httpx0.27.0 Pillow10.4.0 python-multipart0.0.19最后创建main.py精简可靠版支持图片上传文本提问# main.py from fastapi import FastAPI, UploadFile, Form, HTTPException from fastapi.responses import JSONResponse import httpx import base64 from PIL import Image import io app FastAPI(titleGLM-4v-9b API Bridge) VLLM_URL http://vllm-engine:8000/v1/chat/completions app.post(/v1/chat) async def chat_with_image( file: UploadFile, question: str Form(...), ): try: # 读取并压缩图片至1120×1120保持比例 img_bytes await file.read() img Image.open(io.BytesIO(img_bytes)) img.thumbnail((1120, 1120), Image.Resampling.LANCZOS) buffered io.BytesIO() img.save(buffered, formatPNG) img_b64 base64.b64encode(buffered.getvalue()).decode() # 构造vLLM请求 payload { model: ZhipuAI/glm-4v-9b, messages: [ { role: user, content: [ {type: text, text: question}, {type: image_url, image_url: {url: fdata:image/png;base64,{img_b64}}} ] } ], temperature: 0.7, max_tokens: 1024 } async with httpx.AsyncClient() as client: resp await client.post(VLLM_URL, jsonpayload, timeout300) if resp.status_code ! 200: raise HTTPException(status_coderesp.status_code, detailresp.text) return JSONResponse(contentresp.json()) except Exception as e: raise HTTPException(status_code500, detailfProcessing failed: {str(e)})3.3 一键启动全部服务确保当前在glm4v-deploy/目录下执行docker compose up -d --build等待约3–5分钟首次会自动拉取vLLM镜像下载INT4权重然后检查状态docker compose ps # 应看到三个服务状态均为 running # 查看vLLM日志确认加载完成 docker logs glm4v-deploy-vllm-engine-1 | tail -20 # 出现 Started server 即表示就绪服务端口映射如下http://localhost:8000→ vLLM原始OpenAI兼容API调试用http://localhost:8001→ FastAPI多模态桥接API供程序调用http://localhost:3000→ Open WebUI图形界面浏览器访问此时你已拥有一个生产就绪的多模态服务栈vLLM专注推理性能FastAPI专注协议转换与容错WebUI专注用户体验——三者可单独重启、单独扩缩、单独监控。4. 使用实战上传截图问图表5秒得答案打开浏览器访问http://localhost:3000使用任意邮箱注册首次启动会自动创建管理员账户登录后即可开始。4.1 图表理解上传Excel截图问“销售额最高的是哪个月”点击输入框旁的「」图标选择一张含柱状图的Excel截图建议1120×800左右输入问题“这张图里销售额最高的月份是哪个月数值是多少”发送后你会看到模型先识别图中坐标轴、图例、数据标签再精准定位最高柱并提取数值——全程无OCR误识、无坐标混淆、无单位遗漏。4.2 截图问答上传开发报错界面问“这个TypeError怎么解决”上传VS Code终端报错截图含红色堆栈提问“这是什么错误如何修复”模型将准确识别异常类型、触发行、关键变量名并给出Python层面的修复建议如“检查response.json()是否为空”。4.3 中文文档OCR上传PDF扫描页问“第三段第一句话是什么”上传清晰中文技术文档扫描图1120×1120提问“请提取第三段第一句话。”模型返回纯文本结果标点、括号、全角字符100%保留无乱码、无断句错误。小技巧在WebUI中点击右上角「⚙ Settings」→「Model」→ 选择ZhipuAI/glm-4v-9b确保对话走的是你刚部署的本地服务而非云端模型。5. 进阶控制调参、监控与故障排查5.1 关键参数速查表修改docker-compose.yml中command字段参数推荐值作用修改建议--quantization awq默认启用AWQ 4-bit量化显存减半如需更高精度改为--dtype bfloat16需双卡--max-model-len 8192默认上下文最大长度处理长图表描述时可增至12288--max-num-batched-tokens 8192默认批处理总token上限高并发时可调至16384--enforce-eager必加禁用CUDA Graph避免多模态推理崩溃不加此参数图片输入可能报错5.2 实时监控GPU与服务健康查看vLLM实时吞吐curl http://localhost:8000/health # 返回 {status:healthy} 即正常查看GPU显存占用确认是否超限nvidia-smi --query-compute-appspid,used_memory --formatcsv # 正常范围vLLM进程占用 ≤ 22GB40905.3 常见问题速解QWebUI上传图片后无响应日志显示“Connection refused”A检查fastapi-api容器是否运行 ——docker compose ps若状态非running执行docker logs glm4v-deploy-fastapi-api-1查看报错大概率是vLLM未就绪就启动了API稍等30秒再试。Q提问后返回空内容或格式错乱A确认图片是否过大2MB或分辨率远超1120×1120建议预压缩至1120宽高度自适应。Q想换其他模型如Qwen-VL怎么办A只需修改vllm-engine服务的--model参数并在fastapi-api的main.py中同步更新model name字符串无需改其他逻辑。6. 总结这不是部署而是交付一个能力你刚刚完成的不是一个“能跑起来的Demo”而是一个可嵌入工作流的视觉语言能力模块它能接进你的内部知识库系统让员工上传产品手册截图直接问“第5页提到的保修期是多久”它能集成到客服后台客户发送订单异常截图系统自动提取订单号、错误码、时间戳生成标准回复它甚至能成为教学助手——学生上传物理实验照片模型标注受力方向、计算合力大小、指出操作误差。GLM-4v-9b的价值从来不在参数量或榜单排名而在于它把“看图说话”这件事真正做进了24GB显存的消费级显卡里。而本教程做的就是帮你把这份能力从Hugging Face仓库里拿出来装进一个稳定、可维护、可扩展的服务框架中。下一步你可以把http://localhost:8001/v1/chat这个地址封装成公司内部SDK用Nginx加SSL让团队通过https://glm4v.internal/chat安全调用在FastAPI中增加鉴权中间件限制每日调用量甚至把WebUI定制成企业品牌风格嵌入现有OA系统。能力已在手现在只差你按下第一个上传键。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。