
人工智能编译器模型编译高性能计算深度学习CANN【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址https://gitcode.com/cann/pypto点击查看免费下载导读本文介绍 CANN PyPTO 提供的实验性运行时配置接口pypto.experimental.set_runtime_options它把tile_fwk_config.json中运行时部分尚未稳定的参数当前为stitch_function_num_per_pool转化为可编程接口。通过该接口开发者可以在算子编译前分别控制 Workspace 中三个子内存池root_inner、assemble_outcast、exclusive_outcast的容量在“保证性能的前提下降低内存”与“优先内存的前提下提升并行度”两种典型场景下进行精细化调优。读完本文你将掌握该接口的调用方式、参数校验规则、日志分析方法以及一套可直接落地的两步调参流程。产品支持情况set_runtime_options及精细化 Workspace 模式在以下产品上受支持Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品支持功能说明实验性运行时参数的编程化入口PyPTO 的运行时参数集中维护在配置文件 tile_fwk_config.json 的runtime小节中其中包含stitch_function_max_num默认 128、max_workspace_kb默认 0、stitch_function_num_per_pool默认[0, 0, 0]等参数。这些参数中尚未稳定的一部分例如精细化 Workspace 内存池控制不会进入pypto.frontend.jit(runtime_options...)的稳定参数表而是通过实验性接口暴露给用户后续新增的运行时实验特性也沿此通道扩展。该接口的 Python 侧实现位于 python/pypto/experimental/runtime.py并在 python/pypto/experimental/init.py 中导出from .runtime import get_runtime_options, set_runtime_options # noqa: F401调用链上set_runtime_options最终通过set_options(runtime_options...)写入当前配置作用域python/pypto/config.py 中set_options其参数以runtime.前缀进入 C 侧配置。函数原型set_runtime_options( *, stitch_function_num_per_pool: Optional[list[int]] None, )该接口采用关键字参数keyword-only当前仅暴露一个参数。若不传入任何参数或传入None本次调用不产生任何配置变更传入的合法参数会被打包进runtime_options字典后写入当前 scope。参数说明参数名输入/输出说明stitch_function_num_per_pool输入用于分别控制 Workspace 中三个子内存池的容量大小格式为[root_inner, assemble_outcast, exclusive_outcast]。配置的大小决定每个内存池可容纳的最大 stitch 构建 loop 迭代的数量。各子内存池的含义如下池序号池名称典型承载对象第 1 个元素root_inner算子执行过程中产生的 RootInner 中间结果如循环内部的 matmul 结果第 2 个元素assemble_outcastAssemble outcast 型中间 Tensor第 3 个元素exclusive_outcastExclusive outcast 型中间 Tensor参数的详细规则配置方法[0, 0, 0]表示关闭精细模式任一元素非 0 即开启。开启后某一维为 0 表示不为该子内存池预留容量。若算子存在该内存池对应类型的中间 Tensor编译会因容量不足失败此时该维至少需配为 1仅当算子没有该类型 Tensor 时才可配 0。类型list of int固定 3 个元素。取值范围每个元素 01024。默认值[0, 0, 0]关闭。影响 Pass 范围NA。参数校验的源码实现参数合法性在 python/pypto/experimental/runtime.py 的_validate_stitch_function_num_per_pool中强制校验def _validate_stitch_function_num_per_pool(value) - List[int]: if not isinstance(value, (list, tuple)) or len(value) ! 3: raise ValueError(...) if any(isinstance(x, bool) or not isinstance(x, int) or not 0 x 1024 for x in value): raise ValueError(...) return list(value)即必须是长度为 3 的 list 或 tuple每个元素必须是[0, 1024]内的整数bool被显式拒绝因为bool是int的子类。校验失败抛出ValueError异常信息包含Invalid stitch_function_num_per_pool字样。对应单元测试见 python/tests/ut/interface/test_config_options.py 中的test_runtime_option_stitch_function_num_per_pool与test_runtime_option_stitch_function_num_per_pool_invalid后者覆盖了长度不足、长度超限、非列表、负数、越界、浮点、混入 bool 等非法输入。C 侧同样在workspace_budget_calculator.cpp中对三个元素逐项校验framework/src/machine/utils/dynamic/workspace_budget_calculator.cpp 中ValidateDepth调用并提示“若当前程序确实需要该内存池该值不能为 0”。返回值说明voidSet 方法无返回值。设置成功即生效写入当前配置作用域随本次编译生效。约束说明类型安全须为长度为 3 的 list 或 tuple元素为[0, 1024]内的整数不能使用 bool。作用范围不要在pypto.loop内或 kernel 内设置应在算子编译pypto.frontend.jit或函数定义之前设置。配置项相对关系stitch_function_max_num在不考虑内存占用、只考虑调优性能时使用max_workspace_kb在有内存限制时按内存总量压缩内存使用可能降低并行度精细化配置stitch_function_num_per_pool在上述两项之后使用按三个子内存池分别设置开启后stitch_function_max_num与max_workspace_kb均失效。调用示例最简单的启用方式pypto.experimental.set_runtime_options(stitch_function_num_per_pool[64, 1, 1])对应的读取接口同文件提供便于回读与自测pypto.get_runtime_options() # 返回 {stitch_function_num_per_pool: [64, 1, 1], ...}get_runtime_options从当前 scope 读取全部 runtime 选项python/pypto/experimental/runtime.py单元测试test_runtime_option_stitch_function_num_per_pool验证了默认值[0, 0, 0]、设置后回读一致、以及reset_options()后恢复默认的行为。示例 1精细 Workspace 模式以下示例用来说明默认模式与精细控制的差异。示例包含三个 loopLoop0 做 Exclusive write、Loop1 做 Assemble write、Loop2 做 ReadB_STATIC, L_STATIC, H_STATIC, D_STATIC 1, 64, 1, 16 pypto.experimental.set_runtime_options(stitch_function_num_per_pool[64, 1, 1]) pypto.frontend.jit def k_tmp_to_d_emb( dy: pypto.Tensor([B_STATIC, L_STATIC, H_STATIC, D_STATIC], pypto.DT_FP32), weight: pypto.Tensor([H_STATIC, D_STATIC, D_STATIC], pypto.DT_FP32), output1: pypto.Tensor([B_STATIC, L_STATIC, D_STATIC], pypto.DT_FP32), output2: pypto.Tensor([B_STATIC, L_STATIC, D_STATIC], pypto.DT_FP32), ): tmp_assemble pypto.tensor([B_STATIC, L_STATIC, H_STATIC, D_STATIC], output1.dtype, tmp_assemble) tmp_exclusive pypto.tensor([B_STATIC, L_STATIC, H_STATIC, D_STATIC], output2.dtype, tmp_exclusive) # Loop0Exclusive write for i_idx, t in pypto.loop_unroll(0, 1, 1, namel_loop_0): pypto.set_vec_tile_shapes(1, 64, 1, 256) tmp_exclusive[:] pypto.add(dy, dy) # Loop1Assemble write for j_idx, t in pypto.loop_unroll(0, L_STATIC, 1, namel_loop_1): pypto.set_vec_tile_shapes(1, 64, 1, 256) dy_v dy[0, j_idx : j_idx t, 0] pypto.set_cube_tile_shapes([128, 128], [128, 128], [128, 128]) dx pypto.matmul(dy_v, weight[0], pypto.DT_FP32, b_transTrue) pypto.set_vec_tile_shapes(1, 64, 1, 512) tmp_assemble[0, j_idx : j_idx t, 0] dx 0.0 # Loop2Read for k_idx, t in pypto.loop_unroll(0, L_STATIC, 1, namel_loop_2): pypto.set_vec_tile_shapes(1, 64, 1, 512) output1[0, k_idx : k_idx t] tmp_assemble[0, k_idx : k_idx t, 0] output2[0, k_idx : k_idx t] tmp_exclusive[0, k_idx : k_idx t, 0]该示例中 tensor 的内存分布如下Tensor数据归属dy、weight、output1、output2输入参数不进 Workspace 内存池dy_vdy 的切片视图复用同一块内存dxRootInnertmp_assembleAssemble outcasttmp_exclusiveExclusive outcast将stitch_function_num_per_pool配置为非全零后三个子内存池可容纳的 stitch 构建的 loop 数量相互独立可分别按实际需求设置。对本示例运行时根据实际占用得到的推荐配置为[64, 1, 1]说明如下root_inner由默认的 128 下调为 64。dx只存在于 loop1 的单次循环内无需为 loop0、loop2 预留容量。assemble_outcast由默认的 128 下调为 1。tmp_assemble在循环外创建多次循环共享同一块内存。exclusive_outcast由默认的 128 下调为 1。tmp_exclusive仅在 loop0 的一次循环中产生。经过上述设置在并行度基本不变的前提下降低 workspace 占用。调优方法精细模式的价值在于“有的放矢”因此调优的第一步是采集运行时日志观察每个内存池的真实占用再针对性地修改配置。采集日志开启 INFO 级日志并将日志输出到指定目录export ASCEND_PROCESS_LOG_PATH./wk export ASCEND_GLOBAL_LOG_LEVEL1 python your_test.py运行结束后用 grep 过滤 Workspace 相关日志grep -rE \[Workspace Runtime (Pool|Tuning|Summary|Recommendation)\] ./wk日志标识及重点字段说明日志标识说明重点字段[Workspace Runtime Pool]单次任务提交时各池实际使用current、peak、capacity[Workspace Runtime Tuning]单次任务提交的配置与推荐taskId、stitchCount、configuredDepths、recommendedDepths[Workspace Runtime Summary]整次执行各池的最大实际占用与容量上限各池peak、capacity[Workspace Runtime Recommendation]整次执行结束后的配置建议以及某个内存池配置值加 1 时增加的内存recommendedDepths、rawPerParallelBytes、nextDepthTotalBytes其中recommendedDepths{rootInner, assembleOutcast, exclusive}按顺序对应stitch_function_num_per_pool的三个元素actualDepths为当前各个内存池生效大小。从源码看这些日志由 Workspace 分配器在运行时产出[Workspace Runtime Pool]记录每个并行单元各池的current/peak/capacity[Workspace Runtime Tuning]记录taskId、stitchCount与configuredDepths/recommendedDepths见 framework/src/machine/utils/dynamic/dev_workspace.cpp 中LogTuningUsage其中recommendedDepths由实际峰值占用除以对应内存池的单位字节数向上取整得到。若内存不足会出现[Workspace Runtime Alloc Failure]日志表示并行度已被内存截断。场景 1并行度已满足预期精细化控制以降低内存目标并行度已达到预期时去掉已申请但并未使用的内存降低 workspace同时保持性能。操作步骤仅使用stitch_function_max_num或不设置默认 128将端到端性能调至目标不要同时开启本配置或max_workspace_kb。按上文开启 INFO 日志并执行算子。若出现[Workspace Runtime Alloc Failure]说明并行度已被内存截断须先增大stitch_function_max_num或改走场景 2。读取[Workspace Runtime Recommendation]的recommendedDepths写入本配置。例如recommendedDepths{rootInner64, assembleOutcast1, exclusive1}对应[64, 1, 1]。去掉配置stitch_function_max_num后复测workspace 应下降端到端耗时相对步骤 1 应基本持平。若性能下降查看[Workspace Runtime Summary]中实际占用已接近容量上限的内存池将该元素加 1 后重试。覆盖算子实际使用的 shape 与执行路径对各样本的recommendedDepths逐项取最大值后固化再关闭 INFO 日志验收。场景 2优先内存精细化控制以提升并行度目标在总内存存在使用限制时精细控制子内存池大小把内存用到真正限制 stitch 构建的 loop 数量的池上。背景max_workspace_kb按同一规模压缩三个子内存池其推荐值反映的是当前内存限制下根据实际使用内存反推的并行度不是内存充足时的最优并行度不能保证内存被充分利用。内存未用满时可按下面步骤提高并行度。操作步骤使用max_workspace_kb须大于提示的最小可运行值。例如限额 200MB 时配置max_workspace_kb200*1024。按上文采集日志。从[Workspace Runtime Summary]对比各池实际占用与容量上限从[Workspace Runtime Recommendation]读取recommendedDepths与nextDepthTotalBytes。将recommendedDepths写入本配置作为起点并取消max_workspace_kb。计算剩余内存限额减去当前 workspace 占用。某个内存池的配置值再加 1整次执行增加的字节数为nextDepthTotalBytes中对应项。优先增加实际占用更接近容量上限、且nextDepthTotalBytes能被剩余内存覆盖的池常见为第 1 个元素root_inner。每次只将该元素加 1复测端到端耗时与 workspace。当再加 1 将超过限额或耗时不再下降时停止。多 shape 时对各元素取最大值后固化。示例限额 200MB实际峰值约 100MBrecommendedDepths{rootInner32, assembleOutcast1, exclusive1}。剩余约 100MB 可用于提高root_inner可增加的次数不超过剩余字节除以nextDepthTotalBytes.rootInner。提高后 workspace 上升、并行度变大若出现[Workspace Runtime Alloc Failure]或性能回退将该元素减回。与配置文件的对应关系stitch_function_num_per_pool的默认值与相邻运行时参数一同维护在 tile_fwk_config.json 的runtime小节runtime: { device_sched_mode: 0, run_mode: 0, stitch_function_max_num: 128, max_workspace_kb: 0, stitch_function_num_per_pool: [0, 0, 0], ... }可以看到默认模式下 Workspace 各子内存池由stitch_function_max_num128统一决定深度而max_workspace_kb0表示不限制总内存。调用set_runtime_options(stitch_function_num_per_pool...)后运行时配置覆盖该默认值三个池深度彼此独立且stitch_function_max_num与max_workspace_kb不再生效。这一“默认配置 → 编程覆盖”的关系也被单元测试所印证reset_options()后get_runtime_options()[stitch_function_num_per_pool]恢复为[0, 0, 0]见 python/tests/ut/interface/test_config_options.py。使用建议与注意事项先采集、后配置精细模式的价值依赖对真实占用分布的判断务必先按“调优方法”一节采集[Workspace Runtime Recommendation]日志再写入配置避免凭经验盲目设置。区分三种配置的适用时机性能优先用stitch_function_max_num内存受限用max_workspace_kb两者之后的精细化收尾用stitch_function_num_per_pool三者不可同时作为生效手段精细模式开启后前两者失效。为 0 的元素需要谨慎只有当算子确定不产生该内存池对应类型的中间 Tensor 时才可将该维配为 0否则编译期会因容量不足失败日志会给出明确提示。多 shape 取并集算子覆盖多个 shape/执行路径时按各样本recommendedDepths逐项取最大值后固化确保所有路径可运行。实验性接口的稳定性该接口面向尚未稳定的运行时特性接口形态与语义可能在后续版本调整或移除生产固化前建议关注版本发布说明。相关文档接口文档原文docs/zh/api/tensor_api/config/pypto-experimental-set_runtime_options.md接口实现python/pypto/experimental/runtime.py配置管理python/pypto/config.py运行时默认配置framework/src/interface/configs/tile_fwk_config.json运行时 Workspace 分配与日志framework/src/machine/utils/dynamic/dev_workspace.cpp内存池深度校验与预算计算framework/src/machine/utils/dynamic/workspace_budget_calculator.cpp单元测试python/tests/ut/interface/test_config_options.py赞分享人工智能编译器模型编译高性能计算深度学习CANN【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址https://gitcode.com/cann/pypto点击查看免费下载相关推荐Cyberpunk 2077存档编辑器终极指南深度解析与技术实现Cyberpunk 2077存档编辑器终极指南深度解析与技术实现 Cyberpunk 2077存档编辑器是一款专业级的开源工具专为《赛博朋克2077》玩家和人工智能编译器模型编译高性能计算深度学习CANNLinux 内核 Multi-Gen LRU 完全指南配置、运行时调优与实验特性详解Linux 内核 Multi Gen LRU 完全指南配置、运行时调优与实验特性详解 导读 Multi Gen LRU多代 LRU缩写 MGLRU是 L操作系统内核驱动驱动开发虚拟化嵌入式网络存储FrankenPHP 性能优化实战指南线程池、Worker 模式与运行时调优FrankenPHP 性能优化实战指南线程池、Worker 模式与运行时调优 导读FrankenPHP 默认在“开箱即用”与“性能”之间寻求平衡但要让它在后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考