尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CANN Runtime 运行时配置接口实战:系统参数与 Device/Stream 资源限制管理

CANN Runtime 运行时配置接口实战:系统参数与 Device/Stream 资源限制管理 CANN Runtime 运行时配置接口实战系统参数与 Device/Stream 资源限制管理【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime本篇技术指南聚焦 CANN Runtime 的运行时配置接口系统讲解如何通过aclrtSetSysParamOpt/aclrtGetSysParamOpt设置与查询进程级系统参数确定性计算、调试 Kernel 等以及如何通过 Device 级、Stream 级的资源限制接口aclrtSetDeviceResLimit、aclrtSetStreamResLimit、aclrtUseStreamResInCurrentThread等对 AI Core/Cube Core 与 Vector Core 的占用进行精细管控。读完本文你将掌握这 9 个接口的完整用法、参数含义、资源限制优先级规则与源码级调用链能够独立完成多线程、多 Stream 场景下的资源预算配置。本文内容以仓库文档 docs/zh/api_ref/03_runtime_configuration.md 为骨架结合 src/acl/aclrt_impl/device.cpp、src/acl/aclrt_impl/context.cpp 等源码实现与 example/1_basic_features/stream/4_stream_resource_budget/main.cpp 等示例代码展开。一、运行时配置接口全景CANN Runtime 的运行时配置接口共分为两大类系统参数SysParamOpt与资源限制ResLimit。前者用于设置进程/Context 维度的运行时行为开关后者用于限制 Device 或 Stream 上的计算核心资源用量。接口作用域功能aclrtSetSysParamOpt(aclSysParamOpt opt, int64_t value)进程设置当前进程中的运行时参数值aclrtGetSysParamOpt(aclSysParamOpt opt, int64_t *value)进程获取当前进程中的运行时参数值aclrtGetDeviceResLimit(int32_t deviceId, aclrtDevResLimitType type, uint32_t* value)进程获取当前进程的 Device 资源限制aclrtSetDeviceResLimit(int32_t deviceId, aclrtDevResLimitType type, uint32_t value)进程设置当前进程的 Device 资源限制aclrtResetDeviceResLimit(int32_t deviceId)进程重置当前进程的 Device 资源限制恢复默认配置aclrtGetStreamResLimit(aclrtStream stream, aclrtDevResLimitType type, uint32_t *value)Stream获取指定 Stream 的 Device 资源限制aclrtSetStreamResLimit(aclrtStream stream, aclrtDevResLimitType type, uint32_t value)Stream设置指定 Stream 的 Device 资源限制aclrtResetStreamResLimit(aclrtStream stream)Stream重置指定 Stream 的 Device 资源限制恢复默认配置aclrtUseStreamResInCurrentThread(aclrtStream stream)线程在当前线程中使用指定 Stream 上的 Device 资源限制aclrtUnuseStreamResInCurrentThread(aclrtStream stream)线程在当前线程中取消使用指定 Stream 上的 Device 资源限制aclrtGetResInCurrentThread(aclrtDevResLimitType type, uint32_t *value)线程获取当前线程可使用的 Device 资源其中 Stream 级资源限制在使用时需配合线程级接口aclrtSetStreamResLimit负责定义aclrtUseStreamResInCurrentThread负责在当前线程启用两者成对出现。这些接口均声明于头文件 include/external/acl/acl_rt.h如第 1519、1530、4188、4219、4237、4256 行附近。二、进程级系统参数确定性计算与调试 Kernel2.1 接口原型与功能aclError aclrtSetSysParamOpt(aclSysParamOpt opt, int64_t value) // 设置 aclError aclrtGetSysParamOpt(aclSysParamOpt opt, int64_t *value) // 查询aclrtSetSysParamOpt设置当前进程中的运行时参数值设置后需通过aclrtGetSysParamOpt查询。若未调用aclrtSetSysParamOpt而直接调用aclrtGetSysParamOpt获取到的是各参数的默认值0即默认不开启确定性计算、不开启内存访问越界检测。返回值返回 0 表示成功返回其他值表示失败错误码参见 aclError 枚举。2.2 与 Context 级接口的差异本接口与aclrtCtxSetSysParamOpt的关键区别在于作用域aclrtSetSysParamOpt的作用域是进程进程内所有线程均受其影响而aclrtCtxSetSysParamOpt参见 05_context_management.md的作用域是Context仅对绑定该 Context 的线程生效。两者的底层实现在 src/acl/aclrt_impl/context.cpp 中通过同一个SetSysParamOpt(opt, value, isCtx)辅助函数分派isCtx为true时调用rtCtxSetSysParamOpt为false时调用rtSetSysParamOpt对应查询路径为rtCtxGetSysParamOpt/rtGetSysParamOpt。2.3 aclSysParamOpt 枚举详解opt参数取值参见 aclSysParamOpt 枚举typedef enum { ACL_OPT_DETERMINISTIC 0, // 确定性计算 ACL_OPT_ENABLE_DEBUG_KERNEL 1, // 调试 KernelGlobal Memory 访问越界检测 ACL_OPT_STRONG_CONSISTENCY 2, // 强一致性计算已不推荐后续版本废弃 } aclSysParamOpt;各枚举项的取值与行为说明如下表枚举项取值与说明ACL_OPT_DETERMINISTIC是否开启确定性计算取值范围[0, 4)。0不开启默认1开启确定性计算2开启强一致性计算计算结果确定且与数据位置无关等价于已不推荐使用的ACL_OPT_STRONG_CONSISTENCY3开启Batch 一致性计算——将样本放入任意大小的 Batch 或调整其在 Batch 中的排列顺序该样本最终输出结果都保持位级Bit-wise完全相同即单样本的计算结果与它和谁一组Batch Size、排在第几个Batch Index无关。ACL_OPT_ENABLE_DEBUG_KERNEL是否开启算子执行阶段的Global Memory 访问越界检测。0不开启默认1开启。开启方式编译算子前调用aclSetCompileopt将ACL_OP_DEBUG_OPTION配置为oom同时通过aclrtCtxSetSysParamOptContext 作用域或aclrtSetSysParamOpt进程作用域将本参数配置为 1。开启后若执行算子过程中从 Global Memory 读写数据如读算子输入、写算子输出出现越界将返回 EZ9999 错误码提示存在算子 AI Core Error 问题。ACL_OPT_STRONG_CONSISTENCY是否开启强一致性计算。0不开启默认1开启。开启后计算结果确定多次执行输出相同且计算结果与数据的位置无关例如矩阵乘中不同行累加顺序不同导致的细微差异会被消除。注意本枚举项后续版本会废弃请使用ACL_OPT_DETERMINISTIC替代。2.4 确定性计算的使用建议默认情况下确定性计算不开启算子在相同硬件与输入下多次执行的结果可能不同——其差异通常来源于算子实现中异步多线程执行导致的浮点数累加顺序变化。而开启确定性计算后相同硬件与输入下多次执行将产生相同输出但往往会导致算子执行变慢、影响性能。因此官方建议常规场景下不开启确定性计算以免损失性能当发现模型多次执行结果不一致或需要进行精度调优时再开启确定性计算辅助调试与调优。2.5 源码实现佐证src/acl/aclrt_impl/context.cpp 中进程级实现aclrtSetSysParamOptImpl会对opt做严格校验仅允许ACL_OPT_DETERMINISTIC、ACL_OPT_ENABLE_DEBUG_KERNEL、ACL_OPT_STRONG_CONSISTENCY以及部分产品支持的ACL_OPT_ENABLE_KERNEL_EARLY_START取值否则返回ACL_ERROR_INVALID_PARAM。同时每个接口都通过ACL_PROFILING_REG登记到 profiling 体系便于后续性能分析。三、进程级 Device 资源限制3.1 接口原型aclError aclrtGetDeviceResLimit(int32_t deviceId, aclrtDevResLimitType type, uint32_t* value); // 获取 aclError aclrtSetDeviceResLimit(int32_t deviceId, aclrtDevResLimitType type, uint32_t value); // 设置 aclError aclrtResetDeviceResLimit(int32_t deviceId); // 重置3.2 参数说明参数名输入/输出说明deviceId输入Device ID。调用 aclrtGetDeviceCount 获取可用 Device 数量后取值范围为[0, 可用Device数量-1]type输入资源类型参见 aclrtDevResLimitTypevalue输入/输出资源限制的大小3.3 aclrtDevResLimitType 资源类型枚举typedef enum { ACL_RT_DEV_RES_CUBE_CORE 0, // AI Core 或 Cube Core ACL_RT_DEV_RES_VECTOR_CORE, // Vector Core } aclrtDevResLimitType;ACL_RT_DEV_RES_CUBE_CORE的具体含义随产品不同而略有差异Atlas 训练系列产品、Atlas 推理系列产品ACL_RT_DEV_RES_CUBE_CORE表示AI CoreAscend 950PR/Ascend 950DT、Atlas A3 训练/推理系列产品、Atlas A2 训练/推理系列产品、Atlas 200I/500 A2 推理产品ACL_RT_DEV_RES_CUBE_CORE表示Cube Core。关于 Core 的详细定义参见 aclrtDevAttr。3.4 功能与使用约束aclrtGetDeviceResLimit获取当前进程的 Device 资源限制。若未调用aclrtSetDeviceResLimit设置过则获取到的是AI 处理器硬件默认的资源限制。aclrtSetDeviceResLimit设置当前进程的 Device 资源限制。必须在调用aclrtSetDevice之后、执行算子之前使用对同一 Device 多次设置时以最后一次设置为准。aclrtResetDeviceResLimit设置后可调用本接口重置当前进程的 Device 资源限制、恢复默认配置之后可通过aclrtGetDeviceResLimit查询到默认值。关键约束设置仅对后续下发的任务有效。例如在aclmdlRICaptureBegin/aclmdlRICaptureEnd捕获 Stream 任务到模型、再执行模型推理的场景中参见 15_model_running_instance_management.md必须在捕获之前完成资源限制设置否则已捕获的任务不受新设置影响。3.5 源码实现佐证src/acl/aclrt_impl/device.cpp 中的实现非常简洁三个接口分别透传到 RTS 底层aclrtGetDeviceResLimitImpl→rtsGetDeviceResLimit(deviceId, type, value)aclrtSetDeviceResLimitImpl→rtsSetDeviceResLimit(deviceId, type, value)aclrtResetDeviceResLimitImpl→rtsResetDeviceResLimit(deviceId)各接口均通过ACL_PROFILING_REG登记 profiling并通过ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(value)对输出指针做空指针校验value为 NULL 时直接报错返回。3.6 实战示例仓库示例 example/1_basic_features/device/1_device_multi_thread/main.cpp 展示了限制单个进程在某个 Device 上只使用 1 个 Vector Core 的写法CHECK_ERROR(aclrtSetDeviceResLimit(0, ACL_RT_DEV_RES_VECTOR_CORE, 1));另一个示例 example/2_advanced_features/kernel/1_launch_kernel_with_reslimit/main.cpp 则展示了按算子的 blockDim 来设置资源限制的典型思路CHECK_ERROR(aclrtSetDeviceResLimit(deviceId, resLimitType, blockDim));四、Stream 级资源限制与线程绑定当同一进程内不同 Stream 需要差异化资源配额时进程级限制就显得粒度不够细。此时应使用 Stream 级资源限制接口。4.1 接口原型aclError aclrtGetStreamResLimit(aclrtStream stream, aclrtDevResLimitType type, uint32_t *value); // 获取 aclError aclrtSetStreamResLimit(aclrtStream stream, aclrtDevResLimitType type, uint32_t value); // 设置 aclError aclrtResetStreamResLimit(aclrtStream stream); // 重置 aclError aclrtUseStreamResInCurrentThread(aclrtStream stream); // 当前线程启用 aclError aclrtUnuseStreamResInCurrentThread(aclrtStream stream); // 当前线程取消启用 aclError aclrtGetResInCurrentThread(aclrtDevResLimitType type, uint32_t *value); // 查询当前线程可用资源4.2 参数说明参数名输入/输出说明stream输入指定 Stream类型定义参见 aclrtStream。传入 NULL 表示默认 Streamtype输入资源类型参见 aclrtDevResLimitTypevalue输入/输出资源限制的大小 / 资源数量4.3 功能说明aclrtGetStreamResLimit获取指定 Stream 的 Device 资源限制。若未调用aclrtSetStreamResLimit设置过获取到的资源限制优先级为当前进程的 Device 资源限制aclrtSetDeviceResLimit设置 AI 处理器硬件默认的资源限制。aclrtSetStreamResLimit设置指定 Stream 的 Device 资源限制。同样必须在aclrtSetDevice之后、执行算子之前调用对同一 Stream 多次设置以最后一次为准。设置后必须配合aclrtUseStreamResInCurrentThread在当前线程中启用否则限制不会生效。aclrtResetStreamResLimit重置指定 Stream 的资源限制恢复默认配置之后可通过aclrtGetStreamResLimit查询默认值。aclrtUseStreamResInCurrentThread在当前线程中使用指定 Stream 上的资源限制多次调用设置 Stream 时以最后一次设置为准。使用前需先通过aclrtSetStreamResLimit配置该 Stream。aclrtUnuseStreamResInCurrentThread在当前线程中取消使用指定 Stream 上的资源限制与aclrtUseStreamResInCurrentThread成对使用。aclrtGetResInCurrentThread获取当前线程可使用的 Device 资源。获取时按优先级返回Stream 级资源限制aclrtSetStreamResLimit设置 当前进程资源限制aclrtSetDeviceResLimit设置 AI 处理器硬件默认资源限制。4.4 完整调用流程Stream 级资源限制的标准使用流程如下aclrtSetDevice完成设备初始化aclrtCreateStream创建 Stream或使用默认 StreamaclrtSetStreamResLimit(stream, type, value)为指定 Stream 配置资源预算在需要受限执行的线程中调用aclrtUseStreamResInCurrentThread(stream)启用该限制在该线程上下发算子任务并aclrtSynchronizeStream同步结束后调用aclrtUnuseStreamResInCurrentThread(stream)取消限制需要恢复默认时可调用aclrtResetStreamResLimit(stream)。4.5 源码实现佐证src/acl/aclrt_impl/device.cpp 中 Stream 级接口同样是一层薄封装直接透传 RTSaclrtGetStreamResLimitImpl→rtsGetStreamResLimitaclrtSetStreamResLimitImpl→rtsSetStreamResLimitaclrtResetStreamResLimitImpl→rtsResetStreamResLimitaclrtUseStreamResInCurrentThreadImpl→rtsUseStreamResInCurrentThreadaclrtUnuseStreamResInCurrentThreadImpl→rtsNotUseStreamResInCurrentThreadaclrtGetResInCurrentThreadImpl→rtsGetResInCurrentThread其中aclrtUseStreamResInCurrentThread与aclrtUnuseStreamResInCurrentThread在 RTS 侧实际是rtsUseStreamResInCurrentThread与rtsNotUseStreamResInCurrentThread的对应关系命名上的差异正是启用/取消启用语义的体现。真正执行限制的底层逻辑位于 RTS 运行时层ACL 层负责参数校验、类型转换aclrtDevResLimitType→rtDevResLimitType_t、aclrtStream→rtStream_t与 profiling 登记。4.6 实战示例Stream 资源预算仓库示例 example/1_basic_features/stream/4_stream_resource_budget/main.cpp 完整演示了查询默认 → 设置预算 → 校验生效 → 线程启用 → 下发算子的流程// 1. 查询该 Stream 默认的 Vector Core 限制 CHECK_ERROR(aclrtGetStreamResLimit(resources.stream, kResourceType, resources.defaultLimit)); if (resources.defaultLimit kRequestedLimit) { ERROR_LOG(The default Vector Core limit %u cannot satisfy the requested limit %u., resources.defaultLimit, kRequestedLimit); return -1; } // 2. 设置 Stream 资源限制并校验 CHECK_ERROR(aclrtSetStreamResLimit(resources.stream, kResourceType, kRequestedLimit)); CHECK_ERROR(aclrtGetStreamResLimit(resources.stream, kResourceType, configuredLimit)); if (configuredLimit ! kRequestedLimit) { ERROR_LOG(Unexpected configured Vector Core limit: got %u, expected %u., configuredLimit, kRequestedLimit); return -1; } // 3. 在当前线程启用该 Stream 的资源限制再下发算子任务 CHECK_ERROR(aclrtUseStreamResInCurrentThread(resources.stream)); EasyOP(configuredLimit, resources.stream, resources.valueDevice); CHECK_ERROR(aclrtSynchronizeStream(resources.stream));该示例的完整说明可参见 example/1_basic_features/stream/4_stream_resource_budget/README.md其中明确建议先查询默认限制、再按需收紧预算避免请求值超过默认上限导致配置失败。五、资源限制优先级与作用域对比将进程级、Stream 级、线程级接口统一梳理资源限制的生效优先级如下Stream 级 Device 资源限制 进程级 Device 资源限制 AI 处理器硬件的资源限制这一优先级同时体现在两个层面设置层面aclrtSetDeviceResLimit定义进程级上限aclrtSetStreamResLimit可在进程限制之下进一步收紧某个 Stream 的配额查询层面aclrtGetResInCurrentThread查询当前线程可用资源时依次回退到 Stream 级 → 进程级 → 硬件默认值。三个作用域的接口对比如下维度进程级Device ResLimitStream 级Stream ResLimit线程级CurrentThread设置接口aclrtSetDeviceResLimitaclrtSetStreamResLimitaclrtUseStreamResInCurrentThread查询接口aclrtGetDeviceResLimitaclrtGetStreamResLimitaclrtGetResInCurrentThread重置接口aclrtResetDeviceResLimitaclrtResetStreamResLimitaclrtUnuseStreamResInCurrentThread生效范围当前进程内所有下发到该 Device 的任务启用该限制的线程中下发到该 Stream 的任务仅当前线程六、产品支持情况本文所述 11 个接口进程级系统参数 2 个、资源限制 9 个的产品支持情况完全一致产品系列支持情况Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品支持Atlas 200I/500 A2 推理产品支持Atlas 推理系列产品支持Atlas 训练系列产品支持IPV350不支持七、典型实践建议与注意事项设置时机所有 Set 类资源限制接口都必须在aclrtSetDevice之后、执行算子之前调用且只对后续下发的任务生效。模型捕获场景aclmdlRICaptureBegin/aclmdlRICaptureEnd务必在捕获前完成设置。多 Stream 差异化需要精细控制时优先使用 Stream 级限制aclrtSetStreamResLimitaclrtUseStreamResInCurrentThread其优先级高于进程级限制可在同一进程内为不同 Stream 分配不同预算。查询与校验设置前后分别调用 Get 接口确认默认值与实际生效值防止请求值超过默认上限参见 4.6 节示例的防御性写法。重置恢复业务切换或测试结束后使用aclrtResetDeviceResLimit/aclrtResetStreamResLimit恢复默认配置避免影响后续任务。确定性计算仅在精度调优或排查多次执行结果不一致问题时开启ACL_OPT_DETERMINISTIC生产环境默认关闭以保性能ACL_OPT_STRONG_CONSISTENCY已被ACL_OPT_DETERMINISTIC2取代新代码请勿继续使用。越界检测开启ACL_OPT_ENABLE_DEBUG_KERNEL1时需同步将编译选项ACL_OP_DEBUG_OPTION配置为oom二者配合才能生效越界时将返回 EZ9999 错误码便于定位算子 AI Core Error。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表