Qwen3-VL-Embedding-2B 多模态检索模型的昇腾 NPU 适配版本,支持离线推理、在线推理、精度评测和对比学习微调。
Qwen3-VL-Embedding-2B 是 Qwen 家族多模态检索模型,基于 Qwen3-VL 构建,支持文本、图像、截图和视频等多模态输入,适用于跨模态理解与信息检索任务。
Qwen3-VL-embedding-2B/
├── README.md # 本文件
├── Qwen3-VL-Embedding-2B-NPU-适配指导书.md # 详细适配指导书
├── verify_report.md # 验证报告
├── training_report.md # 微调训练报告
├── accuracy_comparison_report.md # 精度对比报告
├── scripts/ # 脚本目录
│ ├── offline_inference.py # 离线推理脚本
│ ├── image_accuracy_eval.py # 多模态精度评测脚本
│ ├── start_server.sh # 在线服务启动脚本
│ ├── verify_server.sh # 服务验证脚本
│ ├── convert_flickr8k.py # 数据集转换脚本
│ ├── train_contrastive_simple.py # 对比学习微调脚本
│ └── evaluate_finetuned_model.py # 微调后模型评测脚本
│ └── convert_weights.sh # MindSpeed-MM权重转换
├── mindspeed_mm/ # MindSpeed-MM微调适配代码
│ ├── models/
│ │ └── embedding_model.py # Embedding模型类
│ ├── tasks/
│ │ └── contrastive/
│ │ └── contrastive_trainer.py # 对比学习训练器
│ └── data/
│ ├── datasets/
│ │ └── contrastive_dataset.py # 对比学习数据集
│ └── dataloader/
│ └── data_collator.py # 数据Collator
├── examples/
│ └── qwen3vl_embedding/ # MindSpeed-MM微调配置
│ ├── qwen3vl_embedding_sft.yaml # 训练配置
│ ├── model_config.json # 模型配置
│ ├── data_config.json # 数据配置
│ ├── finetune_qwen3vl_embedding.sh # 启动脚本
└── data/
└── flickr8k_contrastive_sample.json # 示例数据| 部件 | 版本 |
|---|---|
| 驱动固件 | 25.5.0 |
| CANN | 8.5.1 |
| Python | 3.11.14 |
| torch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
| vllm | 0.18.0 |
| vllm-ascend | 0.18.0rc1 |
| transformers | 4.57.1 |
基于 vLLM-Ascend 框架进行离线推理:
import torch
import torch_npu
from vllm import LLM
os.environ["ASCEND_RT_VISIBLE_DEVICES"] = "3"
# 任务描述
task = 'Given a web search query, retrieve relevant passages that answer the query'
# 构造查询和文档
queries = [
f'Instruct: {task}\nQuery: What is the capital of China?',
f'Instruct: {task}\nQuery: Explain gravity'
]
documents = [
"The capital of China is Beijing.",
"Gravity is a force that attracts two bodies towards each other."
]
input_texts = queries + documents
# 加载模型
model = LLM(
model="/workspace/Qwen3-VL-Embedding-2B",
runner="pooling",
distributed_executor_backend="mp",
trust_remote_code=True
)
# 计算嵌入
outputs = model.embed(input_texts)
embeddings = torch.tensor([o.outputs.embedding for o in outputs])
# 计算相似度
scores = (embeddings[:2] @ embeddings[2:].T)
print(f"Embedding scores: {scores.tolist()}")
print(f"Embedding shape: {embeddings.shape}")预期结果:
Embedding scores: [[0.91, 0.29], [0.30, 0.78]]
Embedding shape: torch.Size([4, 2048])脚本执行:
python scripts/offline_inference.py启动 vLLM 服务:
export ASCEND_RT_VISIBLE_DEVICES="3"
vllm serve /workspace/Qwen3-VL-Embedding-2B \
--runner pooling \
--port 9008 \
--served-model-name Qwen3-VL-Embedding-2B \
--trust-remote-code验证服务:
# 检查模型列表
curl http://127.0.0.1:9008/v1/models
# 发送推理请求
curl http://127.0.0.1:9008/v1/embeddings \
-H "Content-Type: application/json" \
-d '{
"input": ["The capital of China is Beijing.", "Gravity is a force."],
"model": "Qwen3-VL-Embedding-2B"
}'脚本执行:
bash scripts/start_server.sh
bash scripts/verify_server.sh使用 Flickr8k 数据集进行图像-文本检索精度验证:
| 数据集 | 说明 |
|---|---|
| Flickr8k | 8092张图像,每张图像5条描述,共40460条文本-图像对 |
| 指标 | 说明 |
|---|---|
| Top-1 Accuracy | 首位命中准确率 |
| Top-5 Accuracy | 前5位命中准确率 |
| Text-to-Image | 文本检索图像 |
| Image-to-Text | 图像检索文本 |
python scripts/image_accuracy_eval.py --num_samples 100| 样本数 | Avg Top-1 | Avg Top-5 |
|---|---|---|
| 20 | 97.50% | 100.00% |
| 50 | 94.00% | 100.00% |
| 100 | 88.50% | 100.00% |
| 200 | 84.25% | 98.25% |
论文基准对比:MMEB-V2 Image RET = 74.8%
使用 transformers 库进行对比学习微调:
准备数据:
python scripts/convert_flickr8k.py启动微调:
python scripts/train_contrastive_simple.py \
--model /workspace/Qwen3-VL-Embedding-2B \
--data /workspace/MindSpeed-MM/data/flickr8k_contrastive.jsonl \
--output /workspace/outputs/qwen3vl_embedding_finetuned \
--epochs 3 \
--batch_size 4 \
--max_samples 500 \
--lr 2e-5 \
--temperature 0.07微调参数:
| 参数 | 说明 | 默认值 |
|---|---|---|
epochs | 训练轮数 | 3 |
batch_size | 批大小 | 4 |
lr | 学习率 | 2e-5 |
temperature | 对比学习温度 | 0.07 |
max_samples | 训练样本数 | 500 |
如需使用 MindSpeed-MM 框架进行分布式微调:
安装 MindSpeed-MM:
git clone https://gitcode.com/Ascend/MindSpeed-MM.git
pip install -e .复制适配代码:
cp -r mindspeed_mm/* MindSpeed-MM/mindspeed_mm/
cp -r examples/* MindSpeed-MM/examples/启动训练:
bash examples/qwen3vl_embedding/finetune_qwen3vl_embedding.sh| 模型 | Avg Top-1 | Avg Top-5 |
|---|---|---|
| 原始模型 | 94.00% | 100.00% |
| 微调后模型 | 98.00% | 100.00% |
| 提升 | +4.00% | - |
验证微调效果:
python scripts/evaluate_finetuned_model.py \
--model /workspace/outputs/qwen3vl_embedding_finetuned/final \
--num_samples 50vLLM pooling runner 仅支持文本输入。图像嵌入需使用 transformers 库:
from transformers import Qwen3VLForConditionalGeneration, AutoProcessor
from qwen_vl_utils import process_vision_info
import torch.nn.functional as F
model = Qwen3VLForConditionalGeneration.from_pretrained(
"/workspace/Qwen3-VL-Embedding-2B",
torch_dtype=torch.bfloat16,
device_map="auto"
)
processor = AutoProcessor.from_pretrained("/workspace/Qwen3-VL-Embedding-2B")
# 图像嵌入
messages = [
{"role": "user", "content": [{"type": "image", "image": "path/to/image.jpg"}]}
]
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
image_inputs, _ = process_vision_info(messages)
inputs = processor(text=[text], images=image_inputs, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model(**inputs, output_hidden_states=True)
hidden = outputs.hidden_states[-1]
# 从最后一个token提取嵌入
emb = hidden[:, -1, :]
emb = F.normalize(emb, p=2, dim=-1)| 指标 | 数值 |
|---|---|
| 模型加载时间 | 68s |
| 嵌入计算吞吐量 | 320 queries/s (文本) |
| 嵌入维度 | 2048 |
| KV Cache Size | 457,600 tokens |
| 可训练参数比例 | 80.87% (冻结ViT) |
| 脚本 | 用途 |
|---|---|
scripts/offline_inference.py | 离线推理测试 |
scripts/start_server.sh | 在线服务启动 |
scripts/verify_server.sh | 服务验证 |
scripts/image_accuracy_eval.py | 多模态精度评测 |
scripts/convert_flickr8k.py | 数据集转换 |
scripts/train_contrastive_simple.py | 对比学习微调 |
scripts/evaluate_finetuned_model.py | 微调后模型评测 |
scripts/convert_weights.sh | MindSpeed-MM权重转换 |
| 文档 | 说明 |
|---|---|
Qwen3-VL-Embedding-2B-NPU-适配指导书.md | 详细适配指导书 |
Qwen3-VL-Embedding-2B-MindSpeed-MM-微调适配分析.md | MindSpeed-MM适配分析 |
verify_report.md | 仓库验证报告 |
training_report.md | 微调训练报告 |
accuracy_comparison_report.md | 微调前后精度对比 |
vLLM pooling runner 仅支持文本嵌入。图像嵌入需使用 transformers 库,参考第四章"多模态推理"。
减小 batch_size 或使用冻结策略:
使用 scripts/evaluate_finetuned_model.py 对比原始模型和微调后模型的检索精度。
Apache 2.0
版本: v2.0 更新日期: 2026-04-26 适用场景: 昇腾 A2 NPU / NVIDIA GPU 功能: 推理 + 精度评测 + 微调