CANN/ge UT开发指南

发布时间:2026/11/2 19:37:30

CANN/ge UT开发指南 UT用例开发指导【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge返回 DT用例开发总纲UT的测试范围是一个文件理论上一个UT应该对一个文件暴露的接口做测试并校验属于被测文件的行为。测试过程中UT用例应该认为其他文件的行为都是正确的、仅校验被测文件的行为。UT用例设计设计一个接口的测试点时注意关注以下点以下点为checklist如果不涉及或者认为不需要校验可以不设计对应用例错误值校验例如入参空指针超出规格范围边界值校验例如如果输入涉及Tensor考虑空Tensor场景如果被测模块涉及容器概念例如可以添加或管理多个element那么需要额外考虑如下因素插入动作发生在容器的开头、中间、结尾时删除动作发生在容器的开头、中间、结尾时如何校验做完整校验UT用例应该根据设计对所调用函数的返回值、出参做完整校验。如果所调用的函数产生了副作用那么应该对副作用做完整校验。所谓完整校验是指从外部可以观察到的、所有的变更点都应该校验。一种典型的错误是仅校验被测函数的返回值这种用例的作用极其有限应该避免。避免重复校验用例应该避免重复校验这意味着同一类校验尽量不要出现在多个不同的用例中。重复校验的主要问题在于加大了用例的维护难度在修改一个模块行为时导致多个用例失效。图类UT关注的校验点改图、构图类UT需要关注图的变化例如新增结点检查删除结点检查变更的连边检查变更的属性检查 以CEM的基础UT为例CEM(Constant Expression Motion)作用于执行图将执行图Main图中每次计算中不变的表达式移动到Init图中以达到加速Main图执行速度的作用。下面的用例中构造了一个注释中的Main Graph并期望通过一个Pass将Main图中的两个Const一个Foo1移动到Init图中/* * main graph: * * NetOutput * | * Foo2 * / \ * Foo1 data * / \ * const const */ TEST_F(ConstantExpressionsMotionUT, MoveToInit_Success_CeOnMain) { auto c1 ValueHolder::CreateConst(Hello, 5, true); auto c2 ValueHolder::CreateConst(World, 5, true); auto data ValueHolder::CreateFeed(0); auto foo1 ValueHolder::CreateSingleDataOutput(Foo, {c1, c2}); auto foo2 ValueHolder::CreateSingleDataOutput(Foo, {foo1, data}); auto main_frame ValueHolder::PopGraphFrame({foo2}, {}, NetOutput); auto root_frame ValueHolder::PopGraphFrame(); ASSERT_NE(root_frame, nullptr); ASSERT_NE(main_frame, nullptr); bool changed false; LoweringGlobalData global_data; ASSERT_EQ(ConstantExpressionMotion(global_data).Run(root_frame-GetExecuteGraph().get(), changed), ge::GRAPH_SUCCESS); ASSERT_TRUE(changed); EXPECT_EQ(ExeGraphSummaryChecker(main_frame-GetExecuteGraph().get()) .StrictDirectNodeTypes( std::mapstd::string, size_t{{Data, 1}, {Foo, 1}, {InnerData, 1}, {NetOutput, 1}}), success); EXPECT_EQ(ExeGraphSummaryChecker(init_frame_-GetExecuteGraph().get()) .StrictDirectNodeTypes(std::mapstd::string, size_t{{Const, 2}, {Foo, 1}, {InnerNetOutput, 1}}), success); EXPECT_EQ(de_init_frame_-GetExecuteGraph()-GetDirectNodesSize(), 0); ConnectFromInitToMain(foo1-GetFastNode(), 0, foo2-GetFastNode(), 0); changed false; ASSERT_EQ(ConstantExpressionMotion(global_data).Run(root_frame-GetExecuteGraph().get(), changed), ge::GRAPH_SUCCESS); ASSERT_FALSE(changed); }rt2 kernel类UT的校验点Kernel函数的范围RT2中的Kernel指为执行节点注册的一系列运行时函数的集合当前包括通过.RunFunc注册的Kernel执行函数即执行节点的计算逻辑通过.OutputsCreatorFunc注册的执行节点输出创建及初始化函数注意早期版本中的.OutputsInitializer及.OutputsCreator注册接口已废弃。通过.TracePrinter注册的节点自定义执行信息组装接口该接口在节点执行结束后调用返回该节点类型关注的context信息供框架进行节点执行trace信息打印。Kernel函数只为执行节点服务其函数签名不具备可读性通常应当设置为匿名函数。Kernel函数UT测试的策略对Kernel的UT测试是对某个执行节点的运行时相关函数的测试应当从执行节点发起而不是直接调Kernel函数。有些用例为了可以在UT中调用而将不可读的kernel函数签名符号导出有些本末倒置。框架保证调用Kernel相关函数时已正确申请输入输出any value内存Kernel函数编码时可以对输入输出的any value进行ASSERT防御性校验但是不推荐对其进行单独的UT测试即不要测试某个输入any value为空时的Kernel表现。这类用例当前代码里通常是一个叫输入异常的笼统名称预期执行失败。但是都是经不起推敲的比如为何测试只测试一个异常输入场景而不测试不同异常组合下的返回名言部分的证明等于0说明了这种验证的意义。Kernel函数的测试点说明你可能需要关注测试点4中对TracePrinter函数的相关说明测试点1根据执行节点类型能正确查询到注册的Kernel系列函数auto funcs registry.FindKernelFuncs(YourTestingOpType); ASSERT_NE(funcs, nullptr); ASSERT_NE(funcs-outputs_creator, nullptr); // 根据是否注册决定是否校验 ASSERT_EQ(funcs-outputs_creator(nullptr, context), ge::GRAPH_SUCCESS); // 根据是否注册决定是否校验 ASSERT_NE(context-GetOutputPointerShape(0), nullptr); // 根据是否注册决定是否校验测试点2对执行节点的OutputsCreatorFunc函数测试如果执行节点注册了OutputsCreatorFunc则对OutputsCreatorFunc函数进行UT测试通常只需要测试OutputsCreatorFunc的返回值正确即可。ASSERT_NE(funcs-outputs_creator, nullptr); ASSERT_EQ(funcs-outputs_creator(nullptr, context), ge::GRAPH_SUCCESS);我们建议只写一个校验OutputsCreatorFunc正常执行的用例出于以下考虑接口返回正确代表完成了全部的创建和初始化动作对创建的内容的校验是冗余的对创建内容的校验是不充分且不可信的因为无法从any value对象存储的指针上校验类型测试点3对执行节点的Kernel执行函数测试这部分需要针对Kernel执行函数的实现设计合理的测试用例。 但是需要明确用例的边界在调用Kernel执行函数前需要保证已经正确创建了KernelContext输入输出any value内存并调用OutputsCreatorFunc注册函数如果有的话这两部分是测试的前置条件。TEST_F(BuildTensorUT, SplitTensor_Host) { auto tensor_holder TensorFaker().Shape({10, 20}).Format(ge::FORMAT_ND).Placement(kOnHost).Build(); auto context_holder KernelRunContextFaker() .KernelIONum(2, static_castsize_t(kernel::SplitTensorOutputs::kNum)) .NodeIoNum(1, 1) .Inputs({tensor_holder.GetTensor(), gert_allocator}) .Build(); auto run_context context_holder.GetContextKernelContext(); auto funcs registry.FindKernelFuncs(kernel::kSplitDataTensor); ASSERT_NE(funcs, nullptr); ASSERT_EQ(funcs-outputs_creator(FastNodeFaker().Build(), run_context), ge::GRAPH_SUCCESS); ASSERT_EQ(funcs-run_func(run_context), ge::GRAPH_SUCCESS); // 调用执行函数 // check tensor data auto tensor_data_chain run_context-GetOutput(static_castsize_t(kernel::SplitTensorOutputs::kTensorData)); // 获取输出并校验结果 ASSERT_NE(tensor_data_chain, nullptr); EXPECT_TRUE(tensor_data_chain-HasDeleter()); auto tensor_data tensor_data_chain-GetPointerGertTensorData(); ASSERT_NE(tensor_data, nullptr); EXPECT_EQ(tensor_data-GetAddr(), tensor_holder.GetTensor()-GetAddr()); // check shape auto shape run_context-GetOutputPointerStorageShape(static_castsize_t(kernel::SplitTensorOutputs::kShape)); ASSERT_NE(shape, nullptr); EXPECT_EQ(*shape, tensor_holder.GetTensor()-GetShape()); context_holder.FreeAll(); }注意如果你正在写一个期望Kernel执行函数失败的用例请务必慎重这是否是一个真实存在的运行时输入场景如果不是很容易陷入部分证明的泥潭 -- 为何不测试全部的异常输入组合。即使你罗列了全部的异常组合也会陷入用例数量爆炸的另一个泥潭。我们可以在Kernel执行函数内部进行一些BUG场景的ASSERT防御性校验但是不应该对其进行单独的UT测试。测试点4对TracePrinter函数进行测试TracePrinter函数的功能是从context中收集所需的执行信息在调用时序上发生在Kernel执行函数调用后。需要特别注意的是当前执行逻辑下即使Kernel执行函数返回错误仍会调用该函数因此函数实现时对于Kernel输出的处理需要格外慎重必须与Kernel执行函数严格匹配。在目前调用时机未修改且无法获知执行结果的情况下需要开发者谨慎地实现TracePrinter函数确保在Kernel执行函数异常退出时不会发生运行时错误即使这很难实现。将来大概率会修改该函数的调用时机或调用时传入执行结果信息。基于当前的调用时机我们只建议对TracePrinter进行两部分的测试测试用例1测试Kernel执行函数正常执行后的返回信息registry.FindKernelFuncs(LaunchKernelWithFlag)-run_func(context.WithFlag()) auto ret registry.FindKernelFuncs(LaunchKernelWithFlag)-trace_printer(context.WithFlag()); EXPECT_FALSE(ret.empty());注意该测试是不充分的假定了处理执行函数错误时不对输出进行任何修改这通常是不成立的。测试用例2模拟测试Kernel执行函数异常时的返回信息待定构造 -run_func() 失败的场景然后调用 -trace_printer 方法【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/2 19:37:13

CANN/GE算子形状推断函数实现

IMPLEMT_INFERFUNC 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorF…

2026/10/27 11:22:36

MTProxy配置参数详解:从端口设置到worker数量优化

MTProxy配置参数详解:从端口设置到worker数量优化 MTProxy是一款高效的代理工具,本文将详细解析其核心配置参数,帮助新手用户快速掌握从端口设置到worker数量优化的全过程,轻松搭建稳定可靠的代理服务。 一、基础参数解析 1.1 …

2026/11/2 19:34:14

社交媒体成瘾机制与合规设计解析

1. 社交媒体平台成瘾机制的本质剖析 社交媒体平台的设计核心在于一套精密的行为激励机制,这套机制融合了心理学、神经科学和行为经济学原理。最典型的当属"可变奖励"机制——用户每次刷新内容时获得的是不确定的反馈组合(可能是朋友点赞、热门…

2026/11/2 19:34:14

Mangos物品任务BOSS NPC编辑软件安装配置与排错指南

简介:Mangos服务端数据维护工具包,面向私服/单机服搭建者、数据库管理员以及希望熟悉WoW类服务端数据结构的进阶学习者,重点解决物品、任务、BOSS、NPC等条目在数据库中录入、查询和批量调整时效率低、字段易填错的问题。压缩包共66个文件&am…

2026/11/2 19:34:14

SOMBP多分类模型:融合自组织映射与BP神经网络的混合架构

1. SOMBP多分类模型概述 在机器学习领域,将不同算法的优势进行组合往往能产生意想不到的效果。SOMBP模型正是这种思路的典型代表——它巧妙地将自组织映射(SOM)的无监督学习特性与BP神经网络强大的监督学习能力相结合。这种混合架构特别适合处理那些既有大量未标记数…

2026/11/2 19:34:14

cena 0.8.2本地评测实战:题包、时限与对拍避坑指南

简介:Cena评测软件0.8.2是一款面向C、C与Pascal语言学习者的代码评测工具,也可供编程教师批改作业、竞赛组织者进行小规模自动判题,帮助用户验证程序正确性、运行效率与编码规范。压缩包共四百四十六个文件,约十点六八兆字节&…

2026/11/2 19:34:14

2026网络安全趋势:技术挑战与职业发展指南

1. 网络安全行业的现状与挑战2026年的网络安全领域将面临前所未有的复杂局面。作为一名从业十余年的安全工程师,我亲眼目睹了这个行业从边缘岗位到企业核心部门的转变过程。如今的网络安全早已不是简单的防火墙配置和病毒查杀,而是演变成了一个融合技术、…

2026/11/2 19:29:13

Vux Store模块化管理:提升大型前端项目状态维护效率

1. Vux Store模块化管理的核心价值在大型前端项目中,状态管理往往随着业务复杂度提升变得难以维护。Vux作为Vue.js生态中的状态管理方案,其模块化能力就像给杂乱无章的仓库安装了智能货架系统。我经历过一个电商后台项目,初期将所有状态堆砌在…

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业级SPI隔离设计:硬件抗扰与信号完整性实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

PLFM_RADAR:主动探测数据通道,构建低误报的数据感知系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业SPI隔离设计:MAX14431与STM32F746硬件抗干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑