Ascend-SACT/Qwen3-VL-embedding-2B
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

Qwen3-VL-Embedding-2B 昇腾NPU适配

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
CANN8.5.1
Python3.11.14
torch2.9.0
torch_npu2.9.0.post1
vllm0.18.0
vllm-ascend0.18.0rc1
transformers4.57.1

一、推理

1.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

1.2 在线推理

启动 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

二、精度评测

2.1 评测数据集

使用 Flickr8k 数据集进行图像-文本检索精度验证:

数据集说明
Flickr8k8092张图像,每张图像5条描述,共40460条文本-图像对

2.2 评测指标

指标说明
Top-1 Accuracy首位命中准确率
Top-5 Accuracy前5位命中准确率
Text-to-Image文本检索图像
Image-to-Text图像检索文本

2.3 运行评测

python scripts/image_accuracy_eval.py --num_samples 100

2.4 原始模型精度结果

样本数Avg Top-1Avg Top-5
2097.50%100.00%
5094.00%100.00%
10088.50%100.00%
20084.25%98.25%

论文基准对比:MMEB-V2 Image RET = 74.8%


三、微调

3.1 简化版微调(推荐)

使用 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

3.2 MindSpeed-MM 微调

如需使用 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

3.3 微调后精度对比

模型Avg Top-1Avg 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 50

四、多模态推理(图像嵌入)

vLLM 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 Size457,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.shMindSpeed-MM权重转换

七、文档清单

文档说明
Qwen3-VL-Embedding-2B-NPU-适配指导书.md详细适配指导书
Qwen3-VL-Embedding-2B-MindSpeed-MM-微调适配分析.mdMindSpeed-MM适配分析
verify_report.md仓库验证报告
training_report.md微调训练报告
accuracy_comparison_report.md微调前后精度对比

八、常见问题

Q1: vLLM 报错不支持图像输入?

vLLM pooling runner 仅支持文本嵌入。图像嵌入需使用 transformers 库,参考第四章"多模态推理"。

Q2: 微调时显存不足?

减小 batch_size 或使用冻结策略:

  • 默认冻结 Vision Encoder (80.87% 可训练参数)
  • 如需训练 ViT,减小 batch_size 到 1-2

Q3: 如何评估微调效果?

使用 scripts/evaluate_finetuned_model.py 对比原始模型和微调后模型的检索精度。


许可证

Apache 2.0


版本: v2.0 更新日期: 2026-04-26 适用场景: 昇腾 A2 NPU / NVIDIA GPU 功能: 推理 + 精度评测 + 微调