# Llama3

```python
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](https://huggingface.co/papers/2407.21783)モデルは、Meta AIチームによって[Introducing Meta Llama 3: The most capable openly available LLM to date](https://ai.meta.com/blog/meta-llama-3/)で提案されました。

ブログ記事の概要は以下の通りです:

*本日、次世代LlamaであるMeta Llama 3の最初の2つのモデルを、広くご利用いただける形で公開できることを嬉しく思います。今回のリリースでは、8Bパラメータと70Bパラメータの事前学習済み言語モデルと、指示に微調整を施した言語モデルを提供し、幅広いユースケースに対応できます。この次世代Llamaは、幅広い業界ベンチマークで最先端の性能を示し、推論能力の向上など、新たな機能を提供します。私たちは、これらが同クラスで最良のオープンソースモデルであると確信しています。長年続けてきたオープンなアプローチを支持するため、Llama 3をコミュニティに提供します。アプリケーションから開発者ツール、評価、推論の最適化など、スタック全体にわたるAIの次のイノベーションの波を巻き起こしたいと考えています。皆様にご構築いただくものを待ちきれず、フィードバックをお待ちしております。*

Llama3のすべてのモデルチェックポイントは[こちら](https://huggingface.co/models?search=llama3)で確認できます。著者の元のコードは[こちら](https://github.com/meta-llama/llama3)にあります。

## 使用のコツ

`Llama3`モデルは`bfloat16`を使用して学習されましたが、元の推論では`float16`が使用されています。Hubにアップロードされたチェックポイントは`dtype = 'float16'`を使用しており、`AutoModel` APIによって、チェックポイントが`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モデルの重みは、[このフォーム](https://ai.meta.com/resources/models-and-libraries/llama-downloads/)に記入することで入手できます。
- アーキテクチャはLlama2と完全に同一です。
- トークナイザーは、[tiktoken](https://github.com/openai/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)`で初期化されており、これによりパディングトークンのエンコード時にゼロが出力されることを保証します。そのため、初期化時にこれを渡すことをお勧めします。
- 元のチェックポイントは、[変換スクリプト](https://github.com/huggingface/transformers/blob/main/src/transformers/models/llama/convert_llama_weights_to_hf.py)を使用して変換できます。スクリプトは、以下の（例）コマンドで呼び出すことができます。

    ```bash
    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
    ```

- 変換後、モデルとトークナイザーは以下のように読み込むことができます。

    ```python
    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](./llama2)のドキュメントページには、すでに多くの優れたリソースが公開されています。Llama3向けに厳選された新しいリソースの追加にご協力ください！🤗

