导航:首页 > 源码编译 > 编译器机器学习

编译器机器学习

发布时间:2025-02-20 17:25:09

1. 编译原理与什么课程有联系

与人工智能、机器学习、操作系统、编译器等都有关系,属于计算机专业的核心课程,需要扎实掌握;

2. 开篇:XLA是什么

XLA (Accelerated Linear Algebra)是专用于机器学习的编译器,机器学习的运算中99%都是向量乘以矩阵、矩阵乘以矩阵的计算,XLA是专门用来优化这些计算的。

举个例子,运行在GPU上的 model_fn 函数会顺序调用 multiply 、 add 和 rece_sum 这三个op,而且 multiply ,也就是 y * z 的计算结果会先从GPU拷贝回host,再拷贝到device作为 add 的input,同样的,add的计算结果也会以相同的方式传递给下一个op。

显然,对于整个函数来说,将中间变量在host和device间来回倒腾是没有意义的。因此,如果把函数看作一个op,那在计算中产生的中间结果就不必返回到host,少了数据传输的时间开销,就可以大幅提升运算效率。

这种将多个op融合成一个op的方法就称为 fuse ,当前fuse的技术路线有:

XLA的优化当然不只是fuse,还有对计算图的优化,包括删除无效指令、减少内存占用、替换复杂指令等优化。下图是官方提供的性能报告,经XLA优化过后,Tensorflow BERT MLPerf的训练性能提升了~7倍。除了Tensorflow外,XLA还支持 JAX 、 Julia 、 PyTorch 和 Nx 等前端。

jit 是指在首次运行时将函数编译成二进制程序,后续再调用该函数时直接运行先前编译好的程序而非python code。 @tf.funciton 修饰的函数(包括它的子函数)会做 jit 。除非signature发生了变化,也就是input的shape或dtype和编译时不同,否则 get_MSE 是不需要重复编译的。

@tf.function 将函数内的ops替换成一组( XlaCompile , XlaRun ) ops,在运行时前者负责编译,并将编译结果-- executable 保存到cache,后者负责运行executable。如果cache里已经有编译好的程序就不需要编译了,例如 get_MSE(tf.constant(3.0), tf.constant(4.0)) 。

XLA编译器支持的语言(IR)是HLO(High Level Operations),顾名思义这些语言是由一个个op组成,因此,我们在编译前需要先从python code中提取出所有ops,再将它们转换成HLO。

JAX通过tracing的方式,从 @jax.jit 修饰的函数中提取ops,这些ops通过 jaxpr 来表示。然后再通过XLA client提供的API为ops生成相应的HLO。PyTorch/XLA也是采用类似的方法来生成HLO。

Tensorflow的 tf2xla 为每个 Op 创建了一个同名的 XlaOp 用于生成HLO, XlaOp 派生于 Op ,使用相同的注册机制,因此,只要把要编译的子图根据拓扑排序运行一遍就能生成它的HLO。

HLO先经过一系列 pass 优化后再将HLO lowering成ISA,最后将编译好的二进制封装到 executable 。

除了二进制程序,它还包含运行该程序所需要的infos和options。调用 executable.run() 就可以执行计算图。

3. AI编译器技术剖析(一)-概述

AI编译器是近年来在AI应用领域兴起的关键技术,旨在解决AI模型从研发到多环境部署过程中所遇到的复杂性和繁琐性问题。AI模型在智能家居、自动驾驶等领域的广泛应用,促使它们在云平台、专用计算设备以及物联网传感器中的部署需求不断增长。然而,这些模型往往包含非标准算子,其部署在特定硬件上需要大量工程工作,这成为AI应用落地过程中的一个瓶颈。AI编译器的诞生,旨在简化这一过程,提供更高效、灵活的模型转换与优化手段。

AI编译器的产生背景与早期神经网络部署方式紧密相关。早期阶段,神经网络的部署主要依赖框架和算子库,通过直观的数据流图进行表示。这种部署方式在一定程度上简化了AI模型的运行,但随着时间推移,其局限性逐渐显现,特别是在复杂模型的优化和跨平台部署方面。AI编译器的引入,旨在解决这些局限,通过将AI算法从开发阶段转换为部署状态,实现更高效、更灵活的模型优化与部署。

AI编译器的目标在于优化程序性能,同时降低编程难度。与传统编译器相比,AI编译器更侧重于针对AI模型的特殊需求,如自动微分支持、算子融合、内存优化等。它通过将机器学习算法转换为更优化的表示,并针对特定硬件进行编译,以实现模型的高效执行。与传统编译器相似,两者都涉及语言转换,但AI编译器更多关注于提升AI模型的性能和简化开发过程。

AI编译器的架构通常分为前端和后端两个部分。前端负责解析用户代码,生成计算图,并进行设备无关的优化;后端则负责将前端生成的计算图进一步优化,使之更适应特定硬件,并选择最适合的硬件算子进行执行。这一过程包括计算图优化、算子选择和内存分配等关键步骤,最终生成可在硬件上执行的任务序列。

AI编译器的独特之处在于其对自动微分的支持和前端优化策略。自动微分功能要求在传统中间表示的基础上设计新的中间表示结构,以支持更复杂的优化操作。此外,AI编译器的前端还会执行一系列优化,如算子融合、内存分配、常量折叠等,以提高程序的执行效率和减少能耗。

AI编译器后端则专注于硬件相关优化,如算子选择和内存管理,以确保模型在特定硬件上的高效执行。它通过计算图优化、算子选择和内存分配等步骤,生成一个完整的算子序列,从而实现AI模型的高效执行。

综上所述,AI编译器通过提供从算法到硬件执行的完整解决方案,简化了AI模型的部署过程,提高了模型在不同环境下的执行效率。这一技术的不断演进,将为AI应用的广泛普及提供强大支持。

4. 机器学习编译(MLC)基本思想

机器学习编译(MLC)的基本思想是将机器学习算法从开发阶段优化和转换,使其适应部署环境。机器学习算法通常在通用框架如Paddle、PyTorch、TensorFlow或JAX中描述,并包含相应的权重。而部署形式涉及执行应用程序所需的代码、资源管理(如内存)以及与开发环境的接口。MLC的目标是集成与最小化依赖,利用硬件加速,以及进行通用优化。

MLC通过将机器学习模型转换为适配特定部署环境的形式,减少应用大小,并使应用能够部署到更多环境。通过构建调用原生加速库的代码或生成利用原生指令(如TensorCore)的代码,可以利用硬件加速。此外,MLC还包括对模型执行的等价变换,以优化内存使用和执行效率。

TVM是实现MLC的工具之一,它通过将外部模型转换为Relay/Relax的高层IR表示,进一步转换为底层tensor IR表示,并最终编译为可执行代码。IRMole是程序变换的核心组件,包含了一系列Function,如relay/relax::Function和tir::PrimFunc。运行时的Mole是IRMole的编译结果,具备输入、执行和输出功能。

TensorIR是TVM中针对tensor计算过程的描述,如matmul + relu的表示方式与Numpy的对比。Schele是变换的基本组件,TVM提供多种方法进行变换。例如,split、reorder和reverse_compute_at等变换,都是对IRMole进行的优化,目的是使计算逻辑更加友好,以适应底层硬件。

访问内存的效率是影响性能的关键因素。现代CPU采用缓存策略,获取相邻数据会更快。因此,优化内存访问顺序可以提高性能。MLC通过变换和优化计算图,使得模型的执行更加高效。

TVM支持算子自动融合,将多个算子合并为一个,以优化模型执行。融合后的模型可以通过自动图优化在计算图之间进行变换,并将结果反馈到TensorIR中。此外,MLC可以集成现有的高度优化的矩阵计算库,如MKL、CUBLAS、CUDNN和CUTLASS,以提高性能。

MLC的基本思想与手工优化类似,但通过计算图融合和优化单个算子性能来提升模型性能。编译器采用计算调度分离的方式,通过自动程序优化寻找更优的算子实现。在有先验知识的情况下,可以结合手工优化来调整算子实现,以进一步提升性能。

总结,机器学习编译的基本思想旨在通过计算图融合和算子性能优化,以及集成现有优化库,提高机器学习模型在不同部署环境中的执行效率。同时,MLC与手工优化相结合,可以进一步提升模型性能,实现更高效和灵活的机器学习应用部署。

阅读全文

与编译器机器学习相关的资料

热点内容
程序员吃饭手抖 浏览:985
热释红外传感器单片机 浏览:200
部署h5源码 浏览:255
win7pythonvim 浏览:269
怎么在服务器后台跑fortran 浏览:728
人物绘pdf 浏览:530
pythonsound 浏览:969
摆拍app哪个好 浏览:216
光遇服务器爆满该怎么办 浏览:811
我的世界怎么做一个空岛服务器 浏览:791
移动协调如何设置服务器地址 浏览:53
哪里可以删除不需要安装的app 浏览:52
serato文件夹怎么删除 浏览:369
小雨游戏解压视频 浏览:158
ttf如何在服务器上安装 浏览:402
电脑文件夹共享使用什么协议 浏览:49
芭蕾舞和程序员哪个好 浏览:211
常用单片机接口 浏览:621
单片机软件设计原理 浏览:72
pythonlistor 浏览:146