本报告对 GLM-OCR 视觉语言模型在华为昇腾 NPU 设备上通过 vLLM-Ascend 推理框架部署的功能及性能进行了全面测试与评估。
测试日期: 2026-02-05
测试目标:
| 项目 | 详情 |
|---|---|
| NPU 型号 | Ascend 910 |
| NPU 数量 | 16 芯片(8 卡 × 2 芯片/卡)或 8 芯片(8 卡 × 1 芯片/卡) |
| 单芯片 HBM | 65,536 MB |
| 模型占用 HBM | ~59,059 MB(主芯片) |
| 操作系统 | Linux 5.10.0 (openEuler 22.03 SP4, aarch64) |
| 组件 | 版本 |
|---|---|
| vLLM | 0.17.0rc1(含 GLM-OCR 定制补丁) |
| vLLM-Ascend | 0.17.0rc1(含 GLM-OCR MTP 补丁) |
| PyTorch | 2.9.0 |
| torch-npu | 2.9.0 |
| CANN | 8.5.0 |
| Transformers | 4.57.6 |
| Python | 3.11.14 |
| npu-smi | 0.17.0rc1 |
| 项目 | 详情 |
|---|---|
| 模型名称 | GLM-OCR |
| 模型架构 | GlmOcrForConditionalGeneration |
| 模型路径 | /models/GLM-OCR |
| 模型大小 | 2.9 GB(单文件 safetensors) |
| 词表大小 | 59,392 |
| 文本层数 | 16 层 |
| 文本隐藏维度 | 1,536 |
| 注意力头数 | 16(KV 头 8) |
| 视觉编码器深度 | 24 层 |
| 视觉隐藏维度 | 1,024 |
| 图像分辨率 | 336 × 336 |
| Patch 大小 | 14 |
| 最大上下文长度 | 131,072 tokens |
| MTP 层数 | 1 |
| 数据精度 | BFloat16 |
| RoPE 类型 | M-RoPE(多维旋转位置编码) |
将0001-vllm-glm-ocr-v0.17.patch和0002-vllm-ascend-glm-ocr-v0.17.patch文件上传到/home/xxx目录,执行以下命令打上补丁。
cd /vllm-workspace/vllm
git apply /home/xxx/0001-vllm-glm-ocr-v0.17.patch
cd /vllm-workspace/vllm-ascend
git apply /home/xxx/0002-vllm-ascend-glm-ocr-v0.17.patch推荐配置(含 HCCL AIV 优化):
cd /workspace
HCCL_OP_EXPANSION_MODE=AIV vllm serve /models/GLM-OCR \
--trust-remote-code \
--speculative-config '{"method":"mtp","num_speculative_tokens":1}'备选配置(限制并发数):
cd /workspace
HCCL_OP_EXPANSION_MODE=AIV vllm serve /models/GLM-OCR \
--trust-remote-code \
--max-num-seqs 64 \
--speculative-config '{"method":"mtp","num_speculative_tokens":1}'测试方法: 调用 /v1/models 接口确认模型加载状态。
结果: ✅ 通过
GET http://localhost:8000/v1/models
Response: {"object":"list","data":[{"id":"/models/GLM-OCR","object":"model",...}]}模型成功加载,max_model_len 为 131,072。
测试方法: 通过 OpenAI Chat Completions API 发送纯文本消息。
请求:
messages=[{"role": "user", "content": "Hello, can you describe what you can do?"}]响应:
Hello! I'm AI. I am an AI, I can provide information about various topics and offer assistance in various fields, including technology, education, digital content creation, language applications, and more.
结果: ✅ 通过 — 模型能正确理解和回复纯文本输入。
测试方法: 生成包含英文和数字的测试图像,通过 base64 编码发送至 Vision API。
测试图像内容:
Hello World!
This is a test.
12345模型识别结果:
Hello World!
This is a test
12345结果: ✅ 通过 — 英文文本与数字均被准确识别。
测试方法: 生成包含价格和邮箱地址的测试图像。
测试图像内容:
Price: $199.99
Email: test@example.com模型识别结果:
Price: $199.999.999Email: test@example.com结果: ⚠️ 基本通过 — 主体内容识别正确,价格末尾出现重复数字,属于小数点后精度方面的轻微偏差。邮箱地址完整识别。
| 测试项 | 结果 | 备注 |
|---|---|---|
| 服务启动与模型加载 | ✅ 通过 | MTP 推测解码正常启用 |
| 纯文本对话 | ✅ 通过 | 响应流畅、语义正确 |
| 英文 OCR | ✅ 通过 | 识别准确 |
| 数字 OCR | ✅ 通过 | 识别准确 |
| 特殊字符 OCR | ⚠️ 基本通过 | 轻微数字重复问题 |
| Vision API (base64) | ✅ 通过 | 图像编码传输正常 |
使用 vllm bench serve 进行在线推理性能测试。测试分为两轮:
--max-num-seqs 64 限制并发HCCL_OP_EXPANSION_MODE=AIV,移除 --max-num-seqs 限制测试参数:
测试结果对比:
| 指标 | 基线配置 | AIV 优化配置 | 变化 |
|---|---|---|---|
| 成功请求 | 20 / 20 | 20 / 20 | - |
| 总 Token 吞吐量 | 274.77 tok/s | 308.86 tok/s | +12% |
| 峰值输出吞吐量 | 1,242 tok/s | 1,096 tok/s | -12% |
| 峰值并发数 | 20 | 20 | - |
| 均值 TTFT | 4,656.81 ms | 2,694.13 ms | -42% |
| 中位数 TTFT | 4,121.26 ms | 2,844.37 ms | -31% |
| 均值 TPOT | 30.29 ms | 30.52 ms | ~0% |
| MTP 接受率 | 64.24% | 65.20% | +1pp |
测试参数:
测试结果对比:
| 指标 | 基线配置 | AIV 优化配置 | 变化 |
|---|---|---|---|
| 成功请求 | 50 / 50 | 50 / 50 | - |
| 请求吞吐量 | 4.33 req/s | 4.33 req/s | ~0% |
| 总 Token 吞吐量 | 1,661.10 tok/s | 1,605.43 tok/s | -3% |
| 峰值并发数 | 20 | 20 | - |
| 均值 TTFT | 41.31 ms | 44.60 ms | +8% |
| 中位数 TTFT | 40.69 ms | 43.85 ms | +8% |
| 均值 TPOT | 6.99 ms | 8.05 ms | +15% |
| P99 ITL | 16.42 ms | 18.10 ms | +10% |
| MTP 接受率 | 80.55% | 79.88% | ~0% |
测试参数:
测试结果对比:
| 指标 | 基线配置 | AIV 优化配置 | 变化 |
|---|---|---|---|
| 成功请求 | 100 / 100 | 100 / 100 | - |
| 请求吞吐量 | 6.42 req/s | 10.00 req/s | +56% |
| 总 Token 吞吐量 | 4,933.08 tok/s | 4,785.38 tok/s | -3% |
| 峰值输出吞吐量 | 3,840 tok/s | 5,000 tok/s | +30% |
| 峰值并发数 | 100 | 100 | - |
| 均值 TTFT | 4,382.13 ms | 1,944.11 ms | -56% |
| 中位数 TTFT | 2,298.97 ms | 1,931.59 ms | -16% |
| 均值 TPOT | 14.85 ms | 25.16 ms | +69% |
| MTP 接受率 | 82.35% | 75.27% | -7pp |
| 指标 | 多模态 (2 RPS) | 文本 (5 RPS) | 压力测试 (∞ RPS) |
|---|---|---|---|
| 成功率 | 100% | 100% | 100% |
| 请求吞吐 (req/s) | 1.84 | 4.33 | 10.00 |
| 总吞吐 (tok/s) | 309 | 1,605 | 4,785 |
| 峰值输出 (tok/s) | 1,096 | 848 | 5,000 |
| 均值 TTFT (ms) | 2,694 | 45 | 1,944 |
| 中位数 TTFT (ms) | 2,844 | 44 | 1,932 |
| 均值 TPOT (ms) | 30.5 | 8.1 | 25.2 |
| MTP 接受率 | 65.2% | 79.9% | 75.3% |
HCCL_OP_EXPANSION_MODE=AIV 环境变量启用 HCCL 集合通信的 AIV(AI Vector)模式,主要影响如下:
| 场景 | TTFT 改善 | 吞吐量变化 | 适用性 |
|---|---|---|---|
| 多模态(低负载) | -42% | +12% | ✅ 推荐 |
| 文本(中负载) | +8% | -3% | ⚠️ 持平 |
| 压力测试 | -56% | -3% | ✅ 推荐 |
多模态与高并发场景收益显著
中等负载文本场景略有增加
权衡取舍
GLM-OCR 模型内置 1 层 MTP(Multi-Token Prediction)层,在 vLLM 中作为推测解码方案启用。
| 测试场景 | 草稿 Token | 接受 Token | 接受率 | 平均接受长度 |
|---|---|---|---|---|
| 多模态 | 1,543 | 1,006 | 65.20% | 1.65 |
| 文本(中负载) | 7,103 | 5,674 | 79.88% | 1.80 |
| 文本(压力) | 29,181 | 21,965 | 75.27% | 1.75 |
num_speculative_tokens=1),平均接受长度 1.7~1.8 意味着有效加速约 70-80%| 评估项 | 结果 | 说明 |
|---|---|---|
| 服务连续运行 | ✅ 稳定 | 测试期间服务持续运行无崩溃 |
| 零失败率 | ✅ 通过 | 所有 170 个请求(20+50+100)均成功返回 |
| 高并发处理 | ✅ 通过 | 100 并发请求均正常处理 |
| HBM 内存使用 | ✅ 正常 | 主芯片占用 ~59 GB / 64 GB |
| NPU 健康状态 | ✅ 正常 | 所有芯片状态 OK,温度 33~36°C |
HCCL_OP_EXPANSION_MODE=AIV 在多模态和高并发场景下显著降低 TTFT(降幅 42-56%),推荐启用。HCCL_OP_EXPANSION_MODE=AIV,对多模态和高并发场景有显著收益。--max-num-seqs 64;如追求最大吞吐可移除此限制。num_speculative_tokens=1,在纯文本场景已有良好加速效果,多模态场景接受率偏低属正常现象。# 启动服务(推荐配置)
cd /workspace
HCCL_OP_EXPANSION_MODE=AIV vllm serve /models/GLM-OCR \
--trust-remote-code \
--speculative-config '{"method":"mtp","num_speculative_tokens":1}'
# 基准测试 - 多模态
vllm bench serve \
--base-url http://localhost:8000 \
--endpoint /v1/chat/completions \
--model /models/GLM-OCR \
--backend openai-chat \
--dataset-name random-mm \
--num-prompts 20 \
--random-input-len 64 \
--random-output-len 128 \
--request-rate 2
# 基准测试 - 纯文本(中负载)
vllm bench serve \
--base-url http://localhost:8000 \
--endpoint /v1/chat/completions \
--model /models/GLM-OCR \
--backend openai-chat \
--dataset-name random \
--num-prompts 50 \
--random-input-len 128 \
--random-output-len 256 \
--request-rate 5
# 基准测试 - 压力测试
vllm bench serve \
--base-url http://localhost:8000 \
--endpoint /v1/chat/completions \
--model /models/GLM-OCR \
--backend openai-chat \
--dataset-name random \
--num-prompts 100 \
--random-input-len 256 \
--random-output-len 512 \
--request-rate inffrom openai import OpenAI
from PIL import Image, ImageDraw
import base64
from io import BytesIO
client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
# 纯文本测试
response = client.chat.completions.create(
model="/models/GLM-OCR",
messages=[{"role": "user", "content": "Hello, can you describe what you can do?"}],
max_tokens=256
)
print(response.choices[0].message.content)
# OCR 测试
img = Image.new('RGB', (400, 200), color='white')
draw = ImageDraw.Draw(img)
draw.text((50, 50), "Hello World!\nThis is a test.\n12345", fill='black')
buf = BytesIO()
img.save(buf, format="PNG")
img_b64 = base64.b64encode(buf.getvalue()).decode()
response = client.chat.completions.create(
model="/models/GLM-OCR",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "请识别图片中的所有文字"},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{img_b64}"}}
]
}],
max_tokens=512
)
print(response.choices[0].message.content)| 环境变量 | 值 | 说明 |
|---|---|---|
HCCL_OP_EXPANSION_MODE | AIV | 启用 HCCL AI Vector 模式,优化集合通信性能,显著降低多模态和高并发场景的 TTFT |