你正在 OpenAI 進行 AI 工程師面試。 面試官問: 「我們的 GPT 模型在 42 秒內生成 100 個標記。 你怎麼讓它快 5 倍?」 你:「我會分配更多的 GPU 以加快生成速度。」 面試結束。 這是你錯過的:
真正的瓶頸不是計算,而是冗餘計算。 如果沒有 KV 快取,您的模型會為每個標記重新計算鍵和值,重複工作。 - 使用 KV 快取 → 9 秒 - 不使用 KV 快取 → 42 秒(約慢 5 倍) 讓我們深入了解它是如何運作的!
要理解 KV 緩存,我們必須知道 LLM 如何輸出標記。 - Transformer 為所有標記生成隱藏狀態。 - 隱藏狀態被投影到詞彙空間。 - 最後一個標記的 logits 用於生成下一個標記。 - 對後續標記重複此過程。 查看這個👇
因此,要生成一個新的代幣,我們只需要最近代幣的隱藏狀態。 不需要其他任何隱藏狀態。 接下來,讓我們看看最後的隱藏狀態是如何在變壓器層中通過注意力機制計算的。
在注意力期間: 查詢-鍵-產品的最後一行涉及: - 最後的查詢向量。 - 所有鍵向量。 此外,最終注意力結果的最後一行涉及: - 最後的查詢向量。 - 所有鍵和值向量。 查看這個視覺以更好地理解:
上述見解表明,為了生成一個新的代幣,網絡中的每個注意力操作只需要: - 最後一個代幣的查詢向量。 - 所有的鍵值和數值向量。 但是,這裡還有一個更重要的見解。
當我們生成新的代幣時: - 用於所有先前代幣的 KV 向量不會改變。 因此,我們只需要為前一步生成的代幣生成一個 KV 向量。 其餘的 KV 向量可以從緩存中檢索,以節省計算和時間。
這被稱為 KV 快取! 重申一下,與其冗餘地計算所有上下文標記的 KV 向量,不如將它們快取起來。 要生成一個標記: - 為前一步生成的標記生成 QKV 向量。 - 從快取中獲取所有其他 KV 向量。 - 計算注意力。 查看這個👇
KV 緩存通過在生成標記之前計算提示的 KV 緩存來加速推理。 這正是為什麼 ChatGPT 生成第一個標記所需的時間比其餘標記更長的原因。 這種延遲被稱為首次標記時間(TTFT)。 改善 TTFT 是另一個話題!
69.16K