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

## Genel Bakış

[Llama3](https://huggingface.co/papers/2407.21783) modeli, meta AI ekibi tarafından [Introducing Meta Llama 3: The most capable openly available LLM to date](https://ai.meta.com/blog/meta-llama-3/) başlıklı çalışmada önerilmiştir.

Blog yazısındaki özet aşağıdaki gibidir:

*Bugün, Llama'nın yeni nesli olan Meta Llama 3'ün, geniş kullanım için erişime açılan ilk iki modelini paylaşmaktan heyecan duyuyoruz. Bu sürüm, geniş bir kullanım senaryosu yelpazesini destekleyebilen 8B ve 70B parametreli ön eğitilmiş ve talimatla ince ayarlanmış dil modelleri içeriyor. Llama'nın bu yeni nesli, çeşitli sektör standartlarında en iyi performansı sergilemekte ve gelişmiş akıl yürütme dahil olmak üzere yeni yetenekler sunmaktadır. Bu modellerin, kendi sınıflarında en iyi açık kaynak modeller olduğuna inanıyoruz. Uzun süredir benimsediğimiz açık yaklaşımımız doğrultusunda, Llama 3'ü topluluğun kullanımına sunuyoruz. Uygulamalardan geliştirici araçlarına, değerlendirmelerden çıkarım optimizasyonlarına kadar tüm yığın boyunca yapay zekâdaki bir sonraki inovasyon dalgasını başlatmak istiyoruz. Ne inşa edeceğinizi görmek ve geri bildirimlerinizi almak için sabırsızlanıyoruz.*

Tüm Llama3 model kontrol noktalarını [burada](https://huggingface.co/models?search=llama3) inceleyebilirsiniz. Yazarların orijinal kodu [burada](https://github.com/meta-llama/llama3) bulunabilir.

## Kullanım ipuçları

`Llama3` modelleri `bfloat16` kullanılarak eğitildi, ancak orijinal çıkarım `float16` kullanır. Hub'a yüklenen denetim noktaları `dtype = 'float16'` kullanır ve `AutoModel` API'si, denetim noktalarını `torch.float32`'den `torch.float16`'ya dönüştürmek için bunu kullanacaktır.

Çevrimiçi ağırlıkların `dtype`'i, `model = AutoModelForCausalLM.from_pretrained("path", dtype = "auto")` ile bir model başlatırken `dtype="auto"` kullanmıyorsanız büyük ölçüde önemsizdir. Bunun nedeni, modelin önce indirilecek olması (çevrimiçi checkpoint'lerin `dtype`'i kullanılarak), ardından `torch`'ün varsayılan `dtype`'ine (`torch.float32`, device_map="auto") dönüştürülecek olması ve son olarak yapılandırmada bir `dtype` veya `torch_dtype` sağlanmışsa bunun kullanılacak olmasıdır.

Modeli `float16` ile eğitmek önerilmez ve `nan` üretmesi bilinmektedir; bu nedenle model `bfloat16` ile eğitilmelidir.

İpuçları:

- Llama3 modellerinin ağırlıkları, [bu formu](https://ai.meta.com/resources/models-and-libraries/llama-downloads/) doldurarak elde edilebilir.
- Mimari, Llama2 ile tamamen aynıdır.
- Tokenizör, [tiktoken](https://github.com/openai/tiktoken) tabanlı bir BPE modelidir (Llama2 için sentencepiece uygulamasına dayalı olandan farklı olarak). Temel farkı, bir girdi tokeni sözlüğün bir parçasıysa BPE birleştirme kurallarını yok saymasıdır. Bu, `"hugging"` tokenini üretmek için bir birleştirme kuralı yoksa, `["hug","ging"]` gibi en küçük birimlerden oluşan 2 token yerine, `"hugging"` sözlüğün bir parçasıysa otomatik olarak bir token olarak döndürüleceği anlamına gelir.
- Orijinal model, dolgu işareti olmadığını gösteren `pad_id = -1` değerini kullanır. Aynı mantığı uygulayamayız; `tokenizer.add_special_tokens({"pad_token":"<pad>"})` kullanarak bir dolgu işareti eklediğinizden ve token gömme boyutunu buna göre yeniden boyutlandırdığınızdan emin olun. Ayrıca `model.config.pad_token_id` değerini de ayarlamanız gerekir. Modelin `embed_tokens` katmanı, dolgu işaretinin kodlanmasının sıfır üreteceğini garanti eden `self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.config.padding_idx)` ifadesiyle başlatılır; bu nedenle başlatma sırasında bu değerin geçirilmesi önerilir.
- Orijinal checkpoint, [dönüştürme betiği](https://github.com/huggingface/transformers/blob/main/src/transformers/models/llama/convert_llama_weights_to_hf.py) kullanılarak dönüştürülebilir. Betik, aşağıdaki (örnek) komutla çağrılabilir:

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

- Dönüştürme işleminden sonra model ve tokenizer şu şekilde yüklenebilir:

    ```python
    from transformers import AutoModelForCausalLM, AutoTokenizer

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

    Not: Betiğin çalıştırılması, tüm modelin float16 hassasiyetinde barındırılması için yeterli CPU RAM gerektirir (en büyük sürümler birden fazla checkpoint olarak gelse de, bunların her biri modelin her ağırlığının bir parçasını içerdiğinden, hepsini RAM'e yüklememiz gerekir). 75B model için bu, 145GB RAM gerektirir.

- `attn_implementation="flash_attention_2"` ile Flash Attention 2 kullanırken, `from_pretrained` sınıf yöntemine `dtype` parametresini geçirmeyin ve Otomatik Karma Hassasiyet (Automatic Mixed-Precision) eğitimini kullanın. `Trainer` kullanıyorsanız, `True` değerini `fp16` veya `bf16` parametresine atamanız yeterlidir. Aksi takdirde, `torch.autocast` kullandığınızdan emin olun. Flash Attention yalnızca `fp16` ve `bf16` veri türlerini desteklediği için bu gereklidir.

## Kaynaklar

[Llama2](./llama2) dokümantasyon sayfasında zaten bol miktarda harika kaynak mevcut; Llama3 için derlenmiş yeni kaynaklar eklemeye davet ediyoruz! 🤗

