Step 5a构造输入输出空间 → 生成 mapper verifier【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills前置条件S5_mapping_spec.md 已生成Step 5a-pre 完成职责读 S5_mapping_spec.md按 param_type 逐 tensor 构造输入空间通过 infershape 规则推导输出空间生成 S5_case_mapper.py S5_verify_mapper.py。1. 管道概述输入输出文件清单见 00-execution-order.md。1.1 派发机制S5_mapping_spec.md 的输入 tensor 和输出 tensor 各节已标注每个 tensor 的 param_typeREQUIRED 或 DYNAMIC。子 agent 生成代码时对每个 input/output 变量读其 param_type选择对应分支param_type变量结构构造逻辑来源REQUIRED单 tensor本文档内联各节 REQUIRED 分支DYNAMICTensorList多 tensor06-dynamic-tensorlist.md按需读取无默认行为每个 tensor 显式匹配 param_type。混合算子中每个 input/output 独立派发如 input_a 走 DYNAMIC 分支input_b 走 REQUIRED 分支。1.2 核心流程每个 case ├── 1. dtype 解析通用 ├── 2. shape 参数解析通用 ├── 3. 输入空间构造按 param_type 派发 │ ├── REQUIRED → 本文档 §3 │ └── DYNAMIC → 06-dynamic-tensorlist.md ├── 4. 输出推导通用读 operator_model infershape 规则 ├── 5. 属性采样通用 ├── 6. const input 构造通用 └── 7. 组装返回格式由 param_type 决定2. 共享工具函数以下 5 项嵌入 S5_case_mapper.py 顶部不随算子或 param_type 变化。_prime_factors_prime_factors(n: int) - list[int]— 质因数分解升序。n 1 返回 []。_decompose_decompose(num: int, parts: int, strategy: str balanced) - tuple[int, ...]— 将 num 分解为 parts 个因子。balanced: 因子 1 尽量接近不变式math.prod(result) num。nontrivial: 因子 1不足时降级含 1。parts0 返回 ()。_sample_attr_sample_attr(case: dict, spec: dict) - Any— case 中有 spec[param] 则直接取否则按 spec[sampling].strategy 采样log_uniform/uniform/choice/default。无 sampling 取 spec.get(default)。_resolve_param_resolve_param(case: dict, name: str, default: Any) - Any— case.get(name, default)。DTYPE_MAPDT_* 格式 → Python 格式查表。已是 Python 格式时无害透传。3. map_case() — 输入空间构造def map_case(case, rngNone): case: 单条 case dict字段为算子参数名来自 S2P2_cases.json 或 S2P2_network_cases.json rng: random.Random, seed 由 load_mapped_configs 设置 返回: {params: {...}, tensors: {inputs: {...}, outputs: {...}}} if rng is None: rng random.Random() # # 以下内容由子 agent 从 S5_mapping_spec.md 翻译生成 # 步骤 1dtype 解析通用dtype_val DTYPE_MAP.get(case[{dtype_param}], case[{dtype_param}])步骤 2shape 参数解析通用{param_name} _resolve_param(case, {param_name}, {default})步骤 3输入空间构造按 param_type 派发遍历 S5_mapping_spec.md 输入 tensor 的每个 input读其 param_type 标注选择对应分支。REQUIRED 分支单 tensor翻译自 S5_mapping_spec.md 输入 tensor 中标注为 REQUIRED 的各节。ndim 确定# 独立范围rng.randint(lo, hi) {tensor}_ndim rng.randint({lo}, {hi}) # 有 约束rng.randint(lo, min(hi, {X}_ndim)) {tensor}_ndim rng.randint({lo}, min({hi}, {X}_ndim)) # 约束直接赋值 {tensor}_ndim {X}_ndimndim 解析顺序有跨 tensor 依赖时按以下顺序先解析所有独立 tensorndim 范围纯数字无 le/ge/eq 引用其他 tensor再解析有 // 约束的 tensor此时被引用的 tensor 的 ndim 已确定最后处理 sync_with tensor直接赋值input shape 构造# product balanced 分解 - _decompose(val, N) {tensor}_shape _decompose({param}, {N}) # 直接取值 - (val,) {tensor}_shape ({param},) # sync_with - 复制目标 shape {tensor}_shape {X}_shape # ndimmin 时跳过 product 组空 tuple {tensor}_shape () if {N} 0 else _decompose({param}, {N})组装格式# 单 tensor值为 dict inputs[{name}] {shape: {tensor}_shape, dtype: dtype_val}DYNAMIC 分支TensorList按需读取06-dynamic-tensorlist.md §2DYNAMIC 输入值为list[dict]每个 dict 描述一个子 tensor。构造逻辑tensor_count、逐子 tensor ndim/shape、列表级约束、组装格式见 06。4. map_case() — 输出推导通用不按 param_type 派发读S2P1_operator_model.json的outputs[*]按 infershape 规则从输入推导输出。规则与 param_type 正交——REQUIRED 输入是 dictDYNAMIC 输入是 list[dict]推导逻辑自动适配。tensor_count 推导读outputs[*].tensor_countderived_from输出 count 被引用输入的 countDYNAMIC 输入取len(inputs[{name}])param控制rng.randint(min, max)生成同 06 §2.1 模式 A无 tensor_count 字段REQUIRED 输出单 tensor无需 countshape 推导读outputs[*].shape.rulerule处理方式same_as_input复制对应输入的 shape。REQUIRED:inputs[{name}][shape]DYNAMIC: 逐子 tensor[s[shape] for s in inputs[{name}]]derived子 agent 从operator_model.outputs[*].shape.expr翻译为 Python 表达式。REQUIRED: 单次计算DYNAMIC: 逐子 tensor 循环计算fixed直接赋值derived 规则代码模板# REQUIRED 输出 derived单次计算 {out}_shape expr 翻译引用 inputs[{src}][shape] 等 # DYNAMIC 输出 derived逐子 tensor 循环计算 {out}_shapes [ expr 翻译引用 inputs[{src}][i][shape] 等 for i in range({out}_count) ]dtype 推导读outputs[*].dtype.sourcesource处理方式input复制对应输入的 dtypefixed直接赋值组装格式输出格式由输出的 param_type 决定REQUIRED → dictDYNAMIC → list[dict]与对应输入格式一致。# REQUIRED 输出 outputs[{name}] {shape: {out}_shape, dtype: {out}_dtype} # DYNAMIC 输出 outputs[{name}] [ {shape: {out}_shapes[i], dtype: {out}_dtypes[i]} for i in range({out}_count) ]5. map_case() — 属性 const input 组装返回步骤 5属性采样通用{attr_name} _sample_attr(case, { param: {key}, type: {type}, sampling: {strategy: {strategy}, ...}, default: {default} })步骤 6const input 值构造通用{const_input_name} [{dim_0_val}, {dim_1_val}, ...]步骤 7组装返回return { params: {**case, {attr}: {attr_val}, ..., {const_input}: {const_input_val}, ...}, tensors: { inputs: { # REQUIRED: {name: {shape: ..., dtype: ...}} # DYNAMIC: {name: [{shape: ..., dtype: ...}, ...]} }, outputs: { ... } } }6. validate_config()def validate_config(cfg, case): L1 校验 errors [] t cfg[tensors]REQUIRED 分支单 tensorif not ({lo} len(t[inputs][{name}][shape]) {hi}): errors.append(...) if len(t[inputs][{a}][shape]) len(t[inputs][{b}][shape]): errors.append(...) if t[inputs][{name}][shape][{N}] % {K} ! 0: errors.append(...)DYNAMIC 分支TensorList按需读取06-dynamic-tensorlist.md §3校验tensor_count 范围、逐子 tensor ndim 范围、列表级约束same_dtype_within_list、sync_with 一致性。输出校验通用不按 param_type 派发验证推导结果与 infershape 规则一致。按 rule 分节每节按输出 param_type 选择对应代码。dtype 校验sourceinput 则与对应输入 dtype 比对sourcefixed 则与固定值比对。same_as_input# REQUIRED 输出单 dict 直接比较 if t[outputs][{out}][shape] ! t[inputs][{src}][shape]: errors.append(...) if t[outputs][{out}][dtype] ! t[inputs][{src}][dtype]: errors.append(...) # DYNAMIC 输出逐子 tensor 比较先验 count再验逐子 tensor if len(t[outputs][{out}]) ! len(t[inputs][{src}]): errors.append(...) for i in range(len(t[outputs][{out}])): if t[outputs][{out}][i][shape] ! t[inputs][{src}][i][shape]: errors.append(...) if t[outputs][{out}][i][dtype] ! t[inputs][{src}][i][dtype]: errors.append(...)derived子 agent 复用 §4 推导时的 expr对输出 shape 重新计算并与实际输出比对# REQUIRED 输出单次计算 比对 expected expr 翻译引用 t[inputs][{src}][shape] 等 if t[outputs][{out}][shape] ! expected: errors.append(...) # DYNAMIC 输出逐子 tensor 计算 比对 for i in range(len(t[outputs][{out}])): expected expr 翻译引用 t[inputs][{src}][i][shape] 等 if t[outputs][{out}][i][shape] ! expected: errors.append(...)fixed# REQUIRED 输出 if t[outputs][{out}][shape] ! {fixed_shape}: errors.append(...) # DYNAMIC 输出逐子 tensor for i in range(len(t[outputs][{out}])): if t[outputs][{out}][i][shape] ! {fixed_shape}: errors.append(...)通用校验if cfg[params].get({attr}, 0) {min}: errors.append(...) return errors7. check_dim_diversity()def check_dim_diversity(mapped_cases, rank_range, rank_constraintsNone, count_rangeNone): 检查 ndim 覆盖率返回 missing 列表WARNING不阻塞参数rank_range从 operator_model inputs[*].rank 提取 (min,max)rank_constraints从 shape.constraints 识别 ndim 依赖无依赖传 Nonecount_range从 inputs[*].tensor_count 提取仅 DYNAMIC 需要。REQUIRED 分支sync_with tensor标注 skipped不报 MISSING约束 tensormax_le按依赖 ndim 分组检查独立 tensor检查 rank_range 覆盖DYNAMIC 分支按需读取06-dynamic-tensorlist.md §4检查 tensor_count 覆盖率 逐子 tensor ndim 覆盖率。8. 编排代码每次照搬load_mapped_configsdef load_mapped_configs(cases_file, seed42, id_prefixcase): 批量映射加载 JSON - 逐 case 映射 - 校验 - 返回 rng random.Random(seed) with open(cases_file) as f: cases json.load(f) results [] for case in cases: cfg map_case(case, rng) errs validate_config(cfg, case) if errs: print(f[WARN] case {case.get(_group, ?)}: {errs}) cfg[id] f{id_prefix}{len(results):05d} results.append(cfg) return resultsmaindef main(cases_fileNone, out_fileNone, id_prefixcase): import os if cases_file is None: cases_file os.path.join(os.path.dirname(os.path.abspath(__file__)), S2P2_cases.json) if out_file is None: out_file os.path.join(os.path.dirname(os.path.abspath(__file__)), S5_mapped_cases_path.json) mapped load_mapped_configs(cases_file, id_prefixid_prefix) with open(out_file, w) as f: json.dump({cases: mapped}, f, indent2) print(fWritten {len(mapped)} cases to {out_file})子 agent 生成 main() 时须在末尾调用 check_dim_diversity(mapped, rank_range, rank_constraints, count_range)rank_range从 S2P1_operator_model.json 的 inputs[*].rank 提取各 tensor 的 (min, max)。rank_constraints从 S2P1_operator_model.json 的 inputs[*].shape.constraints 中识别 ndim 依赖关系硬编码传入。无依赖关系则传 None。count_range从 S2P1_operator_model.json 的 inputs[*].tensor_count 提取 DYNAMIC 输入的 (min, max)。REQUIRED 输入不需要此参数。9. S5_verify_mapper.py 结构4 层验证0 fail → PASS≥1 fail → FAIL最多 3 轮修复层职责规则L1调 S5_case_mapper.validate_config()—L2operator_model 交叉验证outputs key、dtype/rank 范围—L3source_constraints 交叉验证API 限制 → warn其他 → failL4NPU e2e 调用算子 APINPU 不可用 → SKIP采样10 random cases≤20 时全量。10. 闸门结果处理0 failPASS - 进入 Step 5b1 failFAIL - 回到 map_case/validate_config 修正最多 3 轮diversity check 有缺失WARNING不阻塞缺失信息输出到 stderr【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
CANNBot/cannbot-skills算子白盒用例生成器
Step 5a构造输入输出空间 → 生成 mapper verifier【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills前置条件S5_mapping_spec.md 已生成Step 5a-pre 完成职责读 S5_mapping_spec.md按 param_type 逐 tensor 构造输入空间通过 infershape 规则推导输出空间生成 S5_case_mapper.py S5_verify_mapper.py。1. 管道概述输入输出文件清单见 00-execution-order.md。1.1 派发机制S5_mapping_spec.md 的输入 tensor 和输出 tensor 各节已标注每个 tensor 的 param_typeREQUIRED 或 DYNAMIC。子 agent 生成代码时对每个 input/output 变量读其 param_type选择对应分支param_type变量结构构造逻辑来源REQUIRED单 tensor本文档内联各节 REQUIRED 分支DYNAMICTensorList多 tensor06-dynamic-tensorlist.md按需读取无默认行为每个 tensor 显式匹配 param_type。混合算子中每个 input/output 独立派发如 input_a 走 DYNAMIC 分支input_b 走 REQUIRED 分支。1.2 核心流程每个 case ├── 1. dtype 解析通用 ├── 2. shape 参数解析通用 ├── 3. 输入空间构造按 param_type 派发 │ ├── REQUIRED → 本文档 §3 │ └── DYNAMIC → 06-dynamic-tensorlist.md ├── 4. 输出推导通用读 operator_model infershape 规则 ├── 5. 属性采样通用 ├── 6. const input 构造通用 └── 7. 组装返回格式由 param_type 决定2. 共享工具函数以下 5 项嵌入 S5_case_mapper.py 顶部不随算子或 param_type 变化。_prime_factors_prime_factors(n: int) - list[int]— 质因数分解升序。n 1 返回 []。_decompose_decompose(num: int, parts: int, strategy: str balanced) - tuple[int, ...]— 将 num 分解为 parts 个因子。balanced: 因子 1 尽量接近不变式math.prod(result) num。nontrivial: 因子 1不足时降级含 1。parts0 返回 ()。_sample_attr_sample_attr(case: dict, spec: dict) - Any— case 中有 spec[param] 则直接取否则按 spec[sampling].strategy 采样log_uniform/uniform/choice/default。无 sampling 取 spec.get(default)。_resolve_param_resolve_param(case: dict, name: str, default: Any) - Any— case.get(name, default)。DTYPE_MAPDT_* 格式 → Python 格式查表。已是 Python 格式时无害透传。3. map_case() — 输入空间构造def map_case(case, rngNone): case: 单条 case dict字段为算子参数名来自 S2P2_cases.json 或 S2P2_network_cases.json rng: random.Random, seed 由 load_mapped_configs 设置 返回: {params: {...}, tensors: {inputs: {...}, outputs: {...}}} if rng is None: rng random.Random() # # 以下内容由子 agent 从 S5_mapping_spec.md 翻译生成 # 步骤 1dtype 解析通用dtype_val DTYPE_MAP.get(case[{dtype_param}], case[{dtype_param}])步骤 2shape 参数解析通用{param_name} _resolve_param(case, {param_name}, {default})步骤 3输入空间构造按 param_type 派发遍历 S5_mapping_spec.md 输入 tensor 的每个 input读其 param_type 标注选择对应分支。REQUIRED 分支单 tensor翻译自 S5_mapping_spec.md 输入 tensor 中标注为 REQUIRED 的各节。ndim 确定# 独立范围rng.randint(lo, hi) {tensor}_ndim rng.randint({lo}, {hi}) # 有 约束rng.randint(lo, min(hi, {X}_ndim)) {tensor}_ndim rng.randint({lo}, min({hi}, {X}_ndim)) # 约束直接赋值 {tensor}_ndim {X}_ndimndim 解析顺序有跨 tensor 依赖时按以下顺序先解析所有独立 tensorndim 范围纯数字无 le/ge/eq 引用其他 tensor再解析有 // 约束的 tensor此时被引用的 tensor 的 ndim 已确定最后处理 sync_with tensor直接赋值input shape 构造# product balanced 分解 - _decompose(val, N) {tensor}_shape _decompose({param}, {N}) # 直接取值 - (val,) {tensor}_shape ({param},) # sync_with - 复制目标 shape {tensor}_shape {X}_shape # ndimmin 时跳过 product 组空 tuple {tensor}_shape () if {N} 0 else _decompose({param}, {N})组装格式# 单 tensor值为 dict inputs[{name}] {shape: {tensor}_shape, dtype: dtype_val}DYNAMIC 分支TensorList按需读取06-dynamic-tensorlist.md §2DYNAMIC 输入值为list[dict]每个 dict 描述一个子 tensor。构造逻辑tensor_count、逐子 tensor ndim/shape、列表级约束、组装格式见 06。4. map_case() — 输出推导通用不按 param_type 派发读S2P1_operator_model.json的outputs[*]按 infershape 规则从输入推导输出。规则与 param_type 正交——REQUIRED 输入是 dictDYNAMIC 输入是 list[dict]推导逻辑自动适配。tensor_count 推导读outputs[*].tensor_countderived_from输出 count 被引用输入的 countDYNAMIC 输入取len(inputs[{name}])param控制rng.randint(min, max)生成同 06 §2.1 模式 A无 tensor_count 字段REQUIRED 输出单 tensor无需 countshape 推导读outputs[*].shape.rulerule处理方式same_as_input复制对应输入的 shape。REQUIRED:inputs[{name}][shape]DYNAMIC: 逐子 tensor[s[shape] for s in inputs[{name}]]derived子 agent 从operator_model.outputs[*].shape.expr翻译为 Python 表达式。REQUIRED: 单次计算DYNAMIC: 逐子 tensor 循环计算fixed直接赋值derived 规则代码模板# REQUIRED 输出 derived单次计算 {out}_shape expr 翻译引用 inputs[{src}][shape] 等 # DYNAMIC 输出 derived逐子 tensor 循环计算 {out}_shapes [ expr 翻译引用 inputs[{src}][i][shape] 等 for i in range({out}_count) ]dtype 推导读outputs[*].dtype.sourcesource处理方式input复制对应输入的 dtypefixed直接赋值组装格式输出格式由输出的 param_type 决定REQUIRED → dictDYNAMIC → list[dict]与对应输入格式一致。# REQUIRED 输出 outputs[{name}] {shape: {out}_shape, dtype: {out}_dtype} # DYNAMIC 输出 outputs[{name}] [ {shape: {out}_shapes[i], dtype: {out}_dtypes[i]} for i in range({out}_count) ]5. map_case() — 属性 const input 组装返回步骤 5属性采样通用{attr_name} _sample_attr(case, { param: {key}, type: {type}, sampling: {strategy: {strategy}, ...}, default: {default} })步骤 6const input 值构造通用{const_input_name} [{dim_0_val}, {dim_1_val}, ...]步骤 7组装返回return { params: {**case, {attr}: {attr_val}, ..., {const_input}: {const_input_val}, ...}, tensors: { inputs: { # REQUIRED: {name: {shape: ..., dtype: ...}} # DYNAMIC: {name: [{shape: ..., dtype: ...}, ...]} }, outputs: { ... } } }6. validate_config()def validate_config(cfg, case): L1 校验 errors [] t cfg[tensors]REQUIRED 分支单 tensorif not ({lo} len(t[inputs][{name}][shape]) {hi}): errors.append(...) if len(t[inputs][{a}][shape]) len(t[inputs][{b}][shape]): errors.append(...) if t[inputs][{name}][shape][{N}] % {K} ! 0: errors.append(...)DYNAMIC 分支TensorList按需读取06-dynamic-tensorlist.md §3校验tensor_count 范围、逐子 tensor ndim 范围、列表级约束same_dtype_within_list、sync_with 一致性。输出校验通用不按 param_type 派发验证推导结果与 infershape 规则一致。按 rule 分节每节按输出 param_type 选择对应代码。dtype 校验sourceinput 则与对应输入 dtype 比对sourcefixed 则与固定值比对。same_as_input# REQUIRED 输出单 dict 直接比较 if t[outputs][{out}][shape] ! t[inputs][{src}][shape]: errors.append(...) if t[outputs][{out}][dtype] ! t[inputs][{src}][dtype]: errors.append(...) # DYNAMIC 输出逐子 tensor 比较先验 count再验逐子 tensor if len(t[outputs][{out}]) ! len(t[inputs][{src}]): errors.append(...) for i in range(len(t[outputs][{out}])): if t[outputs][{out}][i][shape] ! t[inputs][{src}][i][shape]: errors.append(...) if t[outputs][{out}][i][dtype] ! t[inputs][{src}][i][dtype]: errors.append(...)derived子 agent 复用 §4 推导时的 expr对输出 shape 重新计算并与实际输出比对# REQUIRED 输出单次计算 比对 expected expr 翻译引用 t[inputs][{src}][shape] 等 if t[outputs][{out}][shape] ! expected: errors.append(...) # DYNAMIC 输出逐子 tensor 计算 比对 for i in range(len(t[outputs][{out}])): expected expr 翻译引用 t[inputs][{src}][i][shape] 等 if t[outputs][{out}][i][shape] ! expected: errors.append(...)fixed# REQUIRED 输出 if t[outputs][{out}][shape] ! {fixed_shape}: errors.append(...) # DYNAMIC 输出逐子 tensor for i in range(len(t[outputs][{out}])): if t[outputs][{out}][i][shape] ! {fixed_shape}: errors.append(...)通用校验if cfg[params].get({attr}, 0) {min}: errors.append(...) return errors7. check_dim_diversity()def check_dim_diversity(mapped_cases, rank_range, rank_constraintsNone, count_rangeNone): 检查 ndim 覆盖率返回 missing 列表WARNING不阻塞参数rank_range从 operator_model inputs[*].rank 提取 (min,max)rank_constraints从 shape.constraints 识别 ndim 依赖无依赖传 Nonecount_range从 inputs[*].tensor_count 提取仅 DYNAMIC 需要。REQUIRED 分支sync_with tensor标注 skipped不报 MISSING约束 tensormax_le按依赖 ndim 分组检查独立 tensor检查 rank_range 覆盖DYNAMIC 分支按需读取06-dynamic-tensorlist.md §4检查 tensor_count 覆盖率 逐子 tensor ndim 覆盖率。8. 编排代码每次照搬load_mapped_configsdef load_mapped_configs(cases_file, seed42, id_prefixcase): 批量映射加载 JSON - 逐 case 映射 - 校验 - 返回 rng random.Random(seed) with open(cases_file) as f: cases json.load(f) results [] for case in cases: cfg map_case(case, rng) errs validate_config(cfg, case) if errs: print(f[WARN] case {case.get(_group, ?)}: {errs}) cfg[id] f{id_prefix}{len(results):05d} results.append(cfg) return resultsmaindef main(cases_fileNone, out_fileNone, id_prefixcase): import os if cases_file is None: cases_file os.path.join(os.path.dirname(os.path.abspath(__file__)), S2P2_cases.json) if out_file is None: out_file os.path.join(os.path.dirname(os.path.abspath(__file__)), S5_mapped_cases_path.json) mapped load_mapped_configs(cases_file, id_prefixid_prefix) with open(out_file, w) as f: json.dump({cases: mapped}, f, indent2) print(fWritten {len(mapped)} cases to {out_file})子 agent 生成 main() 时须在末尾调用 check_dim_diversity(mapped, rank_range, rank_constraints, count_range)rank_range从 S2P1_operator_model.json 的 inputs[*].rank 提取各 tensor 的 (min, max)。rank_constraints从 S2P1_operator_model.json 的 inputs[*].shape.constraints 中识别 ndim 依赖关系硬编码传入。无依赖关系则传 None。count_range从 S2P1_operator_model.json 的 inputs[*].tensor_count 提取 DYNAMIC 输入的 (min, max)。REQUIRED 输入不需要此参数。9. S5_verify_mapper.py 结构4 层验证0 fail → PASS≥1 fail → FAIL最多 3 轮修复层职责规则L1调 S5_case_mapper.validate_config()—L2operator_model 交叉验证outputs key、dtype/rank 范围—L3source_constraints 交叉验证API 限制 → warn其他 → failL4NPU e2e 调用算子 APINPU 不可用 → SKIP采样10 random cases≤20 时全量。10. 闸门结果处理0 failPASS - 进入 Step 5b1 failFAIL - 回到 map_case/validate_config 修正最多 3 轮diversity check 有缺失WARNING不阻塞缺失信息输出到 stderr【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考