图文_视频_Embedding(Qwen-VL)
更新时间:2026-07-29
简介
QwenVLEmbedding 基于 Qwen3-VL-Embedding-8B,对文本或图像进行图文联合 embedding,输出 4096 维 L2 归一化向量,便于下游 cosine 相似度、KMeans 聚类与去重。
功能描述
• 支持四种输入内容类型:text / image_url / image_binary / image_base64,由 content_type 指定。
• 双后端推理:vLLM(默认高吞吐)与 transformers 兜底;backend="auto" 时在 sm_120 新卡上自动回退 transformers。
• 输出 4096 维 list<float32>,默认做 L2 归一化;支持 last / mean / cls 三种池化方式。
• 必须运行在 CUDA GPU 上,权重需预置于 {model_path}/{model_name}(不自动下载)。
算子参数
输入
| 输入 | 含义 |
|---|---|
| contents | 待编码的内容列,为文本字符串或图像(URL / base64 / 二进制),具体形式由 content_type 决定 |
输出
| 输出 | 含义 |
|---|---|
| result | 图文 embedding,类型 list<float32>(4096 维);默认 L2 归一化。批次失败且 fail_on_error=False 时该行为 None |
参数
| 参数名称 | 类型 | 默认值 | 描述 | |
|---|---|---|---|---|
| content_type | str | "image_url" | 输入格式,可选 "text" / "image_url" / "image_binary" / "image_base64" |
|
| model_path | str | "/opt/aihc/models" | 权重根目录,实际模型目录为 {model_path}/{model_name} |
|
| model_name | str | "Qwen/Qwen3-VL-Embedding-8B" | 模型名称/子目录 | |
| batch_size | int | 8 | 单批推理量(8B 模型显存占用较大) | |
| dtype | str | "auto" | 计算精度,可选 "auto" / "bfloat16" / "float16" / "float32";auto 时优先 BF16 |
|
| max_pixels | int |None | None | 视觉输入像素上限,控制显存激活峰值 | |
| min_pixels | int |None | None | 视觉输入像素下限 | |
| pooling | str | "last" | 取序列表征方式,"last"=最后一个 token,"mean"=均值池化,"cls"=第一个 token |
|
| normalize | bool | True | 是否 L2 归一化(cosine 去重语义正确所必需) | |
| tensor_parallel_size | int | 1 | 张量并行度,仅 vLLM 后端生效 | |
| gpu_memory_utilization | float | 0.85 | GPU 显存利用率,仅 vLLM 后端生效 | |
| enforce_eager | bool | False | 是否强制 eager 模式,仅 vLLM 后端生效 | |
| rank | int | 0 | 多卡 rank,模型部署位置为 cuda:{rank % cuda_device_count} |
|
| backend | str | "auto" | 推理后端,可选 "auto" / "vllm" / "transformers";sm_120 或缺 vLLM 时自动走 transformers |
|
| fail_on_error | bool | False | 出错时是否抛异常;False 时对应行返回 None |
调用示例
Python
1from __future__ import annotations
2
3import os
4
5import daft
6from daft import col
7
8from daft.aihc.common.udf import aihc_udf
9from daft.aihc.functions.multimodal.embedding.qwen_vl_embedding import QwenVLEmbedding
10
11os.environ.setdefault("BOS_ENDPOINT", "http://bj.bcebos.com")
12os.environ.setdefault("BOS_REGION", "bj")
13
14MODEL_PATH = "/opt/aihc/models" # MOCK
15
16if __name__ == "__main__":
17 if os.getenv("DAFT_RUNNER", "native") == "ray":
18 import ray
19
20 ray.init(ignore_reinit_error=True)
21 daft.set_runner_ray()
22 daft.set_execution_config(actor_udf_ready_timeout=6000, min_cpu_per_task=0)
23
24 samples = {
25 "content": ["bos://your-bucket/sample.jpg"], # MOCK
26 }
27 ds = daft.from_pydict(samples)
28 ds = ds.with_column(
29 "embedding",
30 aihc_udf(
31 QwenVLEmbedding,
32 construct_args={
33 "content_type": "image_url",
34 "model_path": MODEL_PATH,
35 "model_name": "Qwen/Qwen3-VL-Embedding-8B",
36 "pooling": "last",
37 "normalize": True,
38 "backend": "auto",
39 },
40 num_cpus=1,
41 num_gpus=1,
42 concurrency=1,
43 batch_size=1,
44 )(col("content")),
45 )
46 ds.show()
评价此篇文章
