【AI系统】AI 编译器后端优化

news2024/12/26 5:13:27

AI 编译器后端优化

AI 编译器分为多层架构,最顶层由各种 AI 训练框架编写的神经网络模型架构,一般由 Python 编写,常见的 AI 训练框架有 PyTorch、MindSpore、PaddlePaddle 等。在导入 AI 编译器时需要用对应框架的 converter 功能转换为 AI 编译器统一的 Graph IR,并在计算图级别由 Graph Optimizer 进行计算图级优化,也叫前端优化。

前端优化主要的计算图优化包括图算融合、数据排布转换、内存优化、死代码消除,这些优化是硬件无关的通用优化。在得到优化后的计算图后,将其转换为TensorIR,送入OpsOptimizer进行算子级优化,也叫后端优化,这类优化是硬件相关的,主要包括循环优化、算子融合、tiling、张量化。在算子级优化结束后,即进入代码生成阶段。本节将重点介绍 AI 编译器的后端优化相关功能。

在这里插入图片描述

后端优化

后端优化基本概念

在 AI 编译器中存在两层中间表示,相应也存在两类优化,即前端优化和后端优化。

前端优化:针对计算图整体拓扑结构优化,不关心算子的具体实现。主要优化流程为对算子节点进行融合、消除、化简,使得计算图的计算和存储开销最小。

在这里插入图片描述

后端优化:针对单个算子的内部具体实现优化,使得算子的性能达到最优。主要优化流程为对算子节点的输入、输出、内存循环方式和计算逻辑进行编排与转换。

在这里插入图片描述

二者的区别在于关注点不同,前端优化具有局部或全局的视野,而后端优化只关注单个算子节点。

后端优化流程

后端优化的流程一般分为三步:

  1. 生成低级 IR:将高级或计算图级别 IR(Graph IR)转换为低级 IR(Tensor IR)。

不同 AI 编译器内部低级 IR 形式和定义不同,但是对于同一算子,算法的原理实质相同。对于每个具体的算子,需要用 AI 编译器底层的接口来定义算法,再由编译器来生成内部的低级 IR。

在这里插入图片描述

  1. 后端优化:进行后端优化,并将 IR 转换为更低级的 IR。

针对不同的硬件架构/微架构,不同的算法实现的方式有不同的性能,目的是找到算子的最优实现方式,达到最优性能。同一算子不同形态如 Conv1x1、 Conv3x3、 Conv7x7 都会有不同的循环优化方法。实现方式多种多样,可以人工凭借经验手写算子实现,也可以通过自动调优搜索一个高性能实现。传统编译器如 GCC、LLVM 也具有后端优化的部分,为什么不直接将 AI 编译器的后端优化委托给传统编译器来实现呢?

有两个关键原因:1)数据形式不同:深度学习中数据形式主要为张量(Tensor)。而传统编译器不擅长对张量计算优化,更擅长对标量进行计算。2)缺乏必要的支持:传统编译器主要针对通用编程语言,缺乏对领域特定语言 DSL 的支持,特别是对神经网络,以及相关的特殊优化。

  1. 代码生成:根据硬件进行代码生成。

对优化后的低级 IR 转化为机器指令执行,现阶段最广泛的做法为借助成熟的编译工具来实现,代码生成不是 AI 编译器的核心内容。如把低级 IR 转化成为 LLVM、NVCC 等编译工具的输入形式,然后调用其生成机器指令。

算子优化

算子优化的挑战

算子根据其计算形式的特点可分为访存密集型与计算密集型。

  1. 访存密集(Memory-Bound)型

指的是在执行过程中主要涉及大量内存读取和写入操作的计算任务。这类算子通常需要频繁地从内存中读取数据,执行一些简单的计算操作,然后将结果写回内存。访存密集型算子的性能受限于内存带宽和访问延迟,而不太受计算能力的限制。如 RNN 训练任务,其网络结构的计算密度很低,因此瓶颈转移到 host 端的 Op Launch 上,算子的计算 kernel 之间出现大量空白。

  1. 计算密集(Compute-Bound)型

指的是在执行过程中主要涉及大量的计算操作,而对内存的访问相对较少的计算任务。这类算子主要依赖于 CPU 或 GPU 的计算能力,并且往往对内存带宽和访问延迟的需求不是特别高。一些数值计算密集型的算法,比如矩阵乘法、卷积运算、复杂的数学函数计算等,通常被认为是计算密集型的操作。

由于算子种类的多样性,并没有一个一网打尽的优化手段能解决所有算子的高性能执行方式。算子优化存在以下挑战:

  • 优化手段多样:要在不同情况下权衡优化及其对应参数,例如针对不同种类算子、相同算子有不同的参数可采用不同优化,对于优化专家来说也是相当耗费精力。

  • 通用性与移植性:不同类型的硬件架构差异,使得优化方法要考虑的因素也有很大。例如硬件可使用的指令集,硬件的内存带宽,算力以及存储层次的影响。

  • 不同优化间相互影响:各种优化之间可能会相互制约,相互影响。这意味着找到最优的优化方法组合与序列就是一个困难的组合优化问题,甚至是 NP 问题。

算子优化方法

算子的不同实现其性能差距千差万别,最好的与最差的相比甚至能达到上百倍的时间开销。为了实现高性能算子,业界有多种做法。

  1. 算子库

业界一个最为常见的方式是将预置的算子实现封装成计算库。算子库是指一组高度优化的计算核心函数,用于加速特定类型的计算任务,例如常见的矩阵乘法、卷积、循环神经网络等。这些算子库通常是由硬件厂商或第三方开发者编写的,旨在充分利用硬件平台的计算能力,并提供易于使用和高效的接口。

以 CuDNN 为例,它是一个由英伟达公司开发的深度学习加速库,专门针对各种常见的深度学习算法进行了高度优化,使其在英伟达 GPU 上运行时达到最佳性能。CuDNN 中的算子函数使用 CUDA 架构实现,并且在计算时利用了 GPU 硬件的并行性和向量化特性。此外,CuDNN 还通过使用半精度浮点数运算、算法重排等技术来进一步加速计算速度。

类似地,Eigen 是一个由 C++ 编写的线性代数库,用于实现各种矩阵操作,包括矩阵乘法、矩阵求解、特征值分解等。Eigen 中的算子函数使用 SIMD(单指令多数据)指令集实现,并且可以在不同的 CPU 架构上进行自动优化,以提供最佳性能。

这种方法存在三个问题:

  • 如何应对 AI 领域算子迭代更新快:AI 领域的算法和模型经常迭代更新,导致算子库需要及时跟进以支持新的算法或模型结构。这可能需要算子库开发者不断更新和优化现有的算子实现,以适应新的需求。

  • 如何解决同一算子在多平台移植后一致性问题:算子库通常是为特定硬件平台(如 GPU、CPU)进行优化设计的。但是,在将算子库移植到不同的平台上时,可能会遇到一致性问题。不同平台上的硬件架构和指令集可能存在差异,可能需要进行特定的优化和调整,以确保在多平台上实现一致的计算结果。

  • 如何面对算子组合爆炸问题?如参数多样,融合大算子等:在 AI 计算中,经常会遇到大量算子的组合,例如复杂的模型结构或多阶段数据处理流程。这可能导致算子的组合爆炸问题,其中算子之间的参数和组合方式变得多样化和复杂化。

  1. 自动生成

那么如何能解决这些问题?是否可以通过自动化生成高性能 kernel 生成的方式来减小算子开发的开销?

目前有两种主流的自动生成算法:

  • Auto Tuning:Auto Tuning 是一种通过自动搜索和优化参数组合来生成高效的 kernel 代码的方法。该方法通常基于启发式算法或机器学习技术,自动探索不同参数组合以找到最佳的性能配置。Auto Tuning 可以根据具体的硬件平台和任务特性,自动选择适当的优化策略,从而提高计算核心的性能和效率。

  • Polyhedral:Polyhedral 方法是一种基于数学多面体理论的编译优化方法,用于描述循环嵌套的迭代空间和数据依赖关系,并生成高效的循环 kernel 代码。通过对循环迭代空间进行变换和重组,Polyhedral 方法可以实现循环并行化、内存局部性优化等优化,从而提高计算核心的性能和效率。

如果您想了解更多AI知识,与AI专业人士交流,请立即访问昇腾社区官方网站https://www.hiascend.com/或者深入研读《AI系统:原理与架构》一书,这里汇聚了海量的AI学习资源和实践课程,为您的AI技术成长提供强劲动力。不仅如此,您还有机会投身于全国昇腾AI创新大赛和昇腾AI开发者创享日等盛事,发现AI世界的无限奥秘~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2252917.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣 三角dp

动态规划基础题,当前所在元素来自上一行的两列的值。 题目 从图可以看出,每一行的第一个数与最后一个数都是1,然后中间的数是来自它左上方和右上方的数的和。当然并不是要打印这个三角形的形状,因此可以想到正常的打印方式应该是…

Oracle检查加强版本

支持更丰富了,代码也更乱了 #!/bin/bash## 实例个数 告警日志 实例状态 会话 活动会话 锁 集群状态 服务状态 磁盘空间 侦听日志 ## 单机、RAC Linux、AIX 11g、19c、23ai ## 依赖adrci配置正常,也可以改为 getAlert() ## ver 1.2case uname inAIX)ps…

RoBERTa- 稳健优化的 BERT 预训练模型详解

一、引言 自 BERT(Bidirectional Encoder Representations from Transformers)问世,预训练语言模型在自然语言处理(NLP)领域掀起革命浪潮,凭卓越表现大幅刷新诸多任务成绩。RoBERTa 承继 BERT 架构&#x…

【流程图】各元素形状和含义

判定、文档、数据、数据库、流程处理节点 矩形 - 动词 平行四边形 - 图像 下波浪 - 数据 图片来源http://baike.cu12.com/bkss/62449.shtml

「Mac畅玩鸿蒙与硬件41」UI互动应用篇18 - 多滑块联动控制器

本篇将带你实现一个多滑块联动的控制器应用。用户可以通过拖动多个滑块,动态控制不同参数(如红绿蓝三色值),并实时显示最终结果。我们将以动态颜色调节为例,展示如何结合状态管理和交互逻辑,打造一个高级的…

PyQt6 开发基础

<?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Form</class><widget class"QWidget" name"Form"><property name"geometry"><rect><x>0<…

Kafka如何保证消息可靠?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka如何保证消息可靠&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka如何保证消息可靠&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Kafka通过多种机制来确保消息的可靠性&#xff0c;主要包…

pytest(二)excel数据驱动

一、excel数据驱动 excel文件内容 excel数据驱动使用方法 import openpyxl import pytestdef get_excel():excel_obj openpyxl.load_workbook("../pytest结合数据驱动-excel/data.xlsx")sheet_obj excel_obj["Sheet1"]values sheet_obj.valuescase_li…

类和对象(中)(类的默认成员函数)+日期类实现

1.类的默认成员函数 默认成员函数就是用户没有显示实现&#xff0c;编译器会自动生成的成语函数称为默认成员函数。一个类&#xff0c;我们不写的情况下编译器会默认生成6个默认成员函数。C11后还增加了两个默认成员函数&#xff0c;移动构造和移动赋值&#xff08;这一节暂时…

详解版本控制工作原理及优势,常见的版本控制系统对比(HelixCore、Git、SVN等)

什么是版本控制软件&#xff1f;从基础层面来说&#xff0c;版本控制&#xff08;也可称版本管理&#xff09;就是随时间跟踪和管理文件变更的过程&#xff0c;而版本控制软件有助于实现这一过程的自动化。但这仅仅是其功能及其重要性的开端。 什么是版本控制&#xff1f; 版本…

记录一次网关异常

记一次网关异常 网关时不时就会出现下面的异常。关键是不知道什么时候就会报错&#xff0c;并且有时候就算什么都不操作&#xff0c;也会导致这个异常。 ERROR org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in schedul…

SpringMVC跨域问题解决方案

当Web应用程序尝试从一个源&#xff08;例如 http://localhost:9090&#xff09;向另一个不同的源&#xff08;例如 http://localhost:8080&#xff09;发起请求时&#xff0c;发现报错&#xff1a; 报错原因&#xff1a;请求被CORS策略拦截了 跨域问题概述 当Web应用程序尝试…

现在的电商风口已经很明显了

随着电商行业的不断发展&#xff0c;直播带货的热潮似乎正逐渐降温&#xff0c;而货架电商正成为新的焦点。抖音等平台越来越重视货架电商&#xff0c;强调搜索功能的重要性&#xff0c;预示着未来的电商中心将转向货架和搜索。 在这一转型期&#xff0c;AI技术与电商的结合为…

芯驰X9SP与汽车麦克风-打造无缝驾驶体验

当今汽车技术的进步不仅提升了驾驶体验&#xff0c;还改变了我们与车辆互动的方式。汽车麦克风作为车内语音控制系统的重要组成部分&#xff0c;正逐渐成为现代汽车的标配。 技术原理 汽车麦克风主要依赖于声音传感技术&#xff0c;通常包括电容式麦克风和动圈式麦克风。这些…

vue3项目搭建-6-axios 基础配置

axios 基础配置 安装 axios npm install axios 创建 axios 实例&#xff0c;配置基地址&#xff0c;配置拦截器,目录&#xff1a;utils/http.js 基地址&#xff1a;在每次访问时&#xff0c;自动作为相对路径的根 // axios 基础封装 import axios from "axios";…

【北京迅为】iTOP-4412全能版使用手册-第三十二章 网络通信-TCP套字节

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

量子人工智能产业发展现状及趋势(上)

文章目录 前言一、量子人工智能产业发展现状1.产业链上游&#xff1a;涵盖基础硬件与量子计算整机开发&#xff0c;参与厂商众多&#xff0c;发展相对成熟2.产业链中游&#xff1a;涉及人工智能算法与应用开发&#xff0c;参与企业均在积极探索以赢得市场先机3.产业链下游&…

企业如何构建自己的 AI 编码能力

文章摘要 在数字化转型的浪潮中&#xff0c;企业对于提升开发效率和代码质量的需求日益迫切。AI 编码能力作为一种新兴的技术力量&#xff0c;正逐渐成为企业技术竞争力的关键。本文将探讨企业如何结合代码大模型和私域数据&#xff0c;构建属于自己的 AI 编码能力。 全文阅读…

算法日记 40 day 单调栈

最后两题了&#xff0c;直接上题目。 题目&#xff1a;接雨水 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1…

SpringBoot集成Kafka和avro和Schema注册表

Schema注册表 为了提升kafka的性能&#xff0c;减少网络传输和存储的数据大小&#xff0c;可以把数据的schema部分单独存储到外部的schema注册表中&#xff0c;整体架构如下图所示&#xff1a; 1&#xff09;把所有数据需要用到的 schema 保存在注册表里&#xff0c;然后在记…