Gemma 2とは?
Googleは、最先端のオープンLLMファミリーに新たに加わったGemma 2をリリースしました。Hugging FaceはGoogleと協力し、Hugging Faceエコシステムへの最高の統合を確実にすることに興奮しています。4つのオープンウェイトモデル(ベースモデル2つとファインチューニング済みモデル2つ)をハブで入手できます。リリースされる機能や統合の中には、以下のようなものがあります。
- ハブ上のモデル
- Hugging Face Transformersとの統合
- Google Cloudとの統合と推論エンドポイント
Gemma 2の概要
Gemma 2は、GoogleのオープンLLMの最新バージョンです。90億と270億のパラメータの2つのサイズがあり、ベース(事前学習済み)と命令調整済みバージョンがあります。GemmaはGoogle Deepmind Geminiをベースにしており、コンテキストの長さは8Kトークンです。
- gemma-2-9b: ベースとなる9Bモデル。
- gemma-2-9b-it: ベースとなる9Bモデルの命令調整済みバージョン。
- gemma-2-27b: ベースとなる27Bモデル。
- gemma-2-27b-it: ベースとなる27Bモデルの命令調整済みバージョン。
Gemma 2モデルは、最初のバージョンよりも約2倍多いデータで学習され、27Bバージョンは13兆トークン、9Bバージョンは8兆トークンのウェブデータ(主に英語)、コード、数学を学習しています。学習の構成比の詳細は不明ですが、より大規模で注意深いデータキュレーションが、パフォーマンス向上に大きく貢献したと推測できます。
ライセンス
Gemma 2は、最初のバージョンと同じライセンスで提供されます。これは、再配布、ファインチューニング、商用利用、派生物の作成を許可する、寛容なライセンスです。
Gemma 2の技術的進歩
Gemma 2は、最初のバージョンと多くの共通点があります。コンテキストの長さは8192トークンで、回転位置埋め込み(RoPE)を使用しています。元のGemmaと比較して、Gemma 2には4つの主な進歩があります。
- スライディングウィンドウアテンション:高品質な生成のために、スライディングウィンドウと完全な二次アテンションを交互に配置します。
- 対数ソフトキャッピング:ロジットを一定の範囲にスケーリングすることで、ロジットが過度に大きくなるのを防ぎ、学習を改善します。
- 蒸留:より大きな教師モデルを活用して、より小さなモデル(9Bモデルの場合)を学習します。
- モデルマージ:2つ以上のLLMを組み合わせて、単一の新しいモデルを作成します。
Gemma 2は、JAXとML Pathwaysを使用して、Google Cloud TPU(27Bはv5p、9BはTPU v4)で学習されました。Gemma 2 Instructは、ダイアログアプリケーション向けに最適化されており、教師ありファインチューニング(SFT)、より大きなモデルからの蒸留、会話能力を重視した報酬モデルを使用した人間からのフィードバックによる強化学習(RLHF)、全体的なパフォーマンスを向上させるためのWARPを使用したモデルマージを使用して、合成および人間が生成したプロンプトと応答のペアを組み合わせて学習されました。
事前学習の構成比と同様に、ファインチューニングのデータセットやSFTとRLHFに関連するハイパーパラメータに関する詳細は共有されていません。
スライディングウィンドウアテンション
スライディングウィンドウアテンションとは
スライディングウィンドウアテンションは、Transformerモデルにおけるアテンション計算のメモリと時間要件を削減する方法であり、Mistralなどのモデルで使用されています。
従来のTransformerモデルでは、文章中の全ての単語間の関係を計算するため、計算量が膨大になり、長い文章に対応するのが難しいという問題がありました。スライディングウィンドウアテンションでは、ある単語に着目する際に、その単語の前後一定範囲内の単語との関係のみを計算します。これにより、計算量を大幅に削減することができます。
Gemma 2における実装
Gemma 2の新規性は、1つおきのレイヤーにスライディングウィンドウ(ローカル - 4096トークン)が適用され、間のレイヤーは依然として完全な2次グローバルアテンション(8192トークン)を使用していることです。これは、長いコンテキスト状況(レイヤーの半分は依然としてすべてのトークンに注目している)において品質を向上させながら、スライディングアテンションの利点を部分的に享受する方法だと考えられます。
ソフトキャッピングとアテンションの実装
ソフトキャッピングとは
ソフトキャッピングとは、ロジットを打ち切ることなく、過度に大きくなるのを防ぐ技術です。ロジットを最大値のしきい値(soft_cap)で割り、tanh層に通して((-1, 1)の範囲内にあることを確認)、最後にしきい値を再び掛けることで機能します。これにより、多くの情報を失うことなく最終的な値が(-soft_cap, +soft_cap)の範囲内にあることが保証され、学習が安定します。
まとめると、ロジットは次のように計算されます。logits ← soft_cap ∗ tanh(logits/soft_cap)
Gemma 2における実装
Gemma 2では、最終層とすべてのアテンション層にソフトキャッピングを採用しています。アテンションロジットは50.0、最終ロジットは30.0に制限されています。
リリース時点では、ソフトキャッピングはFlash Attention / SDPAと互換性がありませんが、最大の効率を得るために推論で引き続き使用できます。Gemma 2チームは、推論中にソフトキャッピングを削除した場合、非常に小さな違いしか観察されませんでした。
注意:安定したファインチューニングを実行するには、ソフトキャッピングを有効にする必要があります。そのため、SDPAではなく、熱心なアテンションを使用してファインチューニングすることをお勧めします。
蒸留
蒸留とは
蒸留とは、より小さく、より高速な生徒モデルを、より大きく、より高性能な教師モデルの動作を模倣するように学習させることで、生徒モデルの性能を向上させる手法です。
具体的には、教師モデルの出力と生徒モデルの出力の差を小さくするように、生徒モデルを学習します。これにより、生徒モデルは教師モデルの知識を効率的に学習することができます。
Gemma 2における実装
技術レポートによると、蒸留は9Bモデルの事前学習に使用され、27Bモデルはゼロから事前学習されました。
学習後、Gemma 2チームは教師(レポートでは明記されていませんが、おそらくGemini Ultra)から多様な補完を生成し、SFTを使用してこの合成データで生徒モデルを学習させました。これは、ZephyrやOpenHermesなど、より大きなLLMからの合成データのみで学習された多くのオープンモデルの基礎となっています。
この方法は効果的ですが、生徒と教師のモデル容量のミスマッチにより、学習と推論のミスマッチが生じる可能性があります。これは、推論中に生徒が生成したテキストが、学習中に見られたテキストと比較して分布外になる可能性があることを意味します。
この問題に対処するため、Gemma 2チームは「オンポリシー蒸留」を使用しました。この方法では、生徒はSFTプロンプトから補完を生成します。次に、これらの補完を使用して、教師と生徒のロジット間のKLダイバージェンスを計算します。学習を通してKLダイバージェンスを最小限に抑えることで、生徒は教師の行動を正確にモデル化することを学習しながら、学習と推論のミスマッチも最小限に抑えます。
オンラインDPOのようなオンポリシーメソッドがより強力なモデルを生成することがコミュニティで確認されているため、このアプローチは非常に興味深いものです。オンポリシー蒸留の利点の1つは、教師からのロジットのみが必要となるため、モデルを改善するために報酬モデルやLLM as a Judgeに頼る必要がないことです。この方法が、今後数ヶ月のうちにファインチューナーの間でより一般的になるかどうかを見るのは楽しみです。
モデルマージ
モデルマージとは
モデルマージとは、複数の学習済みモデルを組み合わせて、より高性能なモデルを生成する手法です。
複数のモデルを組み合わせることで、それぞれのモデルが持つ知識や能力を統合し、単一のモデルでは実現できない高い性能を実現することができます。
Gemma 2における実装
技術レポートによると、Gemma 2はWarpを使用しました。Warpは、3つの異なる段階でモデルをマージする新しいマージ技術です。
- 指数移動平均(EMA):強化学習(RL)ファインチューニングプロセス中に適用されます。
- 球面線形補間(SLERP):複数のポリシーのRLファインチューニング後に適用されます。
- 初期化に向けた線形補間(LITI):SLERPステージ後に適用されるステージです。
Gemma 2の評価
Gemmaモデルはどれくらい優れているのでしょうか?以下は、技術レポートと新しいバージョンのオープンLLMリーダーボードに基づいた、他のオープンモデルとの性能比較です。
技術レポートの結果
このGemma 2の技術レポートでは、以前のオープンLLMリーダーボードベンチマークにおける、さまざまなオープンLLMの性能を比較しています。
モデル | MMLU | GSM8K | ARC-c | HellaSwag | Winogrande |
---|---|---|---|---|---|
Llama 3 (70B) | 79.2 | 76.9 | 68.8 | 88.0 | 85.3 |
Qwen 1.5 (32B) | 74.3 | 61.1 | 63.6 | 85.0 | 81.5 |
Gemma 2 (27B) | 75.2 | 75.1 | 71.4 | 86.4 | 83.7 |
レポートでは、小規模言語モデルの性能も比較しています。
ベンチマーク | Mistral (7B) | Llama 3 (8B) | Gemma (8B) | Gemma 2 (9B) |
---|---|---|---|---|
MMLU | 62.5 | 66.6 | 64.4 | 71.3 |
GSM8K | 34.5 | 45.7 | 50.9 | 62.3 |
ARC-C | 60.5 | 59.2 | 61.1 | 68.4 |
HellaSwag | 83.0 | 82.0 | 82.3 | 81.9 |
Winogrande | 78.5 | 78.5 | 79.0 | 80.6 |
オープンLLMリーダーボードの結果
注:現在、新しいオープンLLMリーダーボードベンチマークでGoogle Gemma 2を個別に評価しており、本日中にこのセクションを更新する予定です。
Gemma 2のプロンプト方法
基本モデルのプロンプト
基本モデルにはプロンプト形式がありません。他の基本モデルと同様に、もっともらしい続きで入力シーケンスを継続したり、ゼロショット/フューショット推論に使用したりできます。
Instructバージョンのプロンプト
Instructバージョンは、非常にシンプルな会話構造を持っています。
<start_of_turn>user
knock knock<end_of_turn>
<start_of_turn>model
who is there<end_of_turn>
<start_of_turn>user
LaMDA<end_of_turn>
<start_of_turn>model
LaMDA who?<end_of_turn><eos>
効果的に使用するには、この形式を正確に再現する必要があります。後で、transformersで利用できるチャットテンプレートを使用して、instructプロンプトを簡単に再現する方法を紹介します。
デモ
Hugging ChatでGemma 27B Instructモデルとチャットできます!こちらのリンクをご覧ください:https://huggingface.co/chat/models/google/gemma-2-27b-it.
Hugging Face Transformersを使った利用方法
Transformersリリース4.42では、Gemmaを使用してHugging Faceエコシステム内のすべてのツールを活用できます。transformersでGemmaモデルを使用するには、最新のtransformersリリースを使用していることを確認してください。
pip install "transformers==4.42.1" --upgrade
次のスニペットは、transformersでgemma-2-9b-itを使用する方法を示しています。約18 GBのRAMが必要で、多くのコンシューマ向けGPUに適合します。同じスニペットはgemma-2-27b-itでも機能します。gemma-2-27b-itは56 GBのRAMを必要とするため、本番環境での使用例として非常に興味深いモデルです。メモリ消費量は、8ビットまたは4ビットモードでロードすることでさらに削減できます。
from transformers import pipeline
import torch
pipe = pipeline(
"text-generation",
model="google/gemma-2-9b-it",
model_kwargs={"torch_dtype": torch.bfloat16},
device="cuda",
)
messages = [
{"role": "user", "content": "あなたは誰ですか?海賊の言葉で答えてください。"},
]
outputs = pipe(
messages,
max_new_tokens=256,
do_sample=False,
)
assistant_response = outputs[0]["generated_text"][-1]["content"]
print(assistant_response)
よう、相棒!俺はデジタルの海を航海する、謙虚な言葉の船だ。俺はGemma、Google DeepMindの優秀な人々が生み出したものだ。俺は宝の山のようなテキストで訓練され、本物の海賊のように話し、書くことを学んだ。
質問があれば、答えるから聞いてくれ!🦜📚
命令調整済みモデルのリファレンス精度はbfloat16であるため、bfloat16を使用しました。float16で実行するとハードウェアによっては高速化される可能性があり、9Bモデルでは結果も同様になるはずです。ただし、27Bの命令調整済みモデルでは、float16を使用すると不規則な出力が生成されることに注意してください。このモデルの重みにはbfloat16を使用する必要があります。
量子化
モデルを自動的に量子化して、8ビットまたは4ビットモードでロードすることもできます。大規模な27Bバージョンを4ビットでロードすると、約18 GBのメモリで実行できるため、多くのコンシューマカードやGoogle ColabのGPUと互換性があります。4ビットで生成パイプラインをロードする方法は次のとおりです。
pipeline = pipeline(
"text-generation",
model=model,
model_kwargs={
"torch_dtype": torch.bfloat16,
"quantization_config": {"load_in_4bit": True}
},
)
transformersを使用したモデルの使用方法の詳細については、モデルカードをご覧ください。
Google Cloudとの統合 & 推論エンドポイントとの統合
注:現在、Google Gemma 2を効率的に実行するための新しいコンテナをGKEとVertex AIに追加する作業を行っています。コンテナが利用可能になり次第、このセクションを更新します。
追加リソース
- モデルハブ:https://huggingface.co/models
- オープンLLMリーダーボード:https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard
- Hugging Chatでのチャットデモ:https://huggingface.co/chat/models/google/gemma-2-27b-it
- Googleブログ:https://ai.googleblog.com/
- Google Notebook:近日公開
- Vertex AIモデルガーデン:近日公開
謝辞
エコシステムにおけるサポートと評価を伴う、このようなモデルのリリースは、LLMの評価に貢献してくれたClémentineとNathan、テキスト生成推論のサポートに貢献してくれたNicolas、Gemma 2のtransformersへの統合に貢献してくれたArthur、Sanchit、Joao、Lysandre、Hugging ChatでGemma 2を利用できるようにしてくれたNathanとVictorなど、多くのコミュニティメンバーの貢献なしには実現しませんでした。
そして、Gemma 2をリリースし、オープンソースAIコミュニティが利用できるようにしてくれたGoogleチームに感謝します。
コメント