• [技术干货] 学习总结《 昇腾全流程开发工具链(MindStudio)》
    主要学习了 昇腾全流程开发工具链(MindStudio)的使用和开发流程关于Mind StudioMind Studio是一套基于IntelliJ框架的开发工具链平台,提供了应用开发、调试、模型转换功能,同时还提供了网络移植、优化和分析功能,为用户开发应用程序带来了极大的便利。功能简介针对算子开发,Mind Studio提供了全套的算子开发、调优能力。通过Mind Studio提供的工具链也可以进行第三方算子开发,降低了算子开发的门槛,并提高算子开发及调试调优的效率,有效提升了产品竞争力。针对网络模型的开发,Mind Studio集成了离线模型转换工具、模型量化工具、模型精度比对工具、模型运行性能分析工具、日志分析工具,提升了网络模型移植、分析和优化的效率。针对计算引擎开发,Mind Studio预置了典型的分类网络、检测网络等计算引擎代码,降低了开发者的技术门槛,加快了开发者对AI算法引擎的编写及移植效率。针对应用开发,Mind Studio集成了各种工具如分析器(Profiler)和编译器(Compiler)等,为开发者提供了图形化的集成开发环境,通过Mind Studio能够进行工程管理、编译、调试、性能分析等全流程开发,能够很大程度提高开发效率。功能框架Mind Studio功能框架如图1所示,目前含有的工具链包括:工程管理工具、编译工具、流程编排工具、离线模型工具、比对工具、日志管理工具、自定义算子工具、性能分析工具、设备管理工具、开发工具包(Ascend Development Kit,ADK)等多种工具。图1 工具链功能架构安装Mind Studio只能安装在Ubuntu服务器上,可以在Ubuntu服务器上使用原生桌面自带的终端gnome-terminal进行安装,也可以在Windows服务器上通过SSH登录到Ubuntu服务器进行安装,因为Mind Studio是一款GUI程序,所以在Windows服务器上通过SSH登录到Ubuntu服务器进行安装时,需要使用集成了X server的SSH终端(比如mobaxterm,该工具版本需要为v20.2及以上)。Mind Studio所在的环境为开发环境,开发人员可以进行普通的工程管理、代码编写、编译、模型转换;实际安装昇腾AI处理器的环境为运行环境,实际运行用户开发的应用。如果需要在真实的昇腾AI处理器上运行开发的工程,则需要将Mind Studio连接到主机,并通过主机和设备上的工具后台服务模块进行配合,完成所有开发工程的运行、日志和性能分析等功能。Toolkit:开发套件包,为开发者提供基于昇腾AI处理器的相关算法开发工具包,旨在帮助开发者进行快速、高效的人工智能算法开发。开发者可以将开发工具包安装到Mind Studio上,使用Mind Studio开发工具进行算法快速开发。Mind Studio与Toolkit开发套件包架构图如图1所示。图1 Mind Studio与Toolkit开发套件包架构图
  • [技术干货] 学习心得之昇腾MindX系列教程-MindX SDK开发套件介绍
    AI应用开发背景和挑战人工智能已经进入场景化应用时代:从AI算法到场景应用的路还很远:Ai产品化三大难点:算法开发难,应用开发难,业务部署难。MindX SDK开发套件介绍使用华为提供的SDK和应用案例快速开发并部署人工智能应用。mxManufacture:mxManufacture 致力于简化昇腾 AI 处理器推理业务开发过程,降低使用昇腾AI处理器开发的门槛。mxManufacture 主要功能如下:插件化开发模式,将整个推理流程“插件化”,每个插件提供一种功能,通过组装不同的插件,灵活适配推理业务流程。提供丰富的插件库,用户可根据业务需求组合 Jpeg 解码、抠图、缩放、模型推理、数据序列化等插件。基于 Ascend Computing Language(AscendCL),提供常用功能的高级 API,如模型推理、解码、预处理等,简化 ACL 编程开发。支持自定义插件开发,用户可快速地将自己的业务逻辑封装成插件,打造自己的应用插件。mxVision:随着深度学习技术的兴起,人工智能技术已经渗透到各行各业的应用中。人工智能技术被广泛应用于 IVA(Intelligent Video Analytics,智能视频分析)领域,典型的 IVA 业务流程包括人脸识别、视频结构化、动作行为识别等。mxVision 是华为推出的软件开发套件(SDK),提供极简易用、高性能的 API 和工具,助力昇腾AI处理器赋能 IVA 各应用场景。mxIndex:随着深度学习技术的兴起,人工智能技术已经渗透到各行各业的应用中。物理世界中的非结构化数据如图片、视频、音频等皆可通过AI模型转换为特征;特征距离(相似度)是众多AI业务的核心逻辑,因此特征检索/聚类逐渐成为众多AI应用不可或缺的一环。mxIndex是华为推出的软件开发套件(SDK),对于大规模特征检索/聚类的应用场景需求,基于开源Faiss框架,提供极简易用、高性能API,助力昇腾AI处理器赋能各类应用。开发流程使用SDK开发推理业务步骤如下:流程编排。确定业务流程后,查看SDK插件列表(详见插件介绍)找到符合业务功能的插件编排业务流程(详见流程编排介绍)。当SDK提供的插件无法满足功能需求时,用户可以参考插件开发介绍开发自定义插件。此外,SDK提供了ResNet-50、YOLOv3和SSD_VGG模型的后处理动态库(通过配置参数指定,被推理插件加载执行),当无法满足需求时,用户可以参考推理模型后处理开发介绍开发其他模型的后处理动态库。运行业务。所需功能插件都准备好后,参考样例介绍运行业务流程。SDK提供API调用的使用模式:如图1所示,在用户应用中,通过调用业务流管理的API(MxStreamManager),加载业务流配置文件(*.pipeline)启动业务流,用户即可通过调用API向业务流发送数据和获取结果。此模式下,推理业务和用户应用在同一个进程中。
  • [技术干货] 学习心得-昇腾MindX系列课程-MindX DL初级课程
    MindX DL 介绍MindX DL(昇腾深度学习组件)是支持数据中心训练和推理硬件的深度学习组件参考设计,提供昇腾AI处理器资源管理和监控、昇腾AI处理器优化调度、分布式训练集合通信配置生成等基础功能,快速使能合作伙伴进行深度学习平台开发。用户可以登录昇腾开发者社区获取源码和参考文档。MindX DL的组件包括Ascend Device Plugin、HCCL-Controller、Volcano、cAdvisor和NPU-Exporter。应用场景可以使用MindX DL的组件,快速的构建NPU训练和推理任务,同时也可以基于这些基础组件,构建自己的深度学习平台。在线安装MindX DL前提条件已完成操作系统的安装。已完成NPU驱动的安装。所有节点均与互联网网络互通。用户权限需满足要求,请参见修改“/etc/passwd”文件权限查看。注意事项在线安装通过脚本从Ascend Hub中心自动下载镜像,如需使用手动编译的镜像,请选择离线安装或手动安装方式。安装MindX DL时,系统会自动创建hwMindX用户和HwHiAiUser用户组,并把hwMindX用户添加到HwHiAiUser用户组内。操作步骤以root用户登录管理节点。检查管理节点上是否已完成Python3.7.5和Ansible的安装。具体操作请参见检查Python和Ansible版本。在管理节点上配置Ansible主机信息。具体操作请参见配置Ansible主机信息。将表2中获取的“deploy/online/steps”目录中的文件上传到管理节点任意目录下,如“/home/online_deploy”目录下。在管理节点上,将表2中的“yamls”目录复制到管理节点“/etc/ansible/hosts”中定义的“dls_root_dir”目录(例如:“/tmp”)下。参考目录结构如下:/tmp├── ... └─ yamls ├── ascendplugin-volcano-v2.0.1.yaml ├── ascendplugin-310-v2.0.1.yaml ├── ascendplugin-710-v2.0.1.yaml ├── calico.yaml ├── hccl-controller-v2.0.1.yaml ├── cadvisor-v0.34.0-r50.yaml └── volcano-v1.0.1-r50.yaml(可选)若已对Ansible主机配置文件进行安全加固,需要选择以下任一方式操作后,再安装MindX DL。方法一:修改entry.sh文件,在ansible-playbook后面增加参数“--ask-vault-pass”,运行过程中用户需要多次输入解密密码。方法二:先将Ansible主机配置文件解密,待安装完成之后再加密,安装过程无需再次输入密码。具体操作请参见Ansible主机配置文件加固。安装MindX DL。进入4中“/home/online_deploy”目录,执行以下命令,修改entry.sh文件。chmod 600 entry.shvim entry.sh若需要安装Docker、K8s和NFS等基础依赖软件,则修改entry.sh中“scope”字段的值为“full”,保存并退出。set -escope="full"...若节点上已安装Docker、NFS并已完成K8s集群搭建(至少已解除管理节点隔离),只需安装MindX DL基础组件,则修改entry.sh中“scope”字段的值为“basic”,保存并退出。set -escope="basic"...说明:解除隔离方法:解除单节点隔离kubectl taint nodes hostname node-role.kubernetes.io/master-解除所有节点隔离kubectl taint nodes --all node-role.kubernetes.io/master-执行以下命令,进行自动化安装。dos2unix *chmod 500 entry.shbash -x entry.sh说明:安装过程会关闭ufw防火墙,安装完后如果需要开启防火墙,请参见操作系统安全加固。安装后检查,具体操作请参见环境检查。
  • [技术干货] 【学习心得】昇腾CANN系列教程-应用开发(高级)
     基本思路:筹备、运行、观测、分析AscendCL性能调优的一般思路是先组装一条流水线,然后观测性能趋势和基本的占用量,然后再将多种不同业务作为流水线放入昇腾AI处理器中,从而达成单个昇腾AI处理器的最大化利用;在此过程中可能需要多次调整和部署才能达到设备资源的最大化利用;单个昇腾AI处理器利用率达到最大以后,再考虑以阵列的形式将多个昇腾AI处理器部署优化起来,套路也是一样,整体思路如下:筹备:该过程需要对整体流程进行规划和定义,此处回答应该跑几路解码、几个模型、每个模型用多少内存等等。运行:运行阶段主要是部署任务,将筹备过程中将压力稳定放到昇腾AI处理器上,而不能是间歇性的压力。观测:此时需要采集在稳定条件下系统给出的响应时间,尤其要和筹备阶段时规划的内容进行匹配,主要关注跑起来时系统的响应是否符合预期。分析:拿到加压后的数据可以方便地评估系统的输出能力、资源用量等等,从而决定下一轮调整的策略。是增加流水线?还是减少内存用量?是增加模型数量?还是减少线程数?整个过程全由上一阶段的观测数据决定。最终调优的退出条件通常是资源接近用完,或者是几个子系统都接近性能边界。规划数据的流转通过上图可以观测到:被处理的数据总是从主机一侧,流动到设备上,在设备上处理,然后再回传到主机上,所以目前一般的数据流,需要要多次拷贝完成推理,一方面组织数据提高吞吐,一方面协调各种数据之间的速度,以达到比较好的利用率。为了组织数据,一般有下面2种情况: 1、流转型数据:每笔要处理的源数据,都通过新申请的方式传入被操作的API内,传入时指定输出,配合智能指针完成释放,通过模块功能实现拷贝,流转仅发送指针。 2、复用内存:内存在外部拷贝到池子里,通过标志位表示池子中的数据是否处于空闲,配合异步API实现数据在不搬运时,完成处理,待全部处理完以后,统一搬运一次。确认常用的指标 – 筹备在组装流水线的过程中,会看到某些规格先达到瓶颈,所以我们需要确认如下几个关键性能规格,以保证单条流水线的设计速度和多条流水线设计输出符合预期:1、各个解码器的性能规格,传入数据的速度不能高于该规格。以1080P图像的规格为例DVPP的规格如下:2、由于主机到设备的搬运速度有限,使用的是PCIE 3.0x4 的带宽,所以最大的请求数量和单笔业务的请求带宽也有限,各个主机性能不同所以这个值也会不同,建议分别使用单线程和多线程,发送不同大小包的数据到device上,验证主机端1个核最大的发送能力。3、单个模型推理使用的内存带宽评估:可以对单个模型加压并测试,关注带宽利用率。确认常用的指标 – 总结经过上面两轮的基本信息摸排应该能够评估出单条流水线的基本情况了以单个昇腾AI处理器为例:内存容量和带宽: 8G内存,带宽48GB/sDevice上的处理核: CPU核有8个,分为ctrl CPU和AI CPU,比例可配置; CTRL CPU有4个,用于PCIE中断和数据搬运等等; AI CPU核有4个,负责DVPP的中断负载,AICPU的算子压力等等。主机的依赖的资源:        主机的CPU,承担发送接收数据DMA的功能。        主机的内存,承担外来数据流转的缓冲和读写,同时承载DMA到设备的带宽开销。         主机的IO资源,承担外来数据的接收和预处理,这些数据可能是socket传入,也可能来自iscsi磁盘或者本地磁盘。注:如果上位机的发送能力有限,那么上位机会先到瓶颈,导致设备无法发挥能力。上述任意一个资源先到达瓶颈,都有可能影响整个系统的输出能力。
  • [技术干货] Hi 鲲鹏,Hi 昇腾 ⾯向⽣态的社区体验
    ⼀、围绕产业⽣态打造社区体验 随着计算产业的蓬勃发展,越来越多的⻆⾊加⼊到产业建设中,他们可能是开发者,可能是产业⽣态⾥涌现的伙伴企业,可能是为产业输送⼈才的⾼校⽼师,还可能是关注计算产业进展的普罗⼤众。⽴体的产业发展和多样的⽤户⻆⾊给鲲鹏和昇腾社区带来了新的设计命题。我们需要从开发者⾛向整个计算产业,汇聚产业⼒量,打造⾯向产业链上下游的⼀站式社区体验,激发⾏业应⽤创新、加速产业融合、促进⼈才培养,吸引全产业开发者共同为计算产业添砖加瓦。⼆、设计研究与推导 为了全⾯定义鲲鹏和昇腾社区的体验,我们主动和社区各类相关⻆⾊沟通交流,倾听他们的声⾳和反馈,进⾏共创研究,⼀同探索和定义符合业务属性和⽤户认知的社区体验。围绕鲲鹏和昇腾社区与计算产业的紧密联系,我们提出“开放、沉浸、⼀致”的设计理念,贴合社区的愿景和价值观,达成设计与业务的深度结合,致⼒服务产业⽣态⾥的各个⻆⾊。三、⾯向计算产业的社区体验设计 1. 开放,⾯向⽣态的扩展与包容。⾯朝⼴阔的计算产业,鲲鹏和昇腾社区将「扩展」和「包容」作为重要的设计价值观。我们将产业中复杂多样的信息层层拆解为原⼦级的⽂字、图⽚等,通过归类重组,搭建出富有扩展性的⻚⾯布局,适配多样化的产业⽣态,使能各能⼒阶段的伙伴,在屏幕的⽅⼨之间呈现灵活的变化。2. 沉浸,信息降噪与内容聚合的艺术。清晰的信息架构与触⼿可达的内容带来使⽤的沉浸感。我们结合⽤户认知和业务逻辑,对鲲鹏和昇腾社区的信息架构进⾏了重构设计。⽹站导航从框架扩展性与⽤户浏览深度两⽅⾯考量,将多维度的业务信息合理聚类,降低信息噪声,帮助⽤户更快更清晰地触达需要的信息。此外,我们将⾼价值的内容和服务聚合为层级分明的楼层在⾸⻚有序排列,以⼈为中⼼,围绕⽤户需求,把控业务需求和品牌诉求之间的平衡,充分满⾜⽤户体量、业务体量的不断升级。通过眼动仪测试验证,⽤户的浏览动线清晰明确,符合认知。3. ⼀致,多终端体验的细致打磨。体验的⼀致不是单纯地根据终端屏幕⼤⼩适配设计⽅案,⽽是在保持整体框架⼀致的前提下,根据⽤户在不同终端上使⽤习惯和场景的差异,针对性地调整布局、控件等设计细节,符合⽤户的使⽤认知,达成多终端体验的和⽽不同。我们根据移动端碎⽚化的访问场景、注重信息浏览的特点,对社区的移动端界⾯进⾏优化,通过优化信息浏览体验、弱化复杂操作、减少⻚⾯跳转给⽤户带来流畅的移动端社区体验。当⽤户进⼊鲲鹏和昇腾社区时,⽆论他所处何种场景、使⽤何种终端,都会基于⼀致的社区使⽤体验形成统⼀的认知和可延续的的使⽤习惯。四、设计品质的极致打磨 围绕开放、沉浸、⼀致的设计理念,我们对鲲鹏和昇腾社区的设计品质持续进⾏打磨,并将设计实践中的价值内容沉淀梳理,归纳出鲲鹏与昇腾社区的设计特征,并统⼀制定清晰的设计标准指南,通过机制化的组织流程,打造出可复⽤的组件、模板等集合,形成设计资产,再到开发⼯程化实现,这些内容构成了⽣态社区设计体系的完整建设框架。3D Banner3D Banner 是鲲鹏和昇腾社区重要的视觉传达要素,它能化虚为实,把抽象晦涩的技术性内容具现为可视可感的视觉形象,通过⽴体⼏何元素的有机组合将业务特征传递给社区的⽤户。多媒体视频视频在⼆维平⾯上加⼊了时间的维度,以动态变化的具体画⾯向⽤户传达⽴体的信息。画⾯、⾳效、转场的有机结合,不仅是业务信息的具象化,还是⼀种美的享受。辅助图形辅助图形作为⼀种⽤户通读语⾔,能通过图形化隐喻简洁直观地传递信息,具有可识别性、统⼀性和吸引⼒。帮助⽤户更好地理解信息之间的层级关系,解读⻚⾯信息内容。三维、辅助图形、多媒体等都是鲲鹏和昇腾社区设计的有机组成部分,我们会持续沉淀和迭代,让设计品质更上⼀个台阶,不断焕发出新的⽣命⼒。五、结语 鲲鹏和昇腾社区在追求极致⽣态体验的道路上不断前进。我们希望能通过完善的资源⽀持、⽴体的服务体系赋能每个产业伙伴,将计算产业⽣态的版图相互联结,让每位耕耘在计算领域的同路⼈⾛在⼀起,共享共建繁荣社区,共创⾏业新价值,共建产业新⽣态。
  • [热门活动] 【昇腾CANN训练营第三期】issue记录
    此贴主要用于记录我在CANN训练营第三期遇到的一些问题,并附上在gitee提的issue链接
  • [技术干货] 【昇腾CANN文档速递·11期】带您了解昇腾模型压缩工具
  • [交流分享] 服务器BMC与昇腾NPU卡MCU通信示例
    服务器BMC与昇腾NPU卡MCU通信示例,配合《Atlas XXX 带外管理接口规范》使用请求数据结构typedef struct tag_STD_SMBUS_REQ{unsigned char lun;unsigned char arg;unsigned short opcode;unsigned int offset;unsigned int length;unsigned char data[20];} STD_SMBUS_REQ;响应数据结构typedef struct tag_STD_SMBUS_RSP{unsigned short error_code;unsigned short opcode;unsigned int total_length;unsigned int length;unsigned char data[20];} STD_SMBUS_RSP;1.2 数据长度固定类型char rcv_data[] = {0};rcv_len = 0;STD_SMBUS_RSP rsp;STD_SMBUS_REQ req; memset(&rsp, 0, sizeof(rsp));memset(&req, 0, sizeof(req));req.lun = 0x0;req.opcode = 0x1;       /* 替换为实际opcode */msg_total_length = 1;   /* 数据长度已知,需要替换为实际数据长度*/ do {    req.offset += rsp.length;    if (msg_total_length - req.offset <= 20) {        req.lun |= 0x80;        req.length = msg_total_length - req.offset;} else {    req.length = 20;} smbus_chip_write(0x20, &req);   /* 内部实现PEC计算*/smbus_chip_read(0x21, &rsp);memcpy(&rcv_data[rcv_len], &rsp.data, rsp.length);if (rsp.error_code != 0) {    break;} rcv_len += rsp.length;} while (rcv_len < rsp.total_length);1.3 数据长度不固定类型char rcv_data[] = {0};rcv_len = 0;STD_SMBUS_RSP rsp;STD_SMBUS_REQ req; memset(&rsp, 0, sizeof(rsp));memset(&req, 0, sizeof(req));req.lun = 0x0;req.opcode = 0x0;       /* 替换为实际opcode */req.length = 20;        /* 以实际数据长度为准;数据长度不定时填最大值20 */ do {smbus_chip_write(0x20, &req);   /* 内部实现PEC计算*/smbus_chip_read(0x21, &rsp);memcpy(&rcv_data[rcv_len], &rsp.data, rsp.length);if (rsp.error_code != 0) {    break;} rcv_len += rsp.length;     req.offset += rsp.length;    if (rsp.total_length - req.offset <= 20) {        req.lun |= 0x80;        req.length = rsp.total_length - req.offset;} else {        req.length = 20;}} while (rcv_len < rsp.total_length); 
  • [技术干货] 【昇腾CANN文档速递·10期】带你解锁「推理网络精度调优」
    >>>汇总贴以上内容在“昇腾开发者微信公众号”同步上线,可扫码关注!>>>汇总贴
  • [问题求助] 【众智昇腾】【测试功能】gridsampler2d算子进行st测试时报错
    【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 【昇腾众智】CANN AICPU算子开发分享
    视频链接:https://b23.tv/N8WdnO
  • [技术干货] 【学习心得】昇腾CANN系列教程-环境部署(Atlas200DK)
    1.客户端电脑是Ubuntu 18.04 版本2. 为了安装,先准备需要的必备包:系统:ubuntu-18.04-server-arm64.iso ,需要注意是arm64,而不是amd64,官方下载地址:https://old-releases.ubuntu.com/releases/18.04.4/ubuntu-18.04-server-arm64.iso开发者套件: Atlas 200 DK 开发者套件,官方下载地址:https://www.hiascend.com/hardware/firmware-drivers?tag=community ,了和课程讲解的一致,选择的版本是CANN版本:CANN版本: 3.3.0.alpha001固件与驱动版本:1.0.9.alpha操作系统: Ubuntu 18.04cann社区版本: Ascend-cann-nnrt_3.3.0.alpha001_linux-aarch64.run ,Ascend-cann-toolkit_3.3.0.alpha001_linux-aarch64.run 以及开发环境(自己pc电脑)使用的包:Ascend-cann-toolkit_3.3.0.alpha001_linux-x86_64.run,官方地址:https://www.hiascend.com/software/cann/community制卡器脚本和读卡器脚本:制卡器脚本:下载制卡入口脚本“make_sd_card.py”,命令: wget https://gitee.com/ascend/tools/raw/master/makesd/for_1.0.9.alpha/make_sd_card.py读卡器脚本:下载制作SD卡操作系统的脚本“make_ubuntu_sd.sh”。命令:wget https://gitee.com/ascend/tools/raw/master/makesd/for_1.0.9.alpha/make_ubuntu_sd.sh连接Atlas 200 DK开发者板与Ubuntu服务器的脚本, 使用命令下载:wget https://gitee.com/ascend/tools/raw/master/configure_usb_ethernet/for_20.1/configure_usb_ethernet.shpython环境:使用命令下载 wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgzMindStudio下载3. 在客户端Ubuntu 18.04上执行命令:在Ubuntu服务器中执行如下命令安装qemu-user-static、binfmt-support、yaml、squashfs-tools与交叉编译器。su - root执行如下命令更新源:apt-get update执行如下命令安装相关python依赖:pip3 install pyyamlapt-get install qemu-user-static binfmt-support python3-yaml squashfs-tools gcc-aarch64-linux-gnu g++-aarch64-linux-gnu      2. 后续步骤可直接参考官方指导手册: https://support.huaweicloud.com/environment-deployment-Atlas200DK202/atlased_04_0012.html 其中的“环境部署”->“制作SD卡”->"读卡器场景"4.在客户端电脑上(Ubuntu)部署独立开发套件:4.1. 安装依赖执行命令: sudo apt-get install -y gcc g++ make cmake zlib1g zlib1g-dev libbz2-dev libsqlite3-dev libssl-dev libxslt1-dev libffi-dev unzip pciutils net-tools libncursesw5-dev 4.2.安装Python 3.7.54.2.1执行如下命令:    tar -zxvf Python-3.7.5.tgz    cd Python-3.7.5    ./configure --prefix=/usr/local/python3.7.5 --enable-loadable-sqlite-extensions --enable-shared    make    sudo make install4.2.2执行如下命令设置软链接:    sudo ln -s /usr/local/python3.7.5/bin/python3 /usr/local/python3.7.5/bin/python3.7.5    sudo ln -s /usr/local/python3.7.5/bin/pip3 /usr/local/python3.7.5/bin/pip3.7.54.2.3 设置python3.7.5环境变量     执行vi ~/.bashrc命令,打开.bashrc文件,在文件最后一行后面添加如下内容。     export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH    #如果用户环境存在多个python3版本,则指定使用python3.7.5版本    export PATH=/usr/local/python3.7.5/bin:$PATH    执行:wq!命令保存文件并退出。    执行source ~/.bashrc命令使其立即生效4.2.4. 安装完成之后,执行如下命令查看安装版本,如果返回相关版本信息,则说明安装成功。    python3.7.5 --version    pip3.7.5  --version    python3.7 --version    pip3.7  --version4.2.5 安装Python3相关依赖    pip3.7.5 install attrs --user    pip3.7.5 install psutil --user    pip3.7.5 install decorator --user    pip3.7.5 install numpy --user    pip3.7.5 install protobuf==3.11.3 --user    pip3.7.5 install scipy --user    pip3.7.5 install sympy --user    pip3.7.5 install cffi --user4.3安装开发套件./Ascend-cann-toolkit_3.3.0.alpha001_linux-x86_64.run --install./Ascend-cann-toolkit_3.3.0.alpha001_linux-aarch64.run --install5.安装MindStudio:解压之后,在bin目录下执行./MindStudio.sh安装,如果提示报错,可以根据提示安装依赖包6. 运行mindstudio,选择toolkit的路径7.Atlas200DK设备连接电脑, 如果正常连接,会多一张网卡8.执行命令# bash configure_usb_ethernet.sh ,获得ip地址9. Atlas200DK USB接口的ip地址是: 192.168.1.2  ,如果是网线连接,ip地址是 192.168.0.2  ,这点需要特别注意,如下图,使用ssh命令,输入密码之后连接200Dk设备:可以看到连接成功了,整个过程完成,过程稍微有点繁琐,感谢老师的分享参考文档: https://support.huaweicloud.com/environment-deployment-Atlas200DK202/atlased_04_0021.html
  • [技术干货] 【学习心得】昇腾CANN系列教程-AI CPU算子开发
    1. 为了学习本课程,需要有是储备知识 熟练的c/c++语言编程能力机器学习/深度学习相关基础知识(可选)TBE算子开发相关知识2.概述:AI CPU算子,是指运行在昇腾Al处理器AI CPU计算单元上的表达一个完整计算逻辑的运算,我们为什么需要开发者自定义AI CPU呢?原因如下,有两个:在模型训练或者推理过程中,将第三方开源框架转化为适配昇腾Al处理器的模型时遇到了昇腾Al处理器不支持的算子。此时,为了快速打通模型执行流程,我们可以通过自定义AI CPU算子进行功能调测,提升调测效率。功能调通之后,后续性能调测过程中再讲将Al CPU自定义转换成TBE算子实现。某些场景下,无法通过Al Core实现自定义算子(比如部分算子需要Int64类型,但Al Core指令不支持),且该算子不是网络的性能瓶颈,此时可以通过开发AlI CPU自定义算子实现昇腾Al处理器对此算子的支持。3.什么是算子算子基本概念          算子是一个函数空间到函数空间上的映射 ,广义的讲,对任何函数进行某一项操作都可以认为是一个算子。于我们而言,我们所开发的算子是网络模型中涉及到的计算函数。在Caffe中,算子对应层中的计算逻辑,例如:卷积层(Convolution Layer)中的卷积算法,是一个算子;全连接层(Fully-connected Layer,FC layer)中的权值求和过程,是一个算子。          算子举例: 在网络模型中被用作激活函数的算子: tanh ReLU Sigmoid等                  2. 算子类型(Type)             算子的type,代表算子的类型,例如卷积算子的类型为Convolution,在一个网络中同一类型的算子可能存在多个。        3.算子名称(Name)            用于标识网络中的某个算子,同一网络中算子的名称需要保持唯一。如下图所示conv1,pool1, conv2都是此网络中的算子名称,其中conv1与conv2算子的类型为Convolution,表示分别做一次卷积运算。4. 张量(Tensor) :      Tensor是算子中的数据,包括输入数据与输出数据,TensorDesc(Tensor描述符)是对输入数据,与输出数据的描述,TensorDesc数据结构包含如下属性:           4.1.张量的形状 :张量的形状,以(D0,D1,... ,Dn-1)的形式表示,DO到Dn是任意的正整数。如形状(3,4)表示第一维有3个元素,第二维有4个元素,(3,4)表示一个3行4列的矩阵数组。在形状的中括号中有多少个数字,就代表这个张量是多少维的张量。形状的第一个元素要看张量最外层的中括号中有几个元素,形状的第二个元素要看张量中从左边开始数第二个中括号中有几个元素,依此类推。例如:            张量形状的物理含义:                 假设我们有这样一个shape=(4,20,20,3)。                 假设有一些照片,每个像素点都由红/绿/蓝3色组成,即shape里面3的含义,照片的宽和高都是20,也就是20*20=400个像素,总共有4张的照片,这就是shape=(4,20,20,3)的物理含义。           4.2张量数据排布格式(Format) :在深度学习框架中,多维数据通过多维数组存储,比如卷积神经网络的特征图用四维数组保存,四个维度分别为批量大小(Batch,N)、特征图高度(Height,H)、特征图宽度(Width,W以及特征图通道(Channels,C)。由于数据只能线性存储,因为这四个维度有对应的顺序。不同深度学习框架会按照不同的顺序存储特征图数据,比如Caffe,排列顺序为,即NCHW。Tensorflow中,排列顺序为,即NHWC。如下图所示,以一张格式为RGB的图片为例,NCHW实际存储的是“RRRGGGBBB",同一通道的所有像素值顺序存储在一起,而NHWC实际存储的则是“RGBRGBRGB",多个通道的同一位置的像素值顺序存储在一起。                 张量的数据排布格式——换个图再看一下: 5.算子属性不同的算子包含的属性值不同,下面介绍几个常见的算子属性:    5.1 轴(Axis) :axis代表张量中维度的下标,比如张量a是一个5行6列的二维数组,即shape是(5,6),则axis=O表示是张量中的第一维,即行。axis=1表示是张量中的第二维,即列。例如张量数据.[3,4].[[5,6].[7,8]],Shape为(2,2,2),则轴0代表第一个维度的数据即[[1,2].[3,4]与I[5,6],[7,8]]这两个矩阵,轴1代表第二个维度的数据即[1,2]、[3,4]、[5,6]、[7,8]这四个数组,轴2代表第兰个维度的数据即1,2,3,4,5,6,7,8这八个数。轴axis可以为负数,此时表示是倒数第axis个维度。N维Tensor的轴有:0,1,2,......,N-1。    5.2 权重(Weight) :当输入数据进入计算单元时,会乘以一个权重。例如,如果一个算子有两个输入,则每个输入会分配一个关联权重,一般将认为较重要数据赋予较高的权重,不重要的数据赋予较小的权重,为零的权重则表示特定的特征是无需关注的。如下图所示,假设输入数据为X1,与其相关联的权重为W1,那么在通过计算单元后,数据变为了X1*W1。    5.3 偏差(Bias) :偏差是除了权重之外,另一个被应用于输入数据的线性分量。它被加到权重与输入数据相乘的结果中,用于改变权重与输入相乘所得结果的范围。如图所示,假设输入数据为X1,与其相关联的权重为W1,偏差为B1,那么在通过计算单元后,数据变为了×1*W1+B1。6. AI CPU算子执行流程    流程说明:第三方框架接入,caffe/tensorflow等等,经过Parser解析后转换为中间态的IR GraphGE接收到IR Graph后对图进行优化以及拆分拆分过程中,优先由FFE基于TBE算子信息库判断算子支持度,若不支持则由AICPU Engine基于AI CPU算子信息库判断是否支持GE将拆分后的图进行合并为可执行的整图在图执行阶段,根据任务类型将AICPU的任务下发AICPU进行算子执行    关键概念:算子Parser:将第三方框架的算子转换为内部算子IR,Caaffe框架针对Layer进行处理,TensorFlow针对Operator进行处理算子IR:算子对外APl,定义算子的输入、输出、属性,还有算子的形状推导逻辑算子信息库:描述算子的支持度。算子实现库:算子的运算逻辑7.AICPU算子开发流程8.结束语:AI CPU算子,是指运行在昇腾AI打算的防守打法问我的额已收到不是我什么我打爱上的味道付递四方速递额的返点通过这次课,学习了AI CPU算子的基本概念和开发流程,能够分清AICPU算子和TBE算子的区别了,感谢老师的分享。
  • [技术干货] 【学习心得】TensorFlow训练脚本迁移与调优
    一 背景近期学习了昇腾CANN系列教程之TensorFlow训练脚本迁移与调优,从TensorFlow训练脚本迁移,训练网络精度问题分析,再到训练网络性能优化,深入的学习了TensorFlow训练。二 TensorFlow训练脚本迁移主要内容为如果将TensorFlow的训练脚本迁移至能在昇腾系列处理器上运行的脚本,2.1 目标及前提目标了解如何将TensorFlow训练脚本迁移至NPU训练了解如何在NPU上进行混合精度训练学前准备熟练的Python语言编程能力熟悉TensorFlow 1.1 5的API深度学习基础知识, 熟悉训练网络的基本知识与流程准备工作Ascend 910环境能够在GPU_上跑通的训练脚本与脚本配套的数据集 2.2 迁移要点2.2.1 为什么要进行网络迁移Ascend 910是华为在2019年发布的人工智能(AI)专用的神经网络处理器(NPU) ,其算力高达256T,最新款算力高达310T,是业界主流芯片算力的2倍,默认配套MindSpore训练框架。当前业界大多数训练脚本基于TensorFlow的Python API开发,默认运行在CPU/GPU/TPU上。为了使其能够在Ascend910.上利用NPU的澎湃算力执行训练,提升训练性能,提高训练效率,我们需要对训练网络脚本进行相关的迁移适配工作。当前Ascend910. 上支持TensorFlow的三种API开发的训练脚本迁移:分别是Estimator, Sess.run, Keras。2.2.2 Estimator迁移Estimator迁移,Estimator API属于TensorFlow的高阶API,在201 8年发布的TensorFlow 1.10版本中引入,它可极大简化机器学习的编程过程。使用Estimator进行训练脚本开发的一般步骤为:1.创建输入函数input _fn;2.构建模型函数model_ fn;3.实例化Estimator,并传入Runconfig类对象作为运行参数;4.在Estimator上调用训练方法Estimator.train(),利用指定输入对模型进行固定步数的训练。针对Estimator的训练脚本迁移,我们也按照以上步骤进行。  1. 创建输入函数input fn;直接迁移,无需改造。这里我们需要注意:如果你在创建dataset时使用dataset.batch返回动态shape,需要设置drop_ remainder为True使其固定shape。2.构建模型函数model _fn;直接迁移,无需改造。如果在model中使用了Gelu和Dropout接口,推荐修改为NPU提供的高性能接口。 3.实例化Estimator, 并传入RunConfig类对象作为运行参数;这-步我们需要将TensorFlow的RunConfig迁移为NPURunConfig。由于NPURunConfig类是继承RunConfig类,因此我们在迁移时直接更改接口即可,大多数参数可不变。迁移示例:在Estimator.上调用训练方法Estimator.train(),利用指定输入对模型进行固定步数训练。将TensorFlow的Estimator迁移为NPUEstimator。NPUEstimator类是继承Estimator类,因此我们在迁移时如下示例所示直接更改接口即可,参数可保持不变。 2.2.3 Sess.run迁移1. 数据预处理;2.模型搭建/计算Loss/梯度 更新;这两步与Estimator迁移相同:直接迁移,无需改造。同样需要注意的是:1.如果在创建dataset时使用dataset.batch返回动态shape,需要设置drop_ remainder为True使其固定shape。2.如果在模型搭建使用了Gelu和Dropout接口,建议修改为NPU提供的高性能接口。 3.创建session并初始化资源;这一步我们需要在创建Session前添加如下的配置,使得训练能够在NPU上执行:在添加配置时需要注意这些配置保持默认配置即可,如果原脚本中有变动需要恢复默认配置:以下配置默认关闭,请勿开启:执行训练Sess.run部分直接迁移,无需改造。2.2.4 Keras迁移Keras和Estimator类似,都属于TensorFlow高阶API, 提供了方便的构图功能,并对训练、评估、预测、导出提供了方便的接口。使用Keras API进行训练脚本开发的一般步骤为:1.数据预处理;2.模型搭建;3.模型编译;4.模型训练。 由于Keras迁移到Ascend平台运行时,某些功能受限支持,例如不支持动态学习率等,因此不建议用户在Ascend平台_上迁移Keras开发的网络脚本。如需在Ascend平台运行Keras脚本,下面提供两种迁移方式:在Ascend平台可以直接使用Keras原生API进行训练,但需要进行部分适配,同时指定一次Session.run调用,在异腾AI处理器执行训练迭代的次数固定为1,具体请参考Keras原生接口支持部分的内容。如需减少Host与Device间的交互次数,缩短训|练时长,需要通过model _to_ npu_ estimator接口,将通过Keras构建的模型转换为NPUEstimator对象,同时通过NPURunConfig中的iterations_ per_ loop参数指定一次Session.run调用, 在异腾Al处理器执行训练迭代的次数。具体请参考Keras转换为NPUEstimator部分的内容。Keras原生接口支持需要开启use_ off line用于在异腾AI处理器执行训练,因此需要先创建一个TensorFlow会话并且注册Keras。同时在训练结束时,关闭会话。类似于Sess.run的迁移。Keras原生接口支持如果需要在异腾AI处理器上进行分布式训练,需要在Keras模型编译时修改optimizer,使用TensorFlow单机训练优化器(注意不能使用Keras的优化器),并通过NPUDistributedOptimizer类来封装单机训练优化器,例如: 2.3 混合精度训练*混合精度训练 混合精度训练方法是为了解决fp32"下内存和显存占用大, fp16 下精度不够的问题,使前向计算、反向求导、梯度传输的时候都使用fp16,但参数更新阶段的时候将fp1 6的梯度加到参数的fp32副本上。下- -轮迭代时,将参数的fp32副本转化为fp16,用作前向计算。这样可以减少内存使用和存取,从而可以训练更大的神经网络。同时又能基本保持使用float32训练所能达到的网络精度。使用混合精度训练有如下这些好处:省存储:参数、梯度、feature map均表示为fp16,省一伴存储(显存或内存),因此可使用更大的batch-size省传输:分布式训练时(单机多卡,或多机多卡),梯度的传输量减少-半省计算: GPU的fp1 6运算主要在tensor core中执行,相比fp32算力提升5倍。Ascend910 aicore同样支持fp1 6加速运算,因此也支持混合精度训练。 当前异腾Al处理器支持如下几种训练精度模式,用户可以在训练脚本中设置。allow_ fp32_ to_ fp16: 优先保持原图精度,当算子不支持float32数据类型时,直接降低精度到 float16。force_ _fp16:当算子既支持float1 6又支持float32数据类型时,强制选择float16。must_ keep_ _origin_ _dtype:保持原图精度。此种方式下,如果整网中有Conv2D算子,由于该算子仅支持float1 6类型,在原图输入是float32类型的情况下,训练会报错中止。allow_ mix_ precision:自动混合精度。可以针对全网中float32数据类型的算子,按照内置的优化策略,自动将部分float32的算子降低精度到float16, 从而在精度损失很小的情况下提升系统性能并减少内存使用。   Loss Scale前面我们提到,在混合精度训练中,前向计算,反向求导,梯度传输的过程中会使用fp1 6进行计算。但是我们知道,在深度学习训练中,有些反向求导计算产生的梯度数据会非常小。这种情况下,fp1 6的精度可能不足以表示这些梯度数据,导致在反向传播的过程中梯度丢失。如果将Loss值(是个标量)放大K倍,那么根据链式法则,反向传播过程中的weight gradient. feature mapgradient都会放大K倍。因此原来不能被fp16表示(即< 2-24的数)的gradient就可能被fp1 6表示 在Ascend 910.上,我们提供了Loss scale功能。如果原始网络中手动实现了Loss Scale功能,这种可以不需要迁移。如果原始网络中使用了Loss Scale功能,静态Loss Scale:用户可定义在混合精度训练过程中使用固定的Loss Scale系数。具体做法是,在创建NPULossScaleOptimizer之前, 实例化-个FixedLossScaleManager类进行指定Loss Scale的值。 动态Loss Scale:用户可定义在混合精度训练过程中根据浮点计算异常状态调整Loss Scale系数。具体做法是,在创建NPULossScaleOptimizer之 前,实例化一个ExponentialUpdateLossScaleManagr类进行动态Loss Scale的配置。另外,当使用NPULossScaleOptimizer时, 将is_ _distributed配置为True以支持分布式训练场景下LossScaling功能。 三 训练网络精度问题分析课程目标了解确认精度误差是否为NPU带来的问题了解对NPU上的Dump数据的方法准备内容熟练的Python语言编程能力熟悉TensorFlow 1.15的API能够在Ascend 910.上执行训练脚本深度学习基础知识,熟悉训练网络的基本知识与流程3.1 精度问题分析当我们在NPU上执行训练,最终的精度不满足时,可以使用通常的精度调优方法,例如调整epochs, learning_ rate等超参,或者增加训练数据,清洗问题数据,修改网络结构,优化器等手段进行调优。如果在使用多种手段后,精度依旧不达标( 包括loss跑~飞等情况),怀疑是NPU的精度问题时,请参照下列方法进行初步定位:1.关闭脚本中的所有随机, 例如数据集的shuffle, 网络中的dropout, layer中的初始化等。此步骤非常关键,包括后面的Dump数据也必须做该操作;2.取同一网络的原始脚本 与NPU迁移脚本,使用相同的数据集,相同的超参,分别在CPU/GPU与NPU.上训练;3.取最终的CPU/GPU与NPU训练的loss值进行拟合不对, 如果不拟合,则说明NPU存在精度问题。获取Dump数据华为支持迁移用户原始网络,用于在异腾910 Al处理器上执行训练,网络迁移可能会造成自有实现的算子运算结果与用业界标准算子(如TensorFlow) 运算结果存在偏差。根据前面的方法,当我们确认NPU存在精度问题时,可以获取异腾910 Al处理器运算结果与原始网络基于GPU/CPU运算结果,通过使用精度比对工具确认误差发生的算子。目前精度比对工具提供Vector比对能力,包含余弦相似度、最大绝对误差、累积相对误差、欧氏相对距离、KLD散度、标准差的算法比对。获取Dump数据一-NPU数据准备准备基于异腾AI处理器运行生成的Dump数据在进行迁移后的训练网络Dump数据前,您需要参考《驱动和开发环境安装指南》完成开发环境准备,并完成训练网络开发、编译和运行,确保具备可执行的训练工程,且Dump数据前去除随机。1. 修改训练脚本,开启Dump功能。在相应代码中,增加如下的加粗字体信息。Estimator模式: 通过NPURunConfig中的dump_ _config采集Dump数据,在创建NPURunConfig之前,实例化一个DumpConfig类进行dump的配置 ( 包括配置dump路径、dump哪些迭代的数据、dump算子的输入还是输出数据等) 准备基于GPU/CPU运行生成的npy或Dump数据获取NPU的Dump数据后,我们还要准备对比数据,在进行原始网络生成CPU/GPU的npy或Dump数据前,需要已经有一套完整的、 可执行的标准的原始模型训练工程。如果需要使用基于GPU/CPU运行生成的dump数据比对,请获取到npy文件后利用华为提供的转换工具将npy文件转换成dump数据文件。四 训练网络性能优化课程目标了解在NPU.上训练一 个迭代的时间分解了解如何在NPU上获取Profiling数据了解对NPU上的训练脚本进行性能优化及常用手段准备工作熟练的Python语言编程能力熟悉TensorFlow 1.1 5的API能够在Ascend 910.上执行训练脚本深度学习基础知识,熟悉训练网络的基本知识与流程4.1 训练端到端时间分解训练一个迭代(step) 的端到端时间为:迭代间隙+ FPBP+ AllReduce+梯度更新。迭代间隙为上一个迭代到这次迭代的间隔时间,FPBP为算子计算前向传播和反向传播的时间AR即AllReduce为分布式训练时HCCL进行梯度聚合的时间,在NPU.上默认切分为AR1和AR2梯度更新即正反向计算得到梯度后更新参数的时间。4.2 常见性能优化方法在获取Profiling数据后,根据一个迭代训练中各部分的耗时,根据各部分的工作,可以做针对性的性能优化:例如迭代间隙时间较长,迭代间隙一般为host与device的交互,数据预处理等,可以考虑增加下沉次数iteration per loop或改进数据预处理提升性能。若FPBP时间过长,就要进一步解析训练过程中各个算子的时间, 找出耗时长(相对理论性能)的算子进行优化。若AllReduce时间长,则考虑优化AllReduce.例如并行度差时可以通过调整切分策略来优化AllReduce的时间。 数据预处理性能提升1.均衡数据预处理算 子在大数据量的情况下,当数据预处理性能无法满足后续图需要的计算性能,用户可以通过均衡Host和Device.上执行的数据预处理算子,提高训练性能。数据预处理算子是否在Device执行的策略为:预处理算子由后向前查找,若找到的算子支持在Device执行,则在Device执行,直至遇到不支持的算子,其余均在Host执行。当前支持在Device运行的数据预处理算子为: map、batch、 map_ and_ batch, 其余均在Host执行。 五 结束语老师讲解TensorFlow脚本迁移由浅入深,从理论到实战,帮助我们能在日常工作中提供思路和解决方案,非常的好。 
  • [技术干货] 【学习心得】昇腾AICANN系列课程——TBE算子开发(初级)
    近期学习了昇腾AICANN系列课程——TBE算子开发(初级)课程内容,感觉收获颇多,下面说下本人想法。整个课程从TBE基本概念、TBE实战算子开发DSL方式、TBE-DSL算子验证及调试、TBE-DLS商用算子解读等几个方面进行了介绍。一、TBE基本概念TBE(Tensor Boost Engine)提供了基于TVM框架的自定义算子开发能力,通过TBE提供的API可以完成相应神经网络算子的开发。TBE的逻辑架构如图所示。TBE工具给用户提供了多层灵活的算子开发方式,用户可以根据对硬件的理解程度自由选择,利用工具的优化和代码生成能力,生成昇腾AI处理器的高性能可执行算子。前端框架:包含第三方开源框架TensorFlow(TF:Google机器学习开源框架)、Caffe(快速特征嵌入的卷积结构)。图引擎(Graph Engine:GE):Graph Engine是基于昇腾AI处理器软件栈对不同的机器学习框架提供统一的IR接口,对接上层网络模型框架,例如TensorFlow、Caffe,GE的主要功能包括图准备、图拆分、图优化、图编译、图加载、图执行和图管理等(此处图指网络模型拓扑图)。融合引擎(Fusion Engine:FE):FE负责对接GE和TBE算子,具备算子信息库的加载与管理、融合规则管理、原图融合和子图优化的能力。GE在子图优化阶段将子图传递给FE,FE根据算子信息库以及FE融合优化进行预编译,例如修改数据类型、插入转换算子等,该子图将再次传递给GE进行子图合并及子图优化。张量加速引擎(TBE):TBE通过IR定义为GE的图推导提供必要的算子信息,通过算子信息库和融合规则为FE提供子图优化信息和TBE算子调用信息,TBE生成的二进制对接昇腾AI处理器,最终生成网络在昇腾AI处理器上的执行任务。二、TBE功能框架TBE内部包含了特性域语言(Domain-Specific Language,DSL)模块、调度(Schedule)模块、中间表示(Intermediate Representation,IR)模块、编译优化(Pass)模块以及代码生成(CodeGen)模块。算子逻辑描述:面向开发者,提供算子逻辑的编写的接口(Compute接口),使用接口来编写算子。Schedule模块:用于描述指定shape下算子如何在昇腾AI处理器上进行切分,包括Cube类算子的切分、Vector类算子的切分,它们仍然使用的是社区提供的调度原语来描述。IR模块:使用TVM的IR(Intermediate Representation)中间表示,包括IR变形、AST(Abstract Syntax Code)的维护等功能。编译优化(Pass):对生成的IR进行编译优化,优化的方式有双缓冲(Double Buffer)、流水线(Pipeline)同步、内存分配管理、指令映射、分块适配矩阵计算单元等。代码生成模块(CodeGen):CodeGen生成类C代码的临时文件,这个临时代码文件可以通过编译器生成算子的实现文件,可被网络模型直接加载调用。三、TBE实战算子开发DSL方式介绍TBE(Tensor Boost Engine)是基于TVM(Tensor Virtual Machine)的自定义算子开发框架。TVM是社区的开源项目,旨在将各算子的生成规则进一步抽象,将算子本身分成各个操作原语,在需要的时候加以组合。TVM会根据算子的计算过程的定义,使用Schedule技术和Codegen技术,生成对指定硬件的算子。由于Schedule是描述在硬件上实现一个算子的计算过程,这需要较强的硬件知识。为了简化用户书写算子的难度,我们在TVM的基础上,简化了书写Schedule的难度,采用“Auto schedule”的概念,提供了一组Tensor Boost Engine API,来组合出算子的计算。用户通过使用API进行适当的组合定义一个算子的计算过程,把Schedule交给Auto schedule去完成。本文介绍在TVM基础上定义的TBE DSL API,用户可通过这些API来开发自己的算子。TBE DSL API目前主要涵盖向量运算,包括Element-wise类操作接口、Reduction 操作接口、Broadcast操作接口、Index操作接口、Concat操作接口、卷积接口、4D/5D互转接口、矩阵计算接口等。四、算子编译运行流程(推理)一个完整的TBE算子包含四部分:算子原型定义、对应开源框架的算子适配插件、算子信息库定义和算子实现。算子开发完成后在昇腾AI处理器硬件平台上的编译运行的架构如图1所示。五、算子编译流程将原始第三方网络模型(TensorFlow/Caffe)下发给GE。注:网络模型的拓扑图后续简称为图。GE调用算子插件,将TensorFlow/Caffe网络模型中的算子映射为适配昇腾AI处理器的算子,从而将原始TensorFlow/Caffe图解析为适配昇腾AI处理器的图。调用算子原型库校验接口进行基本参数的校验,校验通过后,会根据原型库中的推导函数推导每个节点的输出shape与dtype,进行输出tensor的静态内存的分配。GE向FE发送图优化请求,并将图下发给FE,FE匹配融合规则进行图融合,并根据fe.ini中的配置进行算子选择,选择优先级最高的算子类型进行算子匹配(默认自定义算子优先级最高),最后将优化后的整图返回给GE。GE根据图中数据将图拆分为子图并下发给FE,FE首先在子图内部插入转换算子,然后按照当前子图流程进行TBE算子预编译,对TBE算子进行UB融合(算子可以在UB中根据UB融合规则自动与其他算子的计算进行组装),并根据算子信息库中算子信息找到算子实现将其编译成算子kernel(算子的*.o与*.json),最后将优化后子图返回给GE。GE进行图编译,包含内存分配、流资源分配等,并向FE发送tasking请求,FE返回算子的taskinfo信息给GE,图编译完成之后生成适配昇腾AI处理器的离线模型文件(*.om)。六、TBE算子开发方式昇腾AI软件栈提供了TBE(Tensor Boost Engine:张量加速引擎)算子开发框架,开发者可以基于此框架使用Python语言开发自定义算子,通过TBE进行算子开发有以下几种方式:DSL(Domain-Specific Language)开发为了方便开发者进行自定义算子开发,昇腾AI软件栈借鉴了TVM中的TOPI机制,预先提供一些常用运算的调度,封装成一个个运算接口,称为基于TBE DSL开发。开发者只需要利用这些特定域语言声明计算的流程,再使用自动调度(Auto Schedule)机制,指定目标生成代码,即可进一步被编译成专用内核。TIK开发TIK(Tensor Iterator Kernel)是一种基于Python语言的动态编程框架,呈现为一个Python模块,运行于Host CPU上。开发者可以通过调用TIK提供的API基于Python语言编写自定义算子,即TIK DSL,然后TIK编译器会将TIK DSL编译为昇腾AI处理器应用程序的二进制文件。基于TIK的自定义算子开发,提供了对Buffer的管理和数据自动同步机制,需要开发者对Davinci架构有一定的了解,但算子的schedule需要开发人员自己规划。整个计算过程可以表现为多个输入张量经过一个计算节点得到多个张量的过程。TIK方式、DSL的开发流程本质上是一样的,只不过开发的抽象层次不一样而已。七、TBE开发流程介绍通过MindStudio进行自定义算子开发与命令行方式进行算子开发的流程相同。自定义算子开发主要包含如下两个场景:全新开发算子:昇腾AI软件栈中不包含相应的算子,需要先完成TBE算子的开发,再进行第三方框架的适配。若用户开发的TBE算子仅用于构造Ascend Graph或者通过AscendCL进行单算子调用,则无需进行第三方框架的适配。算子开发的流程如下所示:适配开发算子:昇腾AI软件栈中已实现了相应的TBE算子,可直接进行第三方框架的适配。此种场景下,算子代码实现流程基于TBE DSL进行算子开发时,由于算子调度依赖Auto Schedule机制,算子开发层面无法直接控制,因此开发者基于TBE DSL算子开发时只需要重点关注算子的计算过程的实现。同时在计算过程中可以通过一些方式进行算子精度和性能的提升,算子分析:在开发算子代码之前需要分析算子的数学表达式,输入、输出以及计算逻辑的实现,明确需要调用的TBE DSL接口。若是使用的第三方开源网络,网络中有昇腾AI处理器不支持的算子,可以根据第三方开源网站中的算子实现进行分析,推理出算子的数学表达式。若TBE DSL接口无法满足算子实现的要求,请考虑使用TIK开发方式。计算实现:进行算子计算逻辑的实现,包含依赖python模块的导入,接口的声明,参数的初始化及校验、计算过程的描述。其中算子实现文件中一般包含两个模块:算子接口函数与compute函数,其中算子接口函数负责输入tensor的初始化及参数校验,compute函数用来描述算子的计算过程,并在算子接口函数中被调用。计算实现是TBE DSL开发的最重要部分,如何实现算子的功能、如何进一步对算子进行精度、性能上的优化,都需要在此阶段充分考虑。算子调度:调用te.lang.cce.auto_schedule接口自动生成相关调度。算子编译:调用te.lang.cce.build接口进行算子编译,最终生成算子目标文件.o与算子描述文件.json。八、结束语。教程内容非不错,适合小白进行入门学习,老师讲课速度适中。后续需要在实际工作中逐步进行实践。后续也希望有更多相关入门教程。
总条数:433 到第
上滑加载中