摘要本文在无显卡的 Ubuntu 24.04 小主机上对 EmbeddingGemma 2、Qwen3-VL-Embedding-2B、WeMM-Embedding-2B 三款多模态向量模型做了同卷图片检索实测。结果显示三款模型全部可跑通Hit1 集中在 12~13/15Qwen3-VL 以 13/15 占先且图表类检索全中EmbeddingGemma 2 以 3.1GB 内存增量与 19.2s/张的编码速度成为资源紧张场景的首选。文章同时给出关键适配代码VL 系图片输入必须走 chat template、三个报错的根因torchvision 硬依赖以及纯 CPU 建库的吞吐参考为无显卡机器做图片向量检索提供完整可复现的账本。EmbeddingGemma 2 图片检索实测3 款多模态向量模型在无显卡 Ubuntu 上的完整账本实测日期 2026-10-09。环境Ubuntu 24.04 / AMD Ryzen 7 5700U8C16TAVX2/ 30G DDR4 / 无 GPU / transformers 5.19.0 torch 2.14.1cpu torchvision 0.29.1cpufp32 精度。 考卷20 张中文技术博客生产图封面 / 竖版贴图 / 系统截图 / 数据图表 / 流程图入库15 条带标准答案的中文查询找图指标 Hit1 / Top3。 考卷脚本、内存探针与安装操作报告已打包见文末无显卡机器从零可复现。TL;DR没有显卡图片检索能跑通transformers 侧没有 llama.cpp 的多模态输入限制三款多模态向量模型全部出向量、全部完成同卷判分。质量挤在 12~13/15Hit1Qwen3-VL-Embedding-2B 以 13/15 占先三张数据图表全部头名命中EmbeddingGemma 2740M 全模态与 WeMM-Embedding-2B2B均 12/15。资源与速度差距是倍数级的内存增量 3.1GB / 7.7GB / 9.7GB单张图片编码 19.2s / 34.5s / 26.3s单条文本查询 1.79s / 6.18s / 11.47s。共同失分点文字密集的竖版贴图配模糊查询三家分别排到第 4 / 11 / 13 名。纯视觉 embedding 不做 OCR文字截图型图库需要前置 OCR 方案。上一轮在 llama.cpp 侧图片输入被静默忽略cos1.000000的问题在 transformers 侧不存在代价是吞吐下降与部署形态从一个 server变成一个 Python 进程。一、测试环境项值机器无显卡 Ubuntu 24.04 小主机CPUAMD Ryzen 7 5700U8C16TAVX2 / F16C无 AVX512内存30G DDR4推理栈transformers 5.19.0 / torch 2.14.1cpu / torchvision 0.29.1cpu精度fp32EmbGemma 2 模型卡明示 FP16 会出 NaNCPU 统一 fp32线程torch.set_num_threads(12)权重来源全部为魔搭国内直连速度远快于 HFgoogle/embeddinggemma-21.5G、Qwen/Qwen3-VL-Embedding-2B4.0G、tencent-community/WeMM-Embedding-2B5.1G。注意 WeMM 的 org 是tencent-community按Tencent/猜会 404。二、考卷与判分文档侧20 张图长边统一压到 1024px原图最大约 1080×1420 竖版贴图逐张编码为向量查询侧15 条中文查询如推理预算对比的数据图开源协议速查卡纯 CPU 跑大模型实测的封面每条人工标注正确图片判分查询向量与全部图片向量做余弦排序统计 Hit1 / Top3同时逐图计时得到入库吞吐。文本与图片向量归一化后用同一位计算余弦pooling 按模型架构分别处理下文第四节。三、结果总表3.1 图片检索质量 速度模型内存增量(fp32)图片编码均时Hit1Top3Qwen3-VL-Embedding-2B7718MB34.5s/张13/1514/15EmbeddingGemma 23086MB19.2s/张12/1514/15WeMM-Embedding-2B9691MB26.3s/张12/1514/153.2 文本查询延迟15 条实测折算单条模型单条延迟备注EmbeddingGemma 21.79s对照 GPUllama.cpp307017.2ms约百倍差距Qwen3-VL-Embedding-2B6.18sWeMM-Embedding-2B11.47s架构依赖的优化内核缺失走 PyTorch 参考实现3.3 内存占用/proc/meminfo 加载前后差值fp32模型加载增量说明EmbeddingGemma 23086MB740M 全模态三者中仅有的 3GB 档Qwen3-VL-Embedding-2B7718MB2B fp32符合参数量 × 4估算WeMM-Embedding-2B9691MB2B fp32 processor 常驻四、关键适配代码4.1 三款模型的加载与向量提取pythonimport torch from transformers import AutoProcessor, AutoModel def load(path): proc AutoProcessor.from_pretrained(path, trust_remote_codeTrue) model AutoModel.from_pretrained(path, torch_dtypetorch.float32, trust_remote_codeTrue) model.eval() return proc, model def pool_last(hidden, mask): idx int(mask.sum().item()) - 1 # 最后一个非 padding 位置 return hidden[0, idx].float().numpy() def pool_mean(hidden, mask): m mask.unsqueeze(-1).float() return (hidden * m).sum(1)[0].float().numpy() / (m.sum() 1e-9)pooling 分工EmbeddingGemma 2 用 meanlast_hidden_state 序列均值Qwen3-VL 与 WeMM 用 last-token取最后一个非 padding 位置。pooling 选错不报错但质量静默下降。4.2 VL 系的图片输入必须走 chat templateQwen3-VL 与 WeMM 的 processor 不能只传图片报错见第五节需要把图片占位与文本一起经 chat template 组装pythonmsgs [{role: user, content: [ {type: image}, {type: text, text: 这张图片}, ]}] txt proc.apply_chat_template(msgs, tokenizeFalse, add_generation_promptTrue) inputs proc(text[txt], images[img], return_tensorspt) with torch.no_grad(): out model(**inputs) emb pool_last(out.last_hidden_state, inputs[attention_mask])EmbeddingGemma 2 则相反图片直接processor(imagesimg, return_tensorspt)裸传即可文本侧加官方前缀task: search result | query: {q}实测该前缀对检索排序的影响约 0.009 MRR可省。4.3 纯 CPU 文本入库吞吐参考EmbGemma 2178 个文本块459 字均值逐小批编码总耗时 315.9s约 0.56 块/spythonfor i in range(0, len(chunks), 4): inputs proc(text[task: search result | query: t for t in chunks[i:i4]], return_tensorspt, paddingTrue) with torch.no_grad(): model(**inputs)2B 模型按查询延迟折算178 块预计 18~34 分钟。CPU 建库的定位结论一次性可接受频繁增量重建建议换小模型或加卡。五、排错实录三个报错一个根因家族报错 1ModuleNotFoundError: Could not import module EmbeddingGemma2Processor报错 2Qwen3VLVideoProcessor requires the Torchvision library but it was [...]报错 3传图片时TypeError: embedding(): argument indices (position 2) must be Tensor, not None三个报错指向两件事torchvision 是多模态 processor 的硬依赖。缺它三个模型的图片处理类全部无法导入。修复与 torch 同源安装pip install torchvision --index-url https://download.pytorch.org/whl/cpu版本自动配对本次 0.29.1cpu。VL 系 processor 的图片必须与文本合传。只传images不传textprocessor 不生成 input_ids底层 embedding 层直接拿到 None。另一个隐藏点是图片 token 需要由 chat template 展开为占位符裸写文本不会触发视觉通路。另有性能提示非错误WeMMQwen3.5 架构在 CPU 上会提示causal_conv1d与flash-linear-attention未安装并回落参考实现文本编码因此偏慢15 条 172s。这两个内核主要面向 CUDACPU 场景暂无解属于该模型在纯 CPU 形态的固有限制。六、逐题明细中的共性与差异共性失分三家的非头名题完全重合在文字密集竖版贴图 模糊查询讲是什么的系列总纲竖图三家排名 4 / 11 / 13。纯视觉 embedding 无 OCR图内的文字信息不参与向量。图库中文字截图占比高时需要 OCR 前置或改用文档解析方案。Qwen3-VL 的增量数据图表类柱状对比、曲线、流程图三连头名图表的结构化视觉特征是它的主场。EmbGemma 2 的分布15 题没有一次跌出前四方差小适合当默认选项。七、复现数据包含emb_img_test.py首轮、emb_img_fix.pychat template 修复版推荐、mem_probe.py内存探针 文本入库吞吐、build_corpus.py文本考卷与安装操作报告从裸 Ubuntu 到跑通的每条命令。三步建 venv 装 CPU 版三件套 → 魔搭拉权重 → 改 QUERIES 跑脚本。八、结论无显卡机器做图片向量检索是可行的质量上三款模型都能到可用档Hit1 12~13/15且互有胜负不多选型胜负手在资源内存紧张选 EmbeddingGemma 23.1GB 19.2s/张追求图表检索质量且内存宽裕选 Qwen3-VL13/15 34.5s/张文字截图型图库是三个模型共同的盲区上 OCR 前置再说llama.cpp 侧的多模态向量输入issue #30082修复前图片检索的本地推理只在 Python 生态成立。完整叙事与纯 CPU 选型决策卡在同名GZH同日推文数据包考卷 脚本 安装报告后台回复获取。分数为单机 fp32 实测语料与图库不同结论可能不同。
阅读完成 · 觉得有帮助?