# 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?")
```

## Tổng quan

Mô hình [Llama3](https://huggingface.co/papers/2407.21783) được đề xuất trong [Introducing Meta Llama 3: The most capable openly available LLM to date](https://ai.meta.com/blog/meta-llama-3/) bởi nhóm meta AI.

Tóm tắt từ bài đăng trên blog như sau:

*Hôm nay, chúng tôi rất vui mừng chia sẻ hai mô hình đầu tiên của thế hệ tiếp theo của Llama, Meta Llama 3, sẵn sàng cho việc sử dụng rộng rãi. Bản phát hành này bao gồm các mô hình ngôn ngữ được huấn luyện trước và tinh chỉnh theo hướng dẫn với 8B và 70B tham số, có khả năng hỗ trợ một phạm vi rộng các trường hợp sử dụng. Thế hệ Llama tiếp theo này thể hiện hiệu suất tiên tiến trên nhiều bộ đánh chuẩn ngành và cung cấp các khả năng mới, bao gồm suy luận được cải thiện. Chúng tôi tin rằng đây là những mô hình mã nguồn mở tốt nhất trong cùng phân khúc, không có ngoại lệ. Để hỗ trợ cho cách tiếp cận mở lâu dài của chúng tôi, chúng tôi đang đặt Llama 3 vào tay cộng đồng. Chúng tôi muốn khởi động làn sóng đổi mới tiếp theo trong AI xuyên suốt toàn bộ hệ thống — từ ứng dụng đến công cụ dành cho nhà phát triển, đến đánh giá, đến tối ưu hóa suy luận và nhiều hơn nữa. Chúng tôi không thể chờ đợi để xem những gì bạn xây dựng và mong nhận được phản hồi từ bạn.*

Xem tất cả các checkpoint của mô hình Llama3 [tại đây](https://huggingface.co/models?search=llama3). Mã nguồn gốc của các tác giả có thể được tìm thấy [tại đây](https://github.com/meta-llama/llama3).

## Mẹo sử dụng

Các mô hình `Llama3` được huấn luyện bằng `bfloat16`, nhưng suy luận gốc sử dụng `float16`. Các checkpoint được tải lên Hub sử dụng `dtype = 'float16'`, và API `AutoModel` sẽ dùng giá trị này để chuyển đổi checkpoint từ `torch.float32` sang `torch.float16`.

`dtype` của trọng số trực tuyến hầu như không quan trọng, trừ khi bạn sử dụng `dtype="auto"` khi khởi tạo mô hình bằng `model = AutoModelForCausalLM.from_pretrained("path", dtype = "auto")`. Lý do là mô hình sẽ được tải xuống trước (sử dụng `dtype` của các checkpoint trực tuyến), sau đó được chuyển đổi sang `dtype` mặc định của `torch` (trở thành `torch.float32`, device_map="auto"), và cuối cùng, nếu có `dtype` hoặc `torch_dtype` được cung cấp trong config, giá trị đó sẽ được sử dụng.

Việc huấn luyện mô hình ở `float16` không được khuyến nghị và được biết là sẽ tạo ra `nan`; do đó, mô hình nên được huấn luyện ở `bfloat16`.

Mẹo:

- Trọng số cho các mô hình Llama3 có thể được lấy bằng cách điền [biểu mẫu này](https://ai.meta.com/resources/models-and-libraries/llama-downloads/)
- Kiến trúc hoàn toàn giống với Llama2.
- Tokenizer là một mô hình BPE dựa trên [tiktoken](https://github.com/openai/tiktoken) (so với tokenizer dựa trên cài đặt sentencepiece cho Llama2). Điểm khác biệt chính là nó bỏ qua các quy tắc gộp BPE khi một token đầu vào nằm trong từ vựng. Điều này có nghĩa là nếu không có quy tắc gộp nào để tạo ra `"hugging"`, thay vì có các đơn vị nhỏ nhất, như `["hug","ging"]` tạo thành 2 token, nếu `"hugging"` là một phần của từ vựng, nó sẽ được tự động trả về như một token.
- Mô hình gốc sử dụng `pad_id = -1`, có nghĩa là không có token đệm. Chúng ta không thể dùng cùng một logic, hãy đảm bảo thêm một token đệm bằng cách sử dụng `tokenizer.add_special_tokens({"pad_token":"<pad>"})` và điều chỉnh kích thước embedding token cho phù hợp. Bạn cũng nên đặt `model.config.pad_token_id`. Lớp `embed_tokens` của mô hình được khởi tạo bằng `self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.config.padding_idx)`, điều này đảm bảo rằng việc mã hóa token đệm sẽ cho ra kết quả là các số không, do đó việc truyền tham số này khi khởi tạo là được khuyến nghị.
- Checkpoint gốc có thể được chuyển đổi bằng [script chuyển đổi](https://github.com/huggingface/transformers/blob/main/src/transformers/models/llama/convert_llama_weights_to_hf.py). Script có thể được gọi bằng lệnh (ví dụ) sau:

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

- Sau khi chuyển đổi, mô hình và tokenizer có thể được nạp thông qua:

    ```python
    from transformers import AutoModelForCausalLM, AutoTokenizer

    tokenizer = AutoTokenizer.from_pretrained("/output/path")
    model = AutoModelForCausalLM.from_pretrained("/output/path", device_map="auto")
    ```

    Lưu ý rằng việc thực thi script yêu cầu đủ bộ nhớ RAM CPU để chứa toàn bộ mô hình ở độ chính xác float16 (ngay cả khi các phiên bản lớn nhất được chia thành nhiều checkpoint, mỗi checkpoint chứa một phần của mỗi trọng số của mô hình, do đó chúng ta cần nạp tất cả vào RAM). Đối với mô hình 75B, cần 145GB RAM.

- Khi sử dụng Flash Attention 2 thông qua `attn_implementation="flash_attention_2"`, đừng truyền `dtype` vào phương thức lớp `from_pretrained` và hãy sử dụng huấn luyện Automatic Mixed-Precision. Khi dùng `Trainer`, chỉ cần đặt `fp16` hoặc `bf16` thành `True`. Nếu không, hãy đảm bảo bạn đang sử dụng `torch.autocast`. Điều này là bắt buộc vì Flash Attention chỉ hỗ trợ kiểu dữ liệu `fp16` và `bf16`.

## Tài nguyên

Rất nhiều tài nguyên thú vị đã có sẵn trên trang tài liệu của [Llama2](./llama2), mời các nhà đóng góp thêm các tài nguyên mới được tuyển chọn cho Llama3 tại đây! 🤗

