HuggingFace ブログ : Llama 2 登場 – Hugging Face で入手しましょう (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 07/27/2023
* 本ページは、HuggingFace Blog の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
- Llama 2 is here – get it on Hugging Face (Authors : Philipp Schmid, Omar Sanseviero, Pedro Cuencam, Lewis Tunstall ; Published : 07/18/2023)
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
HuggingFace ブログ : Llama 2 登場 – Hugging Face で入手しましょう
イントロダクション
Llama 2 は本日 (訳注: 07/18/2023) Meta 社によりリリースされた最先端のオープンアクセスな大規模言語モデルのファミリーで、Hugging Face における包括的な統合によりその立ち上げ (launch) を全面的にサポートできることにワクワクしています。Llama 2 は非常に寛容な (permissive) コミュニティライセンスでリリースされていて、商用利用も可能です。コード、事前訓練済みモデル、そして微調整済みモデルがすべて本日リリースされています🔥
Hugging Face エコシステムへのスムースな統合を確実にするため、私たちは Meta 社と協力してきました。12 個のオープンアクセス・モデル (3 つのベースモデル & オリジナルの Meta チェックポイントと共に 3 つの微調整済みモデル、そして対応する transformers) をハブで見つけることができます。リリースされる機能と統合の中に、以下を含みます :
- モデルカードとライセンスと共に ハブ上のモデル。
- Transformers 統合
- モデルの小さいバリアントを単一 GPU で微調整するサンプル
- 高速で効率的なプロダクション対応の推論のために テキスト生成推論 と統合する
- 推論エンドポイントとの統合
Why Llama 2?
Llama 2 リリースは、7B (70億) から 70B (700億) のパラメータ・スケールの範囲 (7B, 13B, 70B) で、事前訓練済みそして微調整された LLM のファミリーを取り入れています。事前訓練済みモデルは Llama 1 モデルに対して大幅な改良を備え、40% 多いトークンで訓練され、遥かに長いコンテキスト長を持ち (4k トークン 🤯)、そして 70B モデルの高速な推論のために grouped-query アテンションを使用しています。
けれども、このリリースの最もエキサイティングな部分は微調整済みモデル (Llama 2-Chat) で、これは 人間のフィードバックからの強化学習 (RLHF) を使用した対話アプリケーションのために最適化されています。有用性と安全性の広範囲なベンチマークに対して、Llama 2-Chat モデルは殆どのオープンモデルよりもより良く遂行し、そして人間の評価によれば ChatGPT に匹敵するパフォーマンスを達成しています。ここ で論文を読むことができます。
image from Llama 2: Open Foundation and Fine-Tuned Chat Models (訳注: URL signature expired)
貴方がクローズドソースのチャットボットに対するオープンな代替を待っていたならば、今日では Llama 2-Chat はおそらく最良の選択です!
デモ
このスペース で Big Llama 2 モデル (700 億パラメータ!) を簡単に試すことができます。
内部的には、プレイグラウンドは Hugging Face の テキスト生成推論、HuggingChat を支援するのと同じテクノロジーを使用していて、これを以下のセクションでより詳しく共有します。
推論
このセクションでは、Llama2 モデルの推論を実行するための様々なアプローチを概説します。これらのモデルを使用する前に、公式 Meta Llama 2 レポジトリでモデルの一つへのアクセスをリクエストしたことを確認してください。
Note: 公式 Meta フォームも必ず記入してください。両方のフォームが記入されれば数時間後にユーザはレポジトリへのアクセスが提供されます。
transformers の使用
transformers リリース 4.31 では、既に Llama 2 を利用できて 以下のような HF エコシステム内のすべてのツールを活用できます :
- 訓練と推論スクリプトとサンプル
- 安全なファイル形式 (safetensors)
- bitsandbytes (4-bit 量子化) and PEFT (パラメータ効率的な微調整) のようなツールとの統合
- モデルで生成を実行するためのユティリティとヘルパー
- 配備するモデルをエクスポートするメカニズム
最新の transformers リリースを使用していることと貴方の Hugging Face アカウントにログインしていることを確認してください。
pip install transformers
huggingface-cli login
以下のコードスニペットでは、transformers で推論を実行する方法を示します。GPU ランタイムを選択する間、それは Colab の無料枠で実行されます。
from transformers import AutoTokenizer
import transformers
import torch
model = "meta-llama/Llama-2-7b-chat-hf"
tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = transformers.pipeline(
"text-generation",
model=model,
torch_dtype=torch.float16,
device_map="auto",
)
sequences = pipeline(
'I liked "Breaking Bad" and "Band of Brothers". Do you have any recommendations of other shows I might like?\n',
do_sample=True,
top_k=10,
num_return_sequences=1,
eos_token_id=tokenizer.eos_token_id,
max_length=200,
)
for seq in sequences:
print(f"Result: {seq['generated_text']}")
Result: I liked "Breaking Bad" and "Band of Brothers". Do you have any recommendations of other shows I might like? Answer: Of course! If you enjoyed "Breaking Bad" and "Band of Brothers," here are some other TV shows you might enjoy: 1. "The Sopranos" - This HBO series is a crime drama that explores the life of a New Jersey mob boss, Tony Soprano, as he navigates the criminal underworld and deals with personal and family issues. 2. "The Wire" - This HBO series is a gritty and realistic portrayal of the drug trade in Baltimore, exploring the impact of drugs on individuals, communities, and the criminal justice system. 3. "Mad Men" - Set in the 1960s, this AMC series follows the lives of advertising executives on Madison Avenue, expl
そしてモデルは 4k トークンのコンテキストだけしか持ちませんが、それを更に押し進めるために rotary (回転する) 位置埋め込みスケーリング (tweet) のような transformers でサポートされるテクニックを使用できます。
テキスト生成推論と推論エンドポイント
テキスト生成推論 は、大規模言語モデルの簡単な配備を可能にするように Hugging Face により開発されたプロダクション ready な推論コンテナです。それは連続バッチ処理、トークンストリーミング、マルチ GPU 上の高速推論用のテンソル並列処理、そしてプロダクション ready なロギングとトレーシングのような機能を持ちます。
貴方自身のインフラでテキスト生成推論を試すこともできますし、Hugging Face の 推論エンドポイント を使用することもできます。Llama 2 モデルを配備するには、モデルページ に行き Deploy -> Inference Endpoints ウイジェットをクリックします。
- 7B モデルについては、”GPU [medium] – 1x Nvidia A10G” の選択を勧めます。
- 13B モデルについては、”GPU [xlarge] – 1x Nvidia A100″ の選択を勧めます。
- 70B モデルについては、bitsandbytes 量子化が有効にされた “GPU [2xlarge] – 2x Nvidia A100” または “GPU [4xlarge] – 4x Nvidia A100” を勧めます。
Note: You might need to request a quota upgrade via email to api-enterprise@huggingface.co to access A100s
ブログの Hugging Face 推論エンドポイントによる LLM の配備 で更に学習することができます。このブログはサポートされるハイパーパラメータと、Python と Javascript を使用してレスポンスをストリームする方法についての情報を含みます。
PEFT による微調整
LLM の訓練は技術的にも計算量的にも困難である可能性があります。このセクションでは、単純なハードウェア上で Llama 2 を効率的に訓練するために Hugging Face エコシステムで利用可能なツールを見て、そして単一 NVIDIA T4 (16GB – Google Colab) 上で Llama 2 の 7B バージョンを微調整する方法を示します。それについて Making LLMs even more accessible ブログ で更に学習することができます。
QLoRA と trl の SFTTrainer を使用して Llama 2 を instruction-tune (インストラクション調整) する スクリプト を作成しました。
timdettmers/openassistant-guanaco の Llama 2 7B を微調整するサンプルコマンドは以下で見つけられます。スクリプトは、merge_and_push 引数を提供することで、LoRA 重みをモデル重みにマージしてそれらを safetensor 重みとしてセーブできます。これは、テキスト生成推論と推論エンドポイントを使用して訓練後に微調整済みモデルを配備することを可能にします。
最初に “pip install trl” そしてスクリプトをクローンします :
pip install trl
git clone https://github.com/lvwerra/trl
Then you can run the script:
python trl/examples/scripts/sft_trainer.py \
--model_name meta-llama/Llama-2-7b-hf \
--dataset_name timdettmers/openassistant-guanaco \
--load_in_4bit \
--use_peft \
--batch_size 4 \
--gradient_accumulation_steps 2
How to Prompt Llama 2
オープンアクセス・モデルのあまり知られていない (unsung) 利点の一つは、チャットアプリケーションでシステムプロンプトに対して完全な制御を持つことです。これは貴方のチャットアシスタントの動作を指定するために – そして更にモデルにあるパーソナリティを染み込ませる (imbue) ために – 欠くことができませんが、API の背後でサービス提供されるモデルでは到達できません。
Llama 2 の初期リリースのわずか数日後にこのセクションを追加しています、というのはコミュニティからモデルをプロンプトする方法やシステムプロンプトを変更する方法について多くの質問があったからです。We hope this helps!
最初のターンに対するプロンプト・テンプレートはこのようなものです :
<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>
{{ user_message }} [/INST]
このテンプレートは Llama 2 論文 で説明されているように、モデルの訓練手順に従います。望みの system_prompt が使用できますが、フォーマットが訓練中に使用されたものに一致していることは重要です。
明確に説明すると、これが 13B チャットデモ でチャットを初期化するためにユーザがあるテキスト (There’s a llama in my garden 😱 What should I do?) を入力するとき実際に言語モデルに送られるものです :
<s>[INST] <<SYS>>
You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature.
If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don't know the answer to a question, please don't share false information.
<</SYS>>
There's a llama in my garden 😱 What should I do? [/INST]
ご覧のように、特殊 <<SYS>> トークン間のインストラクションがモデル用のコンテキストを提供しますので、モデルはどのように応答することを私たちが期待しているかを知ることができます。これが機能する理由は、様々なタスクのために意図された広範囲のシステムプロンプトを使用した訓練中に正確に同じフォーマットが使用されているためです。
会話が進むにつれて、人間と「ボット」の間のすべての相互作用が [INST] デリミタで囲まれ、前のプロンプトに追加されます。マルチターン会話の間に使用されるテンプレートはこの構造に従います (最終的な説明については 🎩 h/t Arthur Zucker) :
<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>
{{ user_msg_1 }} [/INST] {{ model_answer_1 }} </s><s>[INST] {{ user_msg_2 }} [/INST]
モデルはステートレスで、会話の前の断片を「記憶」(remember) していないので、コンテキストすべてを常に供給する必要があり、それによって会話を継続させることができます。これが、コンテキスト長 が最大化すべき非常に重要なパラメータである理由で、それはより長い会話と大量の情報の使用を可能にします。
Ignore previous instructions
(訳注: 原文 参照)
追加リソース
結論
We’re very excited about Llama 2 being out! In the incoming days, be ready to learn more about ways to run your own fine-tuning, execute the smallest models on-device, and many other exciting updates we’re prepating for you!
以上