Вступ
Після випуску моделей Llama та Mistral LLM з відкритим вихідним кодом привернули увагу OpenAI. З тих пір було випущено кілька моделей на основі архітектури Llama та Mistral, які працювали нарівні з власними моделями, такими як GPT-3.5 Turbo, Claude, Gemini тощо. Однак ці моделі занадто великі, щоб використовувати їх у споживчому обладнанні.
Але останнім часом спостерігається поява нового класу LLM. Це LLMs у категорії параметрів sub-7B. Менша кількість параметрів робить їх досить компактними для використання на споживчому обладнанні, зберігаючи ефективність, порівнянну з моделями 7B. Такі моделі, як Tiny-Llama-1B, Phi-2 від Microsoft і Qwen-3b від Alibaba, можуть чудово замінити більші моделі для локальної роботи або розгортання на межі. У той же час, точне налаштування має вирішальне значення, щоб отримати найкраще від будь-якої базової моделі для будь-яких подальших завдань.
Тут ми розглянемо, як точно налаштувати базу Модель Tiny-Llama на очищеному наборі даних Alpaca.
Мета навчання
- Розуміти тонке налаштування та різні його методи.
- Дізнайтеся про інструменти та методи ефективного тонкого налаштування.
- Дізнайтеся про WandB для ведення журналів навчання.
- Точне налаштування Tiny-Llama на наборі даних Alpaca в Colab.
Ця стаття була опублікована як частина Blogathon Data Science.
Зміст
Що таке LLM Fine-Tuning?
Тонка настройка — це процес, за допомогою якого попередньо навчена модель отримує нові знання. Попередньо навчена модель — це модель загального призначення, навчена на великій кількості даних. Однак у більшості випадків вони не працюють належним чином, і точне налаштування є найефективнішим способом адаптації моделі до конкретних випадків використання. Наприклад, база LLM добре справляються з генеруванням тексту на одноповоротному QA, але мають проблеми з багатоповоротними розмовами, як-от моделі чату.
Базові моделі потрібно навчити стенограмам діалогів, щоб мати можливість вести багаточергові розмови. Тонка настройка необхідна для формування різних аватарів із попередньо навчених моделей. Якість точно налаштованих моделей залежить від якості даних і можливостей базової моделі. Існує кілька способів точного налаштування моделі, наприклад LoRA, QLoRA тощо.
Давайте коротко розглянемо ці поняття.
Лора
LoRA означає низькорангову адаптацію, популярну техніку тонкого налаштування, у якій ми вибираємо кілька параметрів, які можна навчити, замість того, щоб оновлювати всі параметри за допомогою низькорангової апроксимації оригінальних вагових матриць. Модель LoRA можна швидше налаштувати на апаратному забезпеченні, що потребує менше обчислень.
QLoRA
QLoRA або Quantized LoRA є кроком далі, ніж LoRA. Замість моделі повної точності він квантує ваги моделі, щоб знизити точність із плаваючою комою перед застосуванням LoRA. Квантування - це процес низведення вищих значень біта до нижчих значень. Процес 4-бітного квантування включає квантування 16-бітних ваг до 4-бітових значень з плаваючою точкою.
Квантування моделі призводить до суттєвого зменшення розміру моделі з точністю, порівнянною з оригінальною моделлю. У QLoRA ми беремо квантовану модель і застосовуємо до неї LoRA. Моделі можна квантувати різними способами, наприклад за допомогою llama.cpp, AWQ, bitsandbytes тощо.
Точне налаштування за допомогою Unsloth
Unsloth — це платформа з відкритим вихідним кодом для більш швидкого тонкого налаштування популярних великих мовних моделей. Він підтримує популярні LLM, у тому числі Llama-2 і Mistral, а також їх похідні, як-от Yi, Open-hermes тощо. Він реалізує власні ядра triton і механізм ручної підтримки для підвищення швидкості навчання моделі.
Тут ми використаємо Unsloth для точного налаштування базової 4-розрядної квантованої моделі Tiny-Llama на Альпака набір даних. Модель квантується бітами та байтами, а ядра оптимізовано за допомогою Triton OpenAI.
Логування за допомогою WandB
У машинному навчанні вкрай важливо реєструвати показники навчання та оцінювання. Це дає нам повну картину руху поїзда. Вага та упередження (WandB) — це бібліотека з відкритим кодом для візуалізації та відстеження експериментів з машинним навчанням. Він має спеціальний веб-додаток для візуалізації показників навчання в режимі реального часу. Це також дозволяє централізовано керувати виробничими моделями. Ми використовуватимемо WandB лише для відстеження нашого прогону тонкого налаштування Tiny-Llama.
Щоб використовувати WandB, зареєструйте безкоштовний обліковий запис і створіть Ключ API.
Тепер давайте почнемо тонке налаштування нашої моделі.
Як налаштувати Tiny-Llama?
Точне налаштування — це важке завдання. Для цього потрібна машина з 10–15 ГБ відеопам’яті, або ви можете скористатися безкоштовним середовищем виконання Tesla T4 GPU від Colab.
Тепер встановіть Unsloth і WandB
%%capture
import torch
major_version, minor_version = torch.cuda.get_device_capability()
!pip install wandb
if major_version >= 8:
# Use this for new GPUs like Ampere, Hopper GPUs (RTX 30xx, RTX 40xx, A100, H100, L40)
!pip install "unsloth[colab_ampere] @ git+https://github.com/unslothai/unsloth.git"
else:
# Use this for older GPUs (V100, Tesla T4, RTX 20xx)
!pip install "unsloth[colab] @ git+https://github.com/unslothai/unsloth.git"
pass
Далі потрібно завантажити 4-бітну квантовану попередньо навчену модель за допомогою Unsloth.
from unsloth import FastLanguageModel
import torch
max_seq_length = 4096 # Choose any! We auto support RoPE Scaling internally!
dtype = None # None for auto detection. Float16 for Tesla T4, V100, Bfloat16 for Ampere+
load_in_4bit = True # Use 4bit quantization to reduce memory usage. Can be False.
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/tinyllama-bnb-4bit", # "unsloth/tinyllama" for 16bit loading
max_seq_length = max_seq_length,
dtype = dtype,
load_in_4bit = load_in_4bit,
)
Модель буде встановлено локально. Розмір 4-розрядної моделі становитиме близько 760 МБ.
Тепер подайте заявку PEFT до 4-розрядної моделі Tiny-Llama.
model = FastLanguageModel.get_peft_model(
model,
r = 32, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",],
lora_alpha = 32,
lora_dropout = 0, # Currently only supports dropout = 0
bias = "none", # Currently only supports bias = "none"
use_gradient_checkpointing = True, # @@@ IF YOU GET OUT OF MEMORY - set to True @@@
random_state = 3407,
use_rslora = False, # We support rank stabilized LoRA
loftq_config = None, # And LoftQ
)
Підготувати дані
Наступним кроком є підготовка набору даних для точного налаштування. Як я вже згадував раніше, ми будемо використовувати очищений Набір даних Альпака. Це очищена версія оригінального набору даних Alpaca. Він відповідає формату інструкція-введення-відповідь. Ось приклад даних про Альпаку
Тепер давайте підготуємо наші дані.
@title prepare data
#alpaca_prompt = """Below is an instruction that describes a task, paired with an input that
provides further context.
Write a response that appropriately completes the request.
### Instruction:
{}
### Input:
{}
### Response:
{}"""
EOS_TOKEN = tokenizer.eos_token
def formatting_prompts_func(examples):
instructions = examples["instruction"]
inputs = examples["input"]
outputs = examples["output"]
texts = []
for instruction, input, output in zip(instructions, inputs, outputs):
# Must add EOS_TOKEN, otherwise your generation will go on forever!
text = alpaca_prompt.format(instruction, input, output) + EOS_TOKEN
texts.append(text)
return { "text" : texts, }
pass
from datasets import load_dataset
dataset = load_dataset("yahma/alpaca-cleaned", split = "train")
dataset = dataset.map(formatting_prompts_func, batched = True,)
Тепер розділіть дані на дані тренування та оцінювання. Я взяв невеликі дані Eval, оскільки більші дані Eval уповільнюють навчання.
dataset_dict = dataset.train_test_split(test_size=0.004)
Налаштувати WandB
Тепер налаштуйте ваги та зміщення у вашому поточному середовищі виконання.
# @title wandb init
import wandb
wandb.login()
Надайте ключ API для входу в WandB, коли буде запропоновано.
Налаштуйте змінні середовища.
%env WANDB_WATCH=all
%env WANDB_SILENT=true
Модель потяга
Наразі ми завантажили 4-розрядну модель, створили конфігурацію LoRA, підготували набір даних і налаштували WandB. Наступним кроком є навчання моделі на даних. Для цього нам потрібно визначити трейнер із бібліотеки Trl. Ми будемо використовувати SFTrainer від Trl. Але перед цим ініціалізуйте WandB і визначте відповідні навчальні аргументи.
import os
from trl import SFTTrainer
from transformers import TrainingArguments
from transformers.utils import logging
import wandb
logging.set_verbosity_info()
project_name = "tiny-llama"
entity = "wandb"
# os.environ["WANDB_LOG_MODEL"] = "checkpoint"
wandb.init(project=project_name, name = "tiny-llama-unsloth-sft")
Навчальні аргументи
args = TrainingArguments(
per_device_train_batch_size = 2,
per_device_eval_batch_size=2,
gradient_accumulation_steps = 4,
evaluation_strategy="steps",
warmup_ratio = 0.1,
num_train_epochs = 1,
learning_rate = 2e-5,
fp16 = not torch.cuda.is_bf16_supported(),
bf16 = torch.cuda.is_bf16_supported(),
optim = "adamw_8bit",
weight_decay = 0.1,
lr_scheduler_type = "linear",
seed = 3407,
output_dir = "outputs",
report_to="wandb", # enable logging to W&B
# run_name="tiny-llama-alpaca-run", # name of the W&B run (optional)
logging_steps=1, # how often to log to W&B
logging_strategy = 'steps',
save_total_limit=2,
)
Це важливо для навчання. Щоб зберегти низьке використання графічного процесора, зберігайте низькі кроки потягу, пакету оцінювання та накопичення градієнта. Logging_steps — це кількість кроків, перш ніж метрики будуть зареєстровані в WandB.
Тепер ініціалізуйте SFTTrainer.
trainer = SFTTrainer(
model = model,
tokenizer = tokenizer,
train_dataset = dataset_dict["train"],
eval_dataset=dataset_dict["test"],
dataset_text_field = "text",
max_seq_length = max_seq_length,
dataset_num_proc = 2,
packing = True, # Packs short sequences together to save time!
args = args,
)
Тепер почніть навчання.
trainer_stats = trainer.train()
wandb.finish()
Під час тренування WandB відстежуватиме показники навчання та оцінювання. Ви переходите за вказаним посиланням на інформаційну панель і бачите його в режимі реального часу.
Це знімок екрана з моєї роботи на блокноті Colab.
Швидкість навчання залежатиме від багатьох факторів, включаючи розміри даних навчання та оцінки, розмір партії навчання та оцінки та кількість епох. Якщо у вас виникли проблеми з використанням графічного процесора, спробуйте зменшити розмір кроку накопичення пакетів і градієнтів. Розмір партії поїзда = batch_size_per_device * gradient_accumulation_steps. А кількість кроків оптимізації = загальні навчальні дані/розмір партії. Ви можете пограти з параметрами та побачити, який працює краще.
На інформаційній панелі WandB ви можете візуалізувати втрату тренування та оцінки свого навчання.
Втрата поїзда
Оцінка втрати
Висновок
Ви можете зберегти адаптери LoRA локально або відправити їх у репозиторій HuggingFace.
model.save_pretrained("lora_model") # Local saving
# model.push_to_hub("your_name/lora_model", token = "...") # Online saving
Ви також можете завантажити збережену модель з диска та використовувати її для логічного висновку.
if False:
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "lora_model", # YOUR MODEL YOU USED FOR TRAINING
max_seq_length = max_seq_length,
dtype = dtype,
load_in_4bit = load_in_4bit,
)
inputs = tokenizer(
[
alpaca_prompt.format(
"capital of France?", # instruction
"", # input
"", # output - leave this blank for a generation!
)
]*1, return_tensors = "pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens = 64, use_cache = True)
tokenizer.batch_decode(outputs)
Для трансляції відповідей моделі.
from transformers import TextStreamer
text_streamer = TextStreamer(tokenizer)
_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 64)
Отже, все це стосувалося тонкого налаштування моделі Tiny-Llama за допомогою протоколювання WandB.
Ось Блокнот Colab за те саме.
Висновок
Невеликі LLM можуть бути корисними для розгортання на апаратному забезпеченні з обмеженим обсягом обчислень, наприклад на персональних комп’ютерах, мобільних телефонах та інших переносних пристроях тощо. Тонке налаштування дозволяє цим моделям краще виконувати завдання на нижчому рівні. У цій статті ми дізналися, як точно налаштувати модель базової мови на наборі даних.
Ключові винесення
- Тонка настройка — це процес адаптації попередньо навченої моделі до конкретного нового завдання.
- Tiny-Llama — це LLM, який має лише 1.1 мільярда параметрів і навчається на 3 трильйонах токенів.
- Існують різні способи тонкого налаштування LLM, наприклад LoRA та QLoRA.
- Unsloth — це платформа з відкритим вихідним кодом, яка надає оптимізовані для CUDA LLM для прискорення тонкого налаштування LLM.
- Weights and Biases (WandB) — це інструмент для відстеження та зберігання експериментів ML.
ЧАСТІ ЗАПИТАННЯ
A. Тонка настройка в контексті машинного навчання, особливо глибокого навчання, — це техніка, за якої ви берете попередньо навчену модель і адаптуєте її до нового, конкретного завдання.
A. У Colab можна безкоштовно налаштувати менші LLM через графічний процесор Tesla T4 із QLoRA.
A. Тонка настройка значно розширює можливості LLM для виконання наступних завдань, таких як рольові ігри, генерація коду тощо.
A. Tiny-Llama, навчений на 3 трильйонах токенів, є LLM з параметрами 1.1B. Модель використовує оригінальну архітектуру Llama-2.
A. Unsloth — це інструмент із відкритим вихідним кодом, який забезпечує швидше й ефективніше тонке налаштування LLM шляхом оптимізації ядер GPU за допомогою Triton.
Медіафайли, показані в цій статті, не належать Analytics Vidhya та використовуються на розсуд Автора.
споріднений
- Розповсюдження контенту та PR на основі SEO. Отримайте посилення сьогодні.
- PlatoData.Network Vertical Generative Ai. Додайте собі сили. Доступ тут.
- PlatoAiStream. Web3 Intelligence. Розширення знань. Доступ тут.
- ПлатонЕСГ. вуглець, CleanTech, Енергія, Навколишнє середовище, Сонячна, Поводження з відходами. Доступ тут.
- PlatoHealth. Розвідка про біотехнології та клінічні випробування. Доступ тут.
- джерело: https://www.analyticsvidhya.com/blog/2024/02/fine-tuning-a-tiny-llama-model-with-unsloth/
- : має
- :є
- : ні
- :де
- $UP
- 1
- 11
- 12
- 15%
- 16
- 1b
- 258
- 32
- 7
- 8
- a
- A100
- Здатний
- МЕНЮ
- рахунки
- накопичення
- точність
- пристосовувати
- адаптація
- додавати
- ВСІ
- дозволяє
- Також
- кількість
- an
- аналітика
- Аналітика Vidhya
- та
- будь-який
- API
- додаток
- Застосовувати
- Застосування
- відповідний
- відповідним чином
- архітектура
- ЕСТЬ
- аргументація
- навколо
- стаття
- AS
- At
- автоматичний
- аватари
- b
- база
- заснований
- BE
- було
- перед тим
- нижче
- корисний
- Переваги
- КРАЩЕ
- Краще
- зміщення
- упередження
- Мільярд
- Біт
- біти
- порожній
- блогатон
- коротко
- приносити
- але
- by
- CAN
- можливості
- можливості
- капітал
- випадків
- Категорія
- чат
- Вибирати
- клас
- код
- компактний
- порівнянний
- повний
- Завершує
- комп'ютери
- поняття
- конфігурація
- налаштувати
- споживач
- Споживче обладнання
- контекст
- розмови
- створювати
- створений
- вирішальне значення
- Поточний
- В даний час
- виготовлений на замовлення
- Тире
- приладова панель
- дані
- набори даних
- присвячених
- глибокий
- глибоке навчання
- визначати
- залежати
- залежить
- розгортання
- розгортання
- Похідні
- описує
- Виявлення
- діалоги
- різний
- розсуд
- do
- вниз
- Раніше
- край
- Ефективний
- ефективність
- ефективний
- ще
- поява
- включіть
- зіткнення
- двигун
- Підсилює
- досить
- суб'єкта
- Навколишнє середовище
- епохи
- особливо
- істотний
- і т.д.
- Ефір (ETH)
- оцінка
- приклад
- Приклади
- Експерименти
- дослідити
- фактори
- FAIL
- false
- далеко
- швидше
- кілька
- менше
- Поплавок
- плаваючий
- слідує
- для
- формат
- Франція
- Безкоштовна
- від
- далі
- Близнюки
- Головна мета
- покоління
- отримати
- Git
- даний
- дає
- Go
- GPU
- Графічні процесори
- великий
- апаратні засоби
- Мати
- тут
- Високий
- вище
- тримати
- Як
- How To
- Однак
- HTTPS
- HuggingFace
- i
- if
- implements
- імпорт
- важливо
- удосконалювати
- in
- У тому числі
- вхід
- витрати
- встановлювати
- замість
- інструкції
- призначених
- в
- включає в себе
- питання
- IT
- JPG
- тримати
- зберігання
- ключ
- знання
- Кумар
- мова
- великий
- більше
- Веде за собою
- УЧИТЬСЯ
- вчений
- вивчення
- Залишати
- менше
- дозволяє
- бібліотека
- як
- ліхтарик
- лінійний
- LINK
- Лама
- llm
- загрузка
- погрузка
- місцевий
- локально
- журнал
- увійшли
- каротаж
- від
- низький
- знизити
- машина
- навчання за допомогою машини
- зробити
- Робить
- управляти
- керівництво
- макс-ширина
- Медіа
- пам'ять
- згаданий
- методика
- Метрика
- ML
- Mobile
- мобільні телефони
- модель
- Моделі
- більше
- більш ефективний
- найбільш
- множинний
- повинен
- my
- ім'я
- Необхідність
- Нові
- наступний
- ніхто
- ноутбук
- номер
- of
- часто
- старший
- on
- онлайн
- тільки
- з відкритим вихідним кодом
- OpenAI
- оптимізація
- оптимізований
- оптимізуючий
- or
- оригінал
- OS
- Інше
- інакше
- наші
- з
- вихід
- виходи
- над
- яка перебуває у власності
- Пакети
- парний
- параметр
- параметри
- частина
- проходити
- виконувати
- виконанні
- персонал
- Персональні комп'ютери
- телефони
- картина
- платформа
- plato
- Інформація про дані Платона
- PlatoData
- Play
- точка
- популярний
- це можливо
- Точність
- Готувати
- підготовлений
- процес
- Production
- власником
- забезпечує
- опублікований
- Штовхати
- Питання та відповіді
- якість
- R
- ранжувати
- реального часу
- зменшити
- зниження
- скорочення
- випущений
- Сховище
- запросити
- Вимагається
- дослідження
- відповідь
- відповіді
- повертати
- Роль
- RTX
- прогін
- то ж
- зберегти
- зберігаються
- економія
- Масштабування
- наука
- побачити
- насіння
- вибрати
- комплект
- Короткий
- показаний
- підпис
- з
- Розмір
- розміри
- сповільнюється
- невеликий
- менше
- конкретний
- швидкість
- розкол
- стенди
- старт
- Крок
- заходи
- потоковий
- боротьба
- істотний
- такі
- підтримка
- Опори
- Приймати
- прийняті
- Завдання
- завдання
- техніка
- методи
- Tesla
- тест
- текст
- генерація тексту
- ніж
- Що
- Команда
- їх
- Їх
- потім
- Там.
- Ці
- вони
- річ
- це
- через
- час
- до
- разом
- знак
- Жетони
- занадто
- прийняли
- інструмент
- інструменти
- факел
- Усього:
- трек
- Відстеження
- поїзд
- навчений
- Навчання
- Трансформатори
- трильйон
- Triton
- правда
- намагатися
- оновлення
- us
- Використання
- використання
- використовуваний
- Цінності
- версія
- через
- візит
- візуалізувати
- було
- шлях..
- способи
- we
- Предмети одягу
- Web
- webp
- вага
- ДОБРЕ
- були
- Що
- Що таке
- коли
- який
- в той час як
- волі
- з
- працює
- запис
- ви
- вашу
- зефірнет