色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

          EEPW首頁 > 博客 > 消費級GPU成功運行1760億參數(shù)大模型

          消費級GPU成功運行1760億參數(shù)大模型

          發(fā)布人:機(jī)器之心 時間:2022-08-20 來源:工程師 發(fā)布文章

          在消費級 GPU 上運行大規(guī)模模型是機(jī)器學(xué)習(xí)社區(qū)正面臨的挑戰(zhàn)。


          語言模型的規(guī)模一直在變大,PaLM 有 540B 參數(shù),OPT、GPT-3 和 BLOOM 有大約 176B 參數(shù),模型還在朝著更大的方向發(fā)展。

          圖片


          這些模型很難在易于訪問的設(shè)備上運行。例如,BLOOM-176B 需要在 8 個 80GB A100 GPU(每個約 15000 美元)上運行才能完成推理任務(wù),而微調(diào) BLOOM-176B 則需要 72 個這樣的 GPU。PaLM 等更大的模型將需要更多的資源。
          我們需要找到方法來降低這些模型的資源需求,同時保持模型的性能。領(lǐng)域內(nèi)已經(jīng)開發(fā)了各種試圖縮小模型大小的技術(shù),例如量化和蒸餾。
          BLOOM 是去年由 1000 多名志愿研究人員在一個名為「BigScience」的項目中創(chuàng)建的,該項目由人工智能初創(chuàng)公司 Hugging Face 利用法國政府的資金運作,今年 7 月 12 日 BLOOM 模型正式發(fā)布。
          使用 Int8 推理會大幅減少模型的內(nèi)存占用,卻不會降低模型的預(yù)測性能?;诖?,來自華盛頓大學(xué)、Meta AI 研究院等(原 Facebook AI Research )機(jī)構(gòu)的研究員聯(lián)合 HuggingFace 開展了一項研究,試圖讓經(jīng)過訓(xùn)練的 BLOOM-176B 在更少的 GPU 上運行,并將所提方法完全集成到 HuggingFace Transformers 中。

          圖片


          • 論文地址:https://arxiv.org/pdf/2208.07339.pdf
          • Github 地址:https://github.com/timdettmers/bitsandbytes


          該研究為 transformer 提出了首個數(shù)十億規(guī)模的 Int8 量化過程,該過程不會影響模型的推理性能。它可以加載一個具有 16-bit 或 32-bit 權(quán)重的 175B 參數(shù)的 transformer,并將前饋和注意力投影層轉(zhuǎn)換為 8-bit。其將推理所需的內(nèi)存減少了一半,同時保持了全精度性能。
          該研究將向量量化和混合精度分解的組合命名為 LLM.int8()。實驗表明,通過使用 LLM.int8(),可以在消費級 GPU 上使用多達(dá) 175B 參數(shù)的 LLM 執(zhí)行推理,而不會降低性能。該方法不僅為異常值對模型性能的影響提供了新思路,還首次使在消費級 GPU 的單個服務(wù)器上使用非常大的模型成為可能,例如 OPT-175B/BLOOM。

          圖片


          方法簡介
          機(jī)器學(xué)習(xí)模型的大小取決于參數(shù)的數(shù)量及其精度,通常是 float32、float16 或 bfloat16 之一。float32 (FP32) 代表標(biāo)準(zhǔn)化的 IEEE 32 位浮點表示,使用這種數(shù)據(jù)類型可以表示范圍廣泛的浮點數(shù)。FP32 為「指數(shù)」保留 8 位,為「尾數(shù)」保留 23 位,為數(shù)字的符號保留 1 位。并且,大多數(shù)硬件都支持 FP32 操作和指令。
          而 float16 (FP16) 為指數(shù)保留 5 位,為尾數(shù)保留 10 位。這使得 FP16 數(shù)字的可表示范圍遠(yuǎn)低于 FP32,面臨溢出(試圖表示一個非常大的數(shù)字)和下溢(表示一個非常小的數(shù)字)的風(fēng)險。
          出現(xiàn)溢出時會得到 NaN(非數(shù)字)的結(jié)果,如果像在神經(jīng)網(wǎng)絡(luò)中那樣進(jìn)行順序計算,那么很多工作都會崩潰。bfloat16 (BF16) 則能夠避免這種問題。BF16 為指數(shù)保留 8 位,為小數(shù)保留 7 位,意味著 BF16 可以保留與 FP32 相同的動態(tài)范圍。
          理想情況下,訓(xùn)練和推理應(yīng)該在 FP32 中完成,但它的速度比 FP16/BF16 慢,因此要使用混合精度來提高訓(xùn)練速度。但在實踐中,半精度權(quán)重在推理過程中也能提供與 FP32 相似的質(zhì)量。這意味著我們可以使用一半精度的權(quán)重并使用一半的 GPU 來完成相同的結(jié)果。
          但是,如果我們可以使用不同的數(shù)據(jù)類型以更少的內(nèi)存存儲這些權(quán)重呢?一種稱為量化的方法已廣泛用于深度學(xué)習(xí)。
          該研究首先在實驗中用 2-byte BF16/FP16 半精度代替 4-byte FP32 精,實現(xiàn)了幾乎相同的推理結(jié)果。這樣一來,模型減小了一半。但是如果進(jìn)一步降低這個數(shù)字,精度會隨之降低,那推理質(zhì)量就會急劇下降。
          為了彌補(bǔ)這一點,該研究引入 8bit 量化。這種方法使用四分之一的精度,因此只需要四分之一模型大小,但這不是通過去除另一半 bit 來實現(xiàn)的。

          圖片


          兩種最常見的 8-bit 量化技術(shù)為 zero-point 量化和 absmax(absolute maximum)量化。這兩種方法將浮點值映射為更緊湊的 int8(1 字節(jié))值。
          例如,在 zero-point 量化中,如果數(shù)據(jù)范圍是 -1.0——1.0,量化到 -127——127,其擴(kuò)展因子為 127。在這個擴(kuò)展因子下,例如值 0.3 將被擴(kuò)展為 0.3*127 = 38.1。量化通常會采用四舍五入(rounding),得到了 38。如果反過來,將得到 38/127=0.2992——在這個例子中有 0.008 的量化誤差。這些看似微小的錯誤在通過模型層傳播時往往會累積和增長,并導(dǎo)致性能下降。

          圖片


          雖然這些技術(shù)能夠量化深度學(xué)習(xí)模型,但它們通常會導(dǎo)致模型準(zhǔn)確率下降。但是集成到 Hugging Face Transformers 和 Accelerate 庫中的 LLM.int8(),是第一種即使對于帶有 176B 參數(shù)的大型模型 (如 BLOOM) 也不會降低性能的技術(shù)。
          LLM.int8()算法可以這樣解釋,本質(zhì)上,LLM.int8()試圖通過三個步驟來完成矩陣乘法計算:

          • 從輸入隱藏狀態(tài)中,按列提取異常值(即大于某個閾值的值)。
          • 將 FP16 中的異常值與 int8 中的非異常值進(jìn)行矩陣乘法。
          • 在 FP16 中對非異常值進(jìn)行去量化,將異常值和非異常值相加,得到完整的結(jié)果。


          這些步驟可以在下面的動畫中總結(jié):

          圖片


          最后,該研究還關(guān)注了一個問題:速度比原生模型更快嗎?
          LLM.int8() 方法的主要目的是使大型模型更易于訪問而不會降低性能。但是,如果它非常慢,那么用處也不大了。研究團(tuán)隊對多個模型的生成速度進(jìn)行了基準(zhǔn)測試,發(fā)現(xiàn)帶有 LLM.int8() 的 BLOOM-176B 比 fp16 版本慢了大約 15% 到 23%——這是完全可以接受的。而較小的模型(如 T5-3B 和 T5-11B)的減速幅度更大。研究團(tuán)隊正在努力提升這些小型模型的運行速度。

          圖片



          *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          關(guān)鍵詞: 芯片

          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉