Модели и платформы ИИ
Единственное руководство, которое вам нужно для тонкой настройки Llama 3 или любой другой открытой модели
Тонкая настройка крупных языковых моделей (LLM) như Llama 3 включает в себя адаптацию предварительно обученной модели к конкретным задачам с помощью домен-специфического набора данных. Этот процесс использует предварительно существующее знание модели, что делает его эффективным и экономически выгодным по сравнению с обучением с нуля. В этом руководстве мы пройдем через шаги тонкой настройки Llama 3 с использованием QLoRA (Quantized LoRA), параметро-эффективного метода, который минимизирует использование памяти и вычислительные затраты.
Обзор тонкой настройки
Тонкая настройка включает в себя несколько ключевых шагов:
- Выбор предварительно обученной модели: Выберите базовую модель, соответствующую вашей желаемой архитектуре.
- Сбор релевантного набора данных: Соберите и обработайте набор данных, специфичный для вашей задачи.
- Тонкая настройка: Адаптируйте модель с помощью набора данных для улучшения ее производительности на конкретных задачах.
- Оценка: Оцените тонко настроенную модель с помощью качественных и количественных метрик.
Концепции и техники
Полная тонкая настройка
Полная тонкая настройка обновляет все параметры модели, делая ее специфичной для новой задачи. Этот метод требует значительных вычислительных ресурсов и часто является нецелесообразным для очень крупных моделей.
Параметро-эффективная тонкая настройка (PEFT)
PEFT обновляет только подмножество параметров модели, уменьшая требования к памяти и вычислительным затратам. Эта техника предотвращает катастрофическое забывание и сохраняет общее знание модели.
Низкоранговая адаптация (LoRA) и квантованная LoRA (QLoRA)
LoRA тонко настраивает только несколько низкоранговых матриц, а QLoRA квантует эти матрицы для дальнейшего уменьшения использования памяти.
Методы тонкой настройки
- Полная тонкая настройка: Это включает в себя обучение всех параметров модели на задача-специфичном наборе данных. Хотя этот метод может быть очень эффективным, он также вычислительно дорогой и требует значительной памяти.
- Параметро-эффективная тонкая настройка (PEFT): PEFT обновляет только подмножество параметров модели, что делает его более памяти-эффективным. Техники, такие как низкоранговая адаптация (LoRA) и квантованная LoRA (QLoRA), входят в эту категорию.
Что такое LoRA?

Сравнение методов тонкой настройки: QLORA улучшает LoRA с 4-битной квантовой точностью и пейдж-оптимизаторами для управления всплесками памяти
LoRA – это улучшенный метод тонкой настройки, при котором вместо тонкой настройки всех весов предварительно обученной модели тонко настраиваются две меньшие матрицы, которые аппроксимируют более крупную матрицу. Эти матрицы составляют адаптер LoRA. Этот тонко настроенный адаптер затем загружается в предварительно обученную модель и используется для вывода.
Ключевые преимущества LoRA:
- Эффективность памяти: LoRA уменьшает использование памяти, тонко настраивая только небольшие матрицы вместо всей модели.
- Переиспользуемость: Оригинальная модель остается неизменной, и несколько адаптеров LoRA можно использовать с ней, что облегчает обработку нескольких задач с меньшими требованиями к памяти.
Что такое квантованная LoRA (QLoRA)?
QLoRA берет LoRA на шаг вперед, квантуя веса адаптеров LoRA до более низкой точности (например, 4-бит вместо 8-бит). Это еще больше уменьшает использование памяти и требования к хранению, сохраняя при этом сопоставимый уровень эффективности.
Ключевые преимущества QLoRA:
- Еще большая эффективность памяти: Квантуя веса, QLoRA значительно уменьшает требования модели к памяти и хранению.
- Сохраняет производительность: Несмотря на уменьшенную точность, QLoRA сохраняет уровень производительности, близкий к тому, который имеет полно-точечная модель.
Задача-специфическая адаптация
Во время тонкой настройки параметры модели корректируются на основе нового набора данных, что помогает ей лучше понять и генерировать контент, релевантный для конкретной задачи. Этот процесс сохраняет общее языковое знание, полученное во время предварительного обучения, и адаптирует модель к нюансам целевой области.
Тонкая настройка на практике
Полная тонкая настройка vs. PEFT
- Полная тонкая настройка: Включает в себя обучение всей модели, что может быть вычислительно дорогим и требует значительной памяти.
- PEFT (LoRA и QLoRA): Тонко настраивает только подмножество параметров, уменьшая требования к памяти и предотвращая катастрофическое забывание, что делает его более эффективной альтернативой.
Шаги реализации
- Настройка окружения: Установите необходимые библиотеки и настройте вычислительную среду.
- Загрузка и предварительная обработка набора данных: Загрузите набор данных и обработайте его в формат, подходящий для модели.
- Загрузка предварительно обученной модели: Загрузите базовую модель с конфигурациями квантования, если используете QLoRA.
- Токенизация: Токенизируйте набор данных, чтобы подготовить его для обучения.
- Обучение: Тонко настройте модель с помощью подготовленного набора данных.
- Оценка: Оцените производительность модели на конкретных задачах с помощью качественных и количественных метрик.
Шаг за шагом руководство по тонкой настройке 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 # Отключите журналирование Weights and Biases 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 (MSFT ) 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.
Токенизация:
- Используйте подходящий токенизатор для Llama 3, обеспечивая его совместимость с моделью и поддержку необходимых функций, таких как паддинг и специальные токены.
Память и вычисления:
- Тонкая настройка крупных моделей, таких как Llama 3, требует значительных вычислительных ресурсов. Убедитесь, что ваше окружение, такое как мощная конфигурация GPU, может обработать требования к памяти и вычислениям.
Пример:
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
)
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
)
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"
# Генерируйте вывод
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)
Гиперпараметры и их влияние
Гиперпараметры играют решающую роль в оптимизации производительности модели. Вот некоторые ключевые гиперпараметры, которые следует учитывать:
- Скорость обучения: Контролирует скорость, с которой модель обновляет свои параметры. Высокая скорость обучения может привести к более быстрому сходимости, но может также превысить оптимальное решение. Низкая скорость обучения обеспечивает стабильную сходимость, но может потребовать больше эпох.
- Размер партии: Количество образцов, обработанных перед тем, как модель обновляет свои параметры. Более крупные размеры партии могут улучшить стабильность, но требуют больше памяти. Меньшие размеры партии могут привести к более шумному процессу обучения.
- Шаги накопления градиентов: Этот параметр помогает в симуляции более крупных размеров партии, накапливая градиенты за несколько шагов перед выполнением обновления параметров.
- Количество эпох: Количество раз, когда весь набор данных проходит через модель. Более эпох могут улучшить производительность, но могут также привести к переобучению, если не управлять ими должным образом.
- Вырождение весов: Техника регуляризации для предотвращения переобучения путем наказания крупных весов.
- График скорости обучения: Корректирует скорость обучения во время обучения для улучшения производительности и сходимости.
Настройте конфигурацию обучения, корректируя гиперпараметры, такие как скорость обучения, размер партии и шаги накопления градиентов, на основе конкретных требований модели и задачи. Например, модели Llama 3 могут требовать разных скоростей обучения по сравнению с меньшими моделями.
Пример конфигурации обучения
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 или любую другую открытую модель, чтобы достичь высокой производительности на ваших конкретных задачах.













