Faster Transformer

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.mfbz.cn/a/221955.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【matlab程序】matlab画太极图|阴阳

【matlab程序】matlab画太极图|阴阳 %% 海洋与大气科学; % 时间:20231205; % clear;clc;close all; t=0:1/100000:2pi+0.00001; t1=-pi/2:1/100000:pi/2+0.00001; t2=pi/2:1/100000:3pi/2+0.00001; R=10; r=1; figure plot(Rcos(t),Rsin(t),‘color’,‘k’,‘lin…

网络安全威胁——计算机病毒

计算机病毒 1. 定义2. 计算机病毒的特点3. 计算机病毒的常见类型和攻击方式4. 如何防御计算机病毒 1. 定义 计算机病毒是计算机程序编制者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或程序代码。因其特点与生…

用AI批量生成文章的工具有哪些?免费AI生成工具

人工智能(AI)技术不断演进,为许多领域带来了前所未有的便利。其中,AI生成文章技术作为一个备受关注的领域,为大家提供了独特的解决方案,特别是在批量文章生成的需求上。 1. AI生成文章的方法 开放式AI模型…

智能井盖传感器,预警井盖倾斜的办法

城市生命线就像人体的“神经”和“血管”,是城市安全运行的保障。随着数字化时代的到来,智能井盖传感器作为城市生命线的一个重要组成部分,逐渐变得越来越“聪明”,它让城市由井盖引发的风险感知预警更加高效,进一步提…

mysql原理--重新认识MySQL,字符集,比较规则

1.MySQL请求处理 1.1.查询缓存 MySQL 服务器程序处理查询请求时,会把刚刚处理过的查询请求和结果缓存起来,如果下一次有一模一样的请求过来,直接从缓存中查找结果就好了,就不用再傻呵呵的去底层的表中查找了。这个查询缓存可以在不…

Python-封装配置文件

Code [url] baidu http://www.baidu.com[value] send_value 百度[server] ip 220.181.111.188封装的格式可以套用 # 封装,类似函数调用 import configparserclass ReadConfigIni():def __init__(self,filename):self.cf configparser.ConfigParser()self.cf.read(filenam…

低成本物联网安全芯片ACL16_S 系列,可应用物联网认证、 SIM、防抄板和设备认证等产品上

ACL16_S 芯片是针对物联网认证、 SIM、防抄板和设备认证需求推出的高安全芯片。芯片采用 32 位 ARMCortex™-M0 系列内核,片内集成多种安全密码模块,包括 RSA/ECC DES/TDES、 SHA-1/-256、 AES-128/-192/-256 等国际安全算法,支持真随机数发…

HTML5+CSS3+JS小实例:焦点图波浪切换动画特效

实例:焦点图波浪切换动画特效 技术栈:HTML+CSS+JS 字体图标库:Font Awesome 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name=&…

在 Windows 上恢复出厂设置后恢复数据 – 恢复您的文件!

您最近是否因性能问题恢复过您的电脑&#xff1f;如果是&#xff0c;您必须检查您的所有个人数据是否安全。许多用户反映恢复后找不到数据。如果您面临同样的问题&#xff0c;那么这篇文章非常适合您&#xff01; 在本篇文章中&#xff0c;我们将讨论一些恢复在 Windows 上执行…

一个转录组上游分析流程 | Hisat2-Stringtie

本期的教程代码&#xff08;部分&#xff09; #!/bin/bash # # 使用fastq-dump解压sra数据 # 本数据集为双端数据 # 解压格式为fq.gz for i in SRR6929571 SRR6929572 SRR6929573 SRR6929574 SRR6929577 SRR6929578; do pfastq-dump --split-files --threads 20 --gzip -s 00_…

长文!自动化立体库的前世今生

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;你的老朋友&#xff0c;老K。行业群 甲乙双方人脉互配神器--->千人俱乐部 自动化立体库是在谈到自动化仓储物流系统中最常被人提起的一项。很多的物流装备厂家即使本行不是做立体仓库的&#xff0c;也往…

深圳锐杰金融的慈善承诺:健康社区,绿色未来

深圳市锐杰金融投资有限公司&#xff0c;作为中国经济特区的中流砥柱&#xff0c;近年来以其杰出的金融成绩和坚定的社会责任立场引人注目。然而&#xff0c;这并非一个寻常的金融机构。锐杰金融正在用自己的方式诠释企业责任和慈善精神&#xff0c;通过一系列独特的慈善项目&a…

DCGAN生成网络模型

DCGAN&#xff08;Deep Convolutional Generative Adversarial Network&#xff09;是一种生成对抗网络&#xff08;GAN&#xff09;的变体&#xff0c;专门设计用于生成图像。它结合了卷积神经网络&#xff08;CNN&#xff09;和生成对抗网络的概念&#xff0c;旨在生成具有高…

Git版本管理配置说明 - Visual Studio

一、 Git服务端配置 在源代码管理服务器新建文件夹,并配置共享访问权限Everyone(读取/写入)。 在本地访问这台服务器共享目录,确保正确打开。 在VS中打开项目,点选Git更改,点击“创建Git仓库”,创建项目初始版本。 弹出如下对话框: 因为我们只是在局域网中开发项…

【Wireshark工具使用】Wireshark无法抓取TwinCAT的EtherCAT包(已解决)

写在前面 因项目需要&#xff0c;近期在在深入研究EtherCAT协议&#xff0c;之后会将协议做一个系统的总结&#xff0c;分享在这个分栏。在研究EtherCAT协议帧时&#xff0c;使用了一个网络数据分析工具Wireshark&#xff0c;本文是关于EtherCAT数据帧分析工具使用中遇到的一个…

C++ 图论之Floyd算法求解次最短路径的感悟,一切都是脱壳后找最值而已

公众号&#xff1a;编程驿站 1. 前言 抛开基因的影响&#xff0c;学霸和学渣到底是在哪一点上有差异&#xff1f; 学霸刷完 200 道题&#xff0c;会对题目分类&#xff0c;并总结出解决类型问题的通用模板&#xff0c;我不喜欢模板这个名词&#xff0c;感觉到投机的意味&…

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

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

Netty核心知识总结

Netty是一个高性能、异步事件驱动的NIO框架&#xff0c;它提供了对TCP、UDP和文件传输的支持&#xff0c;作为一个异步NIO框架&#xff0c;Netty的所有IO操作都是异步非阻塞的&#xff0c;通过Future-Listener机制&#xff0c;用户可以方便的主动获取或者通过通知机制获得IO操作…

ElasticSearch篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、了解ElasticSearch 深翻页的问题及解决吗?二、熟悉ElasticSearch 性能优化三、ElasticSearch 查询优化手段有哪些?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这…

Linux 和 macOS 的主要区别在哪几个方面呢?

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…