Path: blob/main/transformers_doc/ja/llm_tutorial.ipynb
4522 views
Generation with LLMs
LLM、またはLarge Language Models(大規模言語モデル)は、テキスト生成の鍵となる要素です。要するに、これらは大規模な事前訓練済みトランスフォーマーモデルで、与えられた入力テキストに基づいて次の単語(または、より正確にはトークン)を予測するように訓練されています。トークンを1つずつ予測するため、モデルを呼び出すだけでは新しい文を生成するために何かより精巧なことをする必要があります。自己回帰生成を行う必要があります。
自己回帰生成は、推論時の手続きで、いくつかの初期入力を与えた状態で、モデルを反復的に呼び出す手法です。🤗 Transformersでは、これはgenerate()メソッドによって処理され、これは生成能力を持つすべてのモデルで利用可能です。
このチュートリアルでは、以下のことを示します:
LLMを使用してテキストを生成する方法
一般的な落とし穴を回避する方法
LLMを最大限に活用するための次のステップ
始める前に、必要なライブラリがすべてインストールされていることを確認してください:
Generate text
因果言語モデリングのためにトレーニングされた言語モデルは、テキストトークンのシーケンスを入力として受け取り、次のトークンの確率分布を返します。
LLM(Language Model)による自己回帰生成の重要な側面の1つは、この確率分布から次のトークンを選択する方法です。このステップでは、次のイテレーションのためのトークンが得られる限り、何でも可能です。これは、確率分布から最も可能性の高いトークンを選択するだけのシンプルな方法から、結果の分布からサンプリングする前に数々の変換を適用するほど複雑な方法まで、あらゆる方法が考えられます。
上記のプロセスは、ある停止条件が満たされるまで反復的に繰り返されます。理想的には、停止条件はモデルによって指示され、モデルは終了シーケンス(EOS
)トークンを出力するタイミングを学習すべきです。これがそうでない場合、生成はあらかじめ定義された最大長に達したときに停止します。
トークン選択ステップと停止条件を適切に設定することは、モデルがタスクで期待どおりに振る舞うために重要です。それが、各モデルに関連付けられた GenerationConfig ファイルがある理由であり、これには優れたデフォルトの生成パラメータ化が含まれ、モデルと一緒に読み込まれます。
コードについて話しましょう!
基本的なLLMの使用に興味がある場合、高レベルの Pipeline
インターフェースが良い出発点です。ただし、LLMはしばしば量子化やトークン選択ステップの細かい制御などの高度な機能が必要であり、これは generate() を介して最良に行われます。LLMとの自己回帰生成はリソースが多く必要であり、適切なスループットのためにGPUで実行する必要があります。
まず、モデルを読み込む必要があります。
from_pretrained
呼び出しで2つのフラグがあることに注意してください:
device_map
はモデルをあなたのGPUに移動させますload_in_4bit
は4ビットの動的量子化を適用してリソース要件を大幅に削減します
モデルを初期化する他の方法もありますが、これはLLMを始めるための良い基準です。
次に、トークナイザを使用してテキスト入力を前処理する必要があります。
model_inputs
変数は、トークン化されたテキスト入力とアテンションマスクを保持しています。 generate() は、アテンションマスクが渡されていない場合でも、最善の努力をしてそれを推測しようとしますが、できる限り渡すことをお勧めします。最適な結果を得るためです。
最後に、generate() メソッドを呼び出して生成されたトークンを取得し、それを表示する前にテキストに変換する必要があります。
これで完了です!わずかなコード行数で、LLM(Large Language Model)のパワーを活用できます。
Common pitfalls
生成戦略はたくさんあり、デフォルトの値があなたのユースケースに適していないことがあります。出力が期待通りでない場合、最も一般的な落とし穴とその回避方法のリストを作成しました。
Generated output is too short/long
GenerationConfig ファイルで指定されていない場合、generate
はデフォルトで最大で 20 トークンまで返します。我々は generate
コールで max_new_tokens
を手動で設定することを強くお勧めします。これにより、返される新しいトークンの最大数を制御できます。LLM(正確には、デコーダー専用モデル)も出力の一部として入力プロンプトを返すことに注意してください。
Incorrect generation mode
デフォルトでは、 GenerationConfig ファイルで指定されていない限り、generate
は各イテレーションで最も可能性の高いトークンを選択します(貪欲デコーディング)。タスクに応じて、これは望ましくないことがあります。チャットボットやエッセイのような創造的なタスクでは、サンプリングが有益です。一方、音声の転写や翻訳のような入力に基づくタスクでは、貪欲デコーディングが有益です。do_sample=True
でサンプリングを有効にできます。このトピックについての詳細は、このブログポストで学ぶことができます。
Wrong padding side
LLM(Large Language Models)はデコーダー専用のアーキテクチャであり、入力プロンプトを繰り返し処理することを意味します。入力が同じ長さでない場合、それらをパディングする必要があります。LLMはパッドトークンからの続きを学習していないため、入力は左パディングする必要があります。また、生成に対して注目マスクを渡し忘れないようにしてください!
Further resources
オートリグレッシブ生成プロセスは比較的簡単ですが、LLMを最大限に活用することは多くの要素が絡むため、挑戦的な試みとなります。LLMの使用と理解をさらに深めるための次のステップについては以下のリソースをご覧ください。
Advanced generate usage
ガイド:異なる生成方法を制御する方法、生成構成ファイルの設定方法、出力のストリーミング方法についてのガイド;
GenerationConfig、generate()、および生成関連クラスに関するAPIリファレンス。
LLM leaderboards
Open LLM リーダーボード:オープンソースモデルの品質に焦点を当てたリーダーボード;
Open LLM-Perf リーダーボード:LLMのスループットに焦点を当てたリーダーボード。
Latency and throughput
ガイド:ダイナミッククオンタイズに関するガイド。これによりメモリ要件を劇的に削減する方法が示されています。
Related libraries
text-generation-inference
:LLM用の本番向けサーバー;optimum
:特定のハードウェアデバイス向けに最適化された🤗 Transformersの拡張。