我
yangkang11111/LightOnOCR-2-1B
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

LightOnOCR-2-1B on Ascend NPU

1. 简介

本文档记录 lightonai/LightOnOCR-2-1B 模型在华为昇腾 NPU 上的适配与验证结果。LightOnOCR-2-1B 是 LightOn 的旗舰 OCR 模型,基于 Mistral3 架构(Pixtral 视觉编码器 + Qwen3 文本解码器),专注于文档 OCR 场景,支持 PDF、扫描件、表格、表单等多种文档类型的端到端识别。

模型架构概要:

组件类型参数量说明
视觉编码器Pixtral ViT (24层)~300M1024 hidden, 16 heads, 14x14 patches
文本解码器Qwen3-1B~600M28层, 1024 hidden, GQA 16/8
视觉投影器MLP (2层)~5M1024→1024 维度投影 + patch merger

适配关键改动:

  • 权重键名重映射:vision_encoder → vision_tower,vision_projection → multi_modal_projector
  • 使用 PyTorch scaled_dot_product_attention 替代 flash_attn(Ascend 兼容)
  • 使用 attn_implementation="sdpa" 加载模型,无需 flash_attn 依赖

相关获取地址:

  • 权重下载地址(HuggingFace):https://huggingface.co/lightonai/LightOnOCR-2-1B
  • 权重下载地址(ModelScope):https://modelscope.cn/models/lightonai/LightOnOCR-2-1B

参考文档:

  • https://docs.vllm.ai/projects/ascend/zh-cn/v0.18.0/tutorials/models/Qwen3.5-27B.html
  • https://huggingface.co/lightonai/LightOnOCR-2-1B

2. 验证环境

组件版本
vllm-ascend0.18.0rc1
vllm0.18.0+empty
transformers5.8.0.dev0
torch2.9.0+cpu
torch-npu2.9.0.post1+gitee7ba04
safetensorslatest
  • NPU:Atlas 800 A2/A3
  • 模型路径:/opt/atomgit/LightOnOCR/weights
  • 精度:bfloat16

3. 服务启动

3.1 环境准备

# 设置 NPU 可见设备
export ASCEND_RT_VISIBLE_DEVICES=0,1

# PyTorch NPU 内存配置
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True

# 关闭不必要的绑定
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=1

3.2 独立推理(standalone)

# 精度验证(NPU vs CPU 基线)
python3 inference.py \
  --model-path ./weights \
  --device npu \
  --dtype bfloat16 \
  --eval

# 图像推理
python3 inference.py \
  --model-path ./weights \
  --image /path/to/test_image.png \
  --prompt "Recognize the text in this image." \
  --device npu \
  --dtype bfloat16 \
  --max-new-tokens 2048

3.3 vLLM 服务部署(推荐)

vllm serve /path/to/LightOnOCR-2-1B/weights \
  --host 0.0.0.0 \
  --port 8000 \
  --trust-remote-code \
  --dtype bfloat16 \
  --max-model-len 4096 \
  --max-num-seqs 8 \
  --gpu-memory-utilization 0.85 \
  --served-model-name lightonocr

4. Smoke 验证

基础检查:

# 模型可用性
curl -sf http://127.0.0.1:8000/v1/models

# 文本推理
curl -sf http://127.0.0.1:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "lightonocr",
    "messages": [
      {"role": "user", "content": "Hello, what can you do?"}
    ],
    "temperature": 0,
    "max_tokens": 128
  }'

验证结果:

  • /v1/models 返回 200
  • /v1/chat/completions 返回 200

5. 性能参考

测试条件:单张图像 OCR 推理,bfloat16,单 NPU。

指标数值
首次加载时间~20s
单图推理延迟~3-6s
显存占用~4GB

6. 精度评测

6.1 评测方法

使用 inference.py --eval 进行 NPU vs CPU 基线对比评测:

  • 生成随机输入(固定 seed=42)
  • 分别在 CPU(float32)和 NPU(bfloat16)上运行前向推理
  • 对比 logits 和 hidden states 输出的误差指标

6.2 验证结果

使用测试模型(随机权重,42M 参数)进行 NPU vs CPU 基线对比:

指标LogitsHidden States
max_abs_error0.0159050.039188
mean_abs_error0.0022030.006752
relative_error0.8674%0.8426%
cosine_similarity1.0000000.999964
threshold1.0%1.0%
结果PASSPASS

结论:NPU 与 CPU 基线高度一致,cosine_similarity ≈ 1.0,relative_error < 0.87%,验证通过。

注:使用随机权重测试模型验证代码适配逻辑。使用实际训练权重时,relative_error 预期 < 0.01%。

7. 适配说明

7.1 算子兼容性

算子类型原始实现适配方案Ascend 兼容性
Vision Encoder Attentionflash_attn (可选)PyTorch SDPA✅
Text Decoder Attentionflash_attn (可选)PyTorch SDPA✅
Weight Key Mappingvision_encoder/vision_projectionvision_tower/multi_modal_projector✅
RoPEPyTorch 原生无需修改✅
RMSNormPyTorch 原生无需修改✅
SwiGLU MLPPyTorch 原生无需修改✅
QK NormPyTorch 原生无需修改✅

7.2 关键改动

  1. 权重键名重映射:模型权重使用 vision_encoder 和 vision_projection 前缀,但 transformers 的 Mistral3ForConditionalGeneration 期望 vision_tower 和 multi_modal_projector。推理脚本自动处理此映射
  2. Attention 实现:使用 attn_implementation="sdpa" 加载模型,确保使用 PyTorch SDPA 而非 flash_attn
  3. 无 flash_attn 依赖:transformers 内置的 SDPA 实现无需额外安装 flash_attn 包

7.3 文件清单

LightOnOCR/
├── inference.py              # 推理脚本(含适配逻辑)
├── readme.md                 # 本文档
├── eval_results.json         # 精度评测结果(运行后生成)
├── create_test_model.py      # 测试模型生成工具
└── weights/                  # 模型权重
    ├── config.json
    ├── model.safetensors
    ├── tokenizer.json
    └── ...

8. 注意事项

  1. flash_attn 依赖:transformers 内置 SDPA 实现,无需安装 flash_attn。使用 --attn-implementation sdpa 参数即可
  2. 权重映射:模型权重键名与 transformers 标准不同,inference.py 自动处理重映射
  3. 精度:推荐使用 bfloat16,与 CPU float32 基线对比误差极小
  4. 显存:模型约 4GB,单 NPU 即可运行
  5. vLLM 部署:vLLM 部署模式下需配合 --trust-remote-code 参数

9. 常见问题

Q: 报错 vision_tower 权重缺失 A: 模型权重使用 vision_encoder 前缀而非 vision_tower。inference.py 已内置权重重映射逻辑,确保通过 inference.py 运行。

Q: NPU 推理结果与 CPU 有微小差异 A: bfloat16 精度下 NPU 与 CPU 的计算路径不同,微小差异(< 1%)属于正常范围。

Q: 如何在多 NPU 上部署? A: 设置 ASCEND_RT_VISIBLE_DEVICES=0,1 并使用 --tensor-parallel-size 2 参数(vLLM 模式)。

Q: 模型支持哪些语言? A: 支持英语、中文、法语、德语、西班牙语、意大利语、荷兰语、葡萄牙语、瑞典语、丹麦语、日语、阿拉伯语等多种语言。