F
Member
站务组整理推理性能测试中的一个基础问题:程序调用返回,不代表 GPU 已经完成了计算。许多计算操作以异步方式提交到设备,若直接在调用前后读主机时钟,测到的可能主要是提交开销,而不是实际执行时间。一个看起来极快的数字,首先需要确认它到底覆盖了什么。
先定义测量范围。只测设备上的算子,与包含数据读取、预处理、主机到设备传输、推理、结果回传和后处理,是不同指标。两者都有价值,但不能混在同一张比较表中。若产品关心用户等待,应另外测服务入口到可用结果的端到端耗时,不能用内核执行时间代替。
设备时间可使用框架提供的事件或性能分析机制测量,但要理解事件记录在哪个执行流、是否覆盖实际依赖。主机计时则需要在合适位置等待相关设备工作完成。同步方式会影响流水线并行,因此为了测单次耗时而加入同步后,不能再把同一结果直接当作正常异步服务的吞吐表现。
预热也需要说明目的。首次运行可能包含上下文初始化、内存分配、内核选择或编译;稳态运行则不同。应分别报告冷启动与预热后表现,并固定输入形状及处理方式。不能只删掉最慢的样本,却不解释删去的是初始化还是正常波动,否则结果难以复现。
重复测试要关注系统状态。其他进程、设备功耗与温度状态、数据是否已驻留设备,都可能改变结果。若采用批量请求,还要记录批大小、并发模式和等待策略;吞吐提升不一定意味着单个请求更快。必要时用时间线工具检查计算、传输与空闲之间的关系,避免凭利用率一个数字判断瓶颈。
建议测试报告保留计时代码、同步位置、预热规则、输入分布及输出校验方法。性能优化后仍需验证结果正确,不能为了减少测量开销跳过真正需要的输出。最有价值的不是一个最低耗时,而是在明确口径下能够稳定复现、并能解释其波动来源的结果。
讨论问题:
1. 你们目前计时的是提交、设备执行还是端到端?
2. 冷启动与稳态结果会分开报告吗?
3. 加入同步后,怎样避免误判实际服务的流水线能力?
先定义测量范围。只测设备上的算子,与包含数据读取、预处理、主机到设备传输、推理、结果回传和后处理,是不同指标。两者都有价值,但不能混在同一张比较表中。若产品关心用户等待,应另外测服务入口到可用结果的端到端耗时,不能用内核执行时间代替。
设备时间可使用框架提供的事件或性能分析机制测量,但要理解事件记录在哪个执行流、是否覆盖实际依赖。主机计时则需要在合适位置等待相关设备工作完成。同步方式会影响流水线并行,因此为了测单次耗时而加入同步后,不能再把同一结果直接当作正常异步服务的吞吐表现。
预热也需要说明目的。首次运行可能包含上下文初始化、内存分配、内核选择或编译;稳态运行则不同。应分别报告冷启动与预热后表现,并固定输入形状及处理方式。不能只删掉最慢的样本,却不解释删去的是初始化还是正常波动,否则结果难以复现。
重复测试要关注系统状态。其他进程、设备功耗与温度状态、数据是否已驻留设备,都可能改变结果。若采用批量请求,还要记录批大小、并发模式和等待策略;吞吐提升不一定意味着单个请求更快。必要时用时间线工具检查计算、传输与空闲之间的关系,避免凭利用率一个数字判断瓶颈。
建议测试报告保留计时代码、同步位置、预热规则、输入分布及输出校验方法。性能优化后仍需验证结果正确,不能为了减少测量开销跳过真正需要的输出。最有价值的不是一个最低耗时,而是在明确口径下能够稳定复现、并能解释其波动来源的结果。
讨论问题:
1. 你们目前计时的是提交、设备执行还是端到端?
2. 冷启动与稳态结果会分开报告吗?
3. 加入同步后,怎样避免误判实际服务的流水线能力?

