Transformers documentation
Llama3
このモデルは2024年7月31日にHF papersで公開され、2024年4月24日にHugging Face Transformersに貢献されました。
Llama3
import torch
import transformers
model_id = "meta-llama/Meta-Llama-3-8B"
pipeline = transformers.pipeline("text-generation", model=model_id, model_kwargs={"dtype": torch.bfloat16}, device_map="auto")
pipeline("Hey how are you doing today?")概要
Llama3モデルは、Meta AIチームによってIntroducing Meta Llama 3: The most capable openly available LLM to dateで提案されました。
ブログ記事の概要は以下の通りです:
本日、次世代LlamaであるMeta Llama 3の最初の2つのモデルを、広くご利用いただける形で公開できることを嬉しく思います。今回のリリースでは、8Bパラメータと70Bパラメータの事前学習済み言語モデルと、指示に微調整を施した言語モデルを提供し、幅広いユースケースに対応できます。この次世代Llamaは、幅広い業界ベンチマークで最先端の性能を示し、推論能力の向上など、新たな機能を提供します。私たちは、これらが同クラスで最良のオープンソースモデルであると確信しています。長年続けてきたオープンなアプローチを支持するため、Llama 3をコミュニティに提供します。アプリケーションから開発者ツール、評価、推論の最適化など、スタック全体にわたるAIの次のイノベーションの波を巻き起こしたいと考えています。皆様にご構築いただくものを待ちきれず、フィードバックをお待ちしております。
Llama3 のすべてのモデルチェックポイントはこちらで確認できます。 著者の元のコードはこちらにあります。
使用のコツ
Llama3モデルはbfloat16を使用して学習されましたが、元の推論ではfloat16が使用されています。Hubにアップロードされたチェックポイントはdtype = 'float16'を使用しており、AutoModelAPIによって、チェックポイントがtorch.float32からtorch.float16へキャストされます。
dtypeは、model = AutoModelForCausalLM.from_pretrained("path", dtype = "auto")のようにdtype="auto"を指定してモデルを初期化する場合を除き、オンラインの重みに対してはほぼ無関係です。その理由は、モデルがまずオンラインのチェックポイントのdtypeでダウンロードされ、次にtorchのデフォルトのdtype(torch.float32になり、device_map=“auto”)にキャストされ、最後に設定にdtypeまたはtorch_dtypeが指定されている場合はそれが使用されるためです。
float16でモデルをトレーニングすることは推奨されておらず、nanが発生することが知られています。そのため、モデルはbfloat16でトレーニングする必要があります。
ヒント:
Llama3モデルの重みは、このフォームに記入することで入手できます。
アーキテクチャはLlama2と完全に同一です。
トークナイザーは、tiktoken に基づく BPE モデルです(Llama2 では sentencepiece 実装に基づいていました)。主な違いは、入力トークンが語彙の一部である場合、BPE のマージルールを無視することです。つまり、
"hugging"を生成するマージが存在しない場合、["hug","ging"]のような最小単位で 2 つのトークンに分割されるのではなく、"hugging"が語彙の一部であれば、自動的に 1 つのトークンとして返されます。元のモデルは
pad_id = -1を使用しており、これはパディングトークンが存在しないことを意味します。同じロジックを適用することはできないため、tokenizer.add_special_tokens({"pad_token":"<pad>"})を使用してパディングトークンを追加し、それに応じてトークン埋め込みをリサイズしてください。また、model.config.pad_token_idを設定する必要があります。モデルのembed_tokens層はself.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.config.padding_idx)で初期化されており、これによりパディングトークンのエンコード時にゼロが出力されることを保証します。そのため、初期化時にこれを渡すことをお勧めします。元のチェックポイントは、変換スクリプトを使用して変換できます。スクリプトは、以下の(例)コマンドで呼び出すことができます。
python src/transformers/models/llama/convert_llama_weights_to_hf.py \ --input_dir /path/to/downloaded/llama/weights --model_size 7B --output_dir /output/path --llama_version 3変換後、モデルとトークナイザーは以下のように読み込むことができます。
from transformers import AutoModelForCausalLM, AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("/output/path") model = AutoModelForCausalLM.from_pretrained("/output/path", device_map="auto")スクリプトの実行には、モデル全体をfloat16精度で保持するのに十分なCPU RAMが必要です(最大サイズのモデルは複数のチェックポイントに分割されていますが、各チェックポイントにはモデルの各重みの一部が含まれているため、すべてをRAMにロードする必要があります)。したがって、75Bモデルの場合、145GBのRAMが必要です。
attn_implementation="flash_attention_2"を介して Flash Attention 2 を使用する場合は、from_pretrainedクラスメソッドにdtypeを渡さず、Automatic Mixed-Precision 学習を使用してください。Trainerを使用する場合は、fp16またはbf16をTrueに設定するだけです。それ以外の場合は、torch.autocastを使用していることを確認してください。これは、Flash Attention がfp16とbf16のデータ型のみをサポートするためです。
リソース
Llama2のドキュメントページには、すでに多くの優れたリソースが公開されています。Llama3向けに厳選された新しいリソースの追加にご協力ください!🤗
Update on GitHub