ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux服务器部署通义千问多模态大模型:Ollama与vLLM实践

Linux服务器部署通义千问多模态大模型:Ollama与vLLM实践 前阵子帮客户在一台Linux服务器上把通义千问多模态大模型部署成私有化服务用来做图像内容审核和票据信息抽取。整个过程从环境勘察、模型下载到推理服务上线前后折腾了好几天中间也踩了不少坑。这篇文章把我当时的完整操作流程和排查思路整理出来从方案选型、环境准备、两种主流部署方式Ollama和vLLM到生产环境常见问题尽量写得细一点给打算在Linux服务器上部署通义千问多模态大模型的朋友做个参考。1. 为什么选择通义千问多模态大模型本地化部署1.1 多模态大模型的典型落地场景通义千问的多模态大模型最核心的能力是同时理解文本、图片、视频这些不同模态的信息。你给一张图它能识别图里的物体、场景、文字给一段视频它能描述视频里发生了什么丢一张复杂的表格截图它也能帮你把关键字段抽出来。这跟纯文本大模型完全是两个量级的应用范围。我这次部署的Qwen2.5-VL系列是阿里通义实验室开源的多模态模型。它支持的输入方式很丰富图片、视频、文档扫描件都能处理输出则保持大模型一贯的自然语言能力。实际生产环境里最常见的需求集中在这么几个方向图片审核自动识别违规内容、敏感信息、logo侵权替代传统人工抽检。票据与文档解析发票、合同、手写单据的OCR识别和结构化信息抽取。视频内容理解对监控视频、课程录像做关键帧分析生成文字摘要。企业知识库问答结合RAG让模型能基于图文混合的文档回答业务问题。这些场景有一个共同特点数据敏感不能随便扔到云 API 上去。所以私有化部署一个模型服务成了很多企业的刚需。1.2 本地部署和调用云API怎么权衡很多人会问通义千问官方也有API花钱调不就行了为什么非要自己在服务器上折腾两种方式各有适用场景我直接说结论对比维度本地私有化部署调用云API数据隐私完全可控数据不出内网数据经过第三方服务单次调用成本一次硬件投入后续电费按token/调用量付费高频成本高延迟与并发可控按需调配显存和并发受网络和平台限流影响运维成本需要自己维护环境、升级模型平台托管几乎免运维快速验证部署有一定门槛注册即用最快出效果如果你只是做个Demo验证效果直接调官方API最方便。但如果是企业内部系统要长期跑每天处理几万张图数据又比较敏感那本地部署几乎是唯一选择。我这次碰到的客户就是银行场景图片数据根本不允许出内网所以必须在Linux服务器上把通义千问多模态大模型完整部署起来。另外成本上也算过一笔账云API高频调用一个月下来可能几万块而一台带A100或4090的GPU服务器通常几个月就能回本。当然这取决于你的并发量到底有多大量小的话还是API划算。1.3 模型选型Qwen2.5-VL系列的参数对比通义千问多模态大模型目前主推的是Qwen2.5-VL系列根据参数量分为3B、7B、32B、72B等几个档位。选型主要看你手里有多少显存以及你对效果和速度的预期。模型版本参数量最低建议显存BF164bit量化后显存适用场景Qwen2.5-VL-3B3B约7GB约3GB简单OCR、轻量分类Qwen2.5-VL-7B7B约16GB约6GB通用图片理解、票据抽取Qwen2.5-VL-32B32B约64GB约20GB复杂多模态推理、长视频理解Qwen2.5-VL-72B72B约144GB约42GB企业级高精度场景从我的实际经验看7B是性价比最高的起点。单张RTX 409024GB显存就能轻松跑起来BF16精度下效果已经能覆盖大部分业务配合量化还能进一步压显存。如果对推理质量要求特别高再考虑32B甚至72B但那时候就需要多卡并行部署复杂度会明显上升。选型时还有一个重要判断依据你的输入内容有多复杂。如果只是识别印刷体文字3B模型就够用如果是手写体、票据、复杂图表混排至少得上7B要解析长视频、细粒度视觉问答再考虑32B以上。宁可起步选小一号的模型先跑通流程再迭代升级。2. 部署方案选型与环境准备2.1 Ollama、vLLM、Transformers三种方式怎么选确定了模型版本下一步就是选部署框架。目前主流的方案有三个Ollama、vLLM、Hugging Face Transformers。部署方式上手难度推理性能适合场景Ollama极低几条命令搞定中等适合个人和小并发快速验证、本地开发vLLM中等需要装依赖高PagedAttention优化适合生产企业级高并发API服务Transformers高需要自己写推理逻辑中低无专门优化研究调试、自定义修改模型Ollama和vLLM是我实际用得最多的两个方案。Ollama最大的优势是简单。一条安装命令一条拉模型命令再一条运行命令一个大模型服务就起来了。它内置了模型量化、显存管理、API服务基本不需要操心底层细节。缺点是并发能力和吞吐量比vLLM差一截在大流量的生产环境里瓶颈会比较明显。vLLM是生产部署的事实标准。它引入了PagedAttention技术优化了KV Cache的显存管理配合continuous batching连续批处理能把GPU利用率拉满。它提供的服务端API和OpenAI协议兼容业务代码换一个base_url就能接入。缺点是需要自己管理Python环境、启动参数稍微多一点。我的建议是做技术验证、内部测试用Ollama准备上生产、扛并发用vLLM。这次客户的环境最终是跑在vLLM上的但Ollama在整个调试阶段帮了大忙我会在后面的实操部分把两种方式都完整讲一遍。2.2 Linux服务器硬件与环境盘点部署前先别急着装软件把服务器家底盘清楚能省掉后面一大半问题。我在接到任务后的第一步永远是执行下面几条命令nvidia-smi free -h df -h uname -anvidia-smi最关键它会显示GPU型号、显存大小、驱动版本和驱动支持的最大CUDA版本。举个例子如果你看到显卡是RTX 3090显存24GBDriver Version是535CUDA Version是12.2那说明这台机器可以流畅跑7B模型并且能轻松安装vLLMvLLM要求CUDA 11.8及以上。free -h看内存。CPU内存虽然不是推理的主要瓶颈但至少要保证物理内存比显存大推荐32GB起步。df -h看磁盘剩余空间模型文件很大——Qwen2.5-VL-7B的BF16权重就有15GB左右加上Python虚拟环境、依赖库、日志建议预留至少50GB。操作系统方面Ubuntu 20.04/22.04是体验最好的因为驱动和CUDA生态最成熟。CentOS 7系列如果内核太老很多时候会卡在GLIBC版本兼容上所以能用Ubuntu就别用CentOS。我这次客户用的是Ubuntu 22.04 一张A100 80G环境非常干净所以后面的步骤基本照着官方文档走就没出大问题。如果你用的是老机器驱动没装好先花时间把驱动和CUDA搞定再继续。2.3 模型文件获取ModelScope和HF镜像站通义千问的模型权重放在Hugging Face和ModelScope魔搭社区两个平台。国内环境下载模型首选ModelScope速度能差出好几倍。在服务器上安装ModelScope客户端并下载模型pip install modelscope python3 -c from modelscope import snapshot_download snapshot_download(Qwen/Qwen2.5-VL-7B-Instruct, cache_dir/data/models) 这里我把模型下载到/data/models目录后面加载的时候直接用这个路径避免系统盘被模型文件塞满。下载过程中能看到每个文件的进度条如果中途断了重新执行一遍命令它会自动续传。如果你已经习惯用Hugging Face的命令行工具也可以通过镜像站下载export HF_ENDPOINThttps://hf-mirror.com pip install -U huggingface_hub huggingface-cli download Qwen/Qwen2.5-VL-7B-Instruct --local-dir /data/models/Qwen2.5-VL-7B-Instruct下载完成后检查一下目录里的文件是不是齐全。一般会包含model-00001-of-00004.safetensors这类分片权重文件、config.json、tokenizer.json以及专门处理视觉输入的processor相关文件。文件不完整的话加载时大概率报错所以这一步不要跳过。2.4 用Docker方式部署需要额外准备什么如果服务器需要频繁迁移环境或者你不想污染宿主机系统的Python用Docker部署是更好的选择。它能把CUDA、Python、模型服务全部封装进一个镜像里到新机器上直接跑容器就行。用Docker跑通义千问多模态大模型核心前提是装好NVIDIA Container Toolkit。装完之后在启动容器时加一个--gpus all参数容器内就能直接使用宿主的GPU。docker run --gpus all -p 8000:8000 \ -v /data/models:/data/models \ vllm/vllm-openai:latest \ --model /data/models/Qwen2.5-VL-7B-Instruct \ --served-model-name qwen-vl这里把宿主的模型目录挂载进容器用vLLM官方镜像直接启动OpenAI兼容服务。好处是宿主机只需要装Docker和NVIDIA驱动其余依赖全部隔离在镜像里。缺点是镜像体积大而且如果容器里已经固定了vLLM版本后续模型升级时需要同步更新镜像。3. 实操两种主流部署方式完整跑通3.1 方式一用Ollama快速跑通Qwen2.5-VLOllama的特点就是省事适合在开发机上先把模型跑起来看效果。第一步安装Ollamacurl -fsSL https://ollama.com/install.sh | sh systemctl enable --now ollama systemctl status ollama安装成功后Ollama会成为系统服务默认监听本机的11434端口。第二步拉取通义千问多模态模型ollama pull qwen2.5vl:7b这个命令会从Ollama的模型仓库下载对应模型下载过程中能看到进度条。Ollama仓库里的qwen2.5vl系列已经内置了多模态能力所以不需要额外安装视觉相关的依赖。第三步运行模型ollama run qwen2.5vl:7b进入交互界面后直接输入文字提问。但多模态模型如果只是在终端里打字没法传图片给模型所以更常用的验证方式是通过API请求。要对外提供API服务先修改监听地址默认只监听本地外部访问不到systemctl edit ollama在打开的编辑窗口里加上[Service] EnvironmentOLLAMA_HOST0.0.0.0:11434保存后重启Ollama服务systemctl restart ollama通过API发送带图片的请求语法和OpenAI协议非常接近。把图片转成Base64后放到images字段里curl http://localhost:11434/api/chat -d { model: qwen2.5vl:7b, messages: [ { role: user, content: 请描述这张图片, images: [图片的Base64编码] } ] }命令执行后模型会返回一段JSON里面包含识别出来的图片描述。这一步通了就说明多模态链路是完整的。3.2 方式二用vLLM部署生产级OpenAI兼容服务生产环境我基本总是用vLLM。它启动的服务支持https://host:8000/v1/chat/completions这样的OpenAI兼容接口业务代码几乎零改动。先建一个独立的Python虚拟环境避免污染系统环境python3 -m venv /opt/vllm-env source /opt/vllm-env/bin/activate pip install --upgrade pip pip install vllmvLLM安装包比较大包含CUDA依赖耐心等一会儿。装完后先确认CUDA对当前GPU可见python3 -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))输出True和GPU型号就表示环境正常。接下来启动推理服务vllm serve Qwen/Qwen2.5-VL-7B-Instruct \ --host 0.0.0.0 \ --port 8000 \ --served-model-name qwen-vl \ --gpu-memory-utilization 0.92 \ --max-model-len 8192参数含义我解释一下--served-model-name qwen-vl给模型起个简短别名调用API时不需要写完整的模型路径。--gpu-memory-utilization 0.92允许vLLM使用92%的显存。剩一点余量给CUDA context和临时变量避免OOM。--max-model-len 8192限制上下文最大长度。多模态推理时图片转成的视觉token很占空间如果输入图片多很容易撞上长度上限。--tensor-parallel-size 1单卡就填1多卡时按卡数填。比如你有4张卡改成4vLLM会自动做张量并行。启动成功后终端会显示服务地址和模型加载信息。检验服务是否正常curl http://localhost:8000/v1/models能返回模型列表说明服务已经起来了。用Python调用多模态能力我习惯用OpenAI的SDK把base_url指到vLLM服务import base64 from openai import OpenAI def encode_image(image_path): with open(image_path, rb) as f: return base64.b64encode(f.read()).decode(utf-8) client OpenAI(base_urlhttp://localhost:8000/v1, api_keyEMPTY) image_b64 encode_image(test.png) response client.chat.completions.create( modelqwen-vl, messages[ { role: user, content: [ {type: image_url, image_url: {url: fdata:image/png;base64,{image_b64}}}, {type: text, text: 这张图里有什么请用中文回答。} ] } ], max_tokens512 ) print(response.choices[0].message.content)这段代码在业务系统里就是标准的调用范式读图片、转Base64、拼请求、拿结果。vLLM返回的数据结构完全兼容OpenAI格式迁移起来非常顺。如果用curl测试也可以直接POST JSONcurl http://localhost:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: qwen-vl, messages: [ { role: user, content: [ {type: image_url, image_url: {url: https://example.com/test.jpg}}, {type: text, text: 识别这张发票的金额和税号} ] } ] }3.3 多模态能力实测图片识别、文档解析与视频理解服务起来之后我习惯用三组用例来验证多模态能力是否真的达标通用图片识别、文档OCR解析、视频内容理解。第一组通用图片识别。拿一张日常生活图片让模型描述场景。Qwen2.5-VL对复杂场景的细节捕捉很稳能说出人物、物体、动作、光线信息不只是笼统的“图片上有几个人”。第二组文档解析。这是企业场景里最常用的能力。把一张票据截图丢给模型它可以直接抽出开票方、金额、税号、日期等结构化信息。实测中7B模型对印刷体的提取准确率很高手写体会差一些但仍能识别大部分内容。第三组视频理解。Qwen2.5-VL支持视频输入接受常见格式的视频文件内部会抽取关键帧进行理解。比如我上传一段20秒的监控视频模型能总结出“有人从左侧进入画面停留约10秒后离开”这个能力对于安防和内容审核场景非常有价值。多模态模型和纯文本模型最大的不同在于输入不仅是token序列。图片会被视觉编码器切成patch再映射成视觉token所以同一张图在不同分辨率下会占用不同数量的上下文长度。这也是为什么部署时--max-model-len不建议设得太小否则几张高分辨率图片就能把上下文塞满。4. 生产环境下的性能调优与问题排查4.1 显存溢出OOM和显存管理OOM是我在部署大模型时遇到最多的错误报错信息通常是CUDA out of memory或者OutOfMemoryError: CUDA error。出现这个问题的原因一般有三个模型太大、并发请求太多、上下文长度超过设定值。解决办法从易到难排列解决方案具体操作适用场景降低显存利用率目标--gpu-memory-utilization 0.8单卡显存刚好卡线缩小上下文长度--max-model-len 4096短输入场景减少KV Cache占用换量化版本使用AWQ/GPTQ的4bit模型显存不足但精度要求一般多卡并行--tensor-parallel-size 2有2张及以上GPU换小模型7B降到3B业务效果可以接受时还要注意即使模型本身能塞进显存并发请求多开时每个请求都会占用额外的显存来保存KV Cache。所以 OOM 往往不是启动时报而是跑了一段时间后突然报。这个时候最有效的办法是调低--gpu-memory-utilization给KV Cache预留更多空间或者用--max-num-seqs限制同时处理的序列数。4.2 推理速度慢和并发能力优化刚部署完测试时可能只有几个人在用速度问题不明显。但生产环境一旦并发上来单请求延迟和整体吞吐量就会成为重点。vLLM有 continuous batching它会动态收集等待中的请求调度到同一批GPU计算里所以并发上去后效率反而可能比单请求更高。这也是vLLM在生产环境里远胜Ollama的关键原因。实测数据供参考在一台A100 80G上部署7B模型单请求生成100个token延迟大约在300-500毫秒并发16个请求时整体吞吐依然能维持在每秒几百token以上。如果是Ollama同样条件下并发能力会弱很多延迟也会显著上升。如果觉得单卡吞吐不够优先考虑模型量化和张量并行而不是盲目上更大的模型。比如Qwen2.5-VL-7B的AWQ 4bit量化版在几乎不损失精度的情况下能把显存占用压掉一半以上推理吞吐也能提升不少。监控GPU实时状态用这个命令watch -n 1 nvidia-smi可以看到每一块GPU的显存占用、利用率、温度。如果显存占用接近上限利用率却不高说明请求排队严重需要调并发限制如果显存占用高且利用率接近100%说明GPU是满负荷状态要扩容了。4.3 模型下载慢或卡住的处理思路国内下载Hugging Face模型经常遇到网络问题表现为文件下载速度极慢或者下载到一半卡住不动。我踩过几次坑后固定用下面这套思路处理。首选ModelScope。通义千问是国产模型ModelScope上的托管节点对国内网络非常友好。用snapshot_download下载时中断后重新执行同一条命令会自动跳过已下载的文件实现断点续传。这比很多下载工具都要好用。from modelscope import snapshot_download snapshot_download(Qwen/Qwen2.5-VL-7B-Instruct, cache_dir/data/models)如果是团队内部有多台机器要部署同一个模型还有一个更省事的办法在A机器上下载好模型然后打包传到内网其他服务器。用tar压缩20多GB的模型文件内网传输速度足够快比每台机器都去外网下载靠谱得多。tar -czf qwen2.5vl-7b.tar.gz /data/models/Qwen/Qwen2.5-VL-7B-Instruct scp qwen2.5vl-7b.tar.gz user目标服务器:/data/models/传输完成后在目标服务器上解压即可。这个办法在大规模集群部署时非常实用既能避免外网重复下载又能保证所有节点模型版本一致。4.4 服务端口、防火墙与systemd守护模型部署完成远程却访问不到API这个问题的常见原因不是模型坏而是防火墙没放行端口。服务监听0.0.0.0:8000但云服务器的安全组或本机防火墙还挡着端口。检查本机防火墙ufw status # Ubuntu firewall-cmd --list-all # CentOSUbuntu上放行8000端口ufw allow 8000/tcpCentOS上放行firewall-cmd --permanent --add-port8000/tcp firewall-cmd --reload如果服务器在云平台上还要去云控制台的安全组规则里添加入站规则放行8000端口。生产环境里我还会用systemd把vLLM服务管理起来实现开机自启和崩溃自动重启。写一个服务文件/etc/systemd/system/vllm.service[Unit] DescriptionvLLM Inference Server Afternetwork.target [Service] Typesimple EnvironmentPATH/opt/vllm-env/bin ExecStart/opt/vllm-env/bin/vllm serve Qwen/Qwen2.5-VL-7B-Instruct --host 0.0.0.0 --port 8000 --served-model-name qwen-vl --gpu-memory-utilization 0.92 Restarton-failure RestartSec5 [Install] WantedBymulti-user.target然后执行systemctl daemon-reload systemctl enable --now vllm systemctl status vllm服务挂掉时会自动重启配合日志查看命令journalctl -u vllm -f就能实现比较完整的服务运维闭环。最后说一个我自己踩出来的习惯不管是Ollama还是vLLM我都会在部署完成后先跑一遍带图片的完整请求确认多模态通路没问题再交付。因为很多时候模型能正常聊天但不代表多模态接口就是通的很可能是模型传参格式不对或者图片字段没生效。这个检查别省能省掉后面大量的沟通成本。
返回列表