0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

YCL AI计算库在resnet50上的优化

冬至子 来源:平头哥倚天产品解决方案 作者:平头哥倚天产品解 2023-12-06 17:10 次阅读

1. 背景介绍

英特尔第四代至强可扩展处理器(代号Sapphire Rapids,简称SPR)上引入了全新的加速引擎AMX(Advanced Matrix Extensions),通过指令集层面的支持来显著加速深度学习算法中的Tensor计算。AMX针对广泛的硬件和软件优化,进一步增强了前一代矢量神经网络指令VNNI和BF16,推出了AMX_INT8和AMX_BF16指令,从一维向量计算发展到二维矩阵计算,最大限度的利用计算资源。由于神经网络训练推理涉及大量的矩阵运算,AMX的引入将大幅提高AI性能。

2022年的云栖大会上,阿里云推出了搭载倚天710芯片的ECS服务器,受到了业界的广泛关注。该服务器CPU芯片基于ARM Neoverse N2架构,支持ARM v9 指令集,最高支持128核。业界权威性能报告指出,其并行计算能力在CPU服务器中非常抢眼,并且极具性价比,有潜力作为昂贵的GPU服务器的替代品。然而,Yitian710 作为平头哥第一代ARM通用芯片,在AI场景与X86相比,软件生态与推理性能都存在一定的短板,本文旨在通过倚天AI计算库的优化,打造适合ARM架构的软件平台,提升倚天性能。

1.1 问题

倚天710目前主要依赖开源社区提供对AI场景的软件支持,存在以下几个问题:
(1)目前主流AI软件生态对X86架构适配更好,各种推理场景性能表现更优,倚天缺乏相关的软件生态,推广依靠具体业务场景定制优化与ARM生态支持,效率低下
(2)倚天SIMD位宽受限,与X86 ICL,SPR相比有较大劣势,需要任务调度充分发挥倚天物理核算力优势
(3)ARM AI生态演进考虑不同架构兼容,迭代速度慢,且缺乏倚天微架构针对性调优,不利于充分发挥倚天在AI场景优势

1.2 策略

YCL(YiTian Compute Library)为平头哥数据中心解决方案团队开发的一款高性能AI计算库,该库基于ARM开源的ACL(ARM Compute Library)实现。ACL是一个用于机器学习计算机视觉的高性能 C++ 库。它提供了一系列优化的算法和操作,可在 ARM CPU、GPU 和 DSP 上执行。YCL在ACL的基础上,针对倚天硬件架构的特性,做了深入的适配与优化,通过调度算法优化、GEMM拆分、底层算子融合、BF16精度优化等方法,实现包括Core、Support、Graph、Backends等不同层次模块的性能优化,并通过oneDNN标准接口对接上层推理框架如tensorflow,pytorch,实现上层计算任务不感知。经测试,集成优化版本的tensorlfow在mlperf resnet50评测中性能提升超过40%,目前该版本已集成到cap2自动化测试系统。

2. YCL计算库架构

自Tensorflow 2.5版本开始,已经有了对 oneDNN 的实验性支持,此后ARM开源社区在oneDNN的backend增加了ARM实现,来加速 AArch64 CPU 的性能。如下图1所示,Tensorflow framework 将上层的计算任务分解成各个算子,调用底层实现以提升性能。Tensorflow默认调用Eigen实现各算子如GEMM。Intel提供oneDNN加速库用于实现基于X86 backend的kernel实现,对于arm backend,oneDNN调用ACL来使用ARM向量指令以提升性能。YCL即为 arm backend替代ACL的计算库,专门针对倚天SoC架构特性做出优化。

image.png

图1 YCL计算库在tensorflow中的位置

image.png

图2 YCL计算库架构

YCL在框架架构上与ACL基本相同,如图2所示,绿色部分为倚天710软件架构,接口层实现了常用的AI算子,在使用每个算子之前通过配置(configure)接口设置输入数据、数据类型、计算模式、算子评估、权重数据packing、调度方法等,配置完成即可启动运算过程(run),该过程首先将计算任务划分成子任务,并为不同子任务分配线程并发计算,最后各线程调用计算kernel完成各自计算任务,主线程合并计算结果完成最终的计算。

3. 优化方法

本文从以下4个方面针对倚天架构做优化:

3.1 子任务划分,利用倚天710各级cache提升数据吞吐

image.png

图3 YCL中矩阵运算子任务划分

矩阵运算(GEMM)一般为当前AI推理任务中的主要计算来源,很多加速库也是重点优化提升GEMM计算性能。当前学术上提升在CPU上提升GEMM性能的主要思路为:将A矩阵在M方向划分为宽度为Lvh的子块,将B矩阵在N方向上划分宽度为Lvw的子块,然后根据L1 cache大小确定K方向(Kc)的值,然后确定每个子块计算顺序,使用多核完成计算。

YCL子子任务划分也采用上述方法,但是在设计子任务是考虑倚天Cache结构与物理核优势,首先根据分配的倚天core数与任务大小,确定最终分配的线程数,如果计算任务较小,则考虑少分配线程数n,可以降低线程调度产生的开销。

然后根据任务大小与计算单元缓存确定子任务数,原则是划分后的子任务可以一次性存入缓存,提升数据存取速度;然后如图3所示,将矩阵A与B分别划分成Akj(Lvh x kc), Bki(kc x Lvw)子矩阵,每个线程分别计算Ck=Akj x Bki ,通过调节倚天SIMD寄存器布局,降低数据重复访问,获得最优性能。

3.2 任务调度

设计两级线程与子任务对应表,如图4所示,其中level 0子任务平均分配到各线程上执行,level 1为多余的子任务首先缓存在buffer中,等到有线程空闲时执行。该方法有三个好处,第一,子任务划分利用了多核系统缓存,子任务在单核中执行效率最高;第二,线程与任务对应,充分利用线程资源,先完成的线程继续执行level 1子任务,减少线程长尾效应影响;第三,各子任务在整体任务中数据连续存储,提升cache命中率。

3.3 底层算子融合

在tensorflow中有大量的eltwise计算,然后结果输入激活函数的操作,该部分在独立计算,不依赖其他操作,可以在底层将eltwise计算的中间结果保存在寄存器中,然后紧接中做ACT,以eltwise(sum) + ReLU为例,可以在oneDNN与YCL中将这部分功能合并,如下图4所示。

image.png

图4 底层算子融合

3.4 BF16算子计算

倚天710采用armv9架构,指令集支持bfloat16矩阵计算,单个bfmmla指令可以计算一个2x2大小的矩阵,理论性能相比float指令可以提升4倍,下表为倚天710不同精度下指令的理论算力。因此,使用BF16指令可以在保证精度的前提下大幅提升性能。

YCL计算库在不改变tensoflow框架的前提下,实现了从float到bfloat的简单切换。在oneDNN层面,将卷积算子做了改造,首先将输入tensor配置为bfloat16格式,然后将输入数据从float格式转换成bfloat16格式数据,改转化可能会有overhead,最终实现采用simd 汇编实现,将转换完成的数据导入oneDNN原始的memory中,并释放临时buffer。

3.5 性能评估

倚天710单个SoC有128个core,且都是物理核,有独立的L1与L2cache,我们使用阿里云ecs.c8y.8xlarge来测试YCL计算库的性能,为了充分发挥倚天物理核算力,测试采用MLperf resnet 0ffline模式将CPU压力打到最大,测试开启BF16,具体测试命令为:

./run_local.sh tf resnet50 cpu --scenario Offline

其中g8i为intel SPR实例,其tensorflow安装方式与python依赖如下(通过 pip install tensorflow==2.11.0安装)

使能BF16方法如下:

export DNNL_VERBOSE=1
export TF_ENABLE_ONEDNN_OPTS=1
export ONEDNN_DEFAULT_FPMATH_MODE=BF16

运行benchmark,查看log,如果存在avx512_core_amx_bf16,代表使能AMX_BF16来加速矩阵运算

测试均在32c下进行,如下图5所示,使用优化后的YCL计算库resnet50性能提升45%。

image.png

图5 倚天710 resnet50优化前后性能对比

4. 安装与使用方法

目前YCL计算库已经适配了tensorflow 1.15与2.9两个版本,通过打patch方式支持tensorflow源码编译安装。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM处理器
    +关注

    关注

    6

    文章

    360

    浏览量

    41667
  • SIMD
    +关注

    关注

    0

    文章

    33

    浏览量

    10274
  • SPR
    SPR
    +关注

    关注

    0

    文章

    20

    浏览量

    11476
  • 计算机视觉
    +关注

    关注

    8

    文章

    1696

    浏览量

    45928
  • 机器学习
    +关注

    关注

    66

    文章

    8378

    浏览量

    132412
收藏 人收藏

    评论

    相关推荐

    Firefly支持AI引擎Tengine,性能提升,轻松搭建AI计算框架

    `Tengine 是OPEN AI LAB 为嵌入式设备开发的一个轻量级、高性能并且模块化的引擎。基于ARM平台高效的计算实现,针对特定硬件平台的性能优化,吸取已有
    发表于 08-13 15:58

    AI学习】AI概论:(Part-A)与AI智慧交流

    任务一:电脑+AI(让电脑拥有学习能力)目标:安装Python和TensorFlow。安装Keras、Numpy、OpenCV。安装ResNet50人工智慧模组(模型)。 运行测试程序,展现简单
    发表于 10-30 14:04

    【米尔FZ3深度学习计算卡试用体验】自定义的Ai系统跑深度学习推理模型

    ./compile_tf_model.sh resnet50 cf_resnet50_imagenet_224_224_7.7G得到一个elf文件,同样复制到vitis-ai
    发表于 12-19 11:23

    【米尔百度大脑EdgeBoard边缘AI计算盒试用连载】第二篇 开机测评之图片分类

    │└── resnet50│── src│├── json.hpp // json 解析│└── image_classify.cpp // 图片推理示例└── README.md 下面是配置文件示例。JSON
    发表于 03-15 14:04

    解读最佳实践:倚天 710 ARM 芯片的 Python+AI 算力优化

    ,像 AlexNet、ResNet-50 之类的模型,进行推理时,大约 90% 计算****耗时执行矩阵乘法。即使对矩阵乘法做一些微小的优化
    发表于 12-23 16:02

    【KV260视觉入门套件试用体验】部署DPU镜像并运行Vitis AI图像分类示例程序

    AMD 平台上的 AI 推理。该工具链提供优化的IP、工具、、模型以及资源,例如示例设计和教程,可在整个开发过程中为用户提供帮助。它在设计时充分考虑了高效率和易用性, AMD 自
    发表于 09-10 23:01

    【KV260视觉入门套件试用体验】四、学习过程梳理&DPU镜像&Resnet50

    =xilinx-kv260-dpu-v2022.2-v3.0.0.img.gz 镜像下载 Vitis AI Library 用户指南 镜像安装教程,软件开发教程。 五、DPU-ResNet50 实验 ResNet50模型以其深
    发表于 09-26 15:21

    【KV260视觉入门套件试用体验】Vitis AI 构建开发环境,并使用inspector检查模型

    支持。需要做的不只是执行几条命令,还需要了解赛灵思硬件平台的特点,选择合适的模型和框架,使用 Vitis AI 提供的工具和进行优化和编译,最后目标设备
    发表于 10-14 15:34

    【KV260视觉入门套件试用体验】KV260系列之Petalinux镜像+Resnet 50探索

    据流模型。它还可尽可能执行复杂的最优化操作,例如,层融合、指令调度和复用片存储器。 Vitis AI Profiler可用于对 AI 应用进行性能分析和可视化,以
    发表于 10-16 04:22

    百度大脑EdgeBoard计算卡基于Resnet50/Mobile-SSD模型的性能评测

    GPU: V100 16GB VMem Edgeboard 训练模型 模型使用AIStudio 进行训练,RESNET、MOBILE训练和预测代码有兴趣的同学请手动移步到百度AI社区相关帖子里查看
    发表于 10-30 07:32 981次阅读

    【R329开发板评测】实机测试Resnet50

    经过仿真测试拿到开发板后,参考官方的实机测试教程,对仿真测试模型进行了实机运行和测试,这里主要是对resnet50进行了实时运行。
    发表于 01-25 16:55 3次下载
    【R329开发板评测】实机测试<b class='flag-5'>Resnet50</b>

    NVIDIA 与飞桨团队合作开发基于 ResNet50 的模型示例

    为了让飞桨开发者可以快速复现顶尖的精度和超高的性能,NVIDIA 与飞桨团队合作开发了基于 ResNet50 的模型示例,并将持续开发更多的基于 NLP 和 CV 等领域的经典模型,后续陆续发布的模型有 BERT、PP-OCR、PP-YOLO 等,欢迎持续关注。
    的头像 发表于 10-18 10:03 1161次阅读

    深度解析MLPerf竞赛Resnet50训练单机最佳性能

    标准。MLPerf训练任务包括图像分类(ResNet50)、目标物体检测(SSD)、目标物体检测(Mask R-CNN)、智能推荐(DLRM)、自然语言处理(BERT)以及强化机器学习(Minigo)等。最新的1.0版本增加了两项新的测试项目:语音识别(RNN-T)和医学影像分割(U-Net3D)。
    的头像 发表于 11-09 17:05 1356次阅读

    MLPerf世界纪录技术分享:优化卷积合并算法提升Resnet50推理性能

    离线场景中运行Resnet50,达到了449,856 samples/s的计算性能,位居世界第一。
    的头像 发表于 11-10 14:43 1704次阅读

    基于改进ResNet50网络的自动驾驶场景天气识别算法

    ResNet50网络4组模块内加入SE模块,以便更好地拟合通道间复杂的鲁棒性。基于自动驾驶汽车路测图像数据对所提算法进行Python编程实现,结果表明:SE模块的加入能够增加算法的鲁棒性和准确性,提高了自动驾驶的天气识别精度。
    的头像 发表于 11-09 11:14 830次阅读
    基于改进<b class='flag-5'>ResNet50</b>网络的自动驾驶场景天气识别算法