本文将真切探讨昇腾算子开导编程讲话 Ascend C,这是一种专为昇腾 AI 处理器算子开导策划的编程讲话,它原生复旧 C 和 C++圭臬表率,最大化匹配用户的开导民俗。Ascend C 通过多层接口综合、自动并行筹商、孪生调试等关键工夫,极大提高算子开导服从,助力 AI 开导者低老本完成算子开导和模子调优部署。
通过本文内容的学习,读者将粗糙厚实 Ascend C 编程讲话的中枢成见、编程模子和上风,以及怎样利用这些器具提高 AI 算子的开导服从和性能。
本文参考文件:《Ascend C 异构并行圭表策划》——苏统华,杜鹏,闫长江,2024
并行筹商基得意趣
并行筹商是一种筹商步地,它触及同期履行多个筹商任务或同期履行多个程度。串行筹商是按轨则履行一个任务,然后再履行下一个任务。与串行筹商不同,并行筹商是多个任务或程度不错同期履行,以提高举座筹商性能和服从。
并行筹商不错在多个硬件处理单位(如多个处理器、多个加速硬件、多个筹商节点等)上同期履行任务,如下图所示。加速硬件既不错是前述的昇腾 AI 处理器,也不错是 GPU、TPU 和 FPGA 等成立。并行硬件有助于处理大规模的筹商密集型问题,加速筹商速率,提高系统的婉曲量。并行筹商不错应用于多样鸿沟,包括科学照料、工程策划、图形处理、数据分析等。
本文将领先对并行体系缚构进行分类,然后先容大模子并行加速基础旨趣,终末为了分析并行筹商性能先容并行服从磋筹商化旨趣。
并行体系缚构分类
从筹商机硬件、系统以及应用三个层面,大约包含三类并行体系缚构,分别是教导级并行、线程级并行以及央求级并行。
教导级并行(Instruction-Level Parallelism,ILP)是指在处理器里面多个机器教导粗糙在归拢时钟周期履行。这种并行性不需要圭表员手动优化代码,可由处理器自己的硬件来经管。有几种工夫不错用来提高教导级并行:
超标量架构(Superscalar):允许每个时钟周期辐照多条教导到不同的履行单位。它们具备多个履行单位,如整数运算、浮点运算、加载/存储等,不错同期履行多个操作。
活水线(Pipelining):将教导解析为小圭表,每个圭表由不同的处理器部件轨则完成,一个教导的各个阶段不错与其他教导的阶段类似,从而归拢时刻有多个教导处于不同的履行阶段。例如,一个典型的四段活水线包括取指(IF)、译码(ID)、履行(EXE)、写回(WB)等阶段。
线程级并行(Thread-Level Parallelism,TLP)是通过创建多个线程来结束并行筹商。在多核和多处理器系统中,这些线程不错确凿并行地开动在不同的处理器或中枢上。线程级并行常见于操作系统、数据库系统以及管事端应用等鸿沟,何况平素需要圭表员显式地通过编程来创建和经管线程。
央求级并行(Request-Level Parallelism,RLP)平素出当今应用管事中,比如当多个安详的客户端发送央求到管事器时,管事器会创建不同的处理历程来同期处理这些央求。每个央求可能触及到不同的资源和筹商旅途,因此不错并行处理,从而提高多样管事的履行才略和反应速率。
从软件策划和编程模子的角度来看,并行体系缚构可远隔红数据级并行和任务级并行。
数据级并行(Level Parallelism)是指将较大数据块分割成较小的块,然后在多个处理单位上并行处理这些数据块。每个处理单位上开动交流的操作,但作用于不同的数据片断上。数据并行零星稳健数组、向量和矩阵等数据结构,常在科学筹商和图像处理等鸿沟中使用。
任务级并行(Task-Level Parallelism)触及将使命解析成安详的任务,这些任务不错同期在不同的处理单位上履行。这些任务可能彼此依赖也可能透顶安详,任务并行平素需要圭表员策划粗糙灵验利用并行硬件特点的算法和圭表结构,比如在软件工程、复杂事件处理和多媒体应用中平常使用。
对于数据级并行和任务级并行,咱们不错用一个大型企业发工资的例子来进行形象厚实。假定一个大型企业每个月需要披发数百万名职工的工资。从数据级并行的角度看,一起职工的工资筹商过程会被分割成小块,每块包含一部分职工的工资数据。然后将这些数据块发送到不同的处理器上。每个处理器履行透顶交流的筹商任务,但仅处理其分派到的数据块,例如处理器 A 细致筹商职工列表 1~1000 的工资,处理器 B 细致筹商职工列表 1001~2000 的工资,依此类推。
每个处理器齐会安详完成工资筹商,包括税务扣除、福利筹商等,并最终身成各惬心责的职工工资条。而从任务级并行的角度看,各个处理器可能细致不同的筹商任务,例如处理器 A 细致筹商整个职工的税务扣除,处理器 B 细致筹商整个职工的福利待遇等等。在这种情况下,每个处理器同期读取一起的工资数据集,但仅对数据履行其特定的任务,终末,整个处理器的输出将被合并以生成最终的工资条。
此外,迈克尔·费林(Michael Flynn)于 1972 年建议了费林分类法。该分类法字据筹商机体系缚构中教导流和数据流的组织表情,将筹商机系统远隔为下图所示的四类。
单教导流单数据流:轨则履行一串教导,每个教导作用于单个数据元素上。这类系统代表了单处理器系统,任何时刻只消一条教导在履行,何况该教导只操作一份数据。大大宗早期的筹商机和当代的非并行处理器齐罢免单教导流单数据流 (Single Instruction Stream, Single Data Stream,SISD)架构。
单教导流大宗据流:允许不同处理器同期对多个数据元素履行归拢条教导操作。这类体系缚构稳健于数据并行任务,比如图像和视频处理、矩阵运算等,它们不错在多个处理单位上同期履行交流的操作序列。向量处理器和图形处理单位(GPU)不错归结到单教导流大宗据流 (Single Instruction Stream,Multiple Data Stream, SIMD)架构范围之下。
多教导流单数据流:多教导流单数据流 (Multiple Instruction Stream, Single Data Stream,MISD)归拢时分有多条教导操作归拢个数据流。这一类相较其他类别而言本色应用较少,因为它们的使用场景相对极度。一个表面上的例子是容错筹商,即多个处理单位不错对交流的数据履行不同的操作以检测空虚。
多教导流大宗据流:复旧多个安详的教导流,每个齐操作不同的数据流。这意味着每个处理器不错履行不同的任务,针对不同的数据集。超标量体系缚构的处理器、大大宗当代的多核和多处理器系统齐属于多教导流大宗据流 (Multiple Instruction Stream, Multiple Data Stream,MIMD)架构,另外昇腾 AI 处理器的向量筹商单位与矩阵筹商单位也不错视为 MIMD 架构。这使得它们相当稳健履行需要复杂任务相助的问题,比如管事器处理多个用户央求,或者超等筹商机履行科学模拟。
费林分类法在简化并行筹商厚实方面很有匡助,但 GPU 和众核处理器的出现以及异构筹商的流行,这种分类依然不可透顶消散整个类型的并行筹商步地,因而引入了愈加复杂的并行处理步地。例如单圭表大宗据 (Single Program Multiple Data, SPMD),它在 SIMD 基础上作念了彭胀。SPMD 属于并行筹商的编程模子,当硬件的各处理器有我方安详限制部件时,可通过软件编程让各处理器并行地履行归拢个圭表,但每个处理器处理不同的数据,Ascend C 便是基于昇腾 AI Core 变成了 SPMD 编程模子。
大模子并行旨趣
跟着深度学习工夫的快速跳动,模子的规模和复杂性正往时所未有的速率增长。讲话大模子(LLM)与视觉大模子(VLM)在提高任务性能方面取得了显赫服从,但同期也遭遇了筹商上的巨大挑战。例如 OpenAI 推出的当然讲话处理鸿沟大模子 ChatGPT 领有 1750 亿个参数。
传统的单机进修法子在处理这些重大模子时遭遇了内存截止、筹商速渡过慢和进修时分过长等不可逾越的问题。为了惩处这些瓶颈,大规模并行筹商工夫成为了提重大规模模子进修服从和性能的关键。这里进展的大模子并行加速计策联接 Ascend C 算子开导讲话是华为昇腾大模子惩处决议的基石。
现时针对 AI 大模子的并行化进修主要常用两类并行表情:数据并行和模子并行。下图显露了数据并行和模子并行的基本念念想。
数据并行通过将大规模的数据集远隔为多个批次(batch),分派给不同的筹商节点并行处理。具体来说,每个筹商节点齐有一个模子副本,它们独赶紧履行前向和后向传播,并筹商出梯度。之后,整个的筹商节点通过通讯契约交换梯度信息并进行汇总。
最终,通过团聚得到的全局梯度来更新模子参数,确保整个节点上的模子副本保执同步。数据并哄骗得模子进修不错彭胀到更多的数据和筹商资源,从而加速进修过程。
模子并行是当单个模子太大而无法放入单个筹商节点的内存时,将模子的不同部分(如不同的层或子齐集)散布到不同的节点上。在模子并行中,各个散布式节点细致模子的一部分筹商,并可能需要经常地进行跨节点通讯以同步中间现象和梯度信息。这种表情允许处理更大的模子,但由于通讯支出较大,因此怎样策划和优化模子的分割和通讯计策就显得尤为进犯。
在模子并行中存在一种极度的体式,即张量并行,它专注于模子中单个层的并行。例如,对于一个巨大的矩阵乘法操作,张量并行会将矩阵分割成更小的块,并在不同的筹商节点上履行这些较小规模的乘法操作。这要求跨节点相助履行和数据交换,以完成整个这个词层的运算。张量并行常用于全聚首层、卷积层等参数目大的层,它不错减少单个节点所需处理的参数数目,从而克服内存截止问题。
并行服从量化旨趣
阿姆达尔定律(Amdahl's Law)由吉恩·阿姆达尔在 1967 年建议。它用于揣度圭表在并行化后的表面性能提高。该定律指出,一个圭表的加速比上限受到其串行部分比例的截止。阿姆达尔定律的公式不错表述为如下公式:
其中,加速比 S 表示加速后总体性能的提高倍数,是圭表中不错并行化的代码部分所占的比例(介于 0 和 1 之间),是用于并行处理的处理器数目。
阿姆达尔定律的中枢不雅点是,并行筹商的最大性能提高受限于圭表中无法并行化的部分。字据上述公式,即使并行部分的速率被无尽加速(即 N) ,总体加速比 S 也长久不会越过。因此,若是一个圭表有 10%的代码是串行的(=0.9),那么即使在无尽多的处理器上开动,最大加速比也只可达到 10 倍,因为串行部分的履行时分红了瓶颈。
阿姆达尔定律强调了优化圭表性能的一个进犯计策,即尽可能增多圭表的可并行化比例。同期它也揭示了并行筹商面对的挑战,零星是对于那些难以大幅度并行化的应用或算法。本色应用中,圭表员和系统策划师会使用阿姆达尔定律来评估并行化的潜在价值以及决定在硬件和软件层面需要参预若干资源进行并行优化。
Ascend C 编程体系
算子是编程和数学中的进犯成见,它们是用于履行特定操作的绚烂或函数,以便处理输入值并生成输出值。一元算子通过对单个操作数进行操作,如取反或递加,而二元算子对两个操作数履行操作,例如加法或赋值。关联算子用于相比值之间的关联,逻辑算子用于在逻辑抒发式中组合条款。位运算符操作二进制位,而赋值算子将值分派给变量。算子在编程讲话中界说了基本操作,而在数学中,它们面孔了对数学对象的操作,如微积分中的导数和积分算子。算子的厚实对于正确厚实和编写代码以及惩处数学问题至关进犯。
面向算子开导场景的编程讲话 Ascend C,原生复旧 C 和 C++圭臬表率,最大化匹配用户开导民俗;通过多层接口综合、自动并行筹商、孪生调试等关键工夫,极大提高算子开导服从,助力 AI 开导者低老本完成算子开导和模子调优部署。
使用 Ascend C 进行自界说算子开导的凸起上风有:
C/C++原语编程
编程模子屏蔽硬件各异,编程范式提高开导服从
类库 API 封装,纯粹单到纯真,兼顾易用与高效
孪生调试,CPU 侧模拟 NPU 侧的举止,可优先在 CPU 侧调试
Ascend C 的编程模子
AI Core 是昇腾 AI 处理器履行筹商密集型任务确切凿算力担当。本节将领先先容 AI Core 的硬件综合,先容其中的筹商、存储和 DMA 搬运单位。随后,将先容 SPMD 模子和活水线编程范式,两者不错灵验提高使用 Ascend C 开导算子的并行履行服从,结束更高加速比的筹商任务。
AI Core 硬件综合
使用 Ascend C 编程讲话开导的算子开动在 AI Core 上,AI Core 是昇腾 AI 处理器中的筹商中枢。一个 AI 处理器里面有多个 AI Core,AI Core 中包含筹商单位、存储单位、搬运单位、限制单位等中枢部件。为了屏蔽不同 AI Core 硬件资源上可能存在的各异性,进行硬件的谐和综合表示,如下图所示。
筹商单位包括了三种基础筹商资源:矩阵筹商单位、向量筹商单位和标量筹商单位。存储单位即为 AI Core 的里面存储,统称为土产货内存(Local Memory),与此相对应,AI Core 的外部存储称之为全局内存(Global Memory)。DMA 搬运单位细致在全局内存和土产货内存之间搬运数据。
AI Core 里面的异步并行筹商过程:标量筹商单位读取教导序列,并把向量筹商、矩阵筹商、数据搬运教导辐照给对应单位的教导部队,向量筹商单位、矩阵筹商单位、数据搬运单位异时势并行履行接纳到的教导。该过程不错参考上图中蓝色箭头所示的教导流。
不同的教导间有可能存在依赖关联,为了保证不同教导部队间的教导按照正确的逻辑关联履行,Scalar 筹商单位也会给对应单位下发同步教导。各单位之间的同步过程不错参考上图中的绿色箭头所示的同步信号流。
AI Core 里面数据处理的基本过程:DMA 搬入单位把数据搬运到 Local Memory,Vector/Cube 筹商单位完成数据筹商,并把筹商终局写回 Local Memory,DMA 搬出单位把处理好的数据搬运回 Global Memory。该过程不错参考上图中的红色箭头所示的数据流。
SPMD 编程模子
SPMD(Single-Program Multiple-Data)数据并行是典型的并行筹商法子。其旨趣如下:假定从输入数据到输出数据需要经过 3 个阶段任务的处理(T1、T2、T3)。如下图所示,SPMD 会启动一组程度,并行处理待处理的数据。对待处理数据切分,把切分后数据分片分发给不同程度处理,每个程度对我方的数据分片进行 3 个任务的处理。
Ascend C 算子编程是 SPMD 编程,具体到 Ascend C 编程模子中的应用,是将需要处理的数据拆分并同期在多个筹商中枢上开动,从而取得更高的性能。多个 AI Core 分享交流的教导代码,每个核上的开动实例惟一的区别是 block_idx 不同,每个核通过不同的 block_idx 来识别我方的身份。block 的成见类似于上文先容 SPMD 中程度的成见,其与物理成见上芯片中固定的核数是不同的,不错自行界说建树,block_idx 便是绚烂程度惟一性的程度 ID。一般而言,为了充分利用筹商资源,block 数目建树为物理核数的整数倍。并行筹商过程的暗意图如下图所示。
活水线编程范式
在筹商机编程法子中,作念到软件与硬件的联接对性能提高有很大匡助,其中很关键的少许是在代码流履行过程中让整个筹商资源(硬件)齐处于高占用率现象并进行灵验的运算,从而让整个筹商资源齐得到灵验的运用,不会出现万古分悠然的情况。将圭表活水化则是达到上述效果最佳的法子,把完好的任务进行模块化处理,多个模块之间变成活水关联,并使用部队来处理不同模块之间的异步并行。
Ascend C 编程范式是一种活水线式的编程范式,把算子核内的处理圭表,分红多个活水任务,通过部队(TQue)完成任务间通讯和同步,并通过谐和的内存经管模块(TPipe)经管任务间通讯内存。活水编程范式的关键是活水任务策划。活水任务指的是单核处理圭表中主圭表援助的并行任务。在核函数里面,不错通过活水任求结束数据的并行处理,进一步提高性能。底下例如来证实,活水任务怎样进行并行援助。
以下图为例,单核处理圭表的功能被拆分红 3 个活水任务:阶段 1、阶段 2、阶段 3,每个任务专注于完成单一功能;需要处理的数据被切分红 n 片,使用数据分块 1~n 表示,每个任务需要轮番完成 n 个数据切片的处理。阶段间的箭头抒发数据间的依赖关联,比如阶段 1 处理完数据分块 1 之后,阶段 2 才能对数据分块 1 进行处理。
若 n=3,即待处理的数据被切分红 3 片,则上图中的活水任务开动起来的暗意图如下图。从开动图中不错看出,对于归拢派数据,阶段 1、阶段 2、阶段 3 之间的处理具有依赖关联,需要串行处理;不同的数据切片,归拢时分点,不错有多个任务在并行处理,由此达到任务并行、提高性能的方向。
Ascend C 编程提供了一种通讯部队结束各阶段间的数据通讯与同步,其被称为 TQue。TQue 的分类大约有两种,分别是 VECIN 和 VECOUT,对应筹商前后数据的搬入和搬出。以向量算子为例,则阶段 1 为数据搬入阶段,阶段 2 为向量筹商阶段,阶段 3 为数据搬出阶段,三者调用不同的芯片内单位,从而结束异步并行。对于特定的一块数据分块,在阶段 1 的终末,数据被放入 VECIN 部队中,随后在阶段 2 被取出,履行计议操作后放入 VECOUT 部队,终末在阶段 3 被从 VECOUT 部队中取出并搬出。由于不同算子需求的不同,每个数据分块需要经过的阶段数目和内容也有所各异。
若是您想了解更多AI常识,与AI专科东谈主士交流,请立即看望昇腾社区官方网站https://www.hiascend.com/或者真切研读《AI系统:旨趣与架构》一书,这里积存了海量的AI学习资源和履行课程,为您的AI工夫成长提供强劲能源。不仅如斯,您还有契机投身于寰宇昇腾AI立异大赛和昇腾AI开导者创享日等盛事,发现AI世界的无尽玄妙~
转载自:https://zhuanlan.zhihu.com/p/6655035867
#智启新篇规划#