设计和实现了机器学习框架
(如TensorFlow、PyTorch、MindSpore等)
编译器前端
编译器前端: 机器学习框架往往具有AI编译器来构建计算图,并将计算图转换为硬件可以执行的程序
编译器后端和运行时:
完成计算图的分析和优化后,机器学习框架进一步利用编译器后端和运行时实现针对不同底层硬件的优化
通用编译器中的概念,
如AOT(Ahead of Time提前编译)、
JIT(Just in time 即时)、IR(Intermediate Representation中间表示)、
PASS优化、AST(Abstract Trees)、副作用、闭包等概念
机器学习编译器-AI编译器
AI编译器的设计受到了主流编译器(如LLVM)的影响
AI编译器一般采用多层级IR设计
MLIR(Multi-Level Intermediate Representation)是一种用于构建可重用和可扩展编译的新方法
使用MLIR为Fortran、机器学习图构建抽象
机器学习框架如 MindSpore 采用统一的IR设计(MindIR)
MindSpore IR (MindIR) is a function-style IR based on graph representation
编译器前端主要指图编译和硬件无关的优化,
机器学习框架的编译器前端的独特之处主要在于对 自动微分 功能的支持 张量表达
新的中间表示结构
线性中间表示Linear IR,图中间表示Graphical IR 以及混合中间表示Hybrid IR
计算图模式。主流机器学习框架如TensorFlow、PyTorch、MindSpore等都提供了静态图和动态图两种计算图模式
高阶函数和闭包是函数式编程的重要特性 可以抽象通用问题、减少重复代码、提升框架表达的灵活性和简洁性。
自动微分(Automatic Differentiation, AD)--自动微分通常在编译器前端优化中实现,通过对中间表示的符号解析来生成带有梯度函数的中间表示
编译器的前端引入了类型系统(Type System)和静态分析(Static Analysis)系统
编译器后端主要指硬件相关优化、算子选择
对前端下发的IR做进一步的计算图优化,让其更加贴合硬件,并为IR中的计算节点选择在硬件上执行的算子
主要负责计算图优化、算子选择和内存分配的任务
将IR图进行等价图变换,以便在硬件上能够找到对应的执行算子
算子选择本质上是一个模式匹配问题-可以得到IR图中每个算子的输入输出的形状(Shape)、数据类型、存储格式
计算的调度可以分为单算子调度与计算图调度两种方式
逐算子下发执行的交互式执行以及将整个计算图或者部分子图一次性下发到硬件的下沉式执行两种模式
算子编译器
通用硬件优化和特定硬件优化
算子: 计算密集型算子 访存密集型算子
算子拆解阶段(Expander) 算子聚合阶段(Aggregation)
算子信息主要包括了支持设备类型、数据类型和数据排布格式三个方面
设备(Device)内存
MindSpore中分别提供了PyNative模式和Graph模式。
概念理解:
图中间表示包括抽象语法树(Abstract Syntax Tree,AST)、有向无环图(Directed Acyclic Graph,DAG)、控制流图(Control-Flow Graph,CFG)
LLVM 2000年提出的开源编译器框架项目
LLVM IR使用线性中间表示表示基本块,使用图中间表示表示这些块之间的控制流
TensorFlow团队提出了MLIR(Multi-Level Intermediate Represent,多级中间表示)
MindSpore 框架采用的是一种基于图表示的函数式中间表示,即MindIR,全称MindSpore IR
自动微分采用的是基于函数式编程框架的变换方法 基于图的(Graph based) 纯函数的(Purely functional)
支持闭包表示的(Closure representation)。反向模式的自动微分,需要存储基本操作的中间结果到闭包中,然后再去进行组合连接。
强类型的(Strongly typed
计算机求导:
手工微分(Manual Differentiation)、
数值微分(Numerical Differentiation):数值微分通过差分近似方法完成,其本质是根据导数的定义推导而来
符号微分(Symbolic Differentiation) : 代数系统工具中,例如Mathematica、Maxima和Maple 机器学习框架,如Theano
自动微分(Automatic Differentiation)
微分方向:自动微分根据链式法则的不同组合顺序,可以分为前向模式(Forward Mode)和反向模式(Reverse Mode)
自动微分实现:
动微分的基本思想是明确的,
大体可以划分为
基本表达式法(Elemental Libraries)、
操作符重载法(Operator Overloading,OO)
和代码变换法(Source Code Transformation,ST)
MindSpore是使用基于闭包的代码变换法来实现的自动微分的
无用与不可达代码消除 常量传播、常量折叠 中间表示是编译器的核心数据结构之一
数据处理框架 ETL
数据-加载 load
数据-混洗组件 数据变换组件 数据组装组件 Shuffle Map Batch 对
数据-发送组件 send
特点:
特定存储格式和多种存储设备类型 内存、本地磁盘、分布式文件系统以及对象存储系统等多种存储设备类型
图像进行缩放、翻转、模糊化 文本任务需要对文本进行切分、向量化 语音任务需要对语音进行快速傅立叶变换、混响增强、变频等预处
自定义处理算子,以应对数据模块未覆盖到的场景
数据: Tensor数据类型
主流机器学习系统均采用数据处理与模型计算进行异步执行,以掩盖数据预处理的延迟。
机器学习模型训练对数据输入顺序敏感
框架背后--并行数据处理系统
提供类LINQ式 的编程抽象 用户专注于描述基于数据集的生成与变换,而将这些操作的高效实现与调度执行交由数据系统的运行时负责
Spark : 基于弹性分布式数据集(Resilient Distributed Dataset, RDD)
--类似于dataframe 支持列名和列类型 数据类型是隐式的
-- DataFrame 的 API 更加简洁,因此在某些情况下可能会更易于编写和维护 DataSet 支持更复杂的操作,因此在需要高级操作时可能会更具优势
MindSpore 的数据模块MindData: 核心编程抽象为基于Dataset(数据集)的变换处理
Dataset为一个 多行多列,且每一列都有列名的关系数据表。编译时类型安全的分布式数据集,它可以同时携带结构信息(Schema)和类型信息
良好的用户自定义算子注册机制:C层算子以及Python层算子 dataset-plugin仓
Epoch 一个Epoch一种随机顺序遍历所有的数据且每个数据只被遍历一次 所有Epoch需要以不同的随机顺序
batch
tf.data以及MindData均采用了算子并行的方案
通过约束算子线程组间的通信行为来确保对当前算子的下游算子的输入顺序与自己的输入顺序相同
并行数据预处理后的数据输出顺序与输入顺序保持相同
Pytorch : Dataloader中的进程有两类角色:worker进程以及主进程,以及两类进程间通信队列:index_queue以及worker_result_queue
流水线并行--以流水线为粒度
基于异构计算的数据预处理
基于分布式的数据预处理
数据
LINQ、Lambda表达式和表达式树
LINQ(Language Integrated Query) 语言集成查询 查询语法和方法语法
LINQ 提供大量操作符以及链式语法方便对数据源的操作
流式语法是编写LINQ表达式的最基础同时也是最灵活的方式。
为查询表达式语法结构
延迟执行-使用了装饰模式
对比: 传统编程方式:传统编程通常需要手动编写 循环和条件语句来实现数据的查询和筛选 手动处理类型转换和异常处理
LINQ方式:LINQ使用查询语法或方法链式调用的方式 编译时的类型检查
提出一种统一的存储格式(我们称之为Unirecord格式)
MindRecord文件 :数据文件包含文件头、标量数据页、块数据页,用于存储用户归一化后的训练数据,索引文件包含基于标量数据
Linq的底层原理---表达式树
使用机器学习框架
开发-训练-评测:训练模型
部署:推理模型
开发神经网络交换协议(Open Neural Network Exchange,ONNX)
模型拓扑连接: AI模型中的数据流和控制流等 数据处理节点或者控制流节点
前处理:将原始数据处理成适合网络输入的数据
执行推理:将离线转换得到的模型部署到设备上执行推理流程,根据输入数据计算得到输出数据。
后处理:模型的输出结果做进一步的加工处理,如筛选阈值。
模型的安全保护可以分为静态保护和动态保护两个方面
数据并行、模型并行和流水线并行
趋势
社会:机械化 电气化 信息化 智能化
个体:自动化、实时化、个性化 去适应这个时代,抓住人工智能提供的机会
Mapreduce
Spark Flink
Pytorch MindSpore TensorFlow
ROS CyberRT
芯片:
麒麟芯片 鲲鹏芯片 昇腾芯片
麒麟芯片(To C)【面向智能终端】 Kirin 华为海思
昇腾芯片【面向AI计算】 Ascend
鲲鹏芯片【面向通用计算】 Kunpeng
操作系统:
欧拉 OpenEuler
鸿蒙 OpenHarmony Harmony
rcore
编译器: 华为方舟编译器(OpenArkCompiler) 华为毕昇编译器(bisheng compiler)
华为毕昇编译器基于开源LLVM开发,并进行了优化和改进,同时支持Fortran语言前端,是针对鲲鹏平台的高性能编译器
Clang 不仅可以将C/C++程序编译为LLVM中间表示的IR Flang 是专为LLVM集成而设计的Fortran前端,
毕昇编译器安装和GCC编译器安装
计算库:
华为高性能通信库(Hyper MPI) 鲲鹏数学库(Kunpeng Math Library,以下简称KML)
数据库
华为的 Gauss 数据库是一个开源数据库,基于 PostgreSQL9.2 开发
编程语言
框架
工程师从0到1开发的能力
参考
www.gnu.org/software/binutils/
Linux交叉编译工具链 https://www.cnblogs.com/hellokitty2/p/9745959.html
https://www.cnblogs.com/apachecn/p/18196561
成为一名二进制分析师需要用到的Linux二进制分析工具有哪些?
MindSpore IR(MindIR)
https://www.mindspore.cn/docs/zh-CN/r0.7/design/mindspore/ir.html
https://openmlsys.github.io/chapter_data_processing/summary.html