【2023 · CANN训练营第一季】TIK C++算子编程范式及算子实现
编程范式
编程范式描述了算子实现的固定流程,基于编程范式进行编程,可以快速搭建算子实现的代码框架。
TIK C++编程范式把算子核内的处理程序,分成多个流水任务,以张量为数据载体,任务之间通过队列(Queue)进行通信和同步,并通过统一的内存管理模块(Pipe)管理任务间通信内存。
流水任务
流水任务指的是单核处理程序中主程序调度的并行任务。在核函数内部,可以通过流水任务实现数据的并行处理,进一步提升性能。以下面的流水任务示意图为例,单核处理程序的功能被拆分成3个流水任务:Stage1、Stage2、Stage3,每个任务专注于完成单一功能;需要处理的数据被切分成n片,使用Progress1~n表示,每个任务需要依次完成n个数据切片的处理。Stage间的箭头表达数据间的依赖关系,比如Stage1处理完Progress1之后,Stage2才能对Progress1进行处理。
若n=3,即待处理的数据被切分成3片,则上图中的流水任务运行起来的示意图如下,从运行图中可以看出,对于同一片数据,Stage1、Stage2、Stage3之间的处理具有依赖关系,需要串行处理;不同的数据切片,同一时间 ...
【2023 · CANN训练营第一季】TIK C++算子开发
TIK C++简介
TIK C++是一种使用C/C++作为前端语言的算子开发工具,通过四层接口抽象、并行编程范式、孪生调试等技术,极大提高算子开发效率。
TIK C++的优势有:
C/C++原语编程
编程模型屏蔽硬件差异,编程范式提高开发效率
多层级API封装,从简单到灵活,兼顾易用与高效
孪生调试,CPU侧使用开发者熟悉的gdb工具即可进行功能调试,调试后可无缝移植到AI处理器运行。
核函数
核函数(Kernel Function)是TIK C++算子的入口。TIK C++允许用户使用核函数这种C/C++函数的语法扩展来管理设备端的运行代码,用户在核函数中进行算子类的声明和其成员函数的调用,由此实现该算子的所有功能。核函数是主机端和设备端连接的桥梁。
核函数是直接在设备端执行的代码。在核函数中,需要为在一个核上执行的代码规定要进行的数据访问和计算操作,当核函数被调用时,多个核将并行执行同一个计算任务。
使用函数类型限定符
除了需要按照C/C++函数声明的方式定义核函数之外,还要为核函数加上额外的函数类型限定符,包含__global__和__aicore__。
使用__glob ...
【2023 · CANN训练营第一季】新一代开发者套件介绍
简介
昇腾AI开发者套件Atlas 200I DK A2具有澎湃算力:
4核CPU,4G内存;
8 TOPS INT6;
4 TFLOPS FP16 AI算力。
丰富接口:
2个USB3.0 Type-A;
1个USB Tpye-C;
2个RJ45千兆网口;
1个M.2接口;
1个Micro SD卡插槽;
2路HDMI输出;
40针拓展连接器。
强大的图片/视频编解码能力:
支持40路 1090P 30FPS视频编解码。
开发者套件包含一键制卡工具和模型适配工具,便捷快速进行AI应用开发。
一键制卡工具
模型适配工具
结束语
新一代开发者套件提供了具有强大算力的硬件开发板、便捷的开发工具以及丰富的开发样例和教学文档,便于初学者上手使用。
有机会可以通过亲手尝试,体验CANN开发的乐趣。
【2023 · CANN训练营第一季】图片分类代码详解
本篇对基于Caffe ResNet-50网络实现图片分类的代码进行详细说明
代码结果
样例代码结构如下所示。
12345678910111213141516171819202122├── data│ ├── dog1_1024_683.jpg //测试数据,需要按指导获取测试图片,放到data目录下│ ├── dog2_1024_683.jpg //测试数据,需要按指导获取测试图片,放到data目录下├── inc│ ├── model_process.h //声明模型处理相关函数的头文件│ ├── sample_process.h //声明资源初始化/销毁相关函数的头文件 │ ├── utils.h //声明公共函数(例如:文件读取函数)的头文件├── script│ ├── transferPic.py //将*.jpg转换为*.bin,同时将图片从102 ...
【2023 · CANN训练营第一季】图片分类应用开发
经过上面两篇的介绍,目前我们对昇腾和PyTorch模型迁移有了一定的了解,这里将首先快速体验运行样例以及开发一个图片分类应用。
申请云环境
获取账号名。登录华为云->账号中心->基本信息
获取项目ID。我的凭证->项目列表
然后去找小助手申请环境。
采用共享镜像,创建基于 Ascend 310 的环境,用户使用 HwHiAiUser。
速通样例
运行配置
创建好环境后,利用终端工具远程连接服务器。
首先更改/etc/passwd,设置HwHiAiUser使用的shell为bash
切换用户为HwHiAiUser
下载samples仓库
1git clone https://gitee.com/ascend/samples.git
由于我使用的环境CANN版本为6.0.RC1.alpha001,根据仓库说明,需要将样例仓库切换版本为v0.8.0
以YOLOV3_coco_detection_picture为例
YOLOV3_coco_detection_picture所在目录为samples/cplusplus/level2_ ...
【2023 · CANN训练营第一季】PyTorch模型迁移
目前,众多的深度学习算法采用PyTorch框架开发,通常是在CPU或者英伟达的GPU运行,为了使这些程序能够利用在昇腾AI处理器上运行,需要对PyTorch模型进行迁移。
PyTorch适配昇腾AI处理器
PyTorch框架对接适配昇腾AI处理器的方案为在线对接方案。
当前选择在线对接适配方案的主要原因有以下几点:
最大限度的继承PyTorch框架动态图的特性。
最大限度的继承GPU在PyTorch上的使用方式,可以使用户在将模型移植到昇腾AI处理器设备进行训练时,在开发方式和代码重用方面做到最小的改动。
最大限度的继承PyTorch原生的体系结构,保留框架本身出色的特性,比如自动微分、动态分发、Debug、Profiling、Storage共享机制以及设备侧的动态内存管理等。
扩展性好。在打通流程的通路之上,对于新增的网络类型或结构,只需涉及相关计算类算子的开发和实现。框架类算子,反向图建立和实现机制等结构可保持复用。
与GPU的使用方式和风格保持一致。用户在使用在线对接方案时,只需在Python侧和device相关操作中,指定device为昇腾AI处理器,即可完成用昇腾AI处理 ...
【2023 · CANN训练营第一季】昇腾概述
本文将从整体上介绍昇腾AI全栈架构以及CANN在其中的位置和作用,CANN的逻辑架构和应用开发框架AscendCL。
昇腾全栈AI软硬件平台
昇腾全栈AI软硬件平台是基于昇腾系列处理器和基础软件构建的全栈AI计算基础设施、行业应用及服务,
平台一共分为五层,自底向上依次为Atlas系列硬件、异构计算架构、AI框架、应用使能和行业应用。
Atlas系列硬件
Atlas系列硬件基于昇腾系列AI处理器(Ascend310用于推理场景,Ascend910用于训练场景),通过模块、标卡、小站、服务器、集群等丰富的产品形态,打造面向“端、边、云”的全场景AI基础设施方案。
异构计算架构
异构计算架构CANN在平台中起到承上启下的作用,对标英伟达的CUDA和CuDNN,提供高效易用的编程接口,对上支持多种AI框架(MindSpore、PyTorch等),对下服务AI处理器,是提升昇腾AI处理器计算效率的关键平台,包括各种引擎、编译器、执行器、算子库。由于其需要负责将算子分配到对应的硬件上,因此叫做异构。
AI框架
AI框架层主要包括华为自研框架MindSpore以及第三方框架Tens ...
【创未来 享非凡】昇腾AI开发者峰会游记
2023年5月6日至7日,昇腾AI开发者峰会在广东东莞举办,作为CANN训练营的新手开发者非常荣幸能收到CANN训练营的邀请参与到这次昇腾AI开发者的技术盛宴,与来自华为、高校以及昇腾产业链的开发者进行交流,进一步了解昇腾AI产业的最新技术进展以及优秀应用案例。
游溪村
六日上午,第一站来到了溪流背坡村。溪流背坡村坐落于东莞松山湖,分为4个地块12个团组,12个团组以欧洲经典城市的风格为模板进行设计建造,具有丰富的欧洲风情。据说预约来参观的游客已经排到了半年以后,这次有机会能进去参观,当然要好好逛一逛了。下面就放一些溪村的美图吧。
进入溪村,最先引入眼帘的就是无处不在的峰会标识,足以说明昇腾对这次峰会的重视。
河边的犀牛是在说明这里是犀牛背坡村嘛==
最著名的还有溪村不同团组间交通的小火车。
听峰会
下午,就迎来了本次旅程的重头戏——昇腾AI开发者峰会主题演讲。
首先,华为ICT Marketing总裁周军先生对本次峰会致辞,其次,鹏城实验室主任高文院士发表了人工智能新趋势的演讲。
高文院士在演讲中回顾了鹏城云脑Ⅱ的研发过程和应用现状,指明了昇腾系列硬件成功助力了云脑Ⅱ成 ...
cpp-内存分区
C++中内存分为四区,由内存地址从大到小依次为栈区、堆区、全局区和代码区。(网上各种版本也有五区的说法,主要区别在全局区,将全局区分为静态区和常量区)。
栈区
栈区由系统管理–>方法调用时开辟空间,方法结束时回收空间。
在内存中由高地址向低地址拓展,是一块连续的内存区域,遵循先进后出原则。
栈区的内存空间是在运行时由系统进行分配。
栈区存放:形参、局部变量。
堆区
最大的特点是由程序员手动管理;
堆区是从低地址向高地址拓展,内存空间不连续,以链表结构存在,遵循先进先出原则。
开辟出的空间的首地址是在栈区,如int * p = new int[]{1,2},此时p位于栈区,而数组元素位于堆区。
堆区存放由new、malloc等由程序员开辟的空间。
堆区需要通过delete回收。
全局区
存放全局变量和静态变量。
内存空间由系统管理,程序启动时开辟,结束时回收,执行期间一直存在。
有另一种分法将全局区分为全局静态区和常量区,常量区存放常量(整型、字符型、浮点型和字符串),程序运行期间不能被改变,包括已初始化的全局变量和静态变量。
代码区
代码区中存放编 ...
cpp-指针
指针所占字节
结论:
32位系统上,占4个字节;
64位系统上,占8个字节。
理解:
指针其实就是地址,而地址是内存单元的编码,所以一个指针占多少字节,等于一个内存编码的长度是多少。
32位与64位指的是计算机CPU中通用寄存器一次性处理、传输、暂时存储的信息的最大长度。即CPU在单位时间内(同一时间)能一次处理的二进制数的位数。也表示了计算机的寻址能力,32位的地址总线需要4个字节表示,64位的地址总线需要8个字节表示。
指针与指针变量
一个变量的地址就是该变量的指针;
而指针变量是指存放另外一个变量地址(指针)的变量。
指针变量的值是指针(地址)。