恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

CANN/ge UT用例开发指导

  • 首页
  • 资讯中心
  • /
  • CANN/ge UT用例开发指导

相关资讯

5 分钟跑通双语网页翻译:沉浸式翻译完整入门指南 2026/9/10 5:35:18
Unity动画优化:XTween To方法深度解析与性能陷阱排查 2026/9/10 5:35:18
多隐层架构的数理本质:函数逼近与流形折叠 2026/9/10 5:30:18

最新资讯

Apache Airflow 分区窗口方向控制:`Window.Direction.FORWARD` 与 `BACKWARD` 详解
Agno AgentOS 上手实战:用 HTTP 一次打通 Agent、Team、Workflow 与知识库的完整服务端
如何快速上手 Semgrep:从一条命令到自动查 Bug 的完整指南
连接智能:嵌入式世界展揭示边缘智能网联技术新趋势
Android背单词App源码实战:从解压到改造全解析
自研轻量任务调度器adwawd:状态机与DAG编排实践

今日推荐

AI搜索重构内容生态:企业从“流量争夺”转向“答案共建”
AI搜索的信任缺口:企业内容如何在答案时代自证可信
Spring Boot+Vue+Node.js售后服务系统开发实战

本周热门

超人会飞不算本事:系统稳定依赖清晰规则与边界设计
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论
基于CNN的调制信号识别:MATLAB实现时频图分类实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

CANN/ge UT用例开发指导

发布时间:2026/9/10 5:35:18
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),仅供参考

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号