Transformers documentation

Llama3

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Эта модель была опубликована в HF papers 31 июля 2024 года и добавлена в Hugging Face Transformers 24 апреля 2024 года.

Llama3

Tensor parallelism
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, доступные для широкого использования. В этом релизе представлены предобученные и дообученные на инструкциях языковые модели с 8B и 70B параметрами, способные поддерживать широкий спектр задач. Новое поколение Llama демонстрирует передовые результаты на множестве отраслевых бенчмарков и предлагает новые возможности, включая улучшенное рассуждение. Мы считаем, что это лучшие открытые модели своего класса, без оговорок. В рамках нашего давнего открытого подхода мы передаём Llama 3 в руки сообщества. Мы хотим запустить новую волну инноваций в области ИИ по всему стеку — от приложений и инструментов для разработчиков до оценок и оптимизации инференса. Мы с нетерпением ждём, что вы создадите, и будем рады вашему отзыву.

Все контрольные точки моделей Llama3 можно найти здесь. Исходный код авторов доступен здесь.

Советы по использованию

Модели Llama3 обучались с использованием bfloat16, однако исходный инференс использует float16. Чекпоинты, загруженные на Hub, используют dtype = 'float16', что будет использовано API AutoModel для приведения чекпоинтов из torch.float32 к torch.float16.

dtype онлайн-весов в большинстве случаев не имеет значения, если только при инициализации модели с помощью model = AutoModelForCausalLM.from_pretrained("path", dtype = "auto") не используется dtype="auto". Причина в том, что модель сначала скачивается (с использованием dtype из онлайн-чекпоинтов), затем приводится к dtype по умолчанию в torch (становится torch.float32, device_map=“auto”), и, наконец, если в конфигурации заданы dtype или torch_dtype, они будут использованы.

Обучение модели в float16 не рекомендуется, так как известно, что это приводит к появлению nan; поэтому модель следует обучать в bfloat16.

Советы:

  • Веса для моделей Llama3 можно получить, заполнив эту форму

  • Архитектура полностью совпадает с Llama2.

  • Токенизатор представляет собой модель BPE на основе tiktoken (в отличие от реализации на базе sentencepiece для Llama2). Главное отличие состоит в том, что он игнорирует правила слияния BPE, если входной токен уже входит в словарь. Это означает, что если не существует слияния, которое могло бы образовать "hugging", то вместо получения минимальных единиц, например ["hug","ging"] из 2 токенов, если "hugging" входит в словарь, он будет автоматически возвращён как токен.

  • Исходная модель использует 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")

    Обратите внимание, что для выполнения скрипта необходимо достаточно оперативной памяти CPU, чтобы разместить всю модель в точности float16 (даже если самые большие версии поставляются в виде нескольких контрольных точек, каждая из них содержит часть каждого веса модели, поэтому нам нужно загрузить их все в ОЗУ). Для модели 75B требуется 145 ГБ ОЗУ.

  • При использовании Flash Attention 2 через attn_implementation="flash_attention_2" не передавайте dtype в метод класса from_pretrained и используйте обучение с автоматическим смешанным прецизионным режимом. При использовании Trainer достаточно установить fp16 или bf16 в True. В противном случае убедитесь, что вы используете torch.autocast. Это необходимо, так как Flash Attention поддерживает только типы данных fp16 и bf16.

Ресурсы

На странице документации Llama2 уже собрано множество полезных ресурсов, и мы приглашаем участников добавлять сюда новые материалы, отобранные для Llama3! 🤗

Update on GitHub