1. 问题描述
关键词:推理服务,算子报错,异常dump
1.1 现象
服务化启动后跑gsm8k数据集到一定数量后,出现PagedAttention算子报错,如下,显示访问越界,基本稳定复现
1.2 软件版本
mindspore-2.7.1
sglang-v0.5
2. 定位问题与根因分析
2.1 定位工具与方法
框架提供了算子异常时捕获其输入的方法,参考文档:mindspore dump功能参考文档
分析输入,是否有存在越界访问情况,特别是block_tables中是否有值超了kv_cache页最大值
2.2 定位步骤与过程
2.2.1 dump异常算子输入
准备好dump.json文件
{
"common_dump_settings": {
"op_debug_mode": 4,
"dump_mode": 0,
"path": "/home/xxx/sgl/dump_err",
"net_name": "ResNet50",
"iteration": "all",
"saved_data": "tensor",
"input_output": 0,
"kernels": ["PagedAttention"],
"support_device": [0,1,2,3,4,5,6,7],
"statistic_category": ["max", "min", "l2norm"]
},
"e2e_dump_settings": {
"enable": true,
"trans_flag": true
}
}
运行前设置环境变量
export MINDSPORE_DUMP_CONFIG=dump.json
2.2.2 分析输入
比较大的tensor可以先查看shape,小的直接查看值,分析了常出现异常导致算子执行报错,即block_tables中有值超了最大kvcache存储的页数
key_cache shape: (65, 128, 1, 576) # (page_num, page_size, kv_head_num, kv_head_len)
block_tables: array([799, 0, 4, 6, 5, 8], dtype=int32) #存的是kv_cache具体页数
其中799超过了最大页数65
3. 问题解决
最后调整服务框架构造的block_tables,并进行越界检查
