首次aclrtSetDevice耗时长
问题现象描述
现象1:业务进程首次调用aclrtSetDevice接口存在秒级时延
业务进程首次调用 aclrtSetDevice 接口时耗时明显偏长(秒级时延),而后续再次调用同一接口耗时显著缩短(毫秒级)。
现象2:多进程场景下各进程首次aclrtSetDevice耗时存在抖动
多个业务进程并发调用 aclrtSetDevice 时,各进程的首次调用耗时不一致,存在明显抖动,部分进程耗时可能进一步增大。
现象3:后续进程首次aclrtSetDevice耗时明显缩短
当已有进程完成 aclrtSetDevice 后,新启动的业务进程首次调用 aclrtSetDevice 耗时显著降低,因为算子包搬移成果可在进程间共享。
可能原因
- 算子包搬移开销:首次 aclrtSetDevice 时需要将算子包从 Host 侧搬移到 Device 侧,涉及文件传输和部署,是主要耗时来源之一。
- aicpu_scheduler 进程拉起:首次 aclrtSetDevice 时需要在 Device 侧为该业务进程拉起对应的 aicpu_scheduler 调度进程。各业务进程的 aicpu_scheduler 进程相互独立、不可共享,每个进程都会分别拉起自己的 aicpu_scheduler,进程创建和初始化带来额外耗时。
- 并发与设备负载影响:多进程并发调用 aclrtSetDevice 时,算子包搬移和 aicpu_scheduler 进程拉起受 Device 侧资源竞争和负载影响,导致接口耗时抖动。
处理步骤
原因1:算子包搬移开销
解决方法:
- 理解搬移机制:首次 aclrtSetDevice 时,Runtime 会将业务所需的算子包从 Host 侧传输到 Device 侧并部署,该过程涉及文件 I/O 和 Device 侧写入,耗时与算子包大小正相关。
- 利用搬移缓存:算子包搬移成功后会在 Device 侧缓存。如果不同业务进程使用的算子包版本一致,后续进程的首次 aclrtSetDevice 不涉及重复搬移,耗时显著缩短。
- 保持算子包版本一致:确保多个业务进程使用相同版本的 CANN 算子包,以最大化共享搬移缓存。
- 预热策略:在业务启动阶段安排一个轻量级进程优先执行 aclrtSetDevice,完成算子包搬移,后续业务进程即可享受加速效果。
原因2:aicpu_scheduler 进程拉起
解决方法:
- 理解拉起机制:aicpu_scheduler 是 Device 侧的 AICPU 任务调度进程,首次 aclrtSetDevice 时由 Runtime 自动为当前业务进程拉起,负责该进程的 AICPU 算子任务调度。进程创建、初始化和就绪确认均需要时间。
- 各业务进程的 aicpu_scheduler 进程相互独立、不可共享:每个业务进程首次 aclrtSetDevice 时都会分别拉起自己的 aicpu_scheduler 进程,该开销无法通过其他进程预热来消除。
- 如果对首次调用延迟敏感,可在业务初始化阶段提前调用 aclrtSetDevice 完成预热,将延迟前置到非关键路径。
原因3:并发与设备负载影响
解决方法:
- 避免高并发同时初始化:多业务进程同时调用 aclrtSetDevice 会导致算子包搬移和 aicpu_scheduler 拉起产生资源竞争,增加各进程的等待时间。
- 错峰初始化:合理安排各业务进程的启动时序,避免在同一时刻集中调用 aclrtSetDevice。
- 降低 Device 侧负载:在 aclrtSetDevice 调用前避免向 Device 下发大量计算任务,减少资源竞争对初始化耗时的影响。
相关 issue
暂无相关Issue。