昇腾CANN 7.0 黑科技:大模型训练性能优化之道

目前,大模型凭借超强的学习能力,已经在搜索、推荐、智能交互、AIGC、生产流程变革、产业提效等场景表现出巨大的潜力。大模型经过海量数据的预训练,通常具有良好的通用性和泛化性。用户基于“大模型预训练+微调”开发范式即可在实际业务场景取得理想的效果。从经济成本和时间成本来看,预训练是构筑各种行业模型的主要部分,优化大模型预训练具有非常重要的意义。

Open AI研究表明:大模型表现好坏强烈依赖于模型规模,弱依赖于架构;模型表现随着计算量、数据量和参数量提升;模型表现随着训练数据量和参数量的提升是可预测的。总体来讲,大参数量、大数据量、大计算量已经成为大模型表现好的主要因素。

来源:OpenAI Scaling laws for neural language models

这样的趋势给大模型训练带来什么挑战呢?

首先是算力问题。1750亿参数量的GPT-3训练3000亿token,需要算力3.14e11 TFLOPs,千卡A100集群训练时长需要22天左右(算力利用率约为50%);1.8万亿参数的GPT-4模型,训练13万亿token,需要算力2.15e13TFLOPs,2.5万卡A100训练时长达到90~100天(算力利用率32%~36%)。

其次是显存容量问题。1750亿参数量的GPT-3预训练大约需要3TB内存,大模型训练在短序列长度时,模型参数是内存占用的主要部分,在长序列长度时,激活内存是主要部分。总体来说,随着序列增长,需要的内存越来越大。

最后是通信开销问题。大模型预训练的高算力和大内存诉求往往通过分布式集群scale out的方式应对,但这将带来相当大的通信开销。具体包括模型并行通信开销、数据并行通信拖尾开销、流水并行的通信开销,另外还有流水并行引入的bubble。通常情况下,通信耗时约占E2E耗时的10%~30%,当存在更大通信域时,通信占比会更大。

因此,大模型预训练需要解决三个核心问题:大模型可部署,在内存受限的AI加速卡上放得下;充分发挥算力,提升计算效率,让训练流程更快;提升通信性能,降低通信开销,让计算更专注。

为了释放昇腾硬件算力,昇腾AI异构计算架构CANN发布更开放、更易用的CANN 7.0版本,全面兼容业界的AI框架、加速库和主流大模型,同时通过大颗粒算子深度融合、Kernel调度策略优化、通信并发流水等技术手段,解决大模型训练核心问题,使能大模型性能深度优化。

1  支持分布式切分策略+内存优化策略,让大模型放得下

学术界和工业界发明了很多大模型计算加速策略,包括最为经典的3D并行、序列并行、重计算、ZeRO系列的内存优化策略等等。通过这些并行策略,解决大模型放得下、训的快问题。基于昇腾AI处理器的多样算力和丰富的内存资源,异构计算架构CANN提供完备的技术栈功能,支持各种并行策略部署,也有很好的扩展能力,能支持新的并行算法和策略。下面来列举下在大模型训练中常用的计算加速策略:

  • 3D并行(TP/PP/DP)

  • 序列并行

来源:Reducing Activation Recomputation in Large Transformer Models

  • Checkpoint完全重计算

  •   选择性重计算
  1. Self-attention中的softmax和dropout算子计算结果占用内存大,但计算量相对少,不保留正向计算结果到反向,在反向计算流程可以重新计算softmax和dropout的结果。

来源:Reducing Activation Recomputation in Large Transformer Models

  • 内存优化:ZeRO1/2/3

来源:ZeRO Memory Optimizations Toward Training Trillion Parameter Models

2  充分发挥昇腾算力,提升计算效率,让模型跑得更快

在大模型计算优化方面,CANN通过高频算子优化、大颗粒算子融合、构建Transformer加速库等提升大模型计算效率。在调度方面,CANN通过执行器优化、算子Kernel重构等有效减少或避免host bound,提升算子在Host侧的下发性能。

1、高频算子优化,充分利用L1/L2 cache,发挥cube大算力

来源:Efficient Large-Scale Language Model Training on GPU Clusters Using Megatron-LM

矩阵乘MatMul算子是大模型的高频算子,在GPT-3模型中,占60%以上的计算量。CANN通过算子tiling优化合理切分数据,通过算子流水优化使得数据搬运与计算流水并行,同时,通过cube与vector算子融合,减少内存使用,最终MatMul算子Cube利用率提升显著,性能达到业界先进水平。

2、Flash/Sparse Attention大颗粒算子融合,减少显存耗用,提升计算性能

CANN基于Ascend C编程语言开发了Flash/Sparse Attention算子,支持fp16、bf16、fp32多种数据类型计算,并支持8K及以上的长序列,在bloom、llama、gpt-3等大模型有很好的应用。相对稠密模型,CANN还针对MOE稀疏模型进行了重要的优化,通过MOE融合算子优化内存占用,并实现All-to-All通信与计算并发流水,大幅度提升性能。

3、构筑Transformer加速库提升核心Kernel性能,助力模型加速

基于Transformer,业界已经诞生了很多大模型,CANN针对这些模型进行泛化性分析,构筑Transformer加速库,主要包括FlashAttention、MOE FFN、Norm类等等,加速库为大模型训练保证了高性能下界,客户基于此可以快速改造写出性能更优的算子。

Transformer高性能库构建策略

4、高性能Kernel动态调度和下发,有效减少或避免host bound 

大模型训练不仅要提升AI Core上算子的计算性能,也需提升算子在host侧的下发性能。若host侧下发算子不及时,可能会导致AI Core空闲等待,算力利用率降低(即host bound现象)。为此,CANN通过重构runtime执行框架,包括优化执行图,提供多种策略调度器,可根据模型结构特点选择最优调度策略,重构算子的Shape推导、tiling策略实现高性能Kernel,采用用户态直通device、Host2Device快速拷贝技术实现高性能kernel launch,多措并举使能Tiling和Launch性能倍增,有效减少或避免host bound。

3  降低通信开销,让计算更专注

大模型训练随着集群规模和通信域的增大,通信耗时占比升高,逐渐成为主要性能矛盾。提升通信性能、降低通信开销显得愈发重要。学术界和工业界发明了很多高性能通信算法,在此不一一介绍。下面介绍两个充分利用通信带宽的优化点:

  • 跨server all-reduce场景:SDMA&RDMA通信流水化

跨server实现all reduce一般分为四个阶段:server内reduce scatter、server间reduce scatter、server间all-gather,server内reduce scatter,在同一时刻,server间链路和server内链路只有一个在工作,由此会造成带宽的浪费。将通信数据切片排布成流水,使server内和server间的链路并发利用起来,通过小步快跑方式节省通信耗时。

跨server all-reduce场景:SDMA&RDMA通信流水化

  • 单server内all-reduce场景:TP通信复用RDMA带宽

单server内SDMA通信(比如all-reduce)时,server间的RDMA通信链路通常是空闲的。此时将数据按照一定比例切分,分别由server内SDMA通信、server间的RDMA通信同时传输,从而充分利用server内和server间的通信链路并发,提升通信性能。

单server内all-reduce场景:TP通信复用RDMA带宽

4  总结

昇腾CANN借助根技术创新对大模型训练过程进行了系统级的优化加速,通过合理的分布式切分策略和内存优化策略,使大模型放得下;通过计算层、调度层和通信域的优化,使大模型跑得快,未来CANN也将持续研究、不断突破,以大模型赋能应用,加速千行万业智能化转型。

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

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

相关文章

MySQL——练习

MySQL 一、练习要求二、练习过程 一、练习要求 创建表并插入数据: 字段名数据类型主键外键非空唯一自增idINT是否是是否nameVARCHAR(50)否否是否否glassVARCHAR(50)否否是否否 sch 表内容 id name glass 1 xiaommg glass 1 2 xiaojun glass 21、创建一个可以统计…

PostgreSQL与MySQL数据库对比:适用场景和选择指南

数据库是现代应用程序的基石之一,而在选择合适的数据库管理系统(DBMS)时,开发者常常会面临着许多选择。在这方面,PostgreSQL和MySQL是两个备受瞩目的选项。本文将深入研究这两者之间的异同,并为您提供适用场…

【使用OpenCV进行目标分割与计数的代码实例详解】

文章目录 概要实例一:硬币分割计数实例二:玉米粒分割计数 概要 在当今数字图像处理领域,图像分割技术是一项至关重要的任务。图像分割旨在将图像中的不同目标或区域准确地分开,为计算机视觉、图像识别和机器学习等领域提供了坚实…

[C语言]排序的大乱炖——喵喵的成长记

宝子,你不点个赞吗?不评个论吗?不收个藏吗? 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要…

【微服务 SpringCloud】实用篇 · Ribbon负载均衡

微服务(4) 文章目录 微服务(4)1. 负载均衡原理2. 源码跟踪1)LoadBalancerIntercepor2)LoadBalancerClient3)负载均衡策略IRule4)总结 3. 负载均衡策略3.1 负载均衡策略3.2 自定义负载…

C++前缀和算法的应用:向下取整数对和 原理源码测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 向下取整数对和 给你一个整数数组 nums &#xff0c;请你返回所有下标对 0 < i, j < nums.length 的 floor(nums[i] / nums[j]) 结果之和。由于答案可能会…

Kubeadm部署k8s集群 kuboard

目录 主机准备 主机配置 修改主机名&#xff08;三个节点分别执行&#xff09; 配置hosts&#xff08;所有节点&#xff09; 关闭防火墙、selinux、swap、dnsmasq(所有节点) 安装依赖包&#xff08;所有节点&#xff09; 系统参数设置(所有节点) 时间同步(所有节点) 配…

Java面试题-UDP\TCP\HTTP

UDP UDP特性 &#xff08;1&#xff09;UDP是无连接的&#xff1a;发送数据之前不需要像TCP一样建立连接&#xff0c;也不需要释放连接&#xff0c;所以减少了发送和接收数据的开销 &#xff08;2&#xff09;UDP 使用尽最大努力交付&#xff1a;即不保证可靠交付 &#xff0…

Java面向对象(基础)--package和import关键字的使用

文章目录 一、package关键字的使用1. 说明2. 包的作用3. JDK中主要的包 二、import关键字的使用 一、package关键字的使用 1. 说明 package:包package用于指明该文件中定义的类、接口等结构所在的包。语法格式 举例&#xff1a;pack1\pack2\PackageTest.java package pack1.…

Xshell+screen解决ssh连接 服务器掉线的问题

Linux screen命令解决SSH远程服务器训练代码断开连接后运行中断_linux screen ssh-CSDN博客 Linux命令之screen命令_linux screen_恒悦sunsite的博客-CSDN博客 使用教程&#xff1a; 这里粗略介绍一下 &#xff08;1&#xff09;xshell xftp&#xff08;xshell点这个&#…

组合数(递推版)的初始化

初始考虑为将第一列数和斜对角线上的数进行初始化。 橙色方块由两个绿色方块相加而来&#xff0c;一个为1&#xff0c;一个为0&#xff0c;所以斜对角线都为1&#xff0c;可以通过计算得来&#xff0c;不需要初始化&#xff0c;需要与码蹄集盒子与球 第二类Stirling数&#xf…

Go并发编程之一

一、前言 新年学新语言Go系列文章已经完结&#xff0c;用了最简单的例子去了解Go基础语法&#xff0c;但Go最牛B的是它对并发的友好支持&#xff0c;每一门语言都有它自己独特的优势&#xff0c;如Java适合大型工程化项目&#xff0c;Python适合做数据分析及运维脚本&#xff0…

✔ ★【备战实习(面经+项目+算法)】 10.21学习时间表(总计学习时间:5h30min)(算法刷题:7道)

✔ ★【备战实习&#xff08;面经项目算法&#xff09;】 坚持完成每天必做如何找到好工作1. 科学的学习方法&#xff08;专注&#xff01;效率&#xff01;记忆&#xff01;心流&#xff01;&#xff09;2. 每天认真完成必做项&#xff0c;踏实学习技术 认真完成每天必做&…

工具篇之Axure RP 10的使用

引言 最近在学习原型图&#xff0c;针对画原型图的工具&#xff0c;反复对比墨刀、Axure、xiaopiu后&#xff0c;最终选择Axure。 接下来&#xff0c;我便从Axure RP 10的下载、安装、中文字体、授权等几个方面&#xff0c;来介绍Axure。 一、背景 Axure是一款强大的原型设计…

华为OD技术面试-最短距离矩阵(动态规划、广度优先)

背景 记录2023-10-21 晚华为OD三面的手撕代码题&#xff0c;当时没做出来&#xff0c;给面试官说了我的想法&#xff0c;评价&#xff1a;解法复杂了&#xff0c;只是简单的动态规范 或 广度优先算法&#xff0c;事后找资料记录实现方式。 题目 腐烂的橘子 问题描述&#xff…

[SQL | MyBatis] MyBatis 简介

目录 一、MyBatis 简介 1、MyBatis 简介 2、工作流程 二、入门案例 1、准备工作 2、示例 三、Mapper 代理开发 1、问题简介 2、工作流程 3、注意事项 4、测试 四、核心配置文件 mybatis-config.xml 1、environment 2、typeAilases 五、基于 xml 的查询操作 1、…

EtherCAT主站SDO写报文抓包分析

0 工具准备 1.EtherCAT主站 2.EtherCAT从站&#xff08;本文使用步进电机驱动器&#xff09; 3.Wireshark1 抓包分析 1.1 报文总览 本文设置从站1的对象字典&#xff0c;设置对象字典主索引为0x2000&#xff0c;子索引为0x00&#xff0c;设置值为1500。主站通过发送SDO写报文…

STM32-LCD液晶显示

目录 LCD液晶显示 ILI9341液晶控制器简介 液晶屏的信号线和8080时序 使用STM32的FSMC外设模拟8080接口时序 FSMC 功能框图 通讯引脚 存储器控制器 时钟控制逻辑 FSMC的地址映射 FSMC控制异步Nor Flash的时序 FSMC模拟8080时序 FSMC结构体 NOR FLASH时序结构体 F…

由Django-Session配置引发的反序列化安全问题

漏洞成因 漏洞成因位于目标配置文件settings.py下 关于这两个配置项 SESSION_ENGINE&#xff1a; 在Django中&#xff0c;SESSION_ENGINE 是一个设置项&#xff0c;用于指定用于存储和处理会话&#xff08;session&#xff09;数据的引擎。 SESSION_ENGINE 设置项允许您选择不…

Python基础教程:内置函数之字典函数的使用方法

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 len(字典名)&#xff1a; 返回键的个数&#xff0c;即字典的长度 # len(字典名)&#xff1a; # 返回键的个数&#xff0c;即字典的长度dic {a:123,b:456,c:789…