بنقرة واحدة
pypto-pass-ut-generate
根据 Pass 业务描述,生成单元测试用例(UT)。当用户输入业务情况时,能根据业务,生成对应 Pass 的 UT 用例。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
根据 Pass 业务描述,生成单元测试用例(UT)。当用户输入业务情况时,能根据业务,生成对应 Pass 的 UT 用例。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
PyPTO Pass 编译性能优化技能。用于分析和优化 Pass 模块的编译性能,当 Pass 编译耗时过长需要优化时使用此技能。
定位测试案例中出现 aicore error 时的问题 CCE 文件和问题代码行。当用户说"aicore error"、"定位 aicore error 的原因"、"帮我定位 aicore error 报错"时使用此技能。也适用于用户直接提供 CCE 文件希望定位问题代码行或映射到源码的场景。
PyPTO 环境安装与环境问题修复,包括 CANN、torch_npu、编译工具链、第三方依赖和 PyPTO 编译运行等。触发词:PyPTO environment setup, CANN install, torch_npu, NPU environment, Ascend toolkit, compile PyPTO, build PyPTO, NPU driver, prepare_env, diagnose environment, fix import error, torch_npu import fail, DT_FP8E8M0, pto-isa, ASCEND_HOME_PATH, npu-smi, softmax verify, pip dependency conflict
分析当前 session 上下文,识别 PyPTO 框架或文档不完善导致的断裂点,产出可转化为 Issue 的结构化报告。当用户在 pypto 相关 skill 运行结束后提到"断裂点"、"识别断裂点"、"检测断裂点"、"fracture point"时触发此 skill。也适用于用户对 session 中遇到的问题进行复盘、想要生成问题报告、或希望改进 pypto 框架/文档质量的场景。
分析 host 侧捕获异常后的堆栈信息,通过地址到源码行映射和符号解析,定位问题代码位置。支持 Python traceback、C++ stack trace 和混合堆栈的自动识别与分析。支持编译Debug版本PyPTO包并定位具体代码行。Triggers:"堆栈分析"、"堆栈反汇编"、"分析堆栈信息"、"地址到源码行"、"stack trace"、"backtrace"
PyPTO MACHINE 内存重叠检测与修复技能。通过系统化流程检测和修复 workspace 内存重叠、内存管理策略问题导致的精度异常。当怀疑精度问题由内存重叠、workspace 不足、内存管理异常引起时使用此技能。触发词:内存重叠、内存重叠检测、workspace问题、内存管理异常、内存复用错误。
| name | pypto-pass-ut-generate |
| description | 根据 Pass 业务描述,生成单元测试用例(UT)。当用户输入业务情况时,能根据业务,生成对应 Pass 的 UT 用例。 |
本技能用于分析如何根据用户描述生成对应的 Pass 侧单元测试用例(UT),结合调用 pypto-pass-module-analyzer 技能分析 Pass 业务,帮助设计相关单元测试用例(UT)。
pypto-pass-ut-generate/
├── SKILL.md # 主技能文档
├── scripts/ # 脚本工具目录
│ ├── common_utils.py # 公共工具函数
│ ├── pr_utils.py # PR 处理工具(完整功能)
│ ├── get_ut_status.py # 简化版 UT 状态获取
│ └── ut_coverage.py # 覆盖率分析工具
└── references/
├── check_list.md # 检查清单
├── usage.md # 使用指南
├── trouble_shooting.md # 故障排查
└── common_errors.md # 常见错误记录
当用户输入包含以下关键字或相关内容时,自动触发此技能:
| 触发词 | 说明 |
|---|---|
| "设计 Pass 模块 XXX 的 UT 用例" | 设计指定 Pass 模块的功能的 UT 用例 |
| "设计 Pass 模块 XXX 的 XXX 功能" | 设计指定 Pass 模块的指定功能的 UT 用例 |
| "设计 XXX 功能的相关 Pass 模块的 UT 用例" | 设计与 XXX 功能相关 Pass 的 UT 用例 |
| "为PR XXXX补充UT" | 为指定 PR 补充 UT 测试用例(在线) |
| "分析覆盖率报告" | 分析 UT 覆盖率报告,补充未覆盖代码(离线) |
| "分析本地diff文件" | 分析用户指定的本地 diff 文件(离线) |
| "分析本地覆盖率文件" | 分析用户指定的本地覆盖率 .tar.gz 文件(离线) |
| "分析本地文件" | 同时分析本地 diff 和覆盖率文件(离线) |
触发示例:
本技能支持以下 5 种使用场景:
适用情况:需要为某个 Pass 设计完整的 UT 测试套件
执行步骤:
pypto/framework/tests/ut/passes/src/test_xxx.cpp 创建测试文件python3 build_ci.py -c -u=TestPassName.* -j=24 -f=cpp 验证python3 build_ci.py -c -u=TestPassName.* --gcov -j=24 -f=cpp 检查覆盖率适用情况:PR 已有部分 UT,需要补充未覆盖的代码
执行步骤:
scripts/get_ut_status.py 快速获取 UT 状态scripts/pr_utils.py 处理 PR,获取 diff 和覆盖率报告示例:
# 快速获取 UT 状态
python3 scripts/get_ut_status.py 2017
# 完整处理 PR
python3 scripts/pr_utils.py 2017
适用情况:用户指定本地 diff 文件,需要离线分析
执行步骤:
scripts/ut_coverage.py 解析用户指定的本地 diff 文件示例:
# 解析本地 diff 文件
python3 scripts/ut_coverage.py --diff /path/to/pr.diff
# 简短写法(文件在当前目录)
python3 scripts/ut_coverage.py --diff pr.diff
适用情况:用户指定本地覆盖率报告(.tar.gz 格式),需要分析未覆盖代码
执行步骤:
示例:
# 解析本地覆盖率报告
python3 scripts/ut_coverage.py --report /path/to/ut_cov.tar.gz
# 简短写法(文件在当前目录)
python3 scripts/ut_coverage.py --report ut_cov.tar.gz
适用情况:用户同时指定本地 diff 文件和覆盖率报告,需要关联分析
执行步骤:
示例:
# 综合分析(同时指定 diff 和覆盖率文件)
python3 scripts/ut_coverage.py --diff /path/to/pr.diff --report /path/to/ut_cov.tar.gz
# 输出 JSON 格式建议
python3 scripts/ut_coverage.py --diff pr.diff --report ut_cov.tar.gz --json
根据用户描述的业务情况,分析相关业务:
(1)当描述为具体 Pass 的具体业务时,根据 pypto-pass-module-analyzer,分析业务场景,根据当前业务设计相应的 UT 用例,例如:设计 ProcessAtomic 这个 Pass 消除 RedunceAcc 功能的 UT;
(2)当描述为模糊 Pass 业务时,根据 pypto-pass-module-analyzer,进行相关 Pass 业务总结,挑选出符合业务的 Pass,分析业务场景,设计对应的 UT 用例,例如:请针对 Pass 中对于视图类 Op,view、assemble 处理的 Pass 设计对应的 UT,验证功能实现;
(3)当描述为设计 Pass 的 UT 时,根据 pypto-pass-module-analyzer,进行相关 Pass 业务总结,分析业务场景,设计该 Pass 业务的 UT 用例,例如:针对 ProcessAtomic 这个 Pass 设计相关 UT 用例;
(4) 当描述为设计 PR xxxx 的 UT 或者提供 diff 文件、ut 覆盖率报告时,解析变更变更代码或者未覆盖到的代码行,进行相关 Pass 业务总结,分析业务场景,设计该 Pass 业务的 UT 用例,例如:针对 PR01 设计相关 UT 用例或者针对 01.diff 文件生成 UT 用例或者针对 ut-report.tar.gz 生成 UT 用例;
在 pypto/framework/tests/ut/passes/src/test_xxx.cpp 寻找对应的测试文件,观察当前文件中,是否初始化环境,若已完成初始化,则跳过该步骤。其中 xxx 一般为 Pass 名称,
当未找到对应的测试文件时,可以查找 test_xxx.cpp 中创建类的名字是否与所要求设计 Pass 名字是否一致。
初始化环境详细步骤:
(1)创建新的类,命名 xxx.cpp,文件名为 test_xxx.cpp,其中 xxx 为输入的 pass 名称
(2)声明该类继承于 gtest 框架
(3)该类中,编写相关函数:
1.所有测试用例全局初始化函数--static void SetUpTestCase() {},若未明确指定内容,则为空实现;
2.所有测试用例全局清理函数--static void TearDownTestCase() {}, 若未明确指定内容,则为空实现;
3.每个测试用例执行前的初始化测试环境函数--void SetUp() override {},若未指定内容,则默认生成以下代码体;
void SetUp() override {
Program::GetInstance().Reset();
config::Reset();
config::SetHostOption(COMPILE_STAGE, CS_EXECUTE_GRAPH); // 其中 pypto/framework/src/interface/configs/config_manager_ng.h中的COMPILE_STAGE策略,通过pass所在文件夹目录,得到所处的编译策略
config::SetHostConfig(KEY_STRATEGY, "XXXTestStrategy"); // 其中xxx为pass名字,表示host侧KEY_STRATEGY
config::SetPlatformConfig(KEY_ENABLE_COST_MODEL, false); // 其中 pypto/framework/src/interface/configs/config_manager.h中的Platform KEYs表示平台策略,需要根据用户传入的进行修改,若未传入,则采用该默认方式
TileShape::Current().SetVecTile({64, 64}); // 设置vector的tile块大小
TileShape::Current().SetCubeTile({64, 64}, {64, 64}, {64, 64}); // 设置cube的tile块大小
}
4.每个测试用例执行后的清理测试环境函数--void TearDown() override {},若为明确指定内容,则为空实现。
搭建测试用例框架 TEST_F(XXXX, XXX){ },其中XXXX为上述新建的测试类,XXX为该测试用例名字,可根据根据业务内容生成。
另外,在TEST_F(XXXX, XXX){ }上方位置处可以添加该测试用例注释,描述经过该pass前后的变化,例如:
/*
TESTRemoveDummyExpand
inCast{8,16}->expand->ubTensor{8,16}->exp->outCast1{8,16}
->sqrt->outCast2{8,16}
->reciprocal->outCast3{8,16}
inCast{8,16}->exp->outCast1
->sqrt->outCast2
->reciprocal->outCast3
*/
TEST_F(TestRemoveRedundantOpPass, RemoveRedundantOpUTest1) {
...
}
构建整张计算图function,利用智能指针进行创建,并在创建后判断是否为空。若用户未明确指定参数,则belongTo为新建Program实例,funcMagicName和funcRawName均为TestXXX,XXX为pass名字,parentFunc为空指针。
详细的信息如下:
Function类常用构造函数:
Function(const Program &belongTo, const std::string &funcMagicName, const std::string &funcRawName,
Function *parentFunc);
Program常用获取实例:
Program &Program::GetInstance() {
static Program sProgram;
return sProgram;
}
详细代码可以参考:pypto/framework/src/interface/program/program.cpp和pypto/framework/src/interface/function/function.h
构建计算图中的Tensor,利用智能指针,根据业务需求,创建所需要的Tensor。
LogicalTensor类常用构造函数:
LogicalTensor(Function &function, DataType t, Shape tshape, TileOpFormat tformat = TileOpFormat::TILEOP_ND, std::string tname = "",
NodeType tnodetype = NodeType::LOCAL);
详细LogicalTensor类信息,请参考:pypto/framework/src/interface/tensor/logical_tensor.h
构建计算图中的Operation,利用智能指针,根据业务需求,创建所需要的Operation。
常用的创建Operation及绑定function函数:
Operation &Program::AddOperation(const Opcode opCode,
const std::vector<std::shared_ptr<LogicalTensor>> &iOperand,
const std::vector<std::shared_ptr<LogicalTensor>> &oOperand) {
// Add the operation to the current function
if (currentFunctionMagicName_ == PROGRAM_ENTRY_FUNCTION_NAME) {
FE_LOGE("Error: No active function to add operation.");
ASSERT(false) << "No active function to add operation.";
}
return currentFunctionPtr_->AddOperation(opCode, iOperand, oOperand);
}
详细创建Operation及绑定function函数信息,请参考:pypto/framework/src/interface/program/program.cpp
Opcode信息,请参考:pypto/framework/src/interface/operation/opcode.h和pypto/framework/src/interface/operation/opcode.cpp
根据业务功能,校验pass运行后的处理结果是否符合预期。
例如校验function经过pass后,assemble数量是否符合预期,可以通过遍历function,查找assemble的数量进行比对,具体代码如下:
uint32_t assemble_num = kNumZero;
for (auto &op : currFunctionPtr->Operations()) {
if (op.GetOpcode() == Opcode::OP_ASSEMBLE) {
++assemble_num;
}
}
EXPECT_EQ(assemble_num, kNumZero);
当生成UT用例后,执行执行Python3 build_ci.py -c -u=xxx.* -j=24来验证用例是否正确,xxx为该测试用例类的名字,对于错误进行改正。
当执行超时时,优先执行Python3 build_ci.py -u=xxx.* -j=24。
若此时还存在执行超时问题,则执行Python3 build_ci.py -u=xxx.xx -j=24,xx为测试用例
例如: python3 build_ci.py -c -u=TestRemoveRedundantOpPass.* -j=24 -f=cpp
python3 build_ci.py -u=TestRemoveRedundantOpPass.* -j=24 -f=cpp
python3 build_ci.py -c -u=TestRemoveRedundantOpPass.TestIntermediateOutcast -j=24 -f=cpp
在当前环境中,通过GCov来统计代码UT覆盖率,主要包括行覆盖率和方法覆盖率。
使用方法:
python3 build_ci.py -c -u=xxx.* --gcov -j=24 -f=cpp
xxx为该测试用例类的名字,xx为测试用例
执行结束时,会在build/路径下,生成cov_result 目录,打开index.html观察对应pass的UT覆盖率情况,若覆盖率<=80%,则针对未覆盖的业务,重复以上步骤,进行该Pass UT补充。
同UT生成流程一中步骤1:分析业务
同UT生成流程一中步骤2:环境配置
同UT生成流程一中步骤3:搭建测试用例框架
利用ComputationalGraphBuilder类来构建function,通过调用AddTensor()和AddTensors()来实现function中Tensor的构建,调用AddOp()和AddOps()来实现function中Op的构建。
通过调用SetInCast()和SetOutCast()来实现对function的输入输出构建。
ComputationalGraphBuilder类信息,请参考:pypto/framework/tests/ut/passes/src/computational_graph_builder.h
Opcode信息,请参考:pypto/framework/src/interface/operation/opcode.h和pypto/framework/src/interface/operation/opcode.cpp
Operation信息,请参考: pypto/framework/src/interface/operation/operation.cpp
详细LogicalTensor类信息,请参考: pypto/framework/src/interface/tensor/logical_tensor.h
Tensor创建过程中DataType信息,请参考:pypto/framework/include/tilefwk/data_type.h
同UT生成流程一中步骤7:对业务功能进行校验
同UT生成流程一中步骤8:利用现有的环境,执行生成的UT,并对错误进行修改(若当前环境正常,需在当前环境中验证)
同UT生成流程一中步骤9:统计UT覆盖率
要符合常见的CPP代码编程规范,例如常见的编程错误:未使用的变量定义、未修改的引用加入const、魔鬼数字等;
生成的用例请真实执行,并对生成的用例进行验证修改;
对于UT覆盖率,请打印出来当前所设计UT的覆盖率。
功能:
使用示例:
# 在线处理 PR
python3 scripts/pr_utils.py 1894
功能:
使用示例:
# 解析本地 diff 文件
python3 scripts/ut_coverage.py --diff /path/to/pr.diff
# 解析本地覆盖率报告(.tar.gz 格式)
python3 scripts/ut_coverage.py --report /path/to/ut_cov.tar.gz
# 综合分析(同时指定 diff 和覆盖率文件)
python3 scripts/ut_coverage.py --diff /path/to/pr.diff --report /path/to/ut_cov.tar.gz
# 输出 JSON 格式建议
python3 scripts/ut_coverage.py --diff pr.diff --report ut_cov.tar.gz --json
详见 references/trouble_shooting.md
| 类别 | 文件路径 |
|---|---|
| 生成流程一示例 | pypto/framework/tests/ut/passes/src/test_removeredundantop.cpp |
| 生成流程二示例 | pypto/framework/tests/ut/passes/src/test_cube_process.cpp |
| ComputationalGraphBuilder | pypto/framework/tests/ut/passes/src/computational_graph_builder.h |
| function 信息 | pypto/framework/src/interface/program/program.cpp和pypto/framework/src/interface/function/function.h |
| Opcode 定义 | pypto/framework/src/interface/operation/opcode.h |
| op 属性定义 | framework/src/interface/operation/attribute.h |
| DataType 定义 | pypto/framework/include/tilefwk/data_type.h |
| LogicalTensor 定义 | pypto/framework/src/interface/tensor/logical_tensor.h |
| Operation 信息 | pypto/framework/src/interface/operation/operation.cpp |
| COMPILE_STAGE 策略 | pypto/framework/src/interface/configs/config_manager_ng.h |
| 阶段 | 配置值 |
|---|---|
| TENSOR GRAPH 执行 | CS_TENSOR_GRAPH |
| TILE GRAPH 执行 | CS_TILE_GRAPH |
| BLOCK GRAPH 执行 | CS_EXECUTE_GRAPH |
根据 Pass 所在文件夹目录选择对应的编译策略。