大模型基架:Transformer如何做優化?

大模型的基礎模式是transformer,所以很多芯片都實現先專門的transformer引擎來加速模型訓練或者推理。本文將拆解Transformer的算子組成,展開具體的數據流分析,結合不同的芯片架構實現,分析如何做性能優化。

Transformer結構

transformer結構包含兩個過程,Encoder和Decoder。其中Decoder較Encoder結構相同,多了對于kv_cache的處理。

如下圖經典的結構示意圖,可以看到在Decoder階段的Multi-Head Attentiond的三個輸入箭頭其中兩個來自Encoderde輸出,關于kv-cache對內容管理的優化也是一個很重要的研究方向。本文暫時重點關注與Transformer的Encoder階段的優化分析。

Transformer的數據流圖

下圖對應上面transformer的左邊Encoder階段。不同顏色表示不同的算子,其中linear, 其實也是一種matmul算子,只不過它的兩個輸入一個來自tensor, 一個來自常量。藍色標記的matmul算子則兩個輸入全部是tensor。

包含的算子為:linear, matmul, transpose, softmax, add_layernorm。

通過代入參數,了解具體的數據流執行過程,可以讓我們更加直觀的理解下面的優化之后,得到相同的輸出數據的思路。

優化設計1:圖優化

根據上面的數據流圖可以發現,transpose算子只是對數據進行重排,并不需要計算,但是過多的transpose算子需要不停從內存搬移數據,消耗緊缺的帶寬資源,所以一個簡單的優化點就是通過硬件架構的設計,來減少transpose層。

對硬件來說,在實現GEMM算子是的時候,對兩個矩陣取數過程,增加一個transpose的邏輯,?不會消耗很多的資源,所以可以對GEMM的兩個輸入數據,分別設計是否打開transpose的參數。

假設GEMM算子原始的數據存放排布矩陣A為(batch, M, K), 矩陣B為(batch, K, N)。得到的輸出為(Batch, M , N)。下面對transpose的多頭注意力模塊進行優化,示例了兩種方案,來減少單獨的transpose算子開銷。

transpose前置(A_transpose_en)

利用矩陣A的transpose開關,將q, k, v的transpose前置,?數據流圖如下,這樣可以將原本的5個transpose操作減小為2個。

注意圖中用紅色和藍色標記了GEMM算子的矩陣A,矩陣B的設定,當一個linear或者matmul算子的兩個輸入中顯示(Batch, K, M)時候,即認為打開了GEMM算子的A矩陣transpose開關

transpose內置(B_transpose_en)

當利用B矩陣的transpose_en功能,優化后的數據流圖如下。在QV的matmul計算過程,逆向利用矩陣B的transpose開關,這樣可以將原本的5個transpose操作減小為1個。

當一個linear或者matmul算子的兩個輸入中顯示(Batch, N, K)時候,即認為打開了GEMM算子的B矩陣transpose開關

???????????????

通過上面兩個方案,大家可能會對attnV_matmul那一步的數據流關于head位置有點疑問,在這里我們不妨這樣考慮,將head分給多個thread線程來做,只要thread的數據位置取的對,是可以將(batch, head,seq_len_q, seq_len_k)和(batch, seq_len_v, head, hidden/head)進行矩陣乘得到(batch, head, seq_len_q, hidden/head)的輸出的。

優化設計2:任務并行拆解

模型的分布式并行策略有數據并行,張量并行,pipline 并行等,這些策略的一個要點就是合理利用集群資源,讓更多的任務并行基礎上,減少中間節點的數據通信。

當我們在一個有很多節點的集群上部署大模型時候,因為模型數據維度較大,往往需要將其拆解到不同的芯片(集群)運行,尤其是GEMM算子,不同的拆分方案對應不同的通信開銷。下面我們來具體分析一個任務并行的拆解方案。

如圖,首先針對attention模塊的多頭特征,選擇在qkv_linear的weights的outZ方向切分為head份,假設有head個計算節點,每個節點計算1個head的matmul任務,因為沒有在累加的維度拆分,所以這樣每個節點可以順序執行下一層任務,不需要交互數據。直到attnV_matmul之后,需要做fc0_linear的任務,要把所有的head合并起來累加運算,所以增加了all_gather的通信開銷。接著為了避免通信開銷,fc0和add_layernorm選擇在seq維度拆分。當到達fc1_linear,對depth_hidden進行了拆分,但是fc2_linear需要對所有的depth_hidden進行累加,所以fc2_linear之前需要再一次的all_gather通信。

當然根據具體的硬件條件限制,還可以有其他的任務拆解方案,總之,需要具體場景具體分析。這里僅做簡單的優化示例參考。

歡迎評論交流,如果覺得內容有幫助,需要您的點贊鼓勵!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/22988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/22988.shtml
英文地址,請注明出處:http://en.pswp.cn/web/22988.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

go的反射和斷言

在go中對于一個變量,主要包含兩個信息變量類型(type)和變量值(value) 可以通過reflect包在運行的時候動態獲取變量信息,并能夠進行操作 對于Type可以通過reflect.TypeOf()獲取到變量的類型信息 reflect.Ty…

13_前端工程化_ES6

1.前端工程化概念 前端工程化是使用軟件工程的方法來單獨解決前端的開發流程中模塊化、組件化、規范化、自動化的問題,其主要目的為了提高效率和降低成本。 前后端分離(前端代碼工程化獨立出來形成一個單獨的app) 1.開發分離 2.部署分離 3.服務器分離…

信號(上)

本節目標: 1. 掌握Linux信號的基本概念 2. 掌握信號產生的一般方式 3. 理解信號遞達和阻塞的概念,原理。 4. 掌握信號捕捉的一般方式。 5. 重新了解可重入函數的概念。 6. 了解競態條件的情景和處理方式 7. 了解SIGCHLD信號, 重新編寫信號處理…

ChatGPT基本原理詳細解說

ChatGPT基本原理詳細解說 引言 在人工智能領域,自然語言處理(NLP)一直是研究的熱點之一。隨著技術的發展,我們見證了從簡單的聊天機器人到復雜的語言模型的演變。其中,ChatGPT作為一項突破性技術,以其強大…

【Vue】自定義指令-v-loading指令的封裝

場景 實際開發過程中,發送請求需要時間,在請求的數據未回來時,頁面會處于空白狀態 > 用戶體驗不好 需求 封裝一個 v-loading 指令,實現加載中的效果 分析 本質 loading效果就是一個蒙層,蓋在了盒子上 數據請求…

從零開始精通Onvif之設備發現

設備發現的意義 在復雜的網絡環境中,如何快速而準確地識別網絡上的Onvif設備,對于攝像頭廠商、系統集成商、開發人員乃至最終用戶來說,都顯得至關重要。 首先,設備發現有效簡化了集成的復雜度。在沒有統一標準之前,每個…

2004NOIP普及組真題 2. 花生采摘

線上OJ: 【04NOIP普及組】花生采摘 核心思想: 1、本題為貪心即可。 2、因為本題嚴格限制了順序,所以先把每個節點的花生數量按降序排序。然后逐一判斷下一個花生是否需要去采摘即可 3、每一次采摘完,記錄耗時 t 以及采集的花…

力扣第417題測試程序

題目描述: 有一個 m n 的矩形島嶼,與 太平洋 和 大西洋 相鄰。 “太平洋” 處于大陸的左邊界和上邊界,而 “大西洋” 處于大陸的右邊界和下邊界。 這個島被分割成一個由若干方形單元格組成的網格。給定一個 m x n 的整數矩陣 heights &#…

基于web的垃圾分類回收系統的設計

管理員賬戶功能包括:系統首頁,個人中心,管理員管理,用戶管理,公告管理,運輸管理,基礎數據管理 用戶賬戶功能包括:系統首頁,個人中心,運輸管理,公告…

pyqt QlineEdit內部增加按鈕方法

pyqt QlineEdit內部增加按鈕方法 def addButton(self,lineEdit):btn QtWidgets.QPushButton("")icon1 QtGui.QIcon()icon1.addPixmap(QtGui.QPixmap(":/image/images/th.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)btn.setIcon(icon1)btn.setStyleShe…

全光譜led燈的危害有哪些?曝光低質量全光譜led燈產生的四大風險

眼睛是人類獲取信息最重要的感官器官之一,而近視則會導致視力模糊,進而影響學習效果和生活品質。因此,如何保護眼睛,尤其是在學習和使用電子設備時,成為了一個迫切需要解決的問題。然而在護眼領域上,護眼臺…

【DevOps】網絡安全進階之路:打造更安全、更可靠的網站

目錄 一、網站面臨的主要安全威脅 1、SQL注入攻擊 2、跨站腳本攻擊(XSS) 3、跨站請求偽造(CSRF) 4、文件上傳漏洞 5、不安全的直接對象引用 6、安全配置錯誤 7、使用含有已知漏洞的組件 二、網站安全防護措施 1、輸入驗證與過濾 2、使用參數化查詢 3、數據輸出編碼…

SCAU 數據結構 實驗六 排序算法

![[Pasted image 20240 8638 直接插入排序 Description 用函數實現直接插入排序,并輸出每趟排序的結果. 輸入格式 第一行:鍵盤輸入待排序關鍵的個數n 第二行:輸入n個待排序關鍵字,用空格分隔數據 輸出格式 每行輸出一趟排序…

掌握Java設計模式的23種武器(全):深入解析與實戰示例

目錄 一、創建型模式 1. 單例模式 (Singleton Pattern) 2. 工廠模式 (Factory Pattern) 3. 抽象工廠模式 (Abstract Factory Pattern) 4. 建造者模式 (Builder Pattern) 5. 原型模式 (Prototype Pattern) 二、結構型模式 6. 適配器模式 (Adapter Pattern) 7. 橋接模式…

通信的本質是什么

通信的本質是信息的傳遞和交換。在通信過程中,信息從一個主體(發送方)傳遞到另一個主體(接收方),目的是使接收方理解或使用發送方傳遞的信息。無論使用什么樣的媒介或技術,通信的核心都是在不同…

十三、resultMap解析

分為兩部分:解析和使用 解析 1.解析XML的時候單獨解析所有的resultMap標簽,封裝成ResultMap對象存入configuration中 2.解析XML中的SQL語句,封裝MappedStatement對象,這里會根據SQL的返回類型是resultMap還是resultType做處理。如…

C語言 | Leetcode C語言題解之第133題克隆圖

題目: 題解: struct Node** visited; int* state; //數組存放結點狀態 0:結點未創建 1:僅創建結點 2:結點已創建并已填入所有內容void bfs(struct Node* s) {if (visited[s->val] && state[s->val] 2…

【嵌入式系統實踐】實驗三EXTI按鈕外部中斷控制LED燈參考代碼

此內容不屬于實驗內容,因自己手頭有一STM32F103,故驗證性的進行代碼實驗,按照老師課堂ppt進行了一下復現。 通過按鈕控制LED燈的亮滅(狀態取反)。 main.c代碼: #include "STM32F10X.h" #include "stdio.h"…

Open3D Guided濾波(Python版本)

文章目錄 一、簡介二、實現代碼三、實現效果參考資料一、簡介 Guided Filter原本主要用于2D圖像的降噪等處理,但經過適當的修改后,它可以有效地應用于3D點云的降噪。這種方法能夠保留點云中的細節信息,并且對邊緣和曲面進行保護。 其具體計算過程如下所述: 1.局部線性假設:…

Python Lambda函數的應用實例教程

在Python編程中,lambda函數是一種簡潔且強大的工具,用于創建小型匿名函數。它們在需要快速定義簡單函數時特別有用。本文將詳細介紹lambda函數的語法及其多種應用實例,幫助讀者更好地理解和使用lambda函數。 一、lambda函數的基本概念 1.1 什…