Моделі та платформи ШІ
Єдина необхідна вам посібниця для тонкого налаштування Llama 3 або будь-якої іншої відкритої моделі
Тонке налаштування великих мовних моделей (LLM) типу 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 зберігає рівні продуктивності, близькі до тих, що мають повної точності моделі.
Задача-специфічна адаптація
Під час тонкого налаштування параметри моделі коригуються на основі нового набору даних, що допомагає їй краще зрозуміти та генерувати контент, відповідний конкретному завдання. Цей процес зберігає загальні мовні знання, набуті під час попереднього навчання, одночасно адаптуючи модель до нюансів цільової галузі.
Тонке налаштування на практиці
Повне тонке налаштування проти 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 для цієї навчальної програми:
Попередньо обробіть набір даних згідно з вимогами моделі, включаючи застосування відповідних шаблонів та забезпечення того, що формат даних підходить для тонкого налаштування (Hugging Face) (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’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
<p>set_seed(42)
index = 10
prompt = dataset['test'][index]['dialogue']
formatted_prompt = f"Instruct: Summarize the following conversation.\n{prompt}\nOutput:\n"</p>
<p># Генерування виводу
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)</p>
<p>res = gen(original_model, formatted_prompt, 100)
output = res[0].split('Output:\n')[1]</p>
<p>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)
Гіперпараметри та їхній вплив
Гіперпараметри відіграють важливу роль у оптимізації продуктивності вашої моделі. Ось деякі ключові гіперпараметри, які потрібно розглянути:
- Швидкість навчання: Контролює швидкість, з якою модель оновлює свої параметри. Висока швидкість навчання може привести до швидшого збіжання, але може також пропустити оптимальне рішення. Низька швидкість навчання забезпечує поступове збіження, але може потребувати більше епох.
- Розмір партії: Кількість зразків, оброблених перед тим, як модель оновить свої параметри. Більші розміри партії можуть покращити стабільність, але вимагають більше пам’яті. Менші розміри партії можуть привести до більшої шумності у процесі навчання.
- Кроки накопичення градієнтів: Цей параметр допомагає у симуляції більших розмірів партії шляхом накопичення градієнтів протягом декількох кроків перед виконанням оновлення параметрів.
- Кількість епох: Кількість разів, коли весь набір даних проходить через модель. Більше епох може покращити продуктивність, але може також привести до переобучення, якщо не керувати ним належним чином.
- Зниження ваг: Регуляризаційний метод для запобігання переобученню шляхом штрафування великих ваг.
- Графік швидкості навчання: Регулює швидкість навчання під час навчання для покращення продуктивності та збіжності.
Настройте конфігурацію навчання, коригуючи гіперпараметри, такі як швидкість навчання, розмір партії та кроки накопичення градієнтів, залежно від конкретної моделі та завдань. Наприклад, моделі 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 <p>scorer = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rougeL'], use_stemmer=True) scores = scorer.score(reference_summary, generated_summary) print(scores)</p>
Поширені проблеми та рішення
1. Обмеження пам’яті
Використання QLoRA допомагає пом’якшити проблеми з пам’яттю шляхом квантування ваг моделі до 4-біт. Переконайтесь, що у вас достатньо пам’яті GPU для обробки вашого розміру партії та розміру моделі.
2. Переобучення
Моніторьте метрики валідування, щоб запобігти переобученню. Використовуйте техніки, такі як раннє зупинення та зниження ваг.
3. Повільне навчання
Оптимізуйте швидкість навчання, коригуючи розмір партії, швидкість навчання та використовуючи кроки накопичення градієнтів.
4. Якість даних
Переконайтесь, що ваш набір даних чистий та добре оброблений. Погана якість даних може суттєво вплинути на продуктивність моделі.
Висновок
Тонке налаштування великих мовних моделей за допомогою QLoRA – це ефективний спосіб адаптувати великі попередньо навчені моделі до конкретних завдань з зниженими обчислювальними витратами. За допомогою цієї посібниці ви можете тонко налаштувати PHI, Llama 3 або будь-яку іншу відкриту модель для досягнення високої продуктивності на ваших конкретних завданнях.













