利用 Optimum-intel 快速部署 Qwen3-embedding 系列模型
openlab_96bf3613
更新于 2月前
作为 Qwen 模型家族的新成,Qwen3 Embedding 系列模型专为文本表征、检索与排序任务设计,基于 Qwen3 基础模型进行训练,充分继承了 Qwen3 在多语言文本理解能力方面的优势。在多项基准测试中,Qwen3 Embedding 系列在文本表征和排序任务中展现了卓越的性能。
Optimum-intel 是面向 Transformers 库兼容的模型转换和部署工具,支持 Intel OpenVINO™推理后端,这篇文章将分享如何利用 Optimum-intel 快速在 Intel 平台上部署 Qwen3-embedding 系列模型。
内容列表
1. 环境准备
2. 模型下载和转换
3. 模型部署
第一步,环境准备
通过以下命令可以搭建基于 Python 的模型部署环境。
%pip install -q "git+https://github.com/huggingface/optimum-intel.git"%pip install -qU "openvino>=2025.2" "openvino_tokenizers>=2025.2"
第二步,模型下载和转换
在部署模型之前,我们首先需要将原始的 PyTorch 模型转换为 OpenVINO™的 IR 静态图格式,并对其进行压缩,以实现更轻量化的部署和最佳的性能表现。通过 Optimum 提供的命令行工具 optimum-cli,我们可以一键完成模型的格式转换和权重量化任务:
其中 Embedding 模型可以用 <feature-extraction> 任务类型导出:
optimum-cli export openvino --model Qwen3-Embedding-0.6B --trust-remote-code --task feature-extraction --weight-format fp16 Qwen3-Embedding-0.6B -ovReranker 模型可以用 <text-generation> 任务类型导出:
optimum-cli export openvino --model Qwen3-Reranker-0.6B --trust-remote-code --task text-generation --weight-format fp16 Qwen3-Reranker-0.6B-ov第三步,模型部署
完成模型转换后,我们同样可以利用 Optimum-intel 来进行模型部署,当创建以 “OV” 为前缀的模型任务对象后,Optimum-intel 会使用 OpenVINO™作为模型的后端执行推理,并通过 device 参数来指定模型部署硬件。
其中 Embedding 模型可以用 < OVModelForFeatureExtraction> 任务对象推理:
from optimum.intel import OVModelForFeatureExtractionmodel = OVModelForFeatureExtraction.from_pretrained(model_dir, device=device)
Reranker 模型可以用 < OVModelForCausalLM > 任务对象推理:
from optimum.intel import OVModelForCausalLMmodel = OVModelForCausalLM.from_pretrained(model_dir, device=device)
完成 OpenVINO™模型对象创建后,开发者可以该对象直接替换官方示例中的 Transformers 模型对象,复用官方示例进行模型部署。这里以 Embedding 模型为例,基于以下参考代码可以构建一个简单的文本相似度比较任务:
import torchimport torch.nn.functional as Ffrom torch import Tensorfrom transformers import AutoTokenizerdef last_token_pool(last_hidden_states: Tensor, attention_mask: Tensor) -> Tensor:left_padding = attention_mask[:, -1].sum() == attention_mask.shape[0]if left_padding:return last_hidden_states[:, -1]else:sequence_lengths = attention_mask.sum(dim=1) - 1batch_size = last_hidden_states.shape[0]return last_hidden_states[torch.arange(batch_size, device=last_hidden_states.device), sequence_lengths]def get_detailed_instruct(task_description: str, query: str) -> str:return f"Instruct: {task_description}\nQuery:{query}"# Each query must come with a one-sentence instruction that describes the tasktask = "Given a web search query, retrieve relevant passages that answer the query"queries = [get_detailed_instruct(task, "What is the capital of China?"), get_detailed_instruct(task, "Explain gravity")]# No need to add instruction for retrieval documentsdocuments = ["The capital of China is Beijing.","Gravity is a force that attracts two bodies towards each other. It gives weight to physical objects and is responsible for the movement of planets around the sun.",]input_texts = queries + documentstokenizer = AutoTokenizer.from_pretrained(model_dir, padding_side="left")max_length = 8192# Tokenize the input textsbatch_dict = tokenizer(input_texts,padding=True,truncation=True,max_length=max_length,return_tensors="pt",)batch_dict.to(model.device)output*****odel(**batch_dict)embeddings = last_token_pool(outputs.last_hidden_state, batch_dict["attention_mask"])# normalize embeddingsembeddings = F.normalize(embeddings, p=2, dim=1)scores = embeddings[:2] @ embeddings[2:].Tprint(scores.tolist())
更多示例可以参考:https://github.com/openvinotoolkit/openvino_notebooks/tree/latest/notebooks/qwen3-embedding
总结
可以看到,利用 OpenVINO™工具套件,我们可以非常轻松地将转换后的 Qwen3-embedding 系列模型部署在 Intel 的硬件平台上,从而进一步在本地构建起各类基于 LLM 的服务和应用。
参考资料
Qwen3-embedding 示例:https://github.com/openvinotoolkit/openvino_notebook***lob/latest/notebooks/qwen3-embedding/qwen3-embedding.ipynb
Qwen3-reranker 示例: https://github.com/openvinotoolkit/openvino_notebook***lob/latest/notebooks/qwen3-embedding/qwen3-reranker.ipynb