Faster Transformer

news2025/1/11 21:00:48

Faster Transformer

  • FasterTransformer包含transformer块的高度优化版本的实现,该块包含编码器和解码器部分。
  • 基于高效率的开发语言和工具: C++, CUDA, cuBLAS and cuBLASlt
  • 支持的模型数据格式:FP32, FP16, BF16, INT8 (limited models) and FP8 (limited models)
  • FasterTransformer提供了TensorFlow集成(使用TensorFlow op)和PyTorch集成(使用PyTorch op)。FasterTransformer还提供了Triton集成作为后端。
  • 支持MGMN: Multi-GPU Multi-node服务
  • 8bit量化:SmoothQuant (int8 weight only). (PTQ): less cost, lower accuracy
  • 支持flash attention for long sequence on multi-head attention
  • Optimization of fused mha and indirect k/v
    FasterTransformer有两个部分:
  1. 第一个是用于将经过训练的Transformer模型转换为可用于分布式推理的优化格式
  2. 第二部分是用于在多个GPU上执行模型的后端
    FT 适用于计算能力 >= 7.0 的 GPU,例如 V100、A10、A100 等。

支持的模型格式

Megatron-LM,GPT-3,GPT-J,BERT,ViT,Swin Transformer,Longformer,T5,XLNet等
faster transformer支持的格式

瓶颈

TransFormer的瓶颈
对于编码器-解码器架构,解码器占用了大部分时间(约90%),解码器是瓶颈。根据Amdahl的定律,优化解码器更为重要。
在这里插入图片描述

  1. 计算冗余:在Transformer的自注意力机制中,每个输入序列的每个元素都需要与其他所有元素进行交互,这导致了大量的冗余计算。
  2. 内存瓶颈:由于Transformer的自注意力机制,模型需要存储所有的中间状态,这在处理长序列时会导致内存瓶颈。
  3. “Kernels are too small” -> “Kernel launch bound"为 “内核太小” -> “内核启动受限”。这是指当CUDA内核的规模太小,无法充分利用GPU的并行处理能力,导致GPU的利用率不高,这种情况被称为"内核启动受限”。
    在这里插入图片描述

整体优化思路

  1. 并行计算充分利用硬件设计特性
  2. 内存复用减少内存使用
  3. 减少重复计算
  4. 定位耗时的计算操作尝试优化
  5. 减少数据传输耗时

Parallelism

  • Tensor (Intra-Layer) Parallelism
  • Pipeline (Inter-Layer) Parallelism
    在这里插入图片描述

Tensor parallelism(Intra-Layer)

每个tensor分割成多个子块后放到不同的GPU上运算。处理的过程中各个子块是分别单独并行处理的。最后再把多个结果结合。更多的数据交换在这里插入图片描述

Pipeline parallelism(Inter-Layer)

一个模型的不同层分布在不同的GPU上。比较少的数据交换
在这里插入图片描述

FasterTransformer优化点

网络层融合
优化方案
尽可能多的融合除了GEMMs以外的所有kernels
在这里插入图片描述

  1. 将multi-head attention合并为一个kernel(add bias, transpose, batch multiplication)
  2. 预处理阶段将多层神经网络融合成一个单独的神经网络,该网络将用一个单一的Kernel进行计算。这种技术减少了数据传输并增加了计算密度,从而加速了推理阶段的计算。例如,多头注意力块中的所有操作都可以组合到一个Kernel中。Faster Transformer将70个kernels压缩为16个kernels。在这里插入图片描述
  3. 在beam search中融合“add bias”和“SoftMax”。
  4. 并行计算top k,在并行计算top-k的过程中,FasterTransformer首先将数据分割成多个小块,并在GPU的多个线程上并行处理这些小块。每个线程会计算其对应的小块中的top-k元素。然后,FasterTransformer会使用一个并行归约算法,将所有线程的结果合并起来,得到最终的top-k元素。这个并行归约算法是高效的,因为它可以充分利用GPU的并行处理能力。在这里插入图片描述

自回归模型的推理优化/激活缓存

为了防止重新计算以前的Keys和Values,FT在每个步骤分配一个缓冲区来存储它们。尽管FT需要一些额外的内存使用,但它可以节省重新计算的成本、在每个步骤分配缓冲区的成本以及concatenation的成本。在这里插入图片描述

显存优化

大规模Transformer模型拥有多达数万亿个参数,占用数百GB的存储空间。GPT-3 175b模型采用半精度存储,也需要占用350GB的存储空间。为了降低其他部分的内存使用,在FasterTransformer中,可以通过在不同decoder层中重复使用激活/输出的内存缓冲区来减少内存使用。具体来说,当我们在解码器的每一层中进行前向传播时,我们需要存储每一层的激活(或输出)。在传统的实现中,每一层都会有自己的内存缓冲区来存储这些激活。而在Faster Transformer中,只使用一个内存缓冲区,并在每一层之间重用它。这是通过在每一层完成前向传播后,立即释放这些激活,从而为下一层的激活腾出空间来实现的。这样,我们就可以在不同的层之间重用同一个内存缓冲区,而不需要为每一层都分配新的内存。
这种方法的一个关键前提是,我们在完成前向传播后不再需要这些激活。这通常是在使用Transformer模型进行推理(而不是训练)时才成立的,因为在推理过程中,我们通常不需要进行反向传播。例如:GPT-3中包含96个解码器层,因此只需要原来1/96的内存量来存储激活。

使用MPI and NCCL支持model prallelism

FasterTransormer 同时提供tensor parallelism和pipeline parallelism. 节点间/节点内通信依赖于MPI和NVIDIA NCCL
tensor parallelism:FasterTransformer 按照 Megatron的思路对self-attention block和feed-forward network并行改造,。基于矩阵乘法的性质,FT按行拆分第一矩阵的权重,按列拆分第二矩阵的权重,分配给一个不同的处理器进行计算。这样,每个处理器只需要处理一部分的数据,从而实现并行计算。
在Transformer模型中,"reduction operation"通常指的是在多头自注意力(Multi-head Self-Attention)部分中,将不同头的输出合并(或者说“减少”)为一个单一的输出。这个过程通常涉及到一些矩阵运算,如矩阵乘法和加法。

在原始的Transformer模型中,每个Transformer块可能需要进行多次这样的减少操作。但在FasterTransformer(FT)中,通过优化,每个Transformer块的减少操作可以减少到两次。这是通过在计算过程中重用一些中间结果,以及优化矩阵运算的方式来实现的。
对于pipeline parallelism,是通过将整个批次的请求分割成多个micro-batch来实现的。减少了不必要的等待数据传输的空闲时间。我们可以在多个处理器上并行处理这些微批次。当一个处理器完成一个微批次的处理后,它可以立即开始处理下一个微批次,而不需要等待其他处理器。这样,我们可以最大限度地利用处理器的计算能力,而不会有空闲的时间。此外,FasterTransformer会根据不同的情况自动调整微批次的大小。

GEMM自动调优

矩阵乘法是基于Transformer的神经网络中的主要和最重的操作。FasterTransformer使用CuBLAS和CuTLASS库的功能来执行这些类型的操作。cuBLAS库中的GEMM函数可以自动根据输入矩阵的大小和形状,选择最优的算法来执行矩阵乘法。这种自动选择的过程就是GEMM的自动调优。

在Faster Transformer中,GEMM用于执行Transformer中的矩阵乘法操作,例如在自注意力机制中计算query、key和value,以及在前馈神经网络中计算权重和输入的乘积。GemmBatchedEx 函数实现的MatMul操作可以使用不同的低级算法在“硬件”级别以数十种不同的方式执行。此外,FT对网络的某些部分(如expf:单精度指数计算,shfl_xor_sync:CUDA 线程间的数据交换)使用硬件加速的low-level函数。

低精度推理

FT拥有支持使用fp16和int8低精度输入数据进行推理的Kernel。由于更少的数据传输量和所需的内存而达到加速的目的。int8和fp16计算可以在特殊的硬件上执行,例如张量核(对于从Volta开始的全部GPU体系架构)以及即将问世的Hopper GPU中的变换器引擎。
其他优化
快速的C++BeamSearch实现 Cumulative log probability for beam search
使用 half2 指令减少 FP16 中的内存读写次数;
使用精度较低但速度较快的函数,如将“expf”替换为“__expf”
支持一个模型的权重部分割给八个GPU
使用 __shfl_xor_sync 加速 reduced operations

GPU加速库介绍

1.cuBLAS:它是BLAS(基本线性代数子程序)库的GPU加速版本。cuBLAS提供高度优化的矩阵运算,如矩阵乘法和矩阵向量乘法,利用GPU的高并行性和高内存带宽。
2.cuBLASLt:它是cuBLAS的扩展,对矩阵运算提供了更细粒度的控制。它允许用户指定矩阵布局、数据类型和计算类型等属性,并可以自动为给定配置选择最佳算法。
3.cuSPARSELt:这是一个用于稀疏线性代数的GPU加速库。它为稀疏矩阵运算提供了优化的例程,这在许多科学和工程应用中很常见。这些库是CUDA工具包的一部分,旨在提供通用线性代数例程的高性能GPU加速实现。在大量使用线性代数的应用中,它们可以显著加快计算速度。

参考

https://github.com/NVIDIA/FasterTransformer
https://developer.nvidia.com/blog/accelerated-inference-for-large-transformer-models-using-nvidia-fastertransformer-and-nvidia-triton-inference-server/
Bo Yang Hsueh, NVIDIA
https://www.nvidia.com/en-us/search/?page=1&q=Bo%20Yang%20Hsueh&sort=relevance
https://developer.nvidia.com/zh-cn/blog/accelerated-inference-for-large-transformer-models-using-nvidia-fastertransformer-and-nvidia-triton-inference-server/

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

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

相关文章

智能优化算法应用:基于人工水母算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于人工水母算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于人工水母算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工水母算法4.实验参数设定5.算法结果6.参考…

C语言-详解指针

目录 一.内存 1.内存的定义 2.内存的结构图 二.地址 1.什么是地址 2.什么是变量的地址 三.什么是指针 1.指针的定义 四.如何获取数据存储空间的地址 1.&运算符 五.指针变量 1.什么是指针变量(一级指针变量) 2.指针变量的定义 3…

Opencv库如何检测图片中鸡蛋数量

Opencv库检测图片中鸡蛋数量 由于需要写一个检测鸡蛋数量的程序,用了几个opencv中的经典方法,实现了图片中鸡蛋的检测。在一步步实现的同时,同时说明每个方法的用途。希望能给学习opencv的小伙伴一些帮助。下图为原始图和实现后的检测边框。…

ubuntu20.04找不到#include<opencv/cv.h>文件

编译ROS包的时候出现错误&#xff1a;fatal error&#xff1a;opencv/cv.h : No such file or directory #include<opencv/cv.h> 查看opencv4版本&#xff1a; pk-config --modversion opencv4: 在opencv4中opencv2的cv.h融合进了imgproc.hpp里: 把源码中的#include …

字节跳动开源基于SD1.5的 MagicAnimate 一张照片秒变真人舞蹈视频

项目地址&#xff1a;https://github.com/magic-research/magic-animate 显卡要求&#xff1a;12G MagicAnimate是一项利用先进的扩散模型实现人体图像动画的创新性项目。其核心优势在于确保生成内容的时间一致性&#xff0c;通过提供预训练的稳定扩散V1.5和MSE微调的VAE基础…

Python-炸弹人【附完整源码】

炸弹人 炸弹人是童年的一款经典电子游戏&#xff0c;玩家控制一个类似"炸弹人"的角色&#xff0c;这个角色可以放置炸弹&#xff0c;并在指定的时间内引爆它们消灭敌人以达到目标&#xff0c;此游戏共设有两节关卡&#xff0c;代码如下&#xff1a; 运行效果&#x…

Qt/C++视频监控拉流显示/各种rtsp/rtmp/http视频流/摄像头采集/视频监控回放/录像存储

一、前言 本视频播放组件陆陆续续写了6年多&#xff0c;一直在持续更新迭代&#xff0c;视频监控行业客户端软件开发首要需求就是拉流显示&#xff0c;比如给定一个rtsp视频流地址&#xff0c;你需要在软件上显示实时画面&#xff0c;其次就是录像保存&#xff0c;再次就是一些…

22、pytest多个参数化的组合

官方实例 # content of test_multi_parametrie.py import pytestpytest.mark.parametrize("x",[0,1]) pytest.mark.parametrize("y",[2,3]) def test_foo(x,y):print("{}-{}".format(x,y))pass解读与实操 要获得多个参数化参数的所有组合&…

vue3里面使用ref和toRef、toRefs

vue3 里面我们经常会使用ref()来接受内部值&#xff0c;返回一个响应式的对象。创建可以使用任何类型的响应式ref。这里对象是响应式的&#xff0c;可以进行更改的&#xff0c;对象有一个value属性&#xff0c;其值就是所传递的原始值。ref() 将传入参数的值包装为一个带 .valu…

【链表Linked List】力扣-83 删除排序链表中的重复元素

目录 题目描述 解题过程 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&#xff1…

【每日OJ —— 94. 二叉树的中序遍历】

每日OJ —— 94. 二叉树的中序遍历 1.题目&#xff1a;94. 二叉树的中序遍历2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;94. 二叉树的中序遍历 2.解法 2.1.算法讲解 1.首先如果在每次每个节点遍历的时候都去为数组开辟空间&#xff0c;这样的效率太低…

android开发市场被抢占,鸿蒙能入行吗?

根据最新的数据&#xff0c;华为Mate60系列在上市第二周就成功占据了国内手机市场的17%份额&#xff0c;排名第二。而机构预测&#xff0c;华为手机在第37周有望超过20%的市场份额&#xff0c;成为国内手机市场的冠军。 一开始&#xff0c;人们对HarmonyOSNEXT持保留态度&…

国产麒麟操作系统部署记录

前提&#xff1a;部署项目首先要安装各种软件&#xff0c;在内网环境下无法在线下载。 思路&#xff1a;首先部署一台能上网的系统&#xff0c;在此系统下只下载包&#xff0c;然后传到另一台内网系统下进行安装&#xff1b; 1、最开始yum未安装&#xff0c;因此需要先安装yu…

PHP短信接口防刷防轰炸多重解决方案三(可正式使用)

短信接口盗刷轰炸&#xff1a;指的是黑客利用非法手段获取短信接口的访问权限&#xff0c;然后使用该接口发送大量垃圾短信给目标用户 短信验证码轰炸解决方案一(验证码类解决)-CSDN博客 短信验证码轰炸解决方案二(防止海外ip、限制ip、限制手机号次数解决)-CSDN博客 PHP短信…

JavaScript 数组方法 reduce() 的用法

一、概述 在JavaScript中&#xff0c;reduce()方法是一个非常实用的数组方法&#xff0c;它接收一个函数作为累加器&#xff08;accumulator&#xff09;&#xff0c;数组中的每个值&#xff08;从左到右&#xff09;开始缩减&#xff0c;最终为一个值。这个方法在处理数组…

数据结构 | 二叉树的各种遍历

数据结构 | 二叉树的各种遍历 文章目录 数据结构 | 二叉树的各种遍历创建节点 && 创建树二叉树的前中后序遍历二叉树节点个数二叉树叶子节点个数二叉树第k层节点个数二叉树查找值为x的节点二叉树求树的高度二叉树的层序遍历判断二叉树是否是完全二叉树 我们本章来实现二…

【C语言】指针与数组的潜在联系

目录 前言 改变固有数组的平面思维 注意&#xff1a; 数组操作与指针等价 指针数组 数组指针 笔试加深理解&#xff1a; 解析&#xff1a; 前言 《C Traps and Pitfalls》(C语言缺陷与陷阱)中有一句著名的见解&#xff1a; “在C语言中&#xff0c;指针与数组这两个概念…

MUC\GD32低功耗模式简介

 前言 低功耗模式在现在的开发中尤为重要&#xff0c;特别是在使用电池的设备中&#xff0c;今天我们就拿GD32来聊一聊低功耗模式&#xff0c;以及他们使用的状态与唤醒方式以及耗电情况。 GD32支持的低功耗模式&#xff1a;  省电模式 MCU支持三种省电模式&#xff0…

SpringBoot3-创建自定义启动器,使用自定义starter启动器

1、创建自定义启动工程pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.a…

647. Palindromic Substrings 516. Longest Palindromic Subsequence

647. Palindromic Substrings Given a string s, return the number of palindromic substrings 回文子串 in it. A string is a palindrome when it reads the same backward as forward. A substring is a contiguous sequence of characters within the string. nomal: …