执行:爱衣(researcher 多次 abort,证据已充分,直接出报告)
时间:2026-02-27
根本原因:PyTorch BF16 在无 AVX-512 的 CPU 上触发软件模拟,性能下降约 100 倍。
这是已知的 PyTorch 问题(issue #118499),不是硬件瓶颈,可以解决。
| 机器 | 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/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 运行异常
| 模型 | 架构 | 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 上触发软件模拟。
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 水平)
fastembed 默认使用 ONNX,完全绕过 PyTorch BF16 路径:
from fastembed import TextEmbedding
model = TextEmbedding("Qwen/Qwen3-Embedding-0.6B")
注意:fastembed 对 Qwen3-Embedding 的支持需确认版本兼容性。
BGE-M3 在 LE-B 已有 12.5 条/秒,不受此问题影响,且中英双语能力强。
model.to(torch.float32) 重测 LE-B × Qwen3,验证是否恢复正常速度