Home Машинное обучение Точная настройка Falcon 7B и других LLM на Amazon SageMaker с помощью декоратора @remote | DeepTech

Точная настройка Falcon 7B и других LLM на Amazon SageMaker с помощью декоратора @remote | DeepTech

0
Точная настройка Falcon 7B и других LLM на Amazon SageMaker с помощью декоратора @remote
 | DeepTech

Сегодня генеративные модели ИИ решают самые разные задачи: от обобщения текста, вопросов и ответов до создания изображений и видео. Для улучшения качества вывода используются такие подходы, как n-короткое обучение, оперативное проектирование, поисковая дополненная генерация (RAG) и точная настройка. Точная настройка позволяет вам настроить эти генеративные модели ИИ для повышения производительности при выполнении задач, специфичных для вашей предметной области.

Благодаря Amazon SageMaker теперь вы можете запустить задание обучения SageMaker, просто аннотируя свой код Python с помощью декоратора @remote. SageMaker Python SDK автоматически преобразует существующую рабочую среду и любой связанный с ней код обработки данных и наборы данных в задание обучения SageMaker, которое выполняется на платформе обучения. Преимущество этого подхода состоит в том, что код пишется более естественным, объектно-ориентированным способом, и при этом по-прежнему используются возможности SageMaker для запуска обучающих заданий в удаленном кластере с минимальными изменениями.

В этой статье мы покажем, как настроить Сокол-7Б Базовые модели (FM) с использованием декоратора @remote из SageMaker Python SDK. Он также использует Точная настройка параметров Hugging Face (PEFT) и методы квантования с помощью биты и байты для поддержки тонкой настройки. Код, представленный в этом блоге, также можно использовать для тонкой настройки других FM, таких как Лама-2 13б.

Полноточные представления этой модели могут с трудом уместиться в памяти на одном или даже нескольких Графические процессоры (GPU) — или, возможно, даже понадобится экземпляр большего размера. Следовательно, чтобы точно настроить эту модель без увеличения затрат, мы используем метод, известный как Квантованные LLM с адаптерами низкого ранга (QLoRA). QLoRA — это эффективный подход к тонкой настройке, который снижает использование памяти LLM, сохраняя при этом очень хорошую производительность.

Преимущества использования декоратора @remote

Прежде чем идти дальше, давайте разберемся, как удаленный декоратор повышает производительность разработчиков при работе с SageMaker:

  • Декоратор @remote запускает задание обучения напрямую, используя собственный код Python, без явного вызова оценщиков SageMaker и входных каналов SageMaker.
  • Низкий барьер для входа в модели обучения разработчиков на SageMaker.
  • Нет необходимости переключаться Интегрированные среды разработки (IDE). Продолжайте писать код в выбранной вами IDE и запускайте учебные задания SageMaker.
  • Нет необходимости изучать контейнеры. Продолжайте предоставлять зависимости в requirements.txt и передайте это удаленному декоратору.

Предварительные условия

Требуется учетная запись AWS с ролью AWS Identity and Access Management (AWS IAM), которая имеет разрешения на управление ресурсами, созданными в рамках решения. Подробную информацию см. в разделе Создание учетной записи AWS.

В этом посте мы используем Amazon SageMaker Studio с Data Science 3.0 изображение и ml.t3.medium экземпляр быстрого запуска. Однако вы можете использовать любую интегрированную среду разработки (IDE) по вашему выбору. Вам просто нужно правильно настроить учетные данные интерфейса командной строки AWS (AWS CLI). Дополнительную информацию см. в разделе Настройка интерфейса командной строки AWS.

Для доводки Falcon-7B, ml.g5.12xlarge экземпляр используется в этом посте. Убедитесь, что в аккаунте AWS достаточно места для этого экземпляра.

Вам нужно клонировать это Репозиторий на Гитхабе для репликации решения, продемонстрированного в этом посте.

Обзор решения

  1. Установите необходимые условия для тонкой настройки модели Falcon-7B.
  2. Настройка конфигураций удаленного декоратора
  3. Предварительная обработка набора данных, содержащего часто задаваемые вопросы по сервисам AWS
  4. Тонкая настройка Falcon-7B на сервисах AWS: часто задаваемые вопросы
  5. Протестируйте модели точной настройки, ответив на примеры вопросов, связанных с сервисами AWS.

1. Установить необходимые условия для тонкой настройки модели Falcon-7B.

Запустите блокнот falcon-7b-qlora-remote-decorator_qa.ipynb в SageMaker Studio, выбрав Iмаг как Data Science и Ядро как Python 3. Установите все необходимые библиотеки, упомянутые в requirements.txt. Некоторые библиотеки необходимо устанавливать на самом экземпляре ноутбука. Выполните другие операции, необходимые для обработки набора данных и запуска задания обучения SageMaker.

%pip install -r requirements.txt

%pip install -q -U transformers==4.31.0
%pip install -q -U datasets==2.13.1
%pip install -q -U peft==0.4.0
%pip install -q -U accelerate==0.21.0
%pip install -q -U bitsandbytes==0.40.2
%pip install -q -U boto3
%pip install -q -U sagemaker==2.154.0
%pip install -q -U scikit-learn

2. Настройка конфигураций удаленного декоратора

Создайте файл конфигурации, в котором указаны все конфигурации, связанные с заданием обучения Amazon SageMaker. Этот файл читается декоратором @remote во время выполнения задания обучения. Этот файл содержит такие настройки, как зависимости, обучающий образ, экземпляр и роль выполнения, которая будет использоваться для учебного задания. Подробную информацию обо всех настройках, поддерживаемых файлом конфигурации, см. Настройка и использование значений по умолчанию с помощью SageMaker Python SDK.

SchemaVersion: '1.0'
SageMaker:
  PythonSDK:
    Modules:
      RemoteFunction:
        Dependencies: ./requirements.txt
        ImageUri: '{aws_account_id}.dkr.ecr.{region}.amazonaws.com/huggingface-pytorch-training:2.0.0-transformers4.28.1-gpu-py310-cu118-ubuntu20.04'
        InstanceType: ml.g5.12xlarge
        RoleArn: arn:aws:iam::111122223333:role/ExampleSageMakerRole

Не обязательно использовать config.yaml файл для работы с декоратором @remote. Это просто более простой способ передать все конфигурации декоратору @remote. Благодаря этому параметры, связанные с SageMaker и AWS, остаются вне кода, позволяя единовременно настроить файл конфигурации, используемый всеми членами команды. Все конфигурации также можно было бы указать непосредственно в аргументах декоратора, но это снижает читаемость и удобство сопровождения изменений в долгосрочной перспективе. Кроме того, файл конфигурации может быть создан администратором и доступен всем пользователям в среде.

Предварительная обработка набора данных, содержащего часто задаваемые вопросы по сервисам AWS

Следующим шагом является загрузка и предварительная обработка набора данных, чтобы подготовить его к обучению. Сначала давайте посмотрим на набор данных:

Здесь показаны часто задаваемые вопросы для одного из сервисов AWS. Помимо QLoRA, bitsanbytes используется для преобразования в 4-битную точность для квантования замороженного LLM в 4-битный и присоединения ЛоРА адаптеры на нем.

Создайте шаблон подсказки, чтобы преобразовать каждый образец часто задаваемых вопросов в формат подсказки:

from random import randint

# custom instruct prompt start
prompt_template = f"{{question}}\n---\nAnswer:\n{{answer}}{{eos_token}}"

# template dataset to add prompt to each sample
def template_dataset(sample):
    sample("text") = prompt_template.format(question=sample("question"),
                                            answer=sample("answers"),
                                            eos_token=tokenizer.eos_token)
    return sample

Следующим шагом является преобразование входных данных (текста) в идентификаторы токенов. Это делается с помощью Токенизатор Трансформеров Обнимающего Лица.

from transformers import AutoTokenizer

model_id = "tiiuae/falcon-7b"

tokenizer = AutoTokenizer.from_pretrained(model_id)
# Set the Falcon tokenizer
tokenizer.pad_token = tokenizer.eos_token

Теперь просто используйте prompt_template функция для преобразования всех часто задаваемых вопросов в формат подсказок и настройки наборов обучающих и тестовых данных.

4. Точная настройка Falcon-7B на сервисах AWS. Часто задаваемые вопросы

Теперь вы можете подготовить сценарий обучения и определить функцию обучения. train_fn и поместите декоратор @remote в функцию.

Функция обучения выполняет следующие действия:

  • токенизирует и разбивает набор данных
  • настраивать BitsAndBytesConfigкоторый указывает, что модель должна быть загружена в 4-битном формате, но при этом вычисления должны быть преобразованы в bfloat16.
  • Загрузите модель
  • Найдите целевые модули и обновите необходимые матрицы с помощью служебного метода. find_all_linear_names
  • Создавать ЛоРА конфигурации, которые определяют ранжирование матриц обновления (s), коэффициент масштабирования (lora_alpha), модули для применения матриц обновления LoRA (target_modules), вероятность выпадения слоев Лоры(lora_dropout), task_typeи т. д.
  • Начните обучение и оценку
import bitsandbytes as bnb

def find_all_linear_names(hf_model):
    lora_module_names = set()
    for name, module in hf_model.named_modules():
        if isinstance(module, bnb.nn.Linear4bit):
            names = name.split(".")
            lora_module_names.add(names(0) if len(names) == 1 else names(-1))

    if "lm_head" in lora_module_names:
        lora_module_names.remove("lm_head")
    return list(lora_module_names)
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from sagemaker.remote_function import remote
import torch
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
import transformers

# Start training
@remote(volume_size=50)
def train_fn(
        model_name,
        train_ds,
        test_ds,
        lora_r=8,
        lora_alpha=32,
        lora_dropout=0.05,
        per_device_train_batch_size=8,
        per_device_eval_batch_size=8,
        learning_rate=2e-4,
        num_train_epochs=1
):
    # tokenize and chunk dataset
    lm_train_dataset = train_ds.map(
        lambda sample: tokenizer(sample("text")), batched=True, batch_size=24, remove_columns=list(train_dataset.features)
    )


    lm_test_dataset = test_ds.map(
        lambda sample: tokenizer(sample("text")), batched=True, remove_columns=list(test_dataset.features)
    )

    # Print total number of samples
    print(f"Total number of train samples: {len(lm_train_dataset)}")

    bnb_config = BitsAndBytesConfig(
        load_in_4bit=True,
        bnb_4bit_use_double_quant=True,
        bnb_4bit_quant_type="nf4",
        bnb_4bit_compute_dtype=torch.bfloat16
    )
    # Falcon requires you to allow remote code execution. This is because the model uses a new architecture that is not part of transformers yet.
    # The code is provided by the model authors in the repo.
    model = AutoModelForCausalLM.from_pretrained(
        model_name,
        trust_remote_code=True,
        quantization_config=bnb_config,
        device_map="auto")

    model.gradient_checkpointing_enable()
    model = prepare_model_for_kbit_training(model, use_gradient_checkpointing=True)

    # get lora target modules
    modules = find_all_linear_names(model)
    print(f"Found {len(modules)} modules to quantize: {modules}")

    config = LoraConfig(
        r=lora_r,
        lora_alpha=lora_alpha,
        target_modules=modules,
        lora_dropout=lora_dropout,
        bias="none",
        task_type="CAUSAL_LM"
    )

    model = get_peft_model(model, config)
    print_trainable_parameters(model)

    trainer = transformers.Trainer(
        model=model,
        train_dataset=lm_train_dataset,
        eval_dataset=lm_test_dataset,
        args=transformers.TrainingArguments(
            per_device_train_batch_size=per_device_train_batch_size,
            per_device_eval_batch_size=per_device_eval_batch_size,
            logging_steps=2,
            num_train_epochs=num_train_epochs,
            learning_rate=learning_rate,
            bf16=True,
            save_strategy="no",
            output_dir="outputs"
        ),
        data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),
    )
    model.config.use_cache = False

    trainer.train()
    trainer.evaluate()

    model.save_pretrained("/opt/ml/model")

И вызвать train_fn()

train_fn(model_id, train_dataset, test_dataset)

Задание по настройке будет выполняться в обучающем кластере Amazon SageMaker. Подождите, пока работа по настройке завершится.

5. Проверьте модели точной настройки на примерах вопросов, связанных с сервисами AWS.

Теперь пришло время провести несколько тестов модели. Сначала загрузим модель:

from peft import PeftModel, PeftConfig
import torch
from transformers import AutoModelForCausalLM

device="cuda" if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'

config = PeftConfig.from_pretrained("./model")
model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path, trust_remote_code=True)
model = PeftModel.from_pretrained(model, "./model")
model.to(device)

Теперь загрузите образец вопроса из набора обучающих данных, чтобы увидеть исходный ответ, а затем задайте тот же вопрос из настроенной модели, чтобы увидеть ответ в сравнении.

Вот пример вопроса из обучающего набора и оригинальный ответ:

Теперь тот же вопрос задается и по поводу настроенной модели Falcon-7B:

На этом завершается реализация тонкой настройки Falcon-7B в наборе часто задаваемых вопросов по сервисам AWS с использованием декоратора @remote из Amazon SageMaker Python SDK.

Убираться

Выполните следующие шаги, чтобы очистить ресурсы:

  • Завершите работу экземпляров Amazon SageMaker Studio, чтобы избежать дополнительных затрат.
  • Очистите каталог Amazon Elastic File System (Amazon EFS), очистив каталог кэша Hugging Face:
    rm -R ~/.cache/huggingface/hub

Заключение

В этом посте мы показали вам, как эффективно использовать возможности декоратора @remote для точной настройки модели Falcon-7B с использованием QLoRA, Hugging Face PEFT с bitsandbtyes без внесения существенных изменений в учебный блокнот и использовал возможности Amazon SageMaker для запуска обучающих заданий в удаленном кластере.

Весь код, показанный в этом посте для точной настройки Falcon-7B, доступен в Репозиторий GitHub. В репозитории также есть блокнот, показывающий, как точно настроить Llama-13B.

В качестве следующего шага мы рекомендуем вам ознакомиться с функциональностью декоратора @remote и API Python SDK и используйте его в выбранной вами среде и IDE. Дополнительные примеры доступны в разделе amazon-sagemaker-примеры репозиторий, чтобы вы могли быстро начать работу. Вы также можете просмотреть следующие публикации:


Об авторах

Бруно Пистоне — специалист по архитектуре решений AI/ML в AWS, базирующийся в Милане. Он работает с крупными клиентами, помогая им глубоко понять их технические потребности и разрабатывать решения в области искусственного интеллекта и машинного обучения, которые максимально эффективно используют облако AWS и стек машинного обучения Amazon. Его опыт включает комплексное машинное обучение, индустриализацию машинного обучения и генеративный искусственный интеллект. Ему нравится проводить время со своими друзьями и исследовать новые места, а также путешествовать по новым направлениям.

Викеш Пандей — специалист по архитектуре решений в области машинного обучения в AWS, помогающий клиентам из финансовой отрасли разрабатывать и создавать решения на основе генеративного искусственного интеллекта и машинного обучения. Помимо работы Викеш любит пробовать разные кухни и заниматься спортом на свежем воздухе.

LEAVE A REPLY

Please enter your comment!
Please enter your name here