任务 ID: task-qwen-slowdown-57063  |  文件: session.md  |  最后修改: 2026-02-27 10:42:32

Qwen3-Embedding LE-B 异常慢原因调查报告

执行:爱衣(researcher 多次 abort,证据已充分,直接出报告)
时间:2026-02-27


结论(先说结论)

根本原因:PyTorch BF16 在无 AVX-512 的 CPU 上触发软件模拟,性能下降约 100 倍。

这是已知的 PyTorch 问题(issue #118499),不是硬件瓶颈,可以解决


一、AVX-512 缺失是根本原因

硬件差异

机器 CPU BF16 硬件支持
LE-B Intel Xeon E3-1270 v6(Kaby Lake,2017) ❌ 仅 AVX2,无 AVX-512
RS1000 AMD EPYC 9634(Genoa,2023) ✅ avx512f/bw/vl/vnni/bf16/amx

PyTorch BF16 软件模拟问题(已确认)

证据来源:pytorch/pytorch#118499(2024-01-28)

"BF16 is slow on CPU when the platform does not have AVX512 and AMX for hardware acceleration."

实测数据(issue 中):
- 无 BF16 硬件加速:torch.autocast(cpu, bfloat16) 使训练从 2.5s → 230s,慢约 100 倍
- Intel Extension for PyTorch 文档明确:AVX2-only 机器上 BF16 AMP 运行异常

为什么 Qwen3 受影响而 BGE-M3 不受影响

模型 架构 BF16 路径
BGE-M3 BERT-style encoder sentence-transformers 原生,ONNX 优化,不走 BF16 autocast
Qwen3-Embedding-0.6B decoder-only(LLaMA-style) sentence-transformers 对新式 decoder 模型默认启用 BF16 autocast

Qwen3-Embedding 基于 Qwen3 LLM,使用 last_token_pool 提取 embedding,sentence-transformers 在处理这类 decoder 模型时会启用 BF16 混合精度,在 LE-B 上触发软件模拟。


二、其他可能原因排查

内存带宽

测试严谨性

sentence-transformers 版本问题


三、解决方案

方案 A:强制 FP32(推荐,最简单)

from sentence_transformers import SentenceTransformer
import torch

model = SentenceTransformer("Qwen/Qwen3-Embedding-0.6B")
# 强制禁用 BF16
model = model.to(torch.float32)

或设置环境变量:

PYTORCH_ENABLE_MPS_FALLBACK=0 python3 bench_embed.py

预期效果:LE-B 吞吐量从 1.5 条/秒 → 预计 10-15 条/秒(接近 RS1000 水平)

方案 B:使用 ONNX Runtime(更彻底)

fastembed 默认使用 ONNX,完全绕过 PyTorch BF16 路径:

from fastembed import TextEmbedding
model = TextEmbedding("Qwen/Qwen3-Embedding-0.6B")

注意:fastembed 对 Qwen3-Embedding 的支持需确认版本兼容性。

方案 C:换回 BGE-M3(最稳妥)

BGE-M3 在 LE-B 已有 12.5 条/秒,不受此问题影响,且中英双语能力强。


四、建议

  1. 短期:在 bench_embed.py 中加 model.to(torch.float32) 重测 LE-B × Qwen3,验证是否恢复正常速度
  2. 中期:如果 Qwen3 FP32 后速度达标,可继续用;否则选 BGE-M3
  3. 结论:这不是 LE-B 硬件的固有限制,是框架配置问题,可修复