「AWS Inferentia2を使って、あなたのラマ生成時間を短縮しましょう」
「AWS Inferentia2を使って、あなたのラマ生成時間を短縮しよう!」
Hugging Faceブログの前の投稿で、第2世代のAWS InferentiaアクセラレータであるAWS Inferentia2を紹介し、optimum-neuronを使用して、標準のテキストとビジョンタスクのためにHugging FaceモデルをAWS Inferentia 2インスタンス上で迅速に展開する方法を説明しました。
AWS Neuron SDKとのさらなる統合の一環として、🤗optimum-neuronを使用して、AWS Inferentia2上でテキスト生成のためのLLMモデルを展開することができるようになりました。
デモンストレーションには、Llama 2、ハブで最も人気のあるモデルの一つ、を選択するのが最も適しています。
Inferentia2インスタンスに🤗optimum-neuronをセットアップする
おすすめは、Hugging Face Neuron Deep Learning AMI(DLAMI)を使用することです。DLAMIには、必要なライブラリが事前にパッケージ化されており、Optimum Neuron、Neuron Drivers、Transformers、Datasets、およびAccelerateも含まれています。
- 「5つの最高のスケッチから画像へのAIレンダリングツール(2023年11月)」
- トランスフォーマーモデルでのNLPの台頭 | T5、BERT、GPTの包括的な分析
- 「30/10から5/11までの週の、トップで重要なLLM論文」
また、Hugging Face Neuron SDK DLCを使用してAmazon SageMakerに展開することもできます。
注意:SageMaker展開に関する投稿も近日中に掲載予定です。
最後に、これらのコンポーネントは、optimum-neuron
インストール手順に従って、新しいInferentia2インスタンスにも手動でインストールすることができます。
Llama 2モデルをNeuronにエクスポートする
optimum-neuronドキュメントで説明されているように、モデルはNeuronデバイスで実行する前に、コンパイルされてシリアライズ形式にエクスポートする必要があります。
幸いなことに、🤗optimum-neuron
は、標準の🤗transformersモデルをNeuron形式にエクスポートするための非常にシンプルなAPIを提供しています。
>>> from optimum.neuron import NeuronModelForCausalLM>>> compiler_args = {"num_cores": 24, "auto_cast_type": 'fp16'}>>> input_shapes = {"batch_size": 1, "sequence_length": 2048}>>> model = NeuronModelForCausalLM.from_pretrained( "meta-llama/Llama-2-7b-hf", export=True, **compiler_args, **input_shapes)
これには少し説明が必要です:
compiler_args
を使用して、モデルを展開するためのコア数(各Neuronデバイスには2つのコアがあります)と精度(ここではfloat16
)を指定します。input_shapes
を使用して、モデルの静的な入力と出力の寸法を設定します。すべてのモデルコンパイラは静的な形状を必要とし、Neuronも例外ではありません。sequence_length
は、入力コンテキストの長さだけでなく、KVキャッシュの長さ、つまり出力の長さにも制約を与えます。
パラメータとInferentiaホストの選択によって、これには数分から1時間以上かかる場合があります。
幸運なことに、これを1回だけ行う必要があります。なぜなら、モデルを保存して後で再ロードできるからです。
>>> model.save_pretrained("コンパイルされたニューロンモデルのローカルパス")
さらに良いことに、それをHugging Faceハブにプッシュすることもできます。
>>> model.push_to_hub( "コンパイルされたニューロンモデルのローカルパス", repository_id="aws-neuron/Llama-2-7b-hf-neuron-latency")
AWS Inferentia2でLlama 2を使用してテキストを生成する
モデルをエクスポートしたら、transformersライブラリを使用してテキストを生成することができます。詳細は以前の投稿で詳しく説明されています。
>>> from optimum.neuron import NeuronModelForCausalLM>>> from transformers import AutoTokenizer>>> model = NeuronModelForCausalLM.from_pretrained('aws-neuron/Llama-2-7b-hf-neuron-latency')>>> tokenizer = AutoTokenizer.from_pretrained("aws-neuron/Llama-2-7b-hf-neuron-latency")>>> inputs = tokenizer("What is deep-learning ?", return_tensors="pt")>>> outputs = model.generate(**inputs, max_new_tokens=128, do_sample=True, temperature=0.9, top_k=50, top_p=0.9)>>> tokenizer.batch_decode(outputs, skip_special_tokens=True)['What is deep-learning ?\nディープラーニングとは、高レベルな抽象化を行い、複数の層からなる階層的なデータの形式でデータの処理ノードを増加させることを目指す機械学習の一種です。']
注意:複数の入力プロンプトをモデルに渡す場合、結果のトークンシーケンスはストリームの終了トークンで左側にパディングする必要があります。エクスポートされたモデルと共に保存されるトークナイザーは、それに応じて設定されています。
次のジェネレーション戦略がサポートされています:
- グリーディー
- トップ-k、トップ-pを使用した多項分布サンプリング(温度あり)
大部分のロジットの前処理/フィルタリング(反復ペナルティなど)がサポートされています。
optimum-neuronパイプラインを使用したオールインワン
シンプルに保ちたい方には、optimum-neuronパイプラインを使用する方法があります。
以下のように使用します:
>>> from optimum.neuron import pipeline>>> p = pipeline('text-generation', 'aws-neuron/Llama-2-7b-hf-neuron-budget')>>> p("My favorite place on earth is", max_new_tokens=64, do_sample=True, top_k=50)[{'generated_text': '私のお気に入りの場所は地球です。そこが一番平和を感じる場所です。私は旅行をすることや新しい場所を見ることが大好きです。私は'}]
ベンチマーク
Inferentia2でのテキスト生成はどれくらい効率的ですか?さて、見てみましょう!
様々な構成でLLama 2 7Bおよび13Bモデルの事前コンパイルバージョンをハブにアップロードしました:
注意:すべてのモデルは最大シーケンス長2048でコンパイルされています。
llama2 7B
の”budget”モデルは、1つのニューロンデバイスのみを持つinf2.xlarge
インスタンスに展開されるように設計されており、モデルを読み込むのに十分なcpu
メモリを持っています。
他のすべてのモデルはinf2.48xlarge
インスタンスで利用可能なコアのすべてを使用するようにコンパイルされています。
注意:利用可能なインスタンスの詳細については、inferentia2製品ページを参照してください。
我々は、llama2 7B
およびllama2 13B
のモデル向けに2つの「レイテンシー」指向の構成を作成しました。これらの構成は、一度に1つのリクエストのみを処理しますが、最大速度で処理します。
また、最大4つのリクエストを並列に処理するための2つの「スループット」指向の構成も作成しました。
モデルを評価するために、256個の入力トークン(つまり、256、512、および768個のトークンを生成)から始まり、合計のシーケンスの長さが1024になるまでトークンを生成します。
注意:「予算」モデルの数字は報告されていますが、グラフには含まれていません。
エンコーディング時間
エンコーディング時間は、入力トークンを処理し、最初の出力トークンを生成するために必要な時間です。これは、生成されたトークンをストリーミングする際にユーザーが直接感じるレイテンシに対応する非常に重要な指標です。
我々は、文脈サイズを増やすにつれてエンコーディング時間をテストします。256個の入力トークンは、Typical Q/Aの使用例における典型的なもので、768個はRetrieval Augmented Generation(RAG)の使用例により近いです。
「予算」モデル(Llama2 7B-B
)はinf2.xlarge
インスタンスで展開されており、他のモデルはinf2.48xlarge
インスタンスに展開されています。
エンコーディング時間は秒で表されます。
すべての展開されたモデルは、長いコンテキストでも優れた応答時間を示しています。
エンドツーエンドのレイテンシ
エンドツーエンドのレイテンシは、合計1024トークンのシーケンスに到達するまでの総時間に対応します。
したがって、エンコーディング時間と生成時間を含みます。
「予算」モデル(Llama2 7B-B
)はinf2.xlarge
インスタンスで展開されており、他のモデルはinf2.48xlarge
インスタンスに展開されています。
レイテンシは秒で表されます。
ハイエンドインスタンスに展開されたすべてのモデルは、適切なレイテンシを示しています。実際にはスループットを最適化するように構成されているモデルでさえもです。
「予算」モデルの展開レイテンシはかなり高いですが、まだ問題ありません。
スループット
スループットを評価するために、エンドツーエンドのレイテンシを入力トークンと出力トークンの合計で割るという他のベンチマークと同じ規則を採用しています。つまり、エンドツーエンドのレイテンシをbatch_size * sequence_length
で割って、1秒あたりに生成されるトークンの数を得ます。
「予算」モデル(Llama2 7B-B
)はinf2.xlarge
インスタンスで展開されており、他のモデルはinf2.48xlarge
インスタンスに展開されています。
スループットはトークン/秒で表されます。
再度、ハイエンドインスタンスに展開されたモデルは非常に優れたスループットを持っています。レイテンシに最適化されているモデルでさえもです。
「予算」モデルのスループットははるかに低いですが、ストリーミングの使用例ではまだ十分です。平均的な読者は1秒間に約5つの単語を読みます。
結論
llama2
モデルをHugging Faceハブから簡単にデプロイする方法を説明しました。デプロイはAWS Inferentia2を使用して🤗 optimum-neuronです。
展開されたモデルは、エンコーディング時間、遅延、スループットの観点から非常に優れたパフォーマンスを示しています。
興味深いことに、展開されたモデルの遅延はバッチサイズにあまり敏感ではありません。これは、推論エンドポイントで複数のリクエストを並行して処理することが可能になる道を開いています。
しかし、改善の余地はまだたくさんあります:
- 現在の実装では、スループットを向上させる唯一の方法はバッチサイズを増やすことですが、現在はデバイスのメモリに制約があります。パイプラインなどの代替オプションが現在統合されています。
- 静的なシーケンスの長さは、モデルが長い文脈をエンコードする能力を制限しています。この問題に対処するために、注意力が集中する可能性があるかどうか興味深いと思われます。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles