Свяжитесь с нами:

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

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

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

mm
ТОЧНАЯ НАСТРОЙКА LLM РУКОВОДСТВО ПО PYTHON С ОТКРЫТЫМ ИСТОЧНИКОМ

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

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

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

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

Концепции и методы

Точная настройка больших языковых моделей

Точная настройка больших языковых моделей

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

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

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

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

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

LoRA настраивает только несколько матриц низкого ранга, в то время как QLoRA квантует эти матрицы, чтобы еще больше уменьшить объем памяти.

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

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

Что такое ЛоРА?

Сравнение методов точной настройки: QLORA расширяет LoRA за счет 4-битного прецизионного квантования и страничных оптимизаторов для управления скачками памяти.

Сравнение методов точной настройки: QLORA расширяет LoRA за счет 4-битного прецизионного квантования и страничных оптимизаторов для управления скачками памяти.

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

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

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

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

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

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

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

Адаптация под конкретную задачу

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

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

Полная точная настройка или PEFT

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

Этапы реализации

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

Steo by Step Руководство по точной настройке LLM

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

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

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

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

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

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:

Предварительная обработка набора данных в соответствии с требованиями модели, включая применение соответствующих шаблонов и обеспечение того, чтобы формат данных подходил для точной настройки. (Обнимая лицо)​​ (DataCamp),

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

Проверьте структуру набора данных:

print(dataset['test'][0])

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 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 Использование Ламы 3

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

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

лексемизация:

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

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

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

Пример:

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 рекомендуется для лучшей производительности (Обнимая лицо)​​ (Веса и отклонения),

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
)

Пример для Мистраля:

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 может потребоваться другая скорость обучения по сравнению с моделями меньшего размера. (Веса и отклонения)​​ (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-битных. Убедитесь, что у вас достаточно памяти графического процессора для обработки размера пакета и размера модели.

2. переобучения

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

3. Медленное обучение

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

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

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

Заключение

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

Последние пять лет я погружался в увлекательный мир машинного обучения и глубокого обучения. Моя страсть и опыт позволили мне принять участие в более чем 50 различных проектах по разработке программного обеспечения, уделяя особое внимание AI/ML. Мое постоянное любопытство также привлекло меня к обработке естественного языка, области, которую я очень хочу исследовать дальше.