使用PyTorch II的新特性加快LLM推理速度

Pytorch團隊提出了一種純粹通過PyTorch新特性在的自下而上的優化LLM方法,包括:

Torch.compile: PyTorch模型的編譯器

GPU量化:通過降低精度操作來加速模型

推測解碼:使用一個小的“草稿”模型來加速llm來預測一個大的“目標”模型的輸出

張量并行:通過在多個設備上運行模型來加速模型。

我們來看看這些方法的性能比較:

作為對比,傳統的方式進行LLaMA-7b的推理性能為25tokens/秒,我們來看看看這些方法對推理性能的提高。

使用新的編譯器和分配(76 TOK/S):

Pytorch分析了cpu限制的性能問題。這意味著編譯開銷是提高效率的首要目標。

所以使用編譯器將較大的區域編譯為預編譯狀態,每個操作的CPU調用數量會減少。這意味著該包裝器現在可以在沒有間隙的情況下執行,如下所示。

代碼也非常簡單:

 torch.compile(decode_one_token, mode="reduce-overhead", fullgraph=True)

當生成更多令牌時,kv-cache會增長,每次緩存增長時都需要重新分配和復制(昂貴的計算)。聲明大緩存以允許最大大小。

在預填充階段需要分別編譯兩種策略。整個提示被動態處理,令牌被解碼為上面所示的代碼。保持這些策略并行可以進一步優化。單獨使用這兩種策略,可以獲得3倍的推理性能提高。

消除內存瓶頸,(102 TOK/S)

以靜態方式為緩存分配最大內存時,會使內存問題變得更糟,因為我們上面只是讓CPU計算更加高效,比如緩存肯定會加大內存的使用。

優化內存的最簡單方式就是量化。量化試圖將權重和計算轉換為Int8甚至Int4——這將矩陣的大小減少了4 - 16倍,從而在矩陣操作期間大量節省內存。

如果有72億個參數需要處理,每個權重需要2字節(fp16)來保存;我們可以計算每秒生成100個令牌所需的帶寬。這意味著,要以每秒100個令牌的速度運行推理,我們需要處理總計1.4TB的內存吞吐量。A100的理論上限為2Tb/s,這意味著使用72%的帶寬(沒有瓶頸),A100可以輕松地每秒運行100個令牌。這取決于你的GPU,如果你是4090呢,大家可以計算一下,4090具有1008GBPS的內存帶寬,基本上就是少了一半還要少一些。

重構問題(157.4 TOK/s)

假設對于要生成的每個新單詞,要一次又一次地加載和處理所有標記。在自回歸世代中我們不需要序列依賴。我們可以使用草稿模型和驗證模型(緩慢但準確)并行生成下8個令牌,作為8個副本來驗證生成。與驗證器不匹配的草稿模型輸出將被丟棄。

根據Pytorch文檔,它不會降低生成文本的質量。實驗也證明了這一點。當運行codellam - 34b + codellam - 7b時,能夠在生成代碼時獲得2倍的token /s提升。當使用Llama-7B + TinyLlama-1B時,在token /s中獲得1.3倍的提升。

Int4 (202 TOK/s)

從浮點數變為Int8可以減少內存帶寬,我們可以通過將其降低到Int4來測試極限(最小值為-2147483648)。最大值為2147483647)。考慮到INT的范圍仍然從負到正十億,有足夠的細微差別,在獲得額外提升推理速度的同時,不會失去太多的準確性。

把上面所有的東西結合起來(240 TOK/s)

當所有上述方法一起使用時,由于不同策略的協同作用,還會帶來額外的21%的收益。

總結

可以看到,我們最終獲得了10倍左右的提高 25 TOK/s -》 246 TOK/s

使用Llama-7B,我們能夠使用編譯+ int4量化+推測解碼達到246 tok/s。通過llama-70B,我們還可以將張量并行性提高到80 tok/s。這些都接近或超過SOTA性能數字!

本文代碼:

https://avoid.overfit.cn/post/58c4ba8ee4f546ca81744c50733e46d9

作者:Dr. Mandar Karhade, MD. PhD

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

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

相關文章

成都工業學院Web技術基礎(WEB)實驗三:CSS字體等屬性使用

寫在前面 1、基于2022級計算機大類實驗指導書 2、代碼僅提供參考,前端變化比較大,按照要求,只能做到像,不能做到一模一樣 3、圖片和文字僅為示例,需要自行替換 4、如果代碼不滿足你的要求,請尋求其他的…

Oracle 慢查詢排查步驟

1. Oracle 慢查詢排查步驟 1.1. 前言 記錄一次 Oracle 慢查詢的排查過程 , 便于以后直接使用。 看了一些文檔 , Oracle 中優化的方案和 Mysql 基本上是一致的 , 通常包括一下幾個方向 : 基準測試 (吞吐量): 包括 Oracle 本身吞吐量和磁盤 I/O 吞吐量 硬件分析 (資源情況): 包…

rails3 row sql example

refer: https://stackoverflow.com/questions/14824453/rails-raw-sql-example 搜索怎么在Rails3 使用row sql, 打開上面的鏈接,可以找到這樣的答案,如下圖: sql "Select * from ... your sql query here" records_ar…

Nginx的server層外層的常見配置語句的解讀

有下面的Nginx配置: worker_processes auto; worker_rlimit_nofile 51200;events {use epoll;worker_connections 51200;multi_accept on; }http {include mime.types;default_type application/octet-stream;server_names_hash_bucket_size 512;client_max_body_size 50m;cli…

推薦4個優秀的 Python 時間序列分析庫

時間序列分析在金融和醫療保健等領域至關重要,在這些領域,理解隨時間變化的數據模式至關重要。在本文中,我們將介紹四個主要的Python庫——statmodels、tslearn、tssearch和tsfresh——每個庫都針對時間序列分析的不同方面進行了定制。這些庫…

最長子字符串的長度 (一) - 華為OD統一考試(C卷)

OD統一考試(C卷) 分值: 100分 題解: Java / Python / C 題目描述 給你一個字符串 s,字符串s首尾相連成一個環形,請你在環中找出字符出現了偶數次最長子字符串的長度。 輸入描述 輸入是一串小寫字母組成的…

VS2015編譯GDAL3.2.0+opencl+C#

參考借鑒https://www.cnblogs.com/litou/p/15004877.html 參考借鑒https://www.cnblogs.com/xiaowangba/p/6313903.html 參考借鑒gdal、proj、geos、sqlite等在VS2015下編譯和配置_vs2015編譯sqlite3-CSDN博客 參考借鑒Windows下GDAL3.1.2編譯 (VS2015)_gdal windows編譯-CS…

字符串String

字符串字面量 let s "hello";變量s屬于字符串字面量,它們屬于硬編碼進程序的字符串值,屬于不可變的類型。但并不是所有字符串的值都能夠在編寫代碼時確定。 String類型 String類型會在堆上分配到自己需要的存儲空間,所以它能夠…

Nacos簡介

1.Nacos簡介 1.1.為什么叫Nacos? 前四個字母分別為Naming和Configuration的前兩個字母,最后的s為service。 1.2.Nacos是什么? nacos是第二代微服務SpringCloudAlibaba開源的一款注冊中心和分布式配置中心組件,其功能上為第一代微…

聲明式數據建模、定義簡單易懂:下一代 ORM 助你效率倍增 | 開源日報 No.102

prisma/prisma Stars: 34.0k License: Apache-2.0 Prisma 是一個下一代 ORM,包括以下工具: Prisma Client:為 Node.js 和 TypeScript 自動生成的類型安全查詢構建器Prisma Migrate:聲明式數據建模和遷移系統Prisma Studio&#…

山人求道篇:五、交易中的大道至簡與奧卡姆剃刀

量化的剃刀不是減去因子、減去代碼,而是減去冗余信息量 市面上有的策略對各品種設置了不同參數,每個品種進場不一樣就算了,出場參數還不一樣,那你說他到底賺的是什么利潤呢? 他自己也不知道,主要目的是為…

鴻蒙應用開發(二)環境搭建

開發流程 IDE下載 首先下載HUAWEI DevEco Studio,介紹首次啟動DevEco Studio的配置向導: 運行已安裝的DevEco Studio,首次使用,請選擇Do not import settings,單擊OK。安裝Node.js與ohpm。node.js 是基于 V8 引擎構…

JavaScript常用技巧專題二

文章目錄 一、前言二、生成隨機字符串三、轉義HTML特殊字符四、單詞首字母大寫五、將字符串轉換為小駝峰六、刪除數組中的重復值七、移除數組中的假值八、獲取兩個數字之間的隨機數九、將數字截斷到固定的小數點十、日期10.1、計算兩個日期之間天數10.2、從日期中獲取是一年中的…

【Java編程實現 9 * 9 乘法表格打印四種形態,七種打法】

Java編程實現 9 * 9 乘法表格打印四種形態,七種方法打印 廢話篇打印 9 * 9 乘法表格嵌套for循環實現左下角打印嵌套for循環實現左上角打印嵌套for循環實現右上角打印嵌套for循環實現右下角打印 使用while循環打印 9 * 9 乘法表格(一)使用whil…

1003 我要通過!

“答案正確”是自動判題系統給出的最令人歡喜的回復。本題屬于 PAT 的“答案正確”大派送 —— 只要讀入的字符串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。 得到“答案正確”的條件是: 字符串中必須僅有 P、 A、 T這三種…

詳解Keras3.0 Layers API: Core layers

1、Input keras.Input(shapeNone,batch_sizeNone,dtypeNone,sparseNone,batch_shapeNone,nameNone,tensorNone, ) 參數說明 shape: 輸入張量的形狀。如果為None,則可以動態地指定形狀。batch_size: 批處理大小。如果為None,則可以動態地指定批處理大小…

基于SpringBoot+Vue前后端分離的景點數據分析平臺(Java畢業設計)

大家好,我是DeBug,很高興你能來閱讀!作為一名熱愛編程的程序員,我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里,我將會結合實際項目經驗,分享編程技巧、最佳實踐以及解決問題的方法。無論你是…

awt中文亂碼-Intellij IDEA

亂碼的根本原因在于秦始皇嘎太早了(bushi 解決方法:肉眼可見的編碼設置統一為GBK 1.打開設置找到文件編碼 2.肉眼可見的編碼統統改成GBK 有人該問了,為什么不改成utf-8,因為awt的編碼由操作系統決定,我的是win家庭中…

Nextui使用

安裝和使用 https://nextui.org/docs/frameworks/nextjs 自定義主題 https://nextui.org/docs/customization/customize-theme // tailwind.config.js const {nextui} require("nextui-org/react");/** type {import(tailwindcss).Config} */ module.exports {…

deepstream docker安裝

介紹 deepstream為dGPU和Jetson平臺提供dockers containers,這些鏡像可以方便開發者很快地部署deepstream應用。deepstream的docker images可以在NGC web中得到。 安裝Docker Docker 是一個開源的容器化平臺,它允許你構建,測試&#xff0c…