基于PaddleOCR-VL架构的漫画OCR模型,专门针对漫画/动漫场景优化,支持在华为昇腾NPU上高效推理。
| 设备 | 型号 | 数量 |
|---|---|---|
| NPU | Atlas 800 A2 / A3 | 1+ |
| 内存 | ≥ 32GB | - |
| 存储 | ≥ 100GB | - |
# 推荐使用官方Docker镜像
docker pull quay.io/ascend/vllm-ascend:v0.17.0rc1
# 或使用国内镜像
docker pull m.daocloud.io/quay.io/ascend/vllm-ascend:v0.17.0rc1export VLLM_USE_MODELSCOPE=true
export TASK_QUEUE_ENABLE=1
export CPU_AFFINITY_CONF=1
export PYTORCH_NPU_ALLOC_CONF="expandable_segments:True"docker run --rm \
--name paddleocr-vl-npu \
--net=host \
--shm-size=1g \
--device /dev/davinci0 \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--device /dev/hisi_hdc \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
-v ~/.cache/modelscope:/root/.cache/modelscope \
-it quay.io/ascend/vllm-ascend:v0.17.0rc1 bash# 安装vLLM-Ascend
pip install vllm-ascend
# 验证安装
python -c "import vllm; print(vllm.__version__)"#!/bin/bash
export VLLM_USE_MODELSCOPE=true
export MODEL_PATH="PaddlePaddle/PaddleOCR-VL"
export TASK_QUEUE_ENABLE=1
export CPU_AFFINITY_CONF=1
export PYTORCH_NPU_ALLOC_CONF="expandable_segments:True"
vllm serve ${MODEL_PATH} \
--max-num-batched-tokens 16384 \
--served-model-name PaddleOCR-VL-0.9B \
--trust-remote-code \
--no-enable-prefix-caching \
--mm-processor-cache-gb 0 \
--compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY"}' \
--additional_config '{"enable_cpu_binding":true}' \
--port 8000# 检查服务状态
curl -sf http://127.0.0.1:8000/v1/models
# 文本推理测试
curl -s http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "PaddleOCR-VL-0.9B",
"messages": [{"role": "user", "content": "say hi"}],
"temperature": 0,
"max_tokens": 16
}'from openai import OpenAI
client = OpenAI(
api_key="EMPTY",
base_url="http://localhost:8000/v1",
timeout=3600
)
# OCR任务
messages = [{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {"url": "https://example.com/image.png"}
},
{
"type": "text",
"text": "OCR:"
}
]
}]
response = client.chat.completions.create(
model="PaddleOCR-VL-0.9B",
messages=messages,
temperature=0.0,
)
print(response.choices[0].message.content)# 安装依赖
pip install requests pillow
# 执行推理
python inference.py \
--image path/to/image.png \
--task ocr \
--backend npu \
--output result.json# 运行精度对比脚本
python accuracy_eval.py \
--backend npu \
--test-data ./test_images/ \
--output accuracy_report.json# 运行性能对比脚本
python performance_eval.py \
--backends cpu,npu \
--input-len 512 \
--output-len 128 \
--num-iterations 100 \
--output performance_report.json| 指标 | 说明 |
|---|---|
| 精度 | 模型输出与基准的相似度 |
| 延迟 | 单次推理耗时(ms) |
| 吞吐量 | 每秒处理的请求数 |
| 加速比 | NPU相对CPU的加速倍数 |
A: 检查以下几点:
npu-smi info~/.cache/modelscope/--trust-remote-code参数A: 尝试以下方法:
--compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY"}'--max-num-batched-tokens 16384--additional_config '{"enable_cpu_binding":true}'A: 减小模型长度或批处理大小:
--max-model-len 8192
--max-num-seqs 4A: 使用eager模式:
vllm serve ${MODEL_PATH} \
--enforce-eager \
--dtype float16 \
--port 8000| 硬件 | 延迟(P50) | 延迟(P90) | 延迟(P99) |
|---|---|---|---|
| CPU | ~500ms | ~800ms | ~1200ms |
| NPU | ~50ms | ~80ms | ~120ms |
| GPU | ~30ms | ~50ms | ~80ms |
| 硬件 | 吞吐量(tokens/s) | 加速比 |
|---|---|---|
| CPU | 50 | 1x |
| NPU | 500 | 10x |
| GPU | 800 | 16x |
Apache-2.0