Введение
После того, как были выпущены модели Llama и Mistral, LLM с открытым исходным кодом отодвинули на второй план OpenAI. С тех пор было выпущено несколько моделей на базе архитектур Llama и Mistral, которые работают на одном уровне с такими проприетарными моделями, как GPT-3.5 Turbo, Claude, Gemini и т. д. Однако эти модели слишком велики для использования в потребительском оборудовании.
Но в последнее время появился новый класс LLM. Это LLM в категории параметров ниже 7B. Меньшее количество параметров делает их достаточно компактными, чтобы их можно было использовать на потребительском оборудовании, сохраняя при этом эффективность, сравнимую с моделями 7B. Такие модели, как Tiny-Llama-1B, Phi-2 от Microsoft и Qwen-3b от Alibaba, могут стать отличной заменой более крупным моделям для локального запуска или развертывания на периферии. В то же время точная настройка имеет решающее значение для максимально эффективного использования любой базовой модели для любых последующих задач.
Здесь мы рассмотрим, как точно настроить базу. Модель крошечной ламы на очищенном наборе данных Альпаки.
Цели обучения
- Понимать тонкую настройку и различные ее методы.
- Узнайте об инструментах и методах эффективной тонкой настройки.
- Узнайте о WandB для ведения журналов тренировок.
- Точная настройка Tiny-Llama на наборе данных Alpaca в Colab.
Эта статья была опубликована в рамках Блогатон по Data Science.
Содержание
Что такое тонкая настройка LLM?
Точная настройка — это процесс обучения предварительно обученной модели новым знаниям. Предварительно обученная модель — это модель общего назначения, обученная на большом объеме данных. Однако в большинстве случаев они не работают должным образом, и точная настройка является наиболее эффективным способом адаптации модели к конкретным вариантам использования. Например, база LLM хорошо справляются с генерацией текста при одноэтапном тестировании, но испытывают трудности с многоходовыми разговорами, такими как модели чата.
Базовые модели необходимо обучать на расшифровках диалогов, чтобы иметь возможность вести многоходовые разговоры. Точная настройка необходима для преобразования предварительно обученных моделей в различные аватары. Качество точно настроенных моделей зависит от качества данных и возможностей базовой модели. Существует несколько способов точной настройки модели, например 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 и т. д. В нем реализованы специальные ядра тритона и ручной механизм обратной опоры для повышения скорости обучения модели.
Здесь мы будем использовать Unsloth для точной настройки базовой 4-битной квантованной модели Tiny-Llama на Альпака набор данных. Модель квантована с помощью битов и байтов, а ядра оптимизированы с помощью Triton от OpenAI.
Ведение журнала с помощью WandB
В машинном обучении крайне важно регистрировать показатели обучения и оценки. Это дает нам полную картину хода поезда. Веса и уклоны (WandB) — это библиотека с открытым исходным кодом для визуализации и отслеживания экспериментов по машинному обучению. У него есть специальное веб-приложение для визуализации показателей обучения в режиме реального времени. Это также позволяет нам централизованно управлять производственными моделями. Мы будем использовать WandB только для отслеживания нашей тонкой настройки Tiny-Llama.
Чтобы использовать WandB, зарегистрируйте бесплатную учетную запись и создайте Ключ API.
Теперь приступим к тонкой настройке нашей модели.
Как точно настроить Tiny-Llama?
Точная настройка — это трудоемкая задача. Для этого требуется машина с 10–15 ГБ видеопамяти или вы можете использовать бесплатную среду выполнения графического процессора Tesla T4 от 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 МБ.
Теперь подайте заявку ПЕФТ к 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
)
Подготовить данные
Следующим шагом является подготовка набора данных для тонкой настройки. Как я упоминал ранее, мы будем использовать очищенный Набор данных альпаки. Это очищенная версия исходного набора данных Альпака. Он соответствует формату инструкция-ввод-ответ. Вот пример данных об альпаке
Теперь давайте подготовим наши данные.
@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,)
Теперь разделите данные на данные поезда и оценки. Я взял небольшие оценочные данные, поскольку большие оценочные данные замедляют обучение.
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.
Скорость обучения будет зависеть от множества факторов, включая размеры данных обучения и оценки, размер пакета обучения и оценки, а также количество эпох. Если у вас возникли проблемы с использованием графического процессора, попробуйте уменьшить размер шага пакетного накопления и накопления градиента. Размер партии поезда = пакет_размер_на_устройство * градиент_аккумуляция_шаги. А количество шагов оптимизации = общее количество обучающих данных/размер пакета. Вы можете поиграть с параметрами и посмотреть, что работает лучше.
Вы можете визуализировать потери в обучении и оценке вашего обучения на панели инструментов 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.
Часто задаваемые вопросы
О. Точная настройка в контексте машинного обучения, особенно глубокого обучения, — это метод, при котором вы берете предварительно обученную модель и адаптируете ее к новой конкретной задаче.
О. На Colab можно бесплатно настроить меньшие LLM поверх графического процессора Tesla T4 с помощью QLoRA.
О. Точная настройка значительно расширяет возможности LLM для выполнения последующих задач, таких как ролевые игры, генерация кода и т. д.
A. Tiny-Llama, обученная на 3 триллионах токенов, представляет собой LLM с параметрами 1.1 млрд. Модель использует оригинальную архитектуру Llama-2.
О. Unsloth — это инструмент с открытым исходным кодом, который обеспечивает более быструю и эффективную точную настройку LLM за счет оптимизации ядер графического процессора с помощью Triton.
Материалы, показанные в этой статье, не принадлежат Analytics Vidhya и используются по усмотрению Автора.
Похожие страницы:
- SEO-контент и PR-распределение. Получите усиление сегодня.
- PlatoData.Network Вертикальный генеративный ИИ. Расширьте возможности себя. Доступ здесь.
- ПлатонАйСтрим. Интеллект Web3. Расширение знаний. Доступ здесь.
- ПлатонЭСГ. Углерод, чистые технологии, Энергия, Окружающая среда, Солнечная, Управление отходами. Доступ здесь.
- ПлатонЗдоровье. Биотехнологии и клинические исследования. Доступ здесь.
- Источник: 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
- аналитика
- Аналитика Видхья
- и
- любой
- API
- приложение
- Применить
- Применение
- соответствующий
- надлежащим образом
- архитектура
- МЫ
- Аргументы
- около
- гайд
- AS
- At
- автоматический
- Аватары
- b
- Использование темпера с изогнутым основанием
- основанный
- BE
- было
- до
- ниже
- полезный
- Преимущества
- ЛУЧШЕЕ
- Лучшая
- смещение
- предубеждения
- миллиард
- Немного
- биты
- пустой
- блогатон
- кратко
- приносить
- но
- by
- CAN
- возможности
- возможности
- столица
- случаев
- Категории
- чат
- Выберите
- класс
- код
- компактный
- сравнимый
- полный
- зАВЕРШАЕТ
- компьютеры
- понятия
- Конфигурация
- настроить
- потребитель
- Бытовая техника
- контекст
- Беседы
- Создайте
- создали
- решающее значение
- Текущий
- В настоящее время
- изготовленный на заказ
- Dash
- приборная панель
- данным
- Наборы данных
- преданный
- глубоко
- глубокое обучение
- определять
- зависеть
- зависит
- развертывание
- развертывание
- Производные
- описывает
- обнаружение
- диалоги
- различный
- усмотрение
- do
- вниз
- Ранее
- Edge
- Эффективный
- затрат
- эффективный
- еще
- появление
- включить
- столкновение
- Двигатель
- Усиливает
- достаточно
- организация
- Окружающая среда
- эпохи
- особенно
- существенный
- и т.д
- Эфир (ETH)
- оценка
- пример
- Примеры
- Эксперименты
- Больше
- факторы
- FAIL
- ложный
- далеко
- быстрее
- несколько
- меньше
- Поплавок
- плавающий
- следующим образом
- Что касается
- формат
- Франция
- Бесплатно
- от
- далее
- Gemini
- общее назначение
- поколение
- получить
- идти
- данный
- дает
- Go
- GPU / ГРАФИЧЕСКИЙ ПРОЦЕССОР
- Графические процессоры
- большой
- Аппаратные средства
- Есть
- здесь
- High
- высший
- держать
- Как
- How To
- Однако
- HTTPS
- ОбниматьЛицо
- i
- if
- инвентарь
- Импортировать
- важную
- улучшать
- in
- В том числе
- вход
- затраты
- устанавливать
- вместо
- инструкции
- предназначенных
- в
- включает в себя
- вопросы
- IT
- JPG
- Сохранить
- хранение
- Основные
- знания
- Кумар
- язык
- большой
- больше
- Лиды
- УЧИТЬСЯ
- узнали
- изучение
- Оставлять
- Меньше
- Lets
- Библиотека
- такое как
- центр внимания
- линейный
- LINK
- Лама
- LLM
- загрузка
- погрузка
- локальным
- в местном масштабе
- журнал
- Войти
- каротаж
- от
- Низкий
- ниже
- машина
- обучение с помощью машины
- сделать
- Создание
- управлять
- руководство
- макс-ширина
- Медиа
- Память
- упомянутый
- методы
- Метрика
- ML
- Мобильный телефон
- мобильные телефоны
- модель
- Модели
- БОЛЕЕ
- более эффективным
- самых
- с разными
- должен
- my
- имя
- Необходимость
- Новые
- следующий
- Ничто
- ноутбук
- номер
- of
- .
- старший
- on
- онлайн
- только
- с открытым исходным кодом
- OpenAI
- оптимизация
- оптимизированный
- оптимизирующий
- or
- оригинал
- OS
- Другое
- в противном случае
- наши
- внешний
- выходной
- выходы
- за
- принадлежащих
- пакеты
- в паре
- параметр
- параметры
- часть
- pass
- выполнять
- выполнения
- личного
- Персональные компьютеры
- телефоны
- картина
- Платформа
- Платон
- Платон Интеллектуальные данные
- ПлатонДанные
- Играть
- Точка
- Популярное
- возможное
- Точность
- Подготовить
- подготовленный
- процесс
- Производство
- ( изучите наши патенты),
- приводит
- опубликованный
- Push
- Вопросы и ответы
- R
- ранг
- реального времени
- уменьшить
- снижение
- снижение
- выпустил
- хранилище
- запросить
- требуется
- исследованиям
- ответ
- ответы
- возвращают
- Роли
- RTX
- Run
- то же
- Сохранить
- сохраняются
- экономия
- масштабирование
- Наука
- посмотреть
- семя
- выберите
- набор
- Короткое
- показанный
- подпись
- с
- Размер
- Размеры
- замедляет
- небольшой
- меньше
- конкретный
- скорость
- раскол
- стоит
- Начало
- Шаг
- Шаги
- потоковый
- Бороться
- существенный
- такие
- поддержка
- Поддержка
- взять
- приняты
- Сложность задачи
- задачи
- техника
- снижения вреда
- Tesla
- тестXNUMX
- текст
- генерация текста
- чем
- который
- Ассоциация
- их
- Их
- тогда
- Там.
- Эти
- они
- задача
- этой
- Через
- время
- в
- вместе
- знак
- Лексемы
- слишком
- приняли
- инструментом
- инструменты
- факел
- Всего
- трек
- Отслеживание
- Train
- специалистов
- Обучение
- трансформеры
- Триллион
- Тритон
- правда
- стараться
- обновление
- us
- Применение
- использование
- используемый
- Наши ценности
- версия
- с помощью
- Войти
- визуализации
- законопроект
- Путь..
- способы
- we
- Предметы одежды
- Web
- WebP
- вес
- ЧТО Ж
- были
- Что
- Что такое
- когда
- который
- в то время как
- будете
- работает
- записывать
- являетесь
- ВАШЕ
- зефирнет