面向生產的 LLM 優化

2023-10-19 06:00:21

注意 : 本文同時也是 Transformers 的檔案。

以 GPT3/4、Falcon 以及 LLama 為代表的大語言模型 (Large Language Model,LLM) 在處理以人為中心的任務上能力突飛猛進,儼然已成為現代知識型行業的重要工具。

然而,在實際部署這些模型時,我們仍面臨不少挑戰:

  • 為了展現可媲美人類的文字理解和生成能力,LLM 的引數量一般需要達到數十億 (參見 Kaplan 等人Wei 等人 的論述),隨之而來的是對推理記憶體的巨大需求。
  • 在許多實際任務中,LLM 需要廣泛的上下文資訊,這就要求模型在推理過程中能夠處理很長的輸入序列。

這些挑戰的關鍵在於增強 LLM 的計算和儲存效能,特別是如何增強長輸入序列的計算和儲存效能。

本文,我們將回顧迄今為止那些最有效的技術,以應對高效 LLM 部署的挑戰:

  1. 低精度: 研究表明,低精度 (即 8 位元和 4 位元) 推理可提高計算效率,且對模型效能沒有顯著影響。
  2. Flash 注意力: Flash 注意力是注意力演演算法的一個變種,它不僅更節省記憶體,而且通過優化 GPU 記憶體利用率從而提升了計算效率。
  3. 架構創新: 考慮到 LLM 推理的部署方式始終為: 輸入序列為長文字的自迴歸文字生成,因此業界提出了專門的模型架構,以實現更高效的推理。這方面最重要的進展有 Alibi旋轉式嵌入 (rotary embeddings) 多查詢注意力 (Multi-Query Attention,MQA) 以及 分組查詢注意 (Grouped Query Attention,GQA)

本文,我們將從張量的角度對自迴歸生成進行分析。我們深入研究了低精度的利弊,對最新的注意力演演算法進行了全面的探索,並討論了改進的 LLM 架構。在此過程中,我們用實際的例子來展示每項技術所帶來的改進。

1. 充分利用低精度的力量

通過將 LLM 視為一組權重矩陣及權重向量,並將文字輸入視為向量序列,可以更好地理解 LLM 的記憶體需求。下面, 權重 表示模型的所有權重矩陣及向量。

迄今為止,一個 LLM 至少有數十億引數。每個引數均為十進位制數,例如 4.5689 通常儲存成 float32bfloat16float16 格式。因此,我們能夠輕鬆算出載入 LLM 所需的記憶體:

載入 \(X\) B 引數的 FP32 模型權重需要大約 4 * \(X\) GB 視訊記憶體

現如今,很少有模型以 float32 精度進行訓練,通常都是以 bfloat16 精度訓練的,在很少情況下還會以 float16 精度訓練。因此速算公式就變成了:

載入有 \(X\) B 引數的 BF16/FP16 模型權重需要大約 2 * \(X\) GB 視訊記憶體

對於較短的文字輸入 (詞元數小於 1024),推理的記憶體需求很大程度上取決於模型權重的大小。因此,現在我們假設推理的記憶體需求等於將模型載入到 GPU 中所需的視訊記憶體量。

我們舉幾個例子來說明用 bfloat16 載入模型大約需要多少視訊記憶體:

  • GPT3 需要 2 * 175 GB = 350 GB 視訊記憶體
  • Bloom 需要 2 * 176 GB = 352 GB 視訊記憶體
  • Llama-2-70b 需要 2 * 70 GB = 140 GB 視訊記憶體
  • Falcon-40b 需要 2 * 40 GB = 80 GB 視訊記憶體
  • MPT-30b 需要 2 * 30 GB = 60 GB 視訊記憶體
  • bigcode/starcoder 需要 2 * 15.5 = 31 GB 視訊記憶體

迄今為止,市面上視訊記憶體最大的 GPU 晶片是 80GB 視訊記憶體的 A100。前面列出的大多數模型需要超過 80GB 才能載入,因此必然需要 張量並行 和/或 流水線並行