大規模言語モデル(LLM)を実運用に導入する場合、2つの大きな課題は、それらが必要とする膨大な量のパラメータと、文脈情報を表現するための非常に長い入力シーケンスを扱う必要性から生じる。 Hugging Faceは、このようなモデルを扱った経験に基づき、これらのハードルに取り組むためのテクニックのリストを文書化した。
Hugging Faceの研究者であるPatrick von Platen氏が彼の記事で説明している3つのテクニックは、数値精度を下げて動作させること、フラッシュ・アテンションとして知られるアテンション・アルゴリズムのバリエーションを使うこと、推論に特化したアーキテクチャを使うことである。
LLMは、数十ギガバイト(bigcode/starcoder)から数百ギガバイト(Llama、Bloom、GPT3)まで、膨大な量のVRAMをロードする必要がある。最初の最適化は、精度をfloat32
から bfloat16
に切り替えることで可能になる。
GPUがbfloat16をサポートしているなら、完全なfloat32精度でモデルを実行する理由はない。float32では、モデルの学習に使われた精度よりも良い推論結果は得られない。
これによって全体的なメモリ消費量を半分にすることができるが、残念なことに、多くの場合、必要なメモリはまだ多すぎる可能性がある。より積極的なアプローチは、モデルの重みを8ビットまたは4ビットに量子化することである。これは、大幅なパフォーマンス低下を引き起こさないことが示されている。
量子化は特にテキスト生成に有効である。というのも、我々が気にするのは、最も可能性の高い次のトークンの集合を選択することだけであり、次のトークンのロジット分布の正確な値にはあまり関心がないからである。
これにより、必要なメモリをさらに削減することが可能となり、推論時間が若干長くなる代償はあるものの、わずか16GBのVRAMを搭載した市販のGPUでより小さなモデルを実行することが可能となる。
入力トークン間の文脈的関係を理解するためにLLMが適用するセルフアテンションレイヤーのための新しいアルゴリズムであるフラッシュ・アテンションを使用することも、重要な最適化であるとvon Platen氏は言う。
このアルゴリズムは複雑すぎてここでは要約できないが、ソフトマックスの正規化統計といくつかの スマートな数学を使うことで、入力トークンに応じて線形に増加するメモリしか必要とせずに、同一の出力を提供できると言えば十分だろう。遅いGPU VRAMの代わりに高速なSRAMを使用するアルゴリズムのおかげで、推論性能も向上している。
実際には、フラッシュ・アテンションが使用可能であれば、使用しない理由は今のところ全くない。このアルゴリズムは数学的に同じ出力を与え、より高速でメモリ効率も高い。
LLMが生産時に最適化できる3つ目の分野は、長いテキスト入力を効果的かつ効率的に処理できるよう、適切なアーキテクチャを選択することだ。ここで最近の研究が、すぐにボトルネックになる2つのコンポーネント、位置埋め込みとキー・バリュー・キャッシュを正しく選択するのに役立つとvon Platen氏は言う。
位置埋め込みは、各トークンの位置を数値表現にエンコードすることで、LLMがシーケンスの順序を理解するための手がかりを提供する。大量のテキスト入力を処理するタスクを解決することを目的としたLLMの場合、RoPEやALiBiのような相対位置埋め込みを学習に用いるべきである。
RoPEとALiBiのどちらの位置エンコーディングも、学習中に見られなかった入力の長さまで外挿することができるが、外挿はRoPEに比べてALiBiの方がすぐにうまくいくことが示されている。
どちらのアルゴリズムも、現在の多くのLLMですでに利用可能である。
キー・バリュー・チャットは、会話の文脈を符号化する手段として使うことができる。von Platen氏は、マルチクエリーアテンション(MQA)とグループ化されたクエリーアテンション(GQA)という2つのクラスのキー・バリュー・キャッシュの詳細に踏み込み、それらがもたらす利点を示している。
von Platen氏の記事は、ここに要約しきれないほど多くの分野をカバーし、彼のポイントを実証するための実践的な例を提供している。そのため、全体の概要を把握するために、彼の記事を見逃さないようにしてください。