-
背景信息当开发人员遇到数据量较大的张量或字符串输出时,默认情况下,程序会将输出的数据打印到屏幕上,海量的数据无法用人眼直接识别有价值的数据,此时mindspore.ops.Print方法应运而生,该方法通过context接口中print_file_path参数将其保存在文件中。输出数据将保存在指定路径的文件中。之后可使用mindspore.parse_print()方法加载保存的数据。一、保存print数据1、示例代码import numpy as npimport mindspore.ops as opsfrom mindspore import Tensor, contextfrom mindspore.ops import operations as Pimport mindspore.nn as nnimport mindspore#保存数据context.set_context(mode=context.GRAPH_MODE, print_file_path='./save_print_data', device_target="Ascend")class PrintDemo(nn.Cell): def __init__(self): super(PrintDemo, self).__init__() self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=4, stride=1 ,has_bias=False, weight_init='normal', pad_mode='valid') self.conv2 = nn.Conv2d(in_channels=6, out_channels=2, kernel_size=2, pad_mode="valid") self.conv3 = nn.Conv2d(in_channels=2, out_channels=6, kernel_size=2, pad_mode="valid") self.print = P.Print() #打印出每层计算输出结果 def construct(self, input_data): x = self.conv1(input_data) self.print('self.conv1', x) x = self.conv2(x) self.print('self.conv2', x) x = self.conv3(x) self.print('self.conv3', x) return xdef test(): input_data = Tensor(np.ones([1, 1, 32, 32]), mindspore.float32) net = PrintDemo() net(input_data) return net(input_data)test()2、代码解析:context设置为context.set_context方法添加print_file_path参数来设置保存输出数据的路径:mindspore.context.set_context(mode=context.GRAPH_MODE, device_target="Ascend",print_file_path='./xxx_data')二、解析print数据1、示例代码data = mindspore.parse_print('./xxx_data')for i in range(0,len(data)): if isinstance(data[i], str): print(data[i]) continue else: tmp = data[i].asnumpy() data[i] = tmpprint(data)2、代码解析mindspore.ops.Print方法所保存的数据为二进制文件,不便于开发人员使用,故需要进一步的文件解析。在mindspore中提供了该文件的解析方法如下所示:data = mindspore.parse_print('./xxx_data')此时该文件解析后的数据格式为:list['输入名称(str)', Tensor],示例代码运行的结果如下所示:由于输入将转变为Tensor数据类型输出,不便于开发人员进行数据计算操作,故对此数据类型转换为numpy数据类型:data = mindspore.parse_print('./xxx.data')for i in range(0,len(data)): if isinstance(data[i], str): print(data[i]) continue else: tmp = data[i].asnumpy() data[i] = tmpprint(data)
-
1.简介别名分析是编译器理论中的一种技术,用于确定存储位置是否可以以多种方式访问。如果两个指针指向相同的位置,则称这两个指针为别名。 但是,它不能与指针分析混淆,指针分析解决的问题是一个指针可能指向哪些对象或者指向哪些地址,而别名分析解决的是两个指针指向的是否是同一个对象。指针分析和别名分析通常通过静态代码分析来实现。别名分析在编译器理论中非常重要,在代码优化和安全方面有着非常广泛且重要的应用。编译器级优化需要指针别名信息来执行死代码消除(删除不影响程序结果的代码)、冗余加载/存储指令消除、指令调度(重排列指令)等。编译器级别的程序安全使用别名分析来检测内存泄漏和内存相关的安全漏洞。2.别名分析分类别名分析种类繁多,通常按如下属性进行分类:域敏感(field-sensitivity)、过程内分析(Intra-Procedural)v.s.过程间分析(Inter-Procedural)、上下文敏感度(context-sensitivity)和流敏感度(flow-sensitivity)。2.1 域敏感(Field-Sensitivity)域敏感是对用户自定义类型进行分析的一种策略(亦可以处理数组)。在域敏感维度共有三种分析策略:域敏感(field-sensitive)、域非敏感(field-insensitive)、域基础分析(field-based)。以下面代码为例:struct Test { int field1; int field2; } Test a1; Test a2;Note:field这里为结构体或者类的数据成员。域非敏感:对每个对象建模,而对对象中的成员不进行处理;其建模后的结果如下图,仅有a1.*和a2.*的区别:域基础分析:仅对结构体中的成员进行建模,而不感知对象。其建模后的结果如下图,仅有*.field1和*.field2:域敏感:既对对象建模,又对成员变量进行处理。其建模后的结果如下图,有a1.field1、a1.field2、a2.field1、a2.field2:处理数组时,相同的原则亦适用。以C整数数组为例:int a[10],域非敏感分析仅使用一个节点建模:a[*],而域敏感分析创建10个节点:a[0]、a[1]、...、a[9]。总结:域敏感别名分析准确性高,但是当存在嵌套结构或者大数组时,节点数量会迅速增加,分析成本也会陡然上升。2.2 过程内分析(Intra-Procedural)v.s.过程间分析(Inter-Procedural)过程内分析仅分析函数体内部的指针,并没有考虑与其他函数之间的相互影响。需要特别指出的是,过程内分析当处理包含指针入参的函数或者返回指针的函数时,其分析可能不够准确。相反,过程间分析会在函数调用过程中处理指针的行为。过程内分析不易于扩展,精度较低。相比过程间分析,过程内分析更容易实现,且过程内/间分析与上下文敏感度分析高度相关,因为一个上下文敏感分析必定是一个过程间分析。2.3 上下文敏感度(Context-Sensitivity)上下文敏感度用来控制函数调用该如何分析。有两种分析方法:上下文敏感(context-sensitive) 和上下文非敏感(context-insensitive)。上下文敏感在分析函数调用的目标(被调用者)时考虑调用上下文(调用者)。以如下代码为参考[1]:1 public static void main(String[] args) { 2 String name1 = getName(3); // Tainted 3 String sql1 = "select * from user where name = " + name1; 4 sqlExecute(sql1); // Taint Sink 5 6 String name2 = getName(-1); // Not Tainted 7 String sql2 = "select * from user where name = " + name2; 8 sqlExecute(sql2); 9 } 10 11 private static String getName(int x) { 12 if (x > 0) { 13 return System.getProperty("name"); 14 } else { 15 return "zhangsan"; 16 } 17 }如上所示,getName()方法基于入参的不同,会返回不同的结果,在第2行和第6行,获取到的name1和name2的污点信息不同,当入参为3时,返回的是一个从环境变量中获取的污染的数据,导致sql注入,而当入参为-1时,返回的是一个常量,不是污染数据,不会有问题。 在上下文敏感的分析中,在第4行应该报一个sql注入问题,而在第8行则不应该报sql注入问题。而上下文非敏感的分析中,不考虑传入参数的不同,getName()方法则全部返回一个{System.getProperty("name")}∨{zhangsan},从而导致第4行和第8行都会报一个sql注入的问题。上下文敏感别名分析需要有一种方法,为函数getName创建抽象描述,以便每次调用它时,分析器都可以将调用上下文应用于抽象描述。总结:上下文敏感分析比较准确,但是增加了复杂度。2.4 流敏感度Flow-Sensitivity流敏感度是一种是否考虑代码顺序的原则。有两种方法:流敏感(flow-sensitive)和流非敏感(flow-insensitive)。流非敏感不考虑代码顺序,并为整个程序生成一组别名分析结果,而流敏感考虑代码顺序,计算程序中每个指针出现的位置的别名信息。以如下代码为例:1 int a,b; 2 int *p; 3 p = &a; 4 p = &b;流非敏感的分析结果是针对整个代码块,其结果应该是:指针p可能指向变量a或者变量b。流敏感生成的别名信息是,在第3行,指针p指向变量a,在第4行以后指针p指向变量b。Note:当程序具有许多条件语句、循环或递归函数时,流敏感分析的复杂性会大大增加。要执行流敏感分析,需要完整的控制流图。因此,流敏感分析非常精确,但对于大多数情况来说,它的分析成本过高,无法在整个程序上执行。3.别名分析常见算法介绍常见的别名算法共有三种:Andersen's指针分析算法、Steensgaard's指针分析算法和数据结构分析算法。Andersen's指针分析是一种流非敏感和上下文非敏感的分析算法。Andersen's指针分析算法复杂度较高,实践应用性较差,其时间复杂度为,其中n为指针节点个数。Steensgaard's指针分析算法也是一种流非敏感,上下文非敏感且域非敏感的别名分析算法。其时间复杂度较低,实现相对简单,实践应用广,其时间复杂度为,其中无限接近于1,但是其别名分析的准确性较低。数据结构分析算法是一种流非敏感,上下文敏感和域敏感的算法。其时间复杂度较低,为O(n * log(n)) ,应用性较好,但是由于不支持MustAlias(参考“AliasAnalysis Class概览”章节),导致其应用有局限性。4.别名分析在LLVM中的应用与实现4.1 应用别名分析在代码优化和安全方面有着非常重要且广泛的应用,以下面C代码为例,来简单介绍别名分析在代码优化方面的应用[2]。int foo (int __attribute__((address_space(0)))* a, int __attribute__((address_space(1)))* b) { *a = 42; *b = 20; return *a; }__attribute__属性指定了变量a指向地址0,变量b指向地址1。我们知道在ARM架构中,地址0和地址1是完全不同的,修改地址0中的内存永远不会修改地址1中的内存。以下为该函数可能生成的LLVM IR信息:define i32 @foo(i32 addrspace(0)* %a, i32 addrspace(1)* %b) #0 { entry: store i32 42, i32 addrspace(0)* %a, align 4 store i32 20, i32 addrspace(1)* %b, align 4 %0 = load i32, i32* %a, align 4 ret i32 %0 }第一个store将42存储到变量a指向的地址,第二个store指令将20存储到变量b指向的地址。%0 = ... 指向的行将变量a中的值加载到一个临时变量0中,并在最后一行返回该临时变量0。上述代码是未对foo函数进行优化的情况,下面我们考虑对foo函数进行优化。我们优化后的代码可能如下:删除了load指令对应的行,最后一行直接返回了常量42。define i32 @foo(i32 addrspace(0)* %a, i32 addrspace(1)* %b) #0 { entry: store i32 42, i32 addrspace(0)* %a, align 4 store i32 20, i32 addrspace(1)* %b, align 4 ret i32 42 }然而,我们进行优化的时候需要仔细一些,因为上述优化仅在a和b指向的地址不会相互影响时有效。例如:当我们给foo函数传递的指针相互影响时:int i = 0; int result = foo(&i, &i);在未开启优化的版本中,变量i将先被设置为42,然后被设置为20,最后返回20。然而,在优化版本中,虽然我们执行了两次store操作依次将42、20赋值给变量i,但是返回值是42,而不是20。因此优化版本破坏了foo函数本身的行为。如果应用了别名分析,编译器能够合理的执行上述优化。在执行优化前判断入参a和b是否为别名,如果是别名,则不执行删除load指令对应行的操作,否则执行删除操作。4.2 实现本文以LLVM16.0.0版本为参考,从代码接口入手,带领大家学习别名分析的代码实现。LLVM AliasAnalysis类是LLVM系统中客户使用和别名分析实现的主要接口,或者说一个“基类” 。除了简单的别名分析信息外,这个类还声明了Mod/Ref信息,从而使强大的分析和转换能够很好地协同工作。源码参考链接:AliasAnalysis.h[3]、AliasAnalysis.cpp[4]。4.2.1 基础知识MemoryLocation:LLVM中对内存地址的描述,主要应用在别名分析中,我们需要掌握该类中三个属性:其中,Ptr表示内存开始地址,Size表示内存大小,AATags是描述内存位置别名的metadata节点集合 。4.2.2 AliasAnalysis Class 概览AliasAnalysis类定义了各种别名分析实现应该支持的接口。这个类导出两个重要的枚举:AliasResult和ModRefResult,它们分别表示别名查询或mod/ref查询的结果。1、关键代码如下,AliasAnalysis为AAResults类别名:2、AliasResult关键代码如下:其中NoAlias表示两个内存对象没有任何重叠区域;MayAlias表示两个指针可能指向同一对象;PartialAlias表示两个内存对象对应的地址空间有重叠;MustAlias表示两个内存对象总是从同一位置开始。3、ModRefResult关键代码其中NoModRef表示访问内存的操作既不会修改该内存也不会引用该内存; Ref表示访问内存的操作会可能引用该内存;Mod表示访问内存的操作可能会修改该内存;ModRef表示访问内存的操作既可能引用该内存也可能修改该内存。alias接口其接口定义如下:别名方法是用于确定两个MemoryLocation对象是否相互别名的主要接口。它接受两个MemoryLocation对象作为输入,并根据需要返回MustAlias、PartialAlias、MayAlias或NoAlias。 与所有AliasAnalysis接口一样,alias方法要求其入参的两个MemoryLocation对象定义在同一个函数中,或者至少有一个值是常量。其接口实现如下:getModRefInfo 接口getModReInfo方法返回关于给定的指令执行是否可以读取或修改给定内存位置的信息。Mod/Ref信息具有保守性:如果一条指令可能读或写一个位置,则返回ModRef。 其接口定义众多,我们以如下接口为例来进行学习。其接口实现如下:从上述代码可知,处理共分为四步:(1)遍历AAs,如果发现其任一结果是NoModRef,则直接返回,对应代码行228-234;(2)调用节点(call)操作中是否访问了一个在LLVM IR中无法访问的地址,如果是的话,直接返回NoModRef,否则获取其调用节点的ModRefInfo信息,对应代码行239-240;(3)处理调用节点中指针入参的ModRefInfo信息,如果发现是NoModRef,则直接返回NoModRef,否则将ModRefInfo信息和之前的结果合并,对应代码行247-266;(4)如果getModRefInfo函数中的入参Loc指定的内存地址具有常量属性并且ModRefInfo信息包含Mod,则调用节点一定不会修改Loc内存,因此需要将Ref属于与之前的结果做逻辑与操作,对应代码行271-272。4.2.3 LLVM中已经实现的别名分析-basic-aa pass-basic-aa pass是一种激进的本地分析,它提供许多重要的事实信息[5]:不同的全局变量、堆栈分配和堆分配永远不能别名。全局变量、栈分配的变量和堆分配变量永远不会和空指针别名。结构体中的不同字段不能别名。同一数组,索引不同的两个对象不能别名。许多通用的标准C库函数从不访问内存或只读取内存。-globals-aa pass这个pass实现了一个简单的对内部全局变量(该变量的地址没有被获取过)进行上下文敏感的mod/ref分析和别名分析。 如果某个全局变量的地址没有被获取,则该pass可以得出如下结论:没有指针作为该全局变量的别名。该pass还会识别从不访问内存或从不读取内存的函数。这允许某些指定的优化(例如GVN)完全消除调用指令。这个pass的真正威力在于它为调用指令提供了上下文敏感的mod/ref信息。这使优化器清楚的了解到对于某些函数的调用不会破坏或读取全局变量的值,从而允许消除加载和存储指令。Note:该pass在使用范围上有一定限制,仅支持没有被取过地址的全局变量,但是该pass分析速度非常快。除了上述pass外,LLVM中还实现了cfl-steens-aa、cfl-anders-aa、tbaa、scev-aa。目前LLVM中O1,O2,O3优化默认开启的别名分析是basic-aa,globals-aa和tb-aa。5.写在最后编译器技术从20世纪50年代起,已经发展了近70年的历史,但是编译器技术发展到今天,依然是一个非常热门的技术,各大硬件厂商都在开发自己的编译器,包括因特尔推出的Inter C++、ARM公司推出的armclang以及华为推出的毕昇编译器等,且上述三款编译器都是基于LLVM开发。编译器技术是一门庞大且繁杂的技术,对于初学者来说,这条学习之路道阻且长,盼那些热爱这门技术的赶路人能够行而不辍,未来可期。参考[1]cid:link_3[2]cid:link_2[3]cid:link_1[4]cid:link_0[5]cid:link_4后记欢迎加入Compiler SIG交流群与大家共同交流学习编译技术相关内容,扫码添加小助手微信邀请你进入Compiler SIG交流群。
-
安装完成后,给出的web地址无法访问,有人知道怎么回事吗?
-
根据冯诺依曼架构,计算机由存储器、运算器、控制器、输入设备和输出设备组成,性能调优也从这几个方面入手。1、鲲鹏代码迁移工具: 是一款可以简化客户应用迁移到基于鲲鹏916/920的服务器的过程的工具。工具仅支持x86 Linux到Kunpeng Linux的扫描与分析,不支持Windows软件代码的扫描、分析与迁移。 x86平台上源代码的软件要迁移到基于鲲鹏916/920的服务器上时,既可以使用该工具分析可迁移性和迁移投入,也可以使用该工具自动分析出需修改的代码内容,并指导用户如何修改。2、鲲鹏性能分析工具:由四个子工具组成,分别为:系统性能分析、Java性能分析、系统诊断和调优助手。 系统性能分析是针对基于鲲鹏的服务器的性能分析工具,能收集服务器的处理器硬件、操作系统、进程/线程、函数等各层次的性能数据,分析系统性能指标,定位到系统瓶颈点及热点函数,并给出优化建议。该工具可以辅助用户快速定位和处理软件性能问题。 Java性能分析是针对基于鲲鹏的服务器上运行的Java程序的性能分析和优化工具,能图形化显示Java程序的堆、线程、锁、垃圾回收等信息,收集热点函数、定位程序瓶颈点,帮助用户采取针对性优化。 系统诊断是针对基于鲲鹏的服务器的性能分析工具,提供内存泄漏诊断(包括内存未释放和异常释放)、内存越界诊断、内存消耗信息分析展示、OOM诊断能力、网络丢包等,帮助用户识别出源代码中内存使用的问题点,提升程序的可靠性,工具还支持压测系统,如:网络IO诊断,评估系统最大性能;压测存储IO,获得存储设备最大能力。 调优助手是针对基于鲲鹏的服务器的调优工具,能系统化组织性能指标,引导用户分析性能瓶颈,实现快速调优。3、以上是两个工具的特性,文字来源于官方文档说明。3.1、关于代码迁移工具,需要用户熟悉代码是什么,会基础的汇编语言或者解释性语言,不然是无从下手,也需要会基础的代码编写能力和代码阅读能力,如果都不会的话,就像看天书一样。3.2、关于性能调优工具,可以根据软件在实际应用中,根据业务的变化和需求的短板,通过调优工具针对性的对业务场景下的某些需要提升优化的功能进行调整,调优不一定就是指调整某一项,是边调边观察调整前后的实际应用情况,是个反反复复的过程,调优也不能一口吃个胖子,是循序渐进的过程,这也增加了用户的操作技巧和业务熟练化程度。
-
鲲鹏软件性能调优学习笔记 在鲲鹏社区的鲲鹏软件性能调优实践微认证课程中,我主要学习了鲲鹏软件性能调优机制,了解和掌握了如何根据硬件特点进行性能调优,以及项目中性能调优的基本思路和常用性能采集工具。性能调优的本质是充分发挥硬件的性能,而通过软硬协同可以带来万倍的代码性能提升。从冯诺依曼计算机体系结构来看,性能的优化可以从四个层面来进行探讨,即CPU/内存、磁盘、网卡和应用。 1. 在CPU/内存层面基于鲲鹏处理器的加速可以分为软加速和硬加速。软加速又分为针对单核的单核加速和针对多核的多核加速。基于鲲鹏芯片微架构的编译器性能优化主要包括了指令布局优化、内存布局优化和循环优化。JDK性能优化主要包括序列化、JVM循环、JIT优化、GC优化和向量化等。在SMP系统中,核数的扩展受到内存总线的限制,可以采用非统一内存访问架构( Non-uniform memory access)解决这一问题。发挥NUMA性能,需要克服内存访问速度不均匀的挑战。利用CPU亲和性与内存分配策略,让进程与内存的距离更“短”。基于鲲鹏技术优势构建的加速库,针对基础、压缩、加解密和多媒体四类业务提供9大加速库,实现典型场景10%-100%性能提升。此外,鲲鹏RSA加密加速方案,相较于传统方案可以有效提升Web应用Https性能。2. 在磁盘层面文件系统决定了磁盘加载到内存过程的快慢。磁盘预取可以充分利用磁盘带宽。3. 在网卡层面网卡中断产生频率会影响应用的吞吐和延迟。具体而言,中断产生的频率高会消耗大量的CPU时间片,频率低会影响应用收到数据的时延。可以通过调整网卡中断聚合,在低时延和高吞吐中取一个平衡点。降低网卡中断频率,可以带来约10%的吞吐提升,但也会造增加20%左右的延迟。4. 在应用层面软件调优的本质是充分发挥硬件性能。减少资源抢占,提升并行度,发挥多核性能优势。Tcmalloc使用线程缓存,尺寸小于256K的小内存申请均由ThreadCache进行分配;通过ThreadCache分配过程中不需要任何锁,可以极大的提高分配速度。总结:鲲鹏软件性能调优主要通过以下手段实现。
-
玩转PB级分布式数仓GaussDB(DWS)性能调优黑科技玩转PB级数仓深度调优之依“计”行事
-
本讲为您介绍华为云数仓GaussDB(DWS) 调优的基本理论、常见的SQL性能问题的定位手段和解决方案
-
#### 1.功能描述 使能图算融合尝试网络性能调优 #### 2.功能简介 当前网络性能要进行调优的时候,可以尝试打开图算融合开关。而单纯设置图算融合为True的时候,并不一定挖掘了其所有的优化空间,在图算融合内部,优化的幅度是分等级的,一般分为以下4个等级。 * 0: Disable GraphKernel * 1: Enable GraphKernel with basic features only. * 2: Enable GraphKernel with all stable features. * 3: Enable GraphKernel with all experimental features. 对于当前的GPU网络使能图算融合而言,一般都是设置了enable_graph_kernel=True,而这个设置实际上只优化到了第二个等级,也即把基本的融合优化,和一些稳定的优化使能了。 #### 3.解决方法 正如前文提及的,图算融合的优化幅度是有等级的,具体的等级设置可以用一个flag `opt_level`来进行控制,具体的操作,则是可以在正式训练前使用context进行设置,如在run_train()一类的函数前加一行使能图算最高等级的优化: ``` context.set_context(enable_graph_kernel=True,graph_kernel_flags="--opt_level=3") ``` 这样便可将图算尚且还在实验中的一些优化也给加上了,通过这样的设置可以方便观察性能是否有了进一步的提升。 如下代码所示,分别是默认开图算和开图算且设置了最高阶优化的形式: ``` # Copyright 2021 Huawei Technologies Co., Ltd # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================ import numpy as np import mindspore.context as context from mindspore import Tensor import mindspore.nn as nn from mindspore.nn import Cell from mindspore.ops import operations as P import mindspore.ops.functional as F import pytest context.set_context(mode=context.GRAPH_MODE, device_target="GPU") # enable graph kernel optimization. context.set_context(enable_graph_kernel=True) class BertAttentionPiece(Cell): def __init__(self): super(BertAttentionPiece, self).__init__() self.add = P.Add() self.dropout = nn.Dropout(1 - 0.1) self.softmax = nn.Softmax() self.multiply_data = -10000.0 self.sub = P.Sub() self.multiply = P.Mul() self.get_dtype = P.DType() self.cast = P.Cast() def construct(self, attention_mask, attention_scores): multiply_out = self.sub(self.cast(F.tuple_to_array((1.0,)), self.get_dtype(attention_scores)), self.cast(attention_mask, self.get_dtype(attention_scores))) adder = self.multiply(multiply_out, self.multiply_data) attention_scores = self.add(adder, attention_scores) attention_probs = self.softmax(attention_scores) attention_probs = self.dropout(attention_probs) return attention_probs def get_rtol_atol(dtype): if dtype == np.float16: return 1.e-3, 1.e-3 return 1.e-4, 1.e-4 def compare_result(expect, output, dtype): rtol, atol = get_rtol_atol(dtype) if isinstance(expect, (list, tuple)): assert isinstance(output, (list, tuple)) and len(expect) == len(output) expect_list = list(expect) output_list = list(output) for e, o in zip(expect_list, output_list): assert np.allclose(e.asnumpy(), o.asnumpy(), rtol, atol, equal_nan=True) else: assert np.allclose(expect.asnumpy(), output.asnumpy(), rtol, atol, equal_nan=True) def get_softmax_output(x, y, use_experimental_features): # use experimental features such as stitch fusion. if use_experimental_features: context.set_context(graph_kernel_flags="--opt_level=3") net = BertAttentionPiece() result = net(x, y) return result def test_softmax(shape, dtype): np.random.seed(0) x = Tensor(np.random.normal(0, 1, shape).astype(dtype)) y = Tensor(np.random.normal(0, 1, shape).astype(dtype)) expect = get_softmax_output(x, y, False) output = get_softmax_output(x, y, True) compare_result(expect, output, dtype) def test_softmax_gpu(): context.set_context(mode=context.GRAPH_MODE, device_target="GPU") test_softmax([64, 12, 128, 128], np.float16) if __name__ == '__main__': test_softmax_gpu() ``` 在均能正确跑出结果的同时,使能了opt_level=3的话,会对这个用例进行一个stitch fusion的优化,以便获取更优性能。  上图为单纯使能图算会生成的融合pattern,为3个,而下图为使能了高阶优化后,图算融合会多生成一个融合pattern,增加了融合机会,从而能够获取更优性能。  #### 4.建议与总结 对于GPU后端而言,使能图算融合,一般可以直接打开进行优化尝试,也即优化等级开到2。而在Ascend后端上使能图算融合,可能优化等级开到2会有潜在Bug,如果想尝试图算优化,却遇到Bug的情况,请将opt_level设置为1,也即把最基本的融合优化打开试验性能的优劣情况。最后,尽管GPU后端可以尽可能的使能高的优化层级,但毕竟最高阶的优化在上面也有提及是属于内部实验阶段,可能打开后不一定会有优化,还需用户自己多进行尝试。 #### 5.相关参考文档 对于图算融合的内部flag设置,详情可以参考[图算flag定义文档](https://gitee.com/mindspore/mindspore/issues/I3MBFN) 下的说明,可以参照这个说明更灵活的使用图算融合,以尝试获取更优的网络性能。
-
1.1应用介绍G是一个关系型数据库管理系统,基于MySQL协议栈研发,G是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。G所使用的 SQL 语言是用于访问数据库的最常用标准化语言。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 G作为网站数据库。1.2调优思路调优分析思路如下:很多情况下压测流量并没有完全进入到服务端,在网络上可能就会出现由于各种规格(带宽、最大连接数、新建连接数等)限制,导致压测结果达不到预期。接着看关键指标是否满足要求,如果不满足,需要确定是哪个地方有问题,一般情况下,服务器端问题可能性比较大,也有可能是客户端问题(这种情况比较小)。对于服务器端问题,需要定位的是硬件相关指标,例如CPU,Memory,Disk I/O,Network I/O,如果是某个硬件指标有问题,需要深入的进行分析。如果硬件指标都没有问题,需要查看数据库相关指标,例如:等待事件、内存命中率等。如果以上指标都正常,应用程序的算法、缓冲、缓存、同步或异步可能有问题,需要具体深入的分析。可能的瓶颈点: 1.硬件:CPU、内存、磁盘I/O方面的问题,分为服务器硬件瓶颈、网络瓶颈(对局域网可以不考虑) 2.操作系统:在进行性能测试,出现物理内存不足时,虚拟内存设置也不合理,虚拟内存的交换效率就会大大降低,从而导致行为的响应时间大大增加,这时认为操作系统上出现性能瓶颈。 3.数据库配置等方面的问题。例如,由于参数配置不合理,导致数据库处理速度慢的问题,可认为是数据库层面的的问题。2.1BIOS配置 对于不同的硬件设备,通过在BIOS中设置一些高级选项,可以有效提升服务器性能。 步骤 1 关闭SMMU。 此优化项只在非虚拟化场景使用,在虚拟化场景,则开启SMMU。 1.重启服务器过程中,按Delete键进入BIOS,选择“Advanced > MISC Config”,按Enter进入。 2.将“Support Smmu”设置为“Disable” 。 步骤 2 关闭预取。 1.在BIOS中,选择“Advanced>MISC Config”,按Enter进入。 2.将“CPU Prefetching Configuration”设置为“Disabled”,按F10保存退出。2.2文件系统调优 对于不同的IO设备,通过调整文件系统相关参数配置,可以有效提升服务器性能。建议在文件系统的mount参数上加上noatime,nobarrier两个选项。命令为(其中数据盘以及数据目录以实际为准):mount -o noatime,nobarrier /dev/sdb /data一般来说,Linux会给文件记录了三个时间,change time, modify time和access time。access time指文件最后一次被读取的时间。modify time指的是文件的文本内容最后发生变化的时间。change time指的是文件的inode最后发生变化(比如位置、用户属性、组属性等)的时间。一般来说,文件都是读多写少,而且我们也很少关心某一个文件最近什么时间被访问了。所以,我们建议采用noatime选项,文件系统在程序访问对应的文件或者文件夹时,不会更新对应的access time。这样文件系统不记录access time,避免浪费资源。 2.现在的很多文件系统会在数据提交时强制底层设备刷新cache,避免数据丢失,称之为write barriers。但是,其实我们数据库服务器底层存储设备要么采用RAID卡,RAID卡本身的电池可以掉电保护;要么采用Flash卡,它也有自我保护机制,保证数据不会丢失。所以我们可以安全的使用nobarrier挂载文件系统。对于ext3, ext4和 reiserfs文件系统可以在mount时指定barrier=02.3关闭 irqbalance关闭irqbalance,通过手动绑定中断的方法优化性能步骤 1 停止irqbalance服务。systemctl stop irqbalance.service步骤 2 关闭irqbalance服务。systemctl disable irqbalance.service步骤 3 查看irqbalance服务状态是否已关闭。systemctl status irqbalance.service2.4网卡中断绑核手动绑定网卡中断,根据网卡所属CPU将其进行分配,从而优化系统网络性能。查询网卡所在的CPU,将网络中断绑定到该CPU的所有核上。步骤 1 查询中断号。cat /proc/interrupts | grep $eth | awk -F ':' '{print $1}' #其中$eth表示需要优化的业务网口名称例如:cat /proc/interrupts | grep eth1 | awk -F ':' '{print $1}'步骤 2 根据中断号,将每个中断各绑定在一个核上。echo $cpunum > /proc/irq/$irq/smp_affinity_list #其中$cpunum表示需要绑定到的目标CPU序列号,$irq表示步骤 1执行的结果,如存在多个序列号,则需逐一执行绑定。2.5网络参数调优对于不同的操作系统,通过在OS层面调整一些参数配置,可以有效提升服务器性能。OS优化参数Linux参数参数含义操作tcp_max_syn_backlogtcp_max_syn_backlog是指定所能接受SYN同步包的最大客户端数量。默认值是2048,建议修改成8192。echo 8192 > /proc/sys/net/ipv4/tcp_max_syn_backlognet.core.somaxconn服务端所能accept即处理数据的最大客户端数量,即完成连接上限。默认值是128,建议修改成1024。echo 1024 > /proc/sys/net/core/somaxconnnet.core.rmem_max接收套接字缓冲区大小的最大值。默认值是229376,建议修改成16777216。echo 16777216 > /proc/sys/net/core/rmem_maxnet.core.wmem_max发送套接字缓冲区大小的最大值(以字节为单位)。默认值是229376,建议修改成16777216。echo 16777216 > /proc/sys/net/core/wmem_maxnet.ipv4.tcp_rmem配置读缓冲的大小,三个值,第一个是这个读缓冲的最小值,第三个是最大值,中间的是默认值。默认值是"4096 87380 6291456",建议修改成"4096 87380 16777216"。echo "4096 87380 16777216" > /proc/sys/net/ipv4/tcp_rmemnet.ipv4.tcp_wmem配置写缓冲的大小,三个值,第一个是这个读缓冲的最小值,第三个是最大值,中间的是默认值。默认值是"4096 16384 4194304",建议修改成"4096 65536 16777216"。echo "4096 65536 16777216" > /proc/sys/net/ipv4/tcp_wmemnet.ipv4.max_tw_buckets表示系统同时保持TIME_WAIT套接字的最大数量。默认值是2048,建议修改成360000。echo 360000 > /proc/sys/net/ipv4/tcp_max_syn_backlog2.6 IO参数调优对于不同的IO设备,通过在OS层面调整一些IO相关参数配置,可以有效提升服务器性能Linux参数参数含义操作/sys/block/${device}/queue/scheduler配置IO调度,deadline或者noop更适用于GreatDB数据库场景。命令中的${device}为磁盘名称,根据实际磁盘名称进行修改。NVME盘不支持此操作。echo deadline > /sys/block/${device}/queue/scheduler/sys/block/${device}/queue/nr_requests提升磁盘吞吐量,尤其对myisam存储引擎,可以调整到更大。命令中的${device}为磁盘名称,根据实际磁盘名称进行修改。echo 2048 > /sys/block/${device}/queue/nr_requests2.7 缓存参数调优对于不同系统的内存使用情况,通过在OS层面调整一些缓存相关参数配置,可以有效提升服务器性能Linux参数参数含义操作swappiness值越大,越积极使用swap分区,值越小,越积极使用内存。执行命令 vi /etc/sysctl.conf ,将 vm.swappiness = 1添加到文件底部,保存退出,执行命令sysctl -p使其生效。dirty_ratio内存里的脏数据百分比不能超过这个值。echo 5 > /proc/sys/vm/dirty_ratio3.软件调优使用如下配置文件参数启动数据库,默认配置文件路径为/etc/my.cnf, 其中G软件安装及数据存放路径根据实际情况修改。完成
-
网络训练跑通了,精度OK了,对很多人来说可能已经万事大吉了,但如果网络需要在生产环境跑,还有一个点不得不去关注,那就是性能。对于大的网络,训练一次可能需要上月的时间,这时候就真正的体会到时间就是金钱了。提高网络的性能,缩短训练的时间,可能会节省上百万的金钱。下面给大家介绍下之前对ResNet50网络的性能调优案例,希望能帮助到大家。调优过程中用到了MindSpore中的调试调优工具:MindInsight,不仅可以调试性能,还可以调试精度,感兴趣的同学可以到官网了解下:https://www.mindspore.cn/mindinsight现象我们将ResNet50网络batch size设置为32(代码可参考MindSpore ModelZoo中的ResNet50网络,当前代码已经是调优后的。本次主要给大家介绍下调优的经历),跑网络训练后发现单step时间约为90ms,性能很差。通常batch size为32时,单step耗时应在20ms以内。原因分析分析过程中,我们主要用到了MindInsight中的Profiler模块。如何跑Profiler收集性能数据大家可以到官网上查看教程,此次不再赘述。将性能数据用UI页面可视化后,我们开始了此次的性能调优过程。首先,我们先看页面里的迭代轨迹部分。迭代轨迹将训练过程分为了3部分:迭代间隙表示前一个迭代结束到后一个迭代开始的时间,该段时间可以认为是后一个迭代等待数据的时间;前反向时间表示的是真正的前反向计算的时间;迭代拖尾表示的是反向完成后进行梯度更新的时间。从下图中我们看到迭代间隙的时间占了整个迭代的很大部分,因此我们需要重点关注数据处理的性能。第二步,我们到数据准备详情页面,确认数据处理是否是性能瓶颈点。查看数据准备详情页面中的迭代间隙标签页,我们观察到,数据队列在前期有较多的数据,后期数据的个数变为0,分析原因是前期在图编译阶段已经开始了数据集的加载和增强,队列中随即缓存了多条数据;而后期正常训练开始后,队列中的数据被消费的速度要快于被生产的速度,因此数据队列逐渐变为空,说明此时数据变成了瓶颈。观察主机队列也是同样的情况。综合分析,正常训练过程中,数据处理为性能瓶颈点。第三步,我们到数据准备详情页面中的数据处理标签页来查看具体问题。通过观察数据处理标签页的算子间队列关系,我们发现,Queue_3及其之后的队列使用率较低,即MapOp_3作为生产者生产数据的速度较慢,因此可以判定MapOp_3的性能还有优化空间,需要对该算子进行性能优化。我们查看了数据处理的代码,发现map算子的num_parallel_workers参数没有设置,而该参数的默认为1,代码如下:if do_train: trans = [ C.RandomCropDecodeResize(image_size, scale=(0.08, 1.0), ratio=(0.75, 1.333)), C.RandomHorizontalFlip(prob=0.5), C.Normalize(mean=mean, std=std), C.HWC2CHW() ]else: trans = [ C.Decode(), C.Resize(256), C.CenterCrop(image_size), C.Normalize(mean=mean, std=std), C.HWC2CHW() ]data_set = data_set.map(operations=trans, input_columns="image")因此我们分析可以尝试提高该算子的并发数来提高网络的性能。效果验证我们将num_parallel_workers参数调整为12后,再次运行训练脚本,优化参考代码如下: data_set = data_set.map(operations=trans, input_columns="image", num_parallel_workers=12)通过MindInsight性能分析页面观察迭代轨迹,可以看到迭代间隙时长由72.8ms缩短到0.25ms,单step时长由90ms缩短到18.07ms。至此,我们完成了ResNet50网络的性能调优工作。总结MindInsight调优工具对性能调优和精度调优提供了大量的数据,并形成了一套完整的方法论,需要的同学可以参考奥。 MindSpore官方资料GitHub : https://github.com/mindspore-ai/mindsporeGitee : https : //gitee.com/mindspore/mindspore官方QQ群 : 871543426
-
1. 从官网下载安装包wget https://mirror.iscas.ac.cn/kunpeng/archive/Tuning_kit/Packages/Hyper-tuner_2.3.T20_linux.tar.gz2. 解压tar -zxvf Hyper-tuner_2.3.T20_linux.tar.gz3. 安装cd Hyper_tuner./install.sh在安装过程中会遇到报错:version `OPENSSL_1_1_1f' not found (required by openssl)解决办法:echo "export LD_LIBRARY_PATH=/lib64" >> ~/.bashrcexport LD_LIBRARY_PATH=/lib64修改后查看openssl版本:openssl versionOpenSSL 1.1.1f 31 Mar 2020重新安装即可
-
网络训练跑通了,精度OK了,对很多人来说可能已经万事大吉了,但如果网络需要在生产环境跑,还有一个点不得不去关注,那就是性能。对于大的网络,训练一次可能需要上月的时间,这时候就真正的体会到时间就是金钱了。提高网络的性能,缩短训练的时间,可能会节省上百万的金钱。下面给大家介绍下之前对ResNet50网络的性能调优案例,希望能帮助到大家。调优过程中用到了MindSpore中的调试调优工具:MindInsight,不仅可以调试性能,还可以调试精度,感兴趣的同学可以到官网了解下:https://www.mindspore.cn/mindinsight现象我们将ResNet50网络batch size设置为32(代码可参考MindSpore ModelZoo中的ResNet50网络,当前代码已经是调优后的。本次主要给大家介绍下调优的经历),跑网络训练后发现单step时间约为90ms,性能很差。通常batch size为32时,单step耗时应在20ms以内。原因分析分析过程中,我们主要用到了MindInsight中的Profiler模块。如何跑Profiler收集性能数据大家可以到官网上查看教程,此次不再赘述。将性能数据用UI页面可视化后,我们开始了此次的性能调优过程。首先我们先看页面里的迭代轨迹部分。迭代轨迹将训练过程分为了3部分:迭代间隙表示前一个迭代结束到后一个迭代开始的时间,该段时间可以认为是后一个迭代等待数据的时间;前反向时间表示的是真正的前反向计算的时间;迭代拖尾表示的是反向完成后进行梯度更新的时间。从下图中我们看到迭代间隙的时间占了整个迭代的很大部分,因此我们需要重点关注数据处理的性能。第二步,我们到数据准备详情页面,确认数据处理是否是性能瓶颈点。查看数据准备详情页面中的迭代间隙标签页,我们观察到,数据队列在前期有较多的数据,后期数据的个数变为0,分析原因是前期在图编译阶段已经开始了数据集的加载和增强,队列中随即缓存了多条数据;而后期正常训练开始后,队列中的数据被消费的速度要快于被生产的速度,因此数据队列逐渐变为空,说明此时数据变成了瓶颈。观察主机队列也是同样的情况。综合分析,正常训练过程中,数据处理为性能瓶颈点。第三步,我们到数据准备详情页面中的数据处理标签页来查看具体问题。通过观察数据处理标签页的算子间队列关系,我们发现,Queue_3及其之后的队列使用率较低,即MapOp_3作为生产者生产数据的速度较慢,因此可以判定MapOp_3的性能还有优化空间,需要对该算子进行性能优化。我们查看了数据处理的代码,发现map算子的num_parallel_workers参数没有设置,而该参数的默认为1,代码如下:if do_train: trans = [ C.RandomCropDecodeResize(image_size, scale=(0.08, 1.0), ratio=(0.75, 1.333)), C.RandomHorizontalFlip(prob=0.5), C.Normalize(mean=mean, std=std), C.HWC2CHW() ] else: trans = [ C.Decode(), C.Resize(256), C.CenterCrop(image_size), C.Normalize(mean=mean, std=std), C.HWC2CHW() ] data_set = data_set.map(operations=trans, input_columns="image")因此我们分析可以尝试提高该算子的并发数来提高网络的性能。效果验证我们将num_parallel_workers参数调整为12后,再次运行训练脚本,优化参考代码如下:data_set = data_set.map(operations=trans, input_columns="image", num_parallel_workers=12)通过MindInsight性能分析页面观察迭代轨迹,可以看到迭代间隙时长由72.8ms缩短到0.25ms,单step时长由90ms缩短到18.07ms。至此,我们完成了ResNet50网络的性能调优工作。总结MindInsight调优工具对性能调优和精度调优提供了大量的数据,并形成了一套完整的方法论,需要的同学可以参考奥。原文链接:https://bbs.huaweicloud.com/forum/thread-165718-1-1.html
-
网络训练跑通了,精度OK了,对很多人来说可能已经万事大吉了,但如果网络需要在生产环境跑,还有一个点不得不去关注,那就是性能。对于大的网络,训练一次可能需要上月的时间,这时候就真正的体会到时间就是金钱了。提高网络的性能,缩短训练的时间,可能会节省上百万的金钱。 下面给大家介绍下之前对ResNet50网络的性能调优案例,希望能帮助到大家。调优过程中用到了MindSpore中的调试调优工具:MindInsight,不仅可以调试性能,还可以调试精度,感兴趣的同学可以到官网了解下:https://www.mindspore.cn/mindinsight # 现象 我们将ResNet50网络batch size设置为32(代码可参考MindSpore ModelZoo中的ResNet50网络,当前代码已经是调优后的。本次主要给大家介绍下调优的经历),跑网络训练后发现单step时间约为90ms,性能很差。通常batch size为32时,单step耗时应在20ms以内。 # 原因分析 分析过程中,我们主要用到了MindInsight中的Profiler模块。如何跑Profiler收集性能数据大家可以到官网上查看教程,此次不再赘述。 将性能数据用UI页面可视化后,我们开始了此次的性能调优过程。 首先我们先看页面里的迭代轨迹部分。迭代轨迹将训练过程分为了3部分:迭代间隙表示前一个迭代结束到后一个迭代开始的时间,该段时间可以认为是后一个迭代等待数据的时间;前反向时间表示的是真正的前反向计算的时间;迭代拖尾表示的是反向完成后进行梯度更新的时间。从下图中我们看到迭代间隙的时间占了整个迭代的很大部分,因此我们需要重点关注数据处理的性能。  第二步,我们到数据准备详情页面,确认数据处理是否是性能瓶颈点。查看数据准备详情页面中的迭代间隙标签页,我们观察到,数据队列在前期有较多的数据,后期数据的个数变为0,分析原因是前期在图编译阶段已经开始了数据集的加载和增强,队列中随即缓存了多条数据;而后期正常训练开始后,队列中的数据被消费的速度要快于被生产的速度,因此数据队列逐渐变为空,说明此时数据变成了瓶颈。观察主机队列也是同样的情况。综合分析,正常训练过程中,数据处理为性能瓶颈点。  第三步,我们到数据准备详情页面中的数据处理标签页来查看具体问题。通过观察数据处理标签页的算子间队列关系,我们发现,Queue_3及其之后的队列使用率较低,即MapOp_3作为生产者生产数据的速度较慢,因此可以判定MapOp_3的性能还有优化空间,需要对该算子进行性能优化。  我们查看了数据处理的代码,发现map算子的num_parallel_workers参数没有设置,而该参数的默认为1,代码如下: if do_train: trans = [ C.RandomCropDecodeResize(image_size, scale=(0.08, 1.0), ratio=(0.75, 1.333)), C.RandomHorizontalFlip(prob=0.5), C.Normalize(mean=mean, std=std), C.HWC2CHW() ] else: trans = [ C.Decode(), C.Resize(256), C.CenterCrop(image_size), C.Normalize(mean=mean, std=std), C.HWC2CHW() ] data_set = data_set.map(operations=trans, input_columns="image") 因此我们分析可以尝试提高该算子的并发数来提高网络的性能。 # 效果验证 我们将num_parallel_workers参数调整为12后,再次运行训练脚本,优化参考代码如下: `data_set = data_set.map(operations=trans, input_columns="image", num_parallel_workers=12)` 通过MindInsight性能分析页面观察迭代轨迹,可以看到迭代间隙时长由72.8ms缩短到0.25ms,单step时长由90ms缩短到18.07ms。  至此,我们完成了ResNet50网络的性能调优工作。 # 总结 MindInsight调优工具对性能调优和精度调优提供了大量的数据,并形成了一套完整的方法论,需要的同学可以参考奥。
-
课程:《基于MindStudio的精度与性能调优专题》训练推理开发调优流程:一个典型的tensorFlow训练推理开发与调优全过程有以下步骤:1.环境准备Atlas服务器场景:CANN软件安装。Model Arts场景:Model Arts环境准备。2.GPU训练复现准备Tensorflow原始训练模型,并在GPU或CPU跑通,精度收敛。3.模型迁移迁移TensorFlow原始模型,以支持在异腾AI处理器训练,迁移方法包括:手工迁移和自动迁移。4.单Device训练在一片异腾AI处理器上执行训练,按训练环境分为:裸机训练(查看日志)和Model Arts训练(查看日志)。5.分布式训练(根据自身要求选择是否需要)在多个异腾AI处理器上并行训练,按训练环境分为:裸机训练和Model Arts训练。6.训练精度调优针对训练精度不达标或者收敛效果差的情况进行精度问题定位。7.训练性能调优针对训练性能不达标的情况进行性能优化和性能分析:Auto Tune自动调优和Profiling性能分析。8.模型固化将训练生成的权重数据和模型结构合并为pb格式的文件,用于模型推理。9.离线推理或在线推理离线推理:将pb模型转换成om模型:ATC模型转换;开发推理应用:AscendCL应用开发。在线推理:在AI框架内直接加载pb模型执行推理。10.推理精度调优针对推理应用精度不达标的情况,进行精度问题定位。11.推理性能调优针对推理应用性能不达标的情况进行性能优化和性能分析:Auto Tune自动调优和Profiling性能分析。通过以上步骤可知:原有训练脚本基于原生TensorFlow框架,通过脚本迁移,能够运行在异腾处理器(或称为NPU).上, 由于GPU和NPU硬件实现及其配套的算子实现有差异,训练模型和推.理结果在精度和性能存在差异。精度调优:提出问题所在:训练场景下,迁移原始网络(如TensorFlow、 PyTorch) ,用于NPU上执行训练,网络迁移可能会造成自有实现的算子运算结果与用原生标准算子(如TensorFlow、 PyTorch) 运算结果存在偏差。推理场景下,ATC模型转换过程对模型进行优化, 包括算子消除、算子融合、算子拆分,这些优化也可能会造成自有实现的算子运算结果与原生标准算子(如TensorFlow、 ONNX、Caffe )运算结果存在偏差。上述两种情况都会导致模型精度的差异,精度比对工具能够定位到模型中算子的精度问题,提供迁移/融合后网络基于NPU运算结果与原始网络基于GPU/CPU运算结果的比对能力,以确认误差发生的算子,帮助开发人员快速解决算子精度问题。为完成比对,需要下列文件:1.基于GPU/CPU的原始网络数据;2.基于NPU的迁移/融合后网络数据;3.原始网络与迁移/融合后网络映射关系。训练场景的数据准备:训练场景下,需要的比对数据为:1、基于GPU/CPU的原始网络训练数据;2、基于NPU的迁移后网络训练数据;3、融合规则映射文件(网络映射关系)。训练场景数据准备:GPU/CPU的原始网络训练数据;NPU的迁移后网络训练数据;融合规则映射文件。推理场景数据准备:推理场景下,需要的比对数据为:1、基于GPU/CPU的原始模型推理数据(同训练场景)2、基于NPU的融合模型推理数据3、融合规则映射文件。推理场景数据准备:NPU的融合后推理数据;融合规则映射文件;精度比对工具使用:整网比对工具msaccucmp.py,位于Ascend-cann-toolkit包中;除了直接使用命令行工具外,可以是使用全流程工具链--MindStudio。MindStudio集成精度比对功能,同时支持基于模型可视化的精度比对结果与模型节点联动,开发者可以查看原始模型与离线模型网络差异。性能调优性能调优有三种方法:训练场景Profiling数据采集方法;推理场景Profiling数据采集方法;Profiling数据解析方法。采集性能数据分析:训练任务相关的Job Profiling:AI软件栈采集的数据(Training Trace);HWTS/AICore采集的数据(Task Trace)。训练任务无关的System Profiling:包含Control CPU、Al CPU、TS CPU、DVPP、HBM/DDR等硬件的性能信息,如CPU占用率、内存带宽、PCle带宽等。Job Profiling采集方式:1.训练的脚本配置。2.环境变量配置。3.Graph API。System Profiling采集方式:使用msprof工具采集,仅Ascend-cann-toolkit包支持。提供msprof.py工具,解析Profiling数据并 导出相应数据,按照Timeline, Summary2种维度进行解析展示。Profiling数据解析:Timeline指按照时间导出各项数据,导出格式为json,可以用chrome trace打开;Summray导出各项数据的汇总表,默认格式为CSV, 可使用ExcelI等 工具打开。Profiling数据解析1.数据解析,生成sqlite目录下db文件监控并解析任意目录的Profiling数据python3.7 msprof.py monitor -dir <dir>解析任意目录的Profiling数据python3.7 msprof.py import -dir <dir>2.导出summary数据python3.7 msprof.py export summary -dir <dir> --iteration-id <id>l [--format < format>]3.导出timeline数据, 生成Chrome trace格式的timeline文件python3.7 msprof.py export timeline -dir <dir> [--iteration-id <iteration id>]MindStudio集成推理Profiling功能,并串联起数据采集和数据解析过程,同时增强数据分析功能,支持多维度信息展示:1.Analysis Summary视图:基础硬件信息。2. Timeline View视图:Timeline, 时序图;Event View,事件相关API Statistics;Runtime/ACL/GE API Statistics;AI Core Metric。3.Baseline Comparison视图:两轮Profiling数据比对。
-
目前使用鹏城实验室提供的云端环境,在Ascend 910上运行TensorFlow代码,目前需要做性能调优,进行Profiling分析,但是查看昇腾官方文档或者官方仓库Wiki,如下所示,都需要root权限下进入指定文件夹,寻找脚本,但是云端环境无法获取root权限,请问有什么办法解决吗?1. https://support.huaweicloud.com/Development-tg-cann202training1/atlasprofilingtrain_16_0015.html2. https://gitee.com/ascend/modelzoo/wikis/%E8%AE%AD%E7%BB%83%E6%80%A7%E8%83%BD%E5%A4%AA%E5%B7%AE%E4%BA%86%EF%BC%8C%E6%9C%89%E4%BB%80%E4%B9%88%E5%A5%BD%E5%8A%9E%E6%B3%95%E5%90%97%EF%BC%9F%EF%BC%88Apulis%E7%89%88%EF%BC%89?sort_id=3148795如图,无root权限:
上滑加载中
推荐直播
-
华为开发者空间玩转DeepSeek
2025/03/13 周四 19:00-20:30
马欣 山东商业职业技术学院云计算专业讲师,山东大学、山东建筑大学等多所本科学校学生校外指导老师
同学们,想知道如何利用华为开发者空间部署自己的DeepSeek模型吗?想了解如何用DeepSeek在云主机上探索好玩的应用吗?想探讨如何利用DeepSeek在自己的专有云主机上辅助编程吗?让我们来一场云和AI的盛宴。
即将直播 -
华为云Metastudio×DeepSeek与RAG检索优化分享
2025/03/14 周五 16:00-17:30
大海 华为云学堂技术讲师 Cocl 华为云学堂技术讲师
本次直播将带来DeepSeek数字人解决方案,以及如何使用Embedding与Rerank实现检索优化实践,为开发者与企业提供参考,助力场景落地。
去报名
热门标签