什么是 CANN 和 Ascend C
1 CANN 是什么
异构计算架构 CANN(Compute Architecture for Neural Networks)是华为针对 AI 场景推出的异构计算架构,向上支持多种 AI 框架,包括 MindSpore、PyTorch、TensorFlow 等,向下服务 AI 处理器与编程,发挥承上启下的关键作用,是提升昇腾 AI 处理器计算效率的关键平台。同时针对多样化应用场景,提供多层次编程接口,支持用户快速构建基于昇腾平台的 AI 应用和业务。
1.1 总体架构
CANN 提供了功能强大、适配性好、可自定义开发的 AI 异构计算架构。
GE 图引擎( Graph Engine),是计算图编译和运行的控制中心,提供图优化、图编译管理以及图执行控制等功能。GE 通过统一的图开发接口提供多种 AI 框架的支持,不同 AI 框架的计算图可以实现到 Ascend 图的转换。
Ascend C 算子开发语言,是 CANN 针对算子开发场景推出的编程语言,原生支持 C 和 C++标准规范,最大化匹配用户开发习惯;通过多层接口抽象、自动并行计算、孪生调试等关键技术,极大提高算子开发效率,助力 AI 开发者低成本完成算子开发和模型调优部署。
AOL 算子加速库(Ascend Operator Library),提供了丰富的深度优化、硬件亲和的高性能算子,包括神经网络(Neural Network,NN)库、线性代数计算库(Basic Linear Algebra Subprograms,BLAS)等,为神经网络在昇腾硬件上加速计算奠定了基础。
HCCL 集合通信库(Huawei Collective Communication Library),是基于昇腾硬件的高性能集合通信库,提供单机多卡以及多机多卡间的数据并行、模型并行集合通信方案。HCCL 支持 AllReduce、Broadcast、Allgather、ReduceScatter、AlltoAll 等通信原语,Ring、Mesh、HD 等通信算法,在 HCCS、RoCE 和 PCIe 高速链路实现集合通信。
BiSheng Compiler 毕昇编译器,提供 Host-Device 异构编程编译能力,利用微架构精准编译优化释放昇腾 AI 处理器极致性能,提供完备二进制调试信息与二进制工具链,支撑 AI 开发者自主调试调优。
Runtime 运行时,提供了高效的硬件资源管理、媒体数据预处理、单算子加载执行、模型推理等开发接口,供开发者轻松构建高性能人工智能应用。
1.2 关键功能特性
推理应用开发 CANN 提供了在昇腾平台上开发神经网络应用的昇腾计算语言 AscendCL(Ascend Computing Language),提供运行资源管理、内存管理、模型加载与执行、算子加载与执行、媒体数据处理等 API,实现利用昇腾硬件计算资源、在昇腾 CANN 平台上进行深度学习推理计算、图形图像预处理、单算子加速计算等能力。简单来说,就是统一的 API 框架,实现对所有资源的调用。
模型训练 CANN 针对训练任务提供了完备的支持,针对 PyTorch、TensorFlow 等开源框架网络模型,CANN 提供了模型迁移工具,支持将其快速迁移到昇腾平台。此外,CANN 还提供了多种自动化调测工具,支持数据异常检测、融合异常检测、整网数据比对等,帮助开发者高效问题定位。
算子开发 CANN 提供了超过 1400 个硬件亲和的高性能算子,可覆盖主流 AI 框架的算子加速需求,同时,为满足开发者的算法创新需求,CANN 开放了自定义算子开发的能力,开发者可根据自身需求选择不同的算子开发方式。详细了解可见:CANN是什么
2 Ascend C 是什么
面向算子开发场景的编程语言 Ascend C,原生支持 C 和 C++标准规范,最大化匹配用户开发习惯;通过多层接口抽象、自动并行计算、孪生调试等关键技术,极大提高算子开发效率,助力 AI 开发者低成本完成算子开发和模型调优部署。使用 Ascend C 进行自定义算子开发的突出优势有:
C/C++原语编程
编程模型屏蔽硬件差异,编程范式提高开发效率
类库 API 封装,从简单到灵活,兼顾易用与高效
孪生调试,CPU 侧模拟 NPU 侧的行为,可优先在 CPU 侧调试
2.1 用 Ascend C 写一个“hello world”
掌握一个门编程语言或者技术的开张,一般都是从写一个“hello world”开始。Ascend C 也不例外,作为类似于 Cuda 上的 cudnn,看如何实现一个算子运行输出“hello world”。
2.1.1 实现一个核函数
包含核函数的 Kernel 实现文件 hello_world.cpp 代码如下:核函数 hello_world 的核心逻辑为打印"Hello World"字符串。hello_world_do 封装了核函数的调用程序,通过<<<>>>内核调用符对核函数进行调用。
2.1.2 实现一个调用程序
本样例共调度八个核,分别打印了每个核的核号和"Hello World"信息。Ascend C 可以参考:HelloWorld-快速入门-Ascend C算子开发-算子开发-CANN商用版8.0.RC2.2开发文档-昇腾社区
评论