ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Qwen-VL本地部署实战:三条路线对比与显存优化指南

Qwen-VL本地部署实战:三条路线对比与显存优化指南 我这边第一次真正下决心折腾 Qwen-VL 本地部署是被一批合同扫描件逼的。图片有小一千张客户要求做版面分析和关键字段提取但又明确说了数据不能出内网云端 API 这条路直接被堵死。当时翻遍手里的多模态模型最后锁定了通义千问开源出来的 Qwen-VL 系列。折腾了大概一个周末从纯 CPU 跑不动到 8G 显存也能顺畅推理中间踩了不少坑也把主流的三条部署路线都摸了一遍。这篇东西就把整个本地部署过程、选型逻辑、实操命令和踩坑记录完整写出来给准备入坑的兄弟们省点时间。适用人群很明确一是被数据隐私要求卡住、必须把所有推理放在本地的开发者二是想低成本跑批处理图片识别任务、又不想按张数付 API 费用的个人用户三是单纯想在一台普通电脑上体验多模态大模型的学生或爱好者。如果你只是想在自己的项目里快速接一个图片理解能力不想关心底层推理细节那这篇里面的第三章部署路线对比和第八章接口接入部分最适合你如果你想从零开始把整套环境搭起来那建议从头到尾完整过一遍。1. 为什么非得在本地跑 Qwen-VL而不是继续用云端 API先说说本地部署这件事背后的真实动力不然很多人坚持不下来。我自己最早也是云端 API 的忠实用户把一个图片理解功能接上线只需要几行代码效果还稳定。但用着用着就发现云端方案有几个很现实的坎每一条都可能成为你不得不转向本地部署的理由。第一个是数据隐私。这个不用多说医疗影像、合同票据、企业内部截图、用户上传的证件照片这些数据往云端送一次就有一次风险。哪怕 API 厂商承诺数据不留存合规和法务那一关也过不去。我当时处理的全是合同扫描件甲方直接写进合同里“数据不得离开客户网络环境”这种情况下云端 API 再强也是白搭。第二个是成本结构。云端 API 按 Token 和按图片张数双重计费偶尔调几张还好一旦涉及批处理任务几千张图跑下来账单数字是实打实的。我算过一笔账用当时的通用视觉接口识别一千张合同首页量级大概消耗几百万 Token费用接近一个中等配置云主机一个月的价格。而本地部署除了电费和硬件折旧边际成本几乎为零跑一万张和跑十张花的钱一样。第三个是可控性。云端 API 背后的模型版本更新、参数调整、限流策略都不由你说了算。本地部署之后模型文件就在硬盘上想换量化等级就换想微调就微调想离线部署到客户的机房就离线部署一切动作都在自己掌控范围内。特别是做 To B 项目的时候“我们的系统可以完全离线运行”这句话本身就是一个巨大的销售加分项。当然本地部署也不是没有代价。显存不够就得接受量化带来的精度损失硬件性能不足就得忍受更长的推理延迟环境依赖冲突会花掉你大量排错时间。但综合下来对需要批量处理图片、又对数据敏感的团队来说本地部署是唯一可行的路。Qwen-VL 系列刚好在模型尺寸、能力表现和开源许可之间找到了一个不错的平衡点这也是我选它的核心原因。2. 动手之前先算清这笔账模型选型确认与显存预算很多人一上来就下载 72B 的大模型结果加载直接把机器卡死或者显存溢出直接 OOM。这类问题几乎每天都在各种群里看到。实际上本地部署的第一步不是跑代码而是先搞清楚你手里有什么硬件、能跑多大模型、需要什么量化等级。2.1 Qwen-VL 家族怎么选从第一代到 Qwen2.5-VL“Qwen-VL”这个名字其实是一个系列。最开始的 Qwen-VL 和 Qwen-VL-Chat 是通义千问团队最早开源的双语多模态模型底座是 Qwen-7B参数量大概在 9.6B 左右因为加了一个视觉编码器。后来出了 Qwen-VL-Plus 和 Qwen-VL-Max 这样的云端版本那就是闭源 API 了不在本地部署讨论范围内。真正让本地部署社区热闹起来的是 Qwen2-VL。它把视觉编码器和语言模型的融合方式重做了一遍支持了视频输入、高分辨率图片理解对不同尺寸图片的适应能力明显增强。参数版本有 2B、7B、72B 三档。后来发布的 Qwen2.5-VL 又在这基础上增强了 OCR 和文档解析能力还加入了视觉定位能力多了 3B 这个非常适合端侧部署的版本。如果你现在准备开始部署我建议直接跳过第一代 Qwen-VL从 Qwen2-VL 或 Qwen2.5-VL 入手。原因是第一代模型在中文文档识别、复杂版面理解上的效果已经明显落后即使部署成功实际产出可能也达不到你的预期。尤其是你要做票据、截图、扫描件这类文档理解任务Qwen2.5-VL 的 OCR 增强是实打实能感知到的。2.2 一张表看懂显存预算到底要多少显存估算其实有一个非常简单的公式模型权重显存加上推理过程中的激活值和 KV Cache再留一点余量。BF16 精度下每个参数占 2 字节所以一个 7B 模型光权重就是大致 14GB换成 INT4 量化后每个参数只有约 0.5 字节7B 模型权重降到 3.5GB加上激活值和 KV Cache8GB 显存才勉强够用。这就是为什么“8G 显存能不能跑”这个问题答案永远是一句“看量化等级”。我整理了一张常用的显存预算表方便你对着自己的显卡情况直接判断模型规格参数量精度权重占用建议显存Qwen2-VL-2B / Qwen2.5-VL-3B2B-3BBF164-6GB8GBQwen2-VL-2B / Qwen2.5-VL-3B2B-3BINT41.5-2GB4GBQwen2-VL-7B / Qwen2.5-VL-7B7BBF1614-16GB24GBQwen2-VL-7B / Qwen2.5-VL-7B7BINT44-5GB8GBQwen2.5-VL-32B32BINT418-20GB24GBQwen2.5-VL-72B72BINT440GB48GB这里说的建议显存已经包含了 CUDA 上下文、激活值和基础 KV Cache。但有一点要提醒多模态模型和纯文本模型不一样图片会转换成大量视觉 Token 参与计算。一张高分辨率图片经过视觉编码器处理后可能产生上千个 Token这些 Token 会直接拉高 KV Cache 的占用。所以如果你频繁传入大图、长图实际显存占用会比上面的表再高出 2 到 4GB。我自己测试过一台 8G 显存的机器跑 Qwen2.5-VL-7B INT4 量化版传一张 1024x1024 的普通图片做问答显存峰值大概在 6.5GB 左右。但同一张图换成 2048 像素的超长截图峰值直接就逼近 8GB如果再开长上下文窗口OOM 的风险就比较大了。2.3 硬件环境与运行空间规划除了显存还有一个很多人容易忽略的点内存和硬盘空间。加载 7B 模型时即使权重在显存里CPU 内存至少还需要预留 8-12GB因为 Hugging Face 的模型加载过程通常会在内存里做一次完整的模型数据中转。硬盘空间方面BF16 版本的 7B 模型文件缩在大概 15GBINT4 量化版本在 4-5GB建议至少留出模型体积两倍以上的可用空间因为下载和解压过程还会产生临时文件。我的建议是部署前先用nvidia-smi看一下显存占用用htop看一下内存情况用df -h看一下磁盘剩余空间。三个指标确认之后再选模型基本能避开大部分“下到一半跑不动”的尴尬。3. 三条主流部署路线先来对号入座Qwen-VL 本地部署看起来路数很多但总结下来就三条主线Transformers 全家桶、vLLM 推理框架、Ollama 加 llama.cpp 的轻量路线。这三条路线各有各的适用场景选错了会非常难受。我在实际项目里三条都用过下面直接说结论。Transformers 路线是官方默认支持的加载和推理方式适合做开发调试、跑单机脚本、做模型效果验证。它的优点是灵活性最高各种加载参数、量化方式都能直接控制缺点是吞吐量低并发能力弱不适合直接对外提供 API 服务。vLLM 路线是生产级的选择它用 PagedAttention 和一些列优化手段把推理吞吐量提了非常多而且自带 OpenAI 兼容的 API Server前端项目几乎可以直接切换过来。缺点是环境依赖较重对 CUDA 版本、GPU 架构有一定要求老显卡可能跑不起来。Ollama 路线是最省事的选择。一条命令就能把模型拉下来一条命令就能起一个内部服务。它底层用的是 llama.cpp 那套量化推理方案对显存和内存的要求都比较宽容。缺点是你没法像 Transformers 那样精细控制模型加载逻辑而且遇到问题排错时的可操作性比较差。我按自己的使用场景给三条路线做了个对比对比维度TransformersvLLMOllama / llama.cpp核心定位开发调试、效果验证高并发 API 服务个人电脑轻量使用并发能力低高中显存友好度一般一般最友好部署难度中中高极低扩展灵活性最灵活较灵活受限适合显卡任意 NVIDIA/Apple Silicon 较新版本推荐 Ampere 架构以上任意含老卡典型场景写脚本跑批量任务接入业务系统的推理服务个人笔记本玩一玩一句话总结我的个人选择逻辑如果只是自己写 Python 脚本批处理图片用 Transformers如果要把能力开放给团队或者集成到现有系统里直接上 vLLM如果是 8GB 显存以下的个人电脑而且不想折腾环境老老实实用 Ollama。4. 路线一实操用 Transformers 加载 Qwen2.5-VL 做本地推理这条路线是最接近“官方推荐”的一种方式也是后面很多进阶操作的基础。它的思路很简单从 Hugging Face 下载模型和处理器用 transformers 库加载然后构造对话消息进行推理。4.1 环境准备Python、CUDA 和必要依赖我这边部署时用的环境是 Python 3.10、PyTorch 2.3、CUDA 12.1显卡是 RTX 4070 Ti。先说结论Python 版本建议 3.10 以上PyTorch 必须装 CUDA 版直接pip install torch默认装 CPU 版这是一个非常常见的坑。建议先建一个干净的虚拟环境conda create -n qwenvl python3.10 conda activate qwenvl pip install torch2.3.0 torchvision0.18.0 --index-url https://download.pytorch.org/whl/cu121 pip install transformers accelerate qwen-vl-utilsqwen-vl-utils是 Qwen 官方提供的一个工具包作用是把图片路径、视频路径这些输入转换成模型能吃的张量格式。没有它你要手动处理图像的预处理逻辑非常容易出错。装完之后先跑一下python -c import torch; print(torch.cuda.is_available())看到True再继续。这一步能过滤掉至少一半的环境问题。4.2 模型下载与加载为什么推荐用 from_pretrained 一步到位模型文件可以从 Hugging Face 直接下载也可以从 ModelScope 拉镜像。考虑到国内网络环境ModelScope 通常更稳from modelscope import snapshot_download model_dir snapshot_download(Qwen/Qwen2.5-VL-7B-Instruct)然后加载模型推荐直接走 transformers 的from_pretrainedfrom transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessor from qwen_vl_utils import process_vision_info model Qwen2_5_VLForConditionalGeneration.from_pretrained( Qwen/Qwen2.5-VL-7B-Instruct, torch_dtypeauto, device_mapauto, ) processor AutoProcessor.from_pretrained(Qwen/Qwen2.5-VL-7B-Instruct)torch_dtypeauto的含义是让模型自动读取配置文件里的精度设置Qwen2.5-VL 默认是 bfloat16。如果你的显卡不支持 bf16部分老卡再手动改成torch.float16。device_mapauto会让模型自动分配到可用的设备上如果你有多张显卡它会把不同层分散放上去这是最省心的一种加载方式。我在第一次加载时踩过一个坑没装accelerate库device_mapauto参数直接报错。如果你遇到类似的情况先确认依赖是否装全再检查 transformers 版本是否够新。Qwen2.5-VL 需要 transformers 4.45 以上老版本会报各种奇怪的属性缺失错误。4.3 核心推理逻辑从 messages 到输出加载完成之后推理逻辑其实是标准的 chat 格式。Qwen 的多模态输入用的是messages列表里面区分图片和文本内容messages [ { role: user, content: [ {type: image, image: ./test.png}, {type: text, text: 请详细描述这张图片的内容}, ], } ] text processor.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) image_inputs, video_inputs process_vision_info(messages) inputs processor( text[text], imagesimage_inputs, videosvideo_inputs, paddingTrue, return_tensorspt, ).to(model.device) outputs model.generate(**inputs, max_new_tokens512) generated_ids [ output_ids[len(input_ids):] for input_ids, output_ids in zip(inputs.input_ids, outputs) ] result processor.batch_decode(generated_ids, skip_special_tokensTrue)[0] print(result)这里有一个关键的逻辑点process_vision_info负责把 messages 里的图片路径读出来并转成模型可用的格式而apply_chat_template负责把 messages 转换成模型期望的对话文本格式。两者配合缺一不可。如果你的图片是本地路径直接传路径字符串就行如果是内存里的二进制数据需要先做编码转换这块在接入业务系统时才会遇到。4.4 跑批处理任务时的一个性能建议如果你和我一样目的是一次性处理大量图片那我建议在 Transformers 路线里加上一个固定 batch 的大小的循环而不是一张一张地调用model.generate。虽然从 API 层面看代码复杂度会高一点但吞吐量提升非常明显。我实测同样 100 张图单张循环处理耗时约 20 分钟改成 batch 为 4 的分批处理后耗时降到 11 分钟左右。要注意 batch 模式下图片尺寸最好差不多否则预处理会把所有图片 pad 到最大尺寸造成显存浪费。最省事的做法是前期统一缩放到固定分辨率比如 896x896这是 Qwen2.5-VL 训练时比较擅长的分辨率区间。5. 路线二实操用 vLLM 部署出 OpenAI 兼容 APITransformers 方案虽然灵活但如果你做的是一个带用户交互的线上应用那它的吞吐量和并发能力远远不够。这时候就该 vLLM 上场了。5.1 vLLM 环境与启动参数vLLM 的安装相对简单但要注意它跟 PyTorch 版本有对应关系建议直接用官方推荐的安装命令pip install vllm启动服务只需要一行命令vllm serve Qwen/Qwen2.5-VL-7B-Instruct --limit-mm-per-prompt image5 --max-model-len 8192这里两个参数都非常重要。--limit-mm-per-prompt image5限制单次请求最多带 5 张图防止有人传几十张图把显存打爆--max-model-len 8192控制上下文长度数值越大 KV Cache 占用的显存越多。显存比较紧张的情况下把这个值降到 4096 能明显降低峰值占用。如果你的显存只有 8G 到 12G直接跑 7B 的 BF16 版本大概率会 OOM。两个解决办法一是改成量化版本启动二是用--gpu-memory-utilization 0.9把显存利用率显式拉高。但说实话8G 显存上 vLLM 跑 7B 的体验并不好这个场景我建议直接看第六章的 Ollama 路线或者用 3B 版本。5.2 用 OpenAI SDK 调用本地 APIvLLM 启动成功后控制台会显示 API 服务地址默认是http://localhost:8000。发送请求的方式和 OpenAI 的接口几乎一模一样from openai import OpenAI client OpenAI(base_urlhttp://localhost:8000/v1, api_keyEMPTY) resp client.chat.completions.create( modelQwen/Qwen2.5-VL-7B-Instruct, messages[ { role: user, content: [ {type: image_url, image_url: {url: https://example.com/image.png}}, {type: text, text: 这张图里有什么}, ], } ], max_tokens256, ) print(resp.choices[0].message.content)如果你的图片在本地需要转成 base64 编码塞进url字段格式是data:image/jpeg;base64,xxxxxxxx。这个和 OpenAI 视觉接口的请求格式完全一致所以很多现有项目只需要改一下base_url就能无缝切换到本地模型这真的非常方便。5.3 vLLM 在我实测中的并发与坑我在一个内部工具里用 vLLM 部署了 Qwen2.5-VL-7B8 个并发请求同时进来平均延迟从单请求的 3 秒左右涨到 6 秒但没有任何请求失败。作为对比Transformers 在同一显卡上跑 8 个并发请求直接 OOM 了三次。这就是 vLLM 最大的价值显存管理和请求调度做得比朴素的 Transformers 好太多。唯一要吐槽的点是 vLLM 对 GPU 架构有要求。Ampere 架构RTX 30 系列以上体验很好但要是你用 GTX 10 系列或者更老的卡很多优化算子用不了性能提升非常有限。如果你的卡比较老就老实走 Ollama 路线。6. 路线三实操Ollama 加 GGUF 量化8GB 显存也能顺畅跑这条路线是我个人最推荐的“个人电脑首选”尤其是 8G 显存用户。Ollama 把模型管理、量化推理、服务启动全部封装好了本质上你只需要执行几条命令。6.1 最直接的做法一条命令拉模型先安装 Ollama然后直接执行ollama pull qwen2.5vlqwen2.5vl默认拉取是的 7B 版本的量化版大概 4-5GB显存占用 8G 以内可以顺利跑起来。如果显存只有 4-6G建议用qwen2.5vl:3b这个版本体积更小资源占用更低。运行方式也是一条命令ollama run qwen2.5vl进入交互界面后直接把图片路径当作输入放进去比如 /path/to/image.png 这张图片里有哪些文字Ollama 会自动处理图片的编码和预处理你完全不用关心底层实现。这个体验对非技术用户来说非常友好我甚至见过一个做律师的朋友完全不懂代码用 Ollama 跑通了本地案卷识别工具。6.2 离线环境下的手动导入方式如果你部署的目标机器无法访问外网那就需要走手动导入 GGUF 文件的路径。先在一台能联网的机器上下载量化好的 GGUF 文件然后把文件拷贝到目标机器上再写一个 ModelfileFROM ./qwen2.5vl-7b-instruct-q4_K_M.gguf TEMPLATE {{- if .System }}System: {{ .System }}{{ end }} User: {{ .Prompt }} Assistant: 接着执行ollama create qwen2.5vl-gguf -f Modelfile ollama run qwen2.5vl-gguf这个方式适合政府、军工、企业内网这种完全隔离的网络环境。需要注意的是手动导入时 GGUF 文件名和量化等级要跟模型架构匹配下载时最好像确认 sha256 校验值避免下到损坏的半成品文件。6.3 三种量化等级的实测对比质量与速度的取舍Ollama 默认使用的 GGUF 量化等级可以通过标签指定比如qwen2.5vl:7b-q4_K_M和qwen2.5vl:7b-q8_0。我在一张 8G 显存的卡上分别跑了 Q4_K_M、Q5_K_M、Q8_0 三个等级对比了 OCR 文字识别和图像描述任务。Q4_K_M 速度最快单张图的推理时间大概 3.2 秒但遇到票据上的小字号文字会出现识别错漏偶尔的现象中文长文本场景下出现错别字的概率约摸在 5% 上下。Q8_0 质量明显更好小字识别准确率接近 BF16 版本但显存占用会涨到 7GB 以上推理时间也拉到 4.5 秒左右同时开长上下文的余量就比较小了。Q5_K_M 是中间档速度和显存表现都不错是我在 8G 显存机器上的推荐项。如果你手头是 16G 显存的显卡直接上 Q8_0 完全没问题单图推理时显存峰值大概在 11GB 上下还能留出不少余量跑别的任务。7. 实测中的高频问题与完整排查链路这部分价值最大全是实际踩坑记录。我按“现象、根因、排查过程、最终解决”的思路写方便你遇到了直接照着定位。7.1 显存溢出的完整排查链路现象是torch.cuda.OutOfMemoryError: CUDA out of memory或者 Ollama 的日志里出现memory mapped file failed。很多人第一反应是模型选大了但其实还有三个非常容易忽略的原因。第一个原因是加载精度。确认自己加载的是不是 BF16 还是量化版本BF16 的 7B 模型在 8G 显存上启动阶段就会 OOM跟上下文长度没有关系。第二个原因是上下文长度设置。Transformers 里model.generate的max_new_tokens设得太大或者 vLLM 的--max-model-len设得太长都会显著拉高 KV Cache 占用。第三个原因是图片分辨率。这是多模态模型独有的坑一张超高分辨率长截图转换成视觉 Token 后KV Cache 暴涨的程度可能超出你的预期。排查顺序建议是先用nvidia-smi观察显存峰值确认是不是加载阶段就爆了然后逐步缩小上下文长度确认 KV Cache 的影响最后把图片缩放到 896 或 1280 分辨率再试。如果以上都做了还爆只能降量化等级或者换小模型。7.2 图片输入后报错或模型看不懂图片内容这类问题在 Transformers 路线里很常见。现象是请求能正常返回但模型完全忽略了图片只根据文本内容在做猜测式回答。根因大概率是messages里的图片格式不对或者预处理环节没把图像真正传进去。我自己踩过的一次是直接用 PIL 打开图片转成 numpy 数组传进去结果 Qwen2.5-VL 的 processor 并不认这种格式。后来改成用process_vision_info读取 messages 里的图片路径问题立刻解决。建议在传入方式上严格按官方 demo 来别自己发挥。另一种情况是图片路径中带中文或空格读取时报错把图片路径统一改成英文无空格命名后问题大幅减少。7.3 vLLM 启动报错与 CUDA 相关的坑如果你在vllm serve启动时报ValueError: Bfloat16 is not supported on this GPU其实是因为你的显卡不支持 bf16不是 vLLM 本身的问题。解决方案是给模型配置里手动加dtype float16或者直接用支持 fp16 的量化版本。还有一类报错是Unable to find libcudnn这类 CUDA 依赖问题。常见原因是系统里同时存在多个 CUDA 版本vLLM 被指向了错误的环境变量。排查时用echo $CUDA_HOME看当前指向再确认ldconfig -p | grep cudnn是否能找到库文件。最省事的办法是直接用官方 Docker 镜像把宿主机 GPU 透传进去绕开所有本地环境依赖问题。7.4 量化版 OCR 效果不佳的补救方案前面提到 Q4_K_M 量化对小字识别有概率性错误这里给一个三个层级的补救思路。一级方案是把图片先做预处理用 OpenCV 做一次自适应二值化和放大把文字区域放大后再传给模型。二级方案是切换到更高量化等级比如 Q8_0但要用显存换质量。三级方案是使用混合架构先用一个轻量目标检测模型定位文字区域把区域裁剪出来单独放大再交给 Qwen-VL 识别。这个方案在高分辨率单据场景下效果最好但工程实现复杂度也最高。我自己的经验是如果你要跑批量 OCR 任务建议提前在 50 张图上做一个效果验证多试几种预处理和量化等级组合而不是一上来就无脑选 Q4 然后被质量坑。8. 从“能跑”到“好用”接入上层应用与性能调优部署完成只是第一步真正有价值的是把模型能力接入到自己的业务流程里。最后分享一些工程化的经验。8.1 把本地模型接入 Dify 这类 AI 应用平台Dify 这类低代码 AI 应用平台现在很火它支持自定义模型供应商。如果你用 vLLM 部署了 OpenAI 兼容 API那接入 Dify 非常简单。在模型供应商设置里找到 OpenAI API 兼容选项填上http://localhost:8000/v1作为 API 地址然后填一个任意 API Key 就能通过校验。模型名称填你启动 vLLM 时设定的模型名保存生效。接入之后你可以在 Dify 里做知识库、工作流、对话应用的完整编排。比如建一个“合同识别助手”用户上传一张合同扫描件Dify 工作流先调用 Qwen-VL 抽取版面信息再把结果传给文本模型做结构化整理。整个流程就是可视化拖拽不用写后端代码。8.2 一个实用的批量图片处理架构参考如果你的场景是纯批处理不需要交互式对话那有个非常实用的架构写一个队列服务往里丢图片路径多个 worker 消费队列调用本地模型结果统一写回数据库或者文件夹。我当时写的批处理脚本用的是 Flask 加 Redis 队列。Flask 提供上传接口Redis 做任务队列每个 worker 启动时加载一次模型然后循环从队列里取图片路径执行推理。这样模型只加载一次不会每张图都重新加载吞吐量提升非常明显。一台 24G 显存的机器跑 Qwen2.5-VL-7B稳定能做到每分钟处理 15 到 20 张图足够覆盖大部分中小规模业务。8.3 个人实测后的几条实用建议最后给几条我在实际使用中总结出来的经验。第一模型版本宁小勿大。很多人一开始就上 72B结果显存不够降量化效果反而不如 7B 的 Q8 版本。模型大小和量化等级需要一起考虑不能只看参数量。第二图片预处理花的精力永远值得。我在批量任务里加了一个简单的图片标准化步骤统一格式、压缩到合理分辨率、自动旋转矫正。这一步做完OCR 准确率能提升 5% 到 10%比换更大模型划算得多。第三给推理服务设好超时和降级策略。本地模型偶尔会因为显存碎片化或者并发冲突变慢接口层最好做超时控制超时后先返回队列提示而不是让用户一直等在那里。第四如果要给客户部署优先把整个环境做成 Docker 镜像。我吃过一次亏客户现场的机器 CUDA 版本又老又乱手动装环境装了一整天。后来把模型、运行环境、服务代码全部打进镜像一条docker run命令直接搞定后续维护成本也直线下降。Ollama 官方镜像配合自定义 Modelfile 是最省心的组合。目前这个部署方案我已经在内部跑了三个多月处理了几万张图片整体稳定。后续准备再折腾一下 32B 版本在 24G 显存上的效果以及用 LoRA 微调来提升特定票据版式的识别精度。如果你也在折腾 Qwen-VL 本地部署或者在这过程中遇到了别的坑欢迎随时来交流。
返回列表