Connect with us

Единственное руководство, которое вам нужно для тонкой настройки Llama 3 или любой другой открытой модели

Искусственный интеллект

Единственное руководство, которое вам нужно для тонкой настройки Llama 3 или любой другой открытой модели

mm
FINE TUNING OPEN SOURCE LLM PYTHON GUIDE

Тонкая настройка крупных языковых моделей (LLM) типа Llama 3 включает в себя адаптацию предварительно обученной модели к конкретным задачам с помощью набора данных, специфичного для области. Этот процесс использует предварительные знания модели, что делает его эффективным и экономически выгодным по сравнению с обучением с нуля. В этом руководстве мы пройдем шаги тонкой настройки Llama 3 с помощью QLoRA (Квантовая LoRA), параметро-эффективного метода, который минимизирует использование памяти и вычислительные затраты.

Обзор тонкой настройки

Тонкая настройка включает в себя несколько ключевых шагов:

  1. Выбор предварительно обученной модели: Выберите базовую модель, соответствующую вашей желаемой архитектуре.
  2. Сбор набора данных: Соберите и обработайте набор данных, специфичный для вашей задачи.
  3. Тонкая настройка: Адаптируйте модель с помощью набора данных для улучшения ее производительности на конкретных задачах.
  4. Оценка: Оцените тонко настроенную модель с помощью качественных и количественных метрик.

Концепции и техники

Тонкая настройка крупных языковых моделей

Тонкая настройка крупных языковых моделей

Полная тонкая настройка

Полная тонкая настройка обновляет все параметры модели, делая ее специфичной для новой задачи. Этот метод требует значительных вычислительных ресурсов и часто нецелесообразен для очень крупных моделей.

Параметро-эффективная тонкая настройка (PEFT)

PEFT обновляет только подмножество параметров модели, уменьшая требования к памяти и вычислительным затратам. Эта техника предотвращает катастрофическое забывание и сохраняет общие знания модели.

Низкоранговая адаптация (LoRA) и квантовая LoRA (QLoRA)

LoRA тонко настраивает только несколько низкоранговых матриц, а QLoRA квантует эти матрицы для дальнейшего уменьшения памяти.

Методы тонкой настройки

  1. Полная тонкая настройка: Это включает в себя обучение всех параметров модели на задаче-специфичном наборе данных. Хотя этот метод может быть очень эффективным, он также вычислительно дорог и требует значительной памяти.
  2. Параметро-эффективная тонкая настройка (PEFT): PEFT обновляет только подмножество параметров модели, что делает ее более памяти-эффективной. Техники, такие как низкоранговая адаптация (LoRA) и квантовая LoRA (QLoRA), входят в эту категорию.

Что такое LoRA?

Сравнение методов тонкой настройки: QLORA улучшает LoRA с 4-битной квантовой точностью и оптимизаторами для управления всплесками памяти

Сравнение методов тонкой настройки: QLORA улучшает LoRA с 4-битной квантовой точностью и оптимизаторами для управления всплесками памяти

LoRA – это улучшенный метод тонкой настройки, при котором вместо тонкой настройки всех весов предварительно обученной модели тонко настраиваются две меньшие матрицы, которые аппроксимируют более крупную матрицу. Эти матрицы составляют адаптер LoRA. Этот тонко настроенный адаптер затем загружается в предварительно обученную модель и используется для вывода.

Ключевые преимущества LoRA:

  • Эффективность памяти: LoRA уменьшает отпечаток памяти, тонко настраивая только небольшие матрицы вместо всей модели.
  • Переиспользуемость: Оригинальная модель остается неизменной, и с ней можно использовать несколько адаптеров LoRA, что облегчает обработку нескольких задач с меньшими требованиями к памяти.

Что такое квантовая LoRA (QLoRA)?

QLoRA берет LoRA на шаг дальше, квантуя веса адаптеров LoRA до более низкой точности (например, 4-бит вместо 8-бит). Это еще больше уменьшает использование памяти и требования к хранению, сохраняя при этом сопоставимый уровень эффективности.

Ключевые преимущества QLoRA:

  • Даже большая эффективность памяти: Квантуя веса, QLoRA значительно уменьшает требования модели к памяти и хранению.
  • Сохраняет производительность: Несмотря на уменьшенную точность, QLoRA сохраняет уровень производительности, близкий к тому, что у моделей полной точности.

Задача-специфическая адаптация

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

Тонкая настройка на практике

Полная тонкая настройка vs. PEFT

  • Полная тонкая настройка: Включает в себя обучение всей модели, что может быть вычислительно дорогим и требует значительной памяти.
  • Параметро-эффективная тонкая настройка (PEFT): Тонко настраивает только подмножество параметров, уменьшая требования к памяти и предотвращая катастрофическое забывание, что делает ее более эффективной альтернативой.

Шаги реализации

  1. Настройка среды: Установите необходимые библиотеки и настройте вычислительную среду.
  2. Загрузка и обработка набора данных: Загрузите набор данных и обработайте его в формат, подходящий для модели.
  3. Загрузка предварительно обученной модели: Загрузите базовую модель с конфигурациями квантования, если используете QLoRA.
  4. Токенизация: Токенизируйте набор данных, чтобы подготовить его к обучению.
  5. Обучение: Тонко настройте модель с помощью подготовленного набора данных.
  6. Оценка: Оцените производительность модели на конкретных задачах с помощью качественных и количественных метрик.

Шаг за шагом руководство по тонкой настройке LLM

Настройка среды

Мы будем использовать блокнот Jupyter для этого учебника. Платформы, такие как Kaggle, которые предлагают бесплатное использование GPU, или Google Colab, идеальны для запуска этих экспериментов.

1. Установка необходимых библиотек

Сначала убедитесь, что у вас установлены необходимые библиотеки:

!pip install -qqq -U bitsandbytes transformers peft accelerate datasets scipy einops evaluate trl rouge_score

2. Импорт библиотек и настройка среды

import os
import torch
from datasets import load_dataset
from transformers import (
AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, TrainingArguments,
pipeline, HfArgumentParser
)
from trl import ORPOConfig, ORPOTrainer, setup_chat_format, SFTTrainer
from tqdm import tqdm
import gc
import pandas as pd
import numpy as np
from huggingface_hub import interpreter_login

# Disable Weights and Biases logging
os.environ['WANDB_DISABLED'] = "true"
interpreter_login()

3. Загрузка набора данных

Мы будем использовать набор данных DialogSum для этого учебника:

dataset_name = "neil-code/dialogsum-test"
dataset = load_dataset(dataset_name)

4. Создание конфигурации BitsAndBytes

Чтобы загрузить модель в 4-битном формате:

compute_dtype = getattr(torch, "float16")
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type='nf4',
bnb_4bit_compute_dtype=compute_dtype,
bnb_4bit_use_double_quant=False,
)

5. Загрузка предварительно обученной модели

Используя модель Microsoft’s Phi-2 для этого учебника:

model_name = 'microsoft/phi-2'
device_map = {"": 0}
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)

6. Токенизация

Настройка токенизатора:

tokenizer = AutoTokenizer.from_pretrained(
model_name,
trust_remote_code=True,
padding_side="left",
add_eos_token=True,
add_bos_token=True,
use_fast=False
)
tokenizer.pad_token = tokenizer.eos_token

Тонкая настройка Llama 3 или других моделей

Когда тонко настраиваются модели, такие как Llama 3 или другие передовые открытые LLM, есть конкретные соображения и корректировки, необходимые для обеспечения оптимальной производительности. Вот подробные шаги и идеи о том, как подойти к этому для разных моделей, включая Llama 3, GPT-3 и Mistral.

5.1 Использование Llama 3

Выбор модели:

  • Убедитесь, что у вас есть правильный идентификатор модели из хаба моделей Hugging Face. Например, модель Llama 3 может быть идентифицирована как meta-llama/Meta-Llama-3-8B на Hugging Face.
  • Убедитесь, что вы запросили доступ и вошли в свою учетную запись Hugging Face, если это требуется для моделей, таких как Llama 3​ (Hugging Face)​​

Токенизация:

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

Память и вычисления:

  • Тонкая настройка крупных моделей, таких как Llama 3, требует значительных вычислительных ресурсов. Убедитесь, что ваша среда, такая как мощная установка GPU, может обработать требования к памяти и вычислениям. Убедитесь, что среда может обработать требования к памяти, которые можно смягчить с помощью техник, таких как QLoRA, для уменьшения отпечатка памяти​ (Hugging Face Forums)

Пример:

model_name = 'meta-llama/Meta-Llama-3-8B'
device_map = {"": 0}
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)

Токенизация:
В зависимости от конкретного использования и требований модели убедитесь, что конфигурация токенизатора правильна без избыточных настроек. Например, use_fast=True рекомендуется для лучшей производительности​ (Hugging Face)​​ (Weights & Biases)​.

tokenizer = AutoTokenizer.from_pretrained(
model_name,
trust_remote_code=True,
padding_side="left",
add_eos_token=True,
add_bos_token=True,
use_fast=False
)
tokenizer.pad_token = tokenizer.eos_token

5.2 Использование других популярных моделей (например, GPT-3, Mistral)

Выбор модели:

  • Для моделей, таких как GPT-3 и Mistral, убедитесь, что вы используете правильное имя модели и идентификатор из хаба моделей Hugging Face или других источников.

Токенизация:

  • Аналогично Llama 3, убедитесь, что токенизатор правильно настроен и совместим с моделью.

Память и вычисления:

  • Каждая модель может иметь разные требования к памяти. Настройте свою среду соответственно.

Пример для GPT-3:

model_name = 'openai/gpt-3'
device_map = {"": 0}
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)

Пример для Mistral:

model_name = 'mistral-7B'
device_map = {"": 0}
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)

Соображения токенизации: Каждая модель может иметь уникальные требования к токенизации. Убедитесь, что токенизатор соответствует модели и правильно настроен.
Пример токенизатора Llama 3:

tokenizer = AutoTokenizer.from_pretrained(
model_name,
trust_remote_code=True,
padding_side="left",
add_eos_token=True,
add_bos_token=True,
use_fast=False
)
tokenizer.pad_token = tokenizer.eos_token

Пример токенизатора GPT-3 и Mistral:

tokenizer = AutoTokenizer.from_pretrained(
model_name,
use_fast=True
)

7. Тестирование модели с нулевой выстрелом

Оцените базовую модель с помощью образца ввода:

from transformers import set_seed

set_seed(42)
index = 10
prompt = dataset['test'][index]['dialogue']
formatted_prompt = f"Instruct: Summarize the following conversation.\n{prompt}\nOutput:\n"

# Generate output
def gen(model, prompt, max_length):
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_length=max_length)
return tokenizer.batch_decode(outputs, skip_special_tokens=True)

res = gen(original_model, formatted_prompt, 100)
output = res[0].split('Output:\n')[1]

print(f'INPUT PROMPT:\n{formatted_prompt}')
print(f'MODEL GENERATION - ZERO SHOT:\n{output}')

8. Предобработка набора данных

Преобразуйте пары диалог-суммаризацию в подсказки:

def create_prompt_formats(sample):
blurb = "Below is an instruction that describes a task. Write a response that appropriately completes the request."
instruction = "### Instruct: Summarize the below conversation."
input_context = sample['dialogue']
response = f"### Output:\n{sample['summary']}"
end = "### End"

parts = [blurb, instruction, input_context, response, end]
formatted_prompt = "\n\n".join(parts)
sample["text"] = formatted_prompt
return sample

dataset = dataset.map(create_prompt_formats)

Токенизируйте отформатированный набор данных:

def preprocess_batch(batch, tokenizer, max_length):
return tokenizer(batch["text"], max_length=max_length, truncation=True)

max_length = 1024
train_dataset = dataset["train"].map(lambda batch: preprocess_batch(batch, tokenizer, max_length), batched=True)
eval_dataset = dataset["validation"].map(lambda batch: preprocess_batch(batch, tokenizer, max_length), batched=True)

9. Подготовка модели для QLoRA
Подготовьте модель для параметро-эффективной тонкой настройки:

original_model = prepare_model_for_kbit_training(original_model)

Гиперпараметры и их влияние

Гиперпараметры играют решающую роль в оптимизации производительности вашей модели. Вот некоторые ключевые гиперпараметры, которые следует учитывать:

  1. Скорость обучения: Контролирует скорость, с которой модель обновляет свои параметры. Высокая скорость обучения может привести к более быстрому сходимости, но может перескочить оптимальное решение. Низкая скорость обучения обеспечивает стабильную сходимость, но может потребовать больше эпох.
  2. Размер партии: Количество образцов, обработанных перед тем, как модель обновит свои параметры. Более крупные размеры партии могут улучшить стабильность, но требуют больше памяти. Меньшие размеры партии могут привести к более шумной тренировке.
  3. Шаги накопления градиента: Этот параметр помогает в симуляции более крупных размеров партии, накапливая градиенты за несколько шагов перед выполнением обновления параметра.
  4. Количество эпох: Количество раз, когда весь набор данных проходит через модель. Более эпох могут улучшить производительность, но могут привести к переобучению, если не управлять ими должным образом.
  5. Выгасание весов: Техника регуляризации для предотвращения переобучения путем наказания больших весов.
  6. График скорости обучения: Регулирует скорость обучения во время тренировки для улучшения производительности и сходимости.

Настройте конфигурацию тренировки, регулируя гиперпараметры, такие как скорость обучения, размер партии и шаги накопления градиента, в зависимости от конкретной модели и задачи. Например, модели Llama 3 могут требовать разных скоростей обучения по сравнению с меньшими моделями​ (Weights & Biases)​​ (GitHub)

Пример конфигурации тренировки

orpo_args = ORPOConfig(
learning_rate=8e-6,
lr_scheduler_type="linear",max_length=1024,max_prompt_length=512,
beta=0.1,per_device_train_batch_size=2,per_device_eval_batch_size=2,
gradient_accumulation_steps=4,optim="paged_adamw_8bit",num_train_epochs=1,
evaluation_strategy="steps",eval_steps=0.2,logging_steps=1,warmup_steps=10,
report_to="wandb",output_dir="./results/",
)

10. Тренировка модели

Настройте тренера и начните тренировку:

trainer = ORPOTrainer(
model=original_model,
args=orpo_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
tokenizer=tokenizer,
)
trainer.train()
trainer.save_model("fine-tuned-llama-3")

Оценка тонко настроенной модели

После тренировки оцените производительность модели с помощью качественных и количественных методов.

1. Оценка человеком

Сравните сгенерированные суммаризации с написанными человеком, чтобы оценить качество.

2. Количественная оценка

Используйте метрики, такие как ROUGE, для оценки производительности:

from rouge_score import rouge_scorer

scorer = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rougeL'], use_stemmer=True)
scores = scorer.score(reference_summary, generated_summary)
print(scores)

Распространенные проблемы и решения

1. Ограничения памяти

Использование QLoRA помогает смягчить проблемы с памятью, квантуя веса модели до 4-бит. Убедитесь, что у вас достаточно памяти GPU, чтобы обработать размер партии и размер модели.

2. Переобучение

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

3. Медленная тренировка

Оптимизируйте скорость тренировки, регулируя размер партии, скорость обучения и используя шаги накопления градиента.

4. Качество данных

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

Заключение

Тонкая настройка LLM с помощью QLoRA – это эффективный способ адаптировать крупные предварительно обученные модели к конкретным задачам с уменьшенными вычислительными затратами. Следуя этому руководству, вы можете тонко настроить PHI, Llama 3 или любую другую открытую модель для достижения высокой производительности на ваших конкретных задачах.

Я провел последние пять лет, погружаясь в увлекательный мир Machine Learning и Deep Learning. Моя страсть и экспертиза привели меня к участию в более чем 50 различных проектах по разработке программного обеспечения, с особым акцентом на AI/ML. Мое непрекращающееся любопытство также привело меня к Natural Language Processing, области, которую я с нетерпением жду возможности изучить более подробно.