Полная настройка LLM с помощью AutoTrain Advanced
AutoTrain Advanced позволяет легко настраивать большие языковые модели (LLM) для ваших конкретных случаев использования. В этом руководстве описано все, что вам нужно знать о тонкой настройке LLM.
Ключевые функции
- Простая подготовка данных в форматах CSV и JSONL
- Поддержка различных подходов к обучению (SFT, DPO, ORPO)
- Встроенные шаблоны чата
- Возможности локального и облачного обучения
- Оптимизированные параметры тренировки
Поддерживаемые методы обучения
AutoTrain поддерживает несколько специализированных тренеров:
- llm: Общий тренер LLM
- llm-sft: Наблюдаемый тренер с тонкой настройкой
- llm-reward: Тренер по моделированию вознаграждений
- llm-dpo: Тренер с оптимизацией прямых предпочтений
- llm-orpo: Тренер ORPO (оптимальная политика вознаграждения)
Подготовка данных
LLM finetuning принимает данные в форматах CSV и JSONL. Предпочтительным является формат JSONL. Способ форматирования данных зависит от задачи, для решения которой вы обучаете LLM.
Классическая генерация текста
Для генерации текста данные должны быть в следующем формате:
text |
---|
википедия - это бесплатная онлайн-энциклопедия, это совместный проект, редактировать который может любой желающий Википедия - это крупнейшая и самая популярная справочная работа общего характера в Интернете |
Пример набора данных для этого формата можно найти здесь: stas/openwebtext-10k
Примеры задач:
- Генерация текста
- Завершение работы с кодом
Совместимые тренеры:
- SFT Тренер
- Общий тренер
Чатбот / Вопрос-Ответ / Генерация кода / вызов функции
Для этой задачи вы можете использовать данные CSV или JSONL. Если вы сами форматируете данные (добавление начала, конечных токенов и т. Д.), Вы можете использовать формат CSV или JSONL. Если вы не хотите форматировать данные самостоятельно и хотите-параметр чат-образной образец для форматирования данных для вас, вы должны использовать формат JSONL. В обоих случаях CSV и JSONL могут использоваться взаимозаменяемо, но JSONL является наиболее предпочтительным форматом.
Чтобы обучить чат -бот, ваши данные будут играть контент и роль. Некоторые модели также поддерживают роль системы.
Вот пример набора данных чат -ботов (один образец):
[{'content': 'Help write a letter of 100 -200 words to my future self for ' 'Kyra, reflecting on her goals and aspirations.', 'role': 'user'}, {'content': 'Dear Future Self,\n' '\n' "I hope you're happy and proud of what you've achieved. As I " "write this, I'm excited to think about our goals and how far " "you've come. One goal was to be a machine learning engineer. I " "hope you've worked hard and become skilled in this field. Keep " 'learning and innovating. Traveling was important to us. I hope ' "you've seen different places and enjoyed the beauty of our " 'world. Remember the memories and lessons. Starting a family ' 'mattered to us. If you have kids, treasure every moment. Be ' 'patient, loving, and grateful for your family.\n' '\n' 'Take care of yourself. Rest, reflect, and cherish the time you ' 'spend with loved ones. Remember your dreams and celebrate what ' "you've achieved. Your determination brought you here. I'm " "excited to see the person you've become, the impact you've made, " 'and the love and joy in your life. Embrace opportunities and ' 'keep dreaming big.\n' '\n' 'With love,\n' 'Kyra', 'role': 'assistant'}]
Как видите, данные имеют столбцы содержимого (content) и роли (role). Столбец роли (role) может быть пользователем (user) или помощником (assistant) или системой (system). Эти данные, однако, не отформатированы для обучения. Вы можете использовать параметр-чат-образец для форматирования данных во время обучения.
--chat-template поддерживает следующие виды шаблонов:
- none (по умолчанию)
- zephyr
- chatml
- tokenizer: используйте шаблон чата, указанный в конфигурации токенизатора
Многострочный образец также показан ниже:
[{"content": "hello", "role": "user"}, {"content": "hi nice to meet you", "role": "assistant"}] [{"content": "how are you", "role": "user"}, {"content": "I am fine", "role": "assistant"}] [{"content": "What is your name?", "role": "user"}, {"content": "My name is Mary", "role": "assistant"}] [{"content": "Which is the best programming language?", "role": "user"}, {"content": "Python", "role": "assistant"}] . . .
Пример набора данных для этого формата можно найти здесь: HuggingFaceH4/no_robots
Если вы не хотите форматировать данные с помощью --chat-template, вы можете отформатировать данные самостоятельно и использовать следующий формат:
<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\nCutting Knowledge Date: December 2023\nToday Date: 03 Oct 2024\n\n<|eot_id|><|start_header_id|>user<|end_header_id|>\n\nHelp write a letter of 100 -200 words to my future self for Kyra, reflecting on her goals and aspirations.<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\nDear Future Self,\n\nI hope you're happy and proud of what you've achieved. As I write this, I'm excited to think about our goals and how far you've come. One goal was to be a machine learning engineer. I hope you've worked hard and become skilled in this field. Keep learning and innovating. Traveling was important to us. I hope you've seen different places and enjoyed the beauty of our world. Remember the memories and lessons. Starting a family mattered to us. If you have kids, treasure every moment. Be patient, loving, and grateful for your family.\n\nTake care of yourself. Rest, reflect, and cherish the time you spend with loved ones. Remember your dreams and celebrate what you've achieved. Your determination brought you here. I'm excited to see the person you've become, the impact you've made, and the love and joy in your life. Embrace opportunities and keep dreaming big.\n\nWith love,\nKyra<|eot_id|>
Ниже показан пример многострочного набора данных:
[{"text": "<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\nCutting Knowledge Date: December 2023\nToday Date: 03 Oct 2024\n\n<|eot_id|><|start_header_id|>user<|end_header_id|>\n\nhello<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\nhi nice to meet you<|eot_id|>"}] [{"text": "<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\nCutting Knowledge Date: December 2023\nToday Date: 03 Oct 2024\n\n<|eot_id|><|start_header_id|>user<|end_header_id|>\n\nhow are you<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\nI am fine<|eot_id|>"}] [{"text": "<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\nCutting Knowledge Date: December 2023\nToday Date: 03 Oct 2024\n\n<|eot_id|><|start_header_id|>user<|end_header_id|>\n\nWhat is your name?<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\nMy name is Mary<|eot_id|>"}] [{"text": "<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\nCutting Knowledge Date: December 2023\nToday Date: 03 Oct 2024\n\n<|eot_id|><|start_header_id|>user<|end_header_id|>\n\nWhich is the best programming language?<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\nPython<|eot_id|>"}] . . .
Пример набора данных для этого формата можно найти здесь: timdettmers/openassistant-guanaco
В приведенных выше примерах мы видели только два обращения: одно от пользователя, другое от ассистента. Однако в одном примере может быть несколько обращений от пользователя и ассистента.
Модели чата могут быть обучены с помощью следующих инструкторов:
- SFT Тренер:
- Требуется только текстовый столбец
- Пример набора данных: HuggingFaceH4/no_robots
- Общий тренер:
- Требуется только текстовый столбец
- Пример набора данных: HuggingFaceH4/no_robots
- Наградный тренер:
- требуются столбцы text и rejected_text
- Пример набора данных: trl-lib/ultrafeedback_binarized
- DPO Тренер:
- требуются столбцы prompt, text и rejected_text
- Пример набора данных: trl-lib/ultrafeedback_binarized
- ORPO Тренер:
- требуются столбцы prompt, text и rejected_text
- Пример набора данных: trl-lib/ultrafeedback_binarized
Единственное различие между форматами данных для тренер по вознаграждению и DPO/ORPO тренер заключается в том, что для тренер по вознаграждению требуются только столбцы text и rejected_text, в то время как для DPO/ORPO тренер требуется дополнительный столбец подсказок.
Рекомендации по точной настройке LLM
Оптимизация памяти
- Используйте соответствующие block_size и model_max_length для вашего оборудования
- По возможности включайте смешанную тренировку точности
- Используйте методы PEFT для больших моделей
Качество данных
- Очистите и подтвердите свои тренировочные данные
- Обеспечьте сбалансированные образцы разговоров
- Используйте соответствующие шаблоны чата
Советы по обучению
- Начните с небольших темпов обучения
- Отслеживайте показатели обучения с помощью тензорной доски
- Проверка результатов моделирования во время обучения
Связанные ресурсы
Обучение
Обучение на местном уровне
Локальное обучение может быть выполнено с помощью команды autotrain --config config.yaml. Файл config.yaml должен содержать следующие параметры:
task: llm-orpo base_model: meta-llama/Meta-Llama-3-8B-Instruct project_name: autotrain-llama3-8b-orpo log: tensorboard backend: local data: path: argilla/distilabel-capybara-dpo-7k-binarized train_split: train valid_split: null chat_template: chatml column_mapping: text_column: chosen rejected_text_column: rejected prompt_text_column: prompt params: block_size: 1024 model_max_length: 8192 max_prompt_length: 512 epochs: 3 batch_size: 2 lr: 3e-5 peft: true quantization: int4 target_modules: all-linear padding: right optimizer: adamw_torch scheduler: linear gradient_accumulation: 4 mixed_precision: fp16 hub: username: ${HF_USERNAME} token: ${HF_TOKEN} push_to_hub: true
В приведенном выше конфигурационном файле мы обучаем модель с помощью ORPO trainer. Модель обучается по модели meta-llama/Meta-Llama-3-8B-Instruct. Данные представляют собой бинаризованный набор данных argilla/distilabel-capybara-dpo-7k. Параметру chat_template присвоено значение chatml. Параметр column_mapping используется для сопоставления столбцов в наборе данных с требуемыми столбцами для ORPO trainer. Раздел params содержит параметры обучения, такие как block_size, model_max_length, epochs, batch_size, lr, peft, квантование, target_modules, заполнение, оптимизатор, планировщик, gradient_accumulation и mixed_precision. Раздел hub содержит имя пользователя и токен для учетной записи Hugging Face, а параметру push_to_hub присвоено значение true, чтобы отправить обученную модель в Hugging Face Hub.
Если у вас есть локальный обучающий файл, вы можете изменить часть данных на:
data: path: path/to/training/file train_split: train # name of the training file valid_split: null chat_template: chatml column_mapping: text_column: chosen rejected_text_column: rejected prompt_text_column: prompt
Вышеизложенное предполагает, что у вас есть train.csv или train.jsonl в каталоге path/to/training/file, и вы будете применять шаблон chatml к данным.
Вы можете запустить тренировку, используя следующую команду:
$ autotrain --config config.yaml
Дополнительные примеры конфигурационных файлов для точной настройки различных типов lllm и различных задач можно найти здесь.
Тренировка в Hugging Face Spaces
Если вы тренируетесь в Hugging Face Spaces, все происходит так же, как и на местном тренинге:
В пользовательском интерфейсе вам нужно убедиться, что вы выбрали правильную модель, набор данных и разбиения. Особое внимание следует уделить column_mapping.
Как только вы будете удовлетворены параметрами, вы можете нажать на кнопку Начать тренировку, чтобы начать тренировочный процесс.
Параметры
Параметры тонкой настройки LLM
class autotrain.trainers.clm.params.LLMTrainingParams
( model: str = 'gpt2', project_name: str = 'project-name', data_path: str = 'data', train_split: str = 'train', valid_split: typing.Optional[str] = None, add_eos_token: bool = True, block_size: typing.Union[int, typing.List[int]] = -1, model_max_length: int = 2048, padding: typing.Optional[str] = 'right', trainer: str = 'default', use_flash_attention_2: bool = False, log: str = 'none', disable_gradient_checkpointing: bool = False, logging_steps: int = -1, eval_strategy: str = 'epoch', save_total_limit: int = 1, auto_find_batch_size: bool = False, mixed_precision: typing.Optional[str] = None, lr: float = 3e-05, epochs: int = 1, batch_size: int = 2, warmup_ratio: float = 0.1, gradient_accumulation: int = 4, optimizer: str = 'adamw_torch', scheduler: str = 'linear', weight_decay: float = 0.0, max_grad_norm: float = 1.0, seed: int = 42, chat_template: typing.Optional[str] = None, quantization: typing.Optional[str] = 'int4', target_modules: typing.Optional[str] = 'all-linear', merge_adapter: bool = False, peft: bool = False, lora_r: int = 16, lora_alpha: int = 32, lora_dropout: float = 0.05, model_ref: typing.Optional[str] = None, dpo_beta: float = 0.1, max_prompt_length: int = 128, max_completion_length: typing.Optional[int] = None, prompt_text_column: typing.Optional[str] = None, text_column: str = 'text', rejected_text_column: typing.Optional[str] = None, push_to_hub: bool = False, username: typing.Optional[str] = None, token: typing.Optional[str] = None, unsloth: bool = False, distributed_backend: typing.Optional[str] = None )
Parameters
- model (str) — Название модели, которая будет использоваться для обучения. По умолчанию используется “gpt2”.
- project_name (str) — Имя проекта и выходной каталог. По умолчанию используется “project-name”.
- data_path (str) — Путь к набору данных. По умолчанию используется значение “data”.
- train_split (str) — Конфигурация для разделения обучающих данных. По умолчанию используется “train”.
- valid_split (Optional[str]) — Конфигурация для разделения данных проверки. Значение по умолчанию - None.
- add_eos_token (bool) — Следует ли добавлять токен EOS в конце последовательностей. Значение по умолчанию - True.
- block_size (Union[int, List[int]]) — Размер блоков для обучения может быть одним целым числом или списком целых чисел. Значение по умолчанию -1.
- model_max_length (int) — Максимальная длина введенной модели. Значение по умолчанию - 2048.
- padding (Optional[str]) — Сторона, с которой нужно дополнять последовательности (левая или правая). По умолчанию используется “right” (правая).
- trainer (str) — Тип используемого тренажера. По умолчанию используется значение “default”.
- use_flash_attention_2 (bool) — Следует ли использовать flash attention версии 2. По умолчанию установлено значение False.
- log (str) — Метод ведения журнала для отслеживания эксперимента. Значение по умолчанию - “none”.
- disable_gradient_checkpointing (bool) — Следует ли отключить установку контрольных точек градиента. Значение по умолчанию - False.
- logging_steps (int) — Количество шагов между записями в журнал событий. Значение по умолчанию -1.
- eval_strategy (str) — Стратегия оценки (например, ‘epoch’ - эпоха). По умолчанию используется “epoch”.
- save_total_limit (int) — Максимальное количество сохраняемых контрольных точек. Значение по умолчанию - 1.
- auto_find_batch_size (bool) — Следует ли автоматически определять оптимальный размер пакета. Значение по умолчанию - False.
- mixed_precision (Optional[str]) — Тип используемой смешанной точности (например, ‘fp16’, ‘bf16’ или None). По умолчанию используется значение None.
- lr (float) — Скорость усвоения для обучения. По умолчанию используется значение 3e-5.
- epochs (int) — Количество периодов обучения. Значение по умолчанию равно 1.
- batch_size (int) — Размер пакета для обучения. По умолчанию используется значение 2.
- warmup_ratio (float) — Доля времени, затрачиваемого на тренировку, для повышения скорости обучения. Значение по умолчанию равно 0.1.
- gradient_accumulation (int) — Количество шагов для накопления градиентов перед обновлением. По умолчанию - 4.
- optimizer (str) — Оптимизатор, используемый для обучения. По умолчанию используется “adamw_torch”.
- scheduler (str) — Использовать планировщик темпов обучения. Значение по умолчанию - “linear” - линейный .
- weight_decay (float) — Уменьшение веса для применения к оптимизатору. Значение по умолчанию равно 0.0.
- max_grad_norm (float) — Максимальная норма для обрезки градиента. Значение по умолчанию - 1.0.
- seed (int) — Выборочное значение для воспроизводимости. Значение по умолчанию - 42.
- chat_template (Optional[str]) — Шаблон для моделей, основанных на чате, можно использовать в следующих вариантах: None, zephyr, chatml или tokenizer. По умолчанию используется значение None.
- quantization (Optional[str]) — Используемый метод квантования (например, ‘int4’, ‘int8’ или None). По умолчанию используется “int4”.
- target_modules (Optional[str]) — Целевые модули для квантования или точной настройки. По умолчанию используется “all-linear”.
- merge_adapter (bool) — Следует ли объединять слои адаптера. Значение по умолчанию - False.
- peft (bool) — Следует ли использовать точную настройку с учетом параметров (PEFT). Значение по умолчанию - False.
- lora_r (int) — Ранг матриц LoRa. Значение по умолчанию - 16.
- lora_alpha (int) — Параметр Alpha для LoRa. Значение по умолчанию равно 32.
- lora_dropout (float) — Коэффициент отсева для LoRa. Значение по умолчанию - 0,05.
- model_ref (Optional[str]) — Эталонная модель для DPO trainer. Значение по умолчанию - None.
- dpo_beta (float) — Параметр бета-версии для DPO trainer. Значение по умолчанию равно 0.1.
- max_prompt_length (int) — Максимальная длина запроса. Значение по умолчанию - 128.
- max_completion_length (Optional[int]) — Максимальная продолжительность завершения. Значение по умолчанию - None.
- prompt_text_column (Optional[str]) — Имя столбца для текста запроса. Значение по умолчанию - None.
- text_column (str) — Имя столбца для текстовых данных. По умолчанию используется “text”.
- rejected_text_column (Optional[str]) — Имя столбца для отклоненных текстовых данных. Значение по умолчанию - None.
- push_to_hub (bool) — Следует ли перемещать модель в центр обтягивания лица. Значение по умолчанию - False.
- username (Optional[str]) — Для аутентификации используется имя пользователя Hugging Face. Значение по умолчанию - None.
- token (Optional[str]) — Маркер "Hugging Face" для аутентификации. Значение по умолчанию - None.
- unsloth (bool) — Следует ли использовать библиотеку unsloth. Значение по умолчанию равно False.
- distributed_backend (Optional[str]) — Серверная часть, используемая для распределенного обучения. Значение по умолчанию - None.
LLMTrainingParams: Параметры для обучения языковой модели с использованием библиотеки autotraining.
Параметры, специфичные для конкретной задачи
The length parameters used for different trainers can be different. Some require more context than others.
- block_size: This is the maximum sequence length or length of one block of text. Setting to -1 determines block size automatically. Default is -1.
- model_max_length: Set the maximum length for the model to process in a single batch, which can affect both performance and memory usage. Default is 1024
- max_prompt_length: Specify the maximum length for prompts used in training, particularly relevant for tasks requiring initial contextual input. Used only for orpo and dpo trainer.
- max_completion_length: Completion length to use, for orpo: encoder-decoder models only. For dpo, it is the length of the completion text.
NOTE:
- block size cannot be greater than model_max_length!
- max_prompt_length cannot be greater than model_max_length!
- max_prompt_length cannot be greater than block_size!
- max_completion_length cannot be greater than model_max_length!
- max_completion_length cannot be greater than block_size!
ПРИМЕЧАНИЕ: Несоблюдение этих ограничений приведет к ошибке / nan-потерям.
Generic Trainer
--add_eos_token, --add-eos-token
Переключает, следует ли автоматически добавлять токен конца предложения (EOS) в конце текстов, что может иметь решающее значение для определенных типов моделей, таких как языковые модели. Используется только для тренера «по умолчанию»
--block_size BLOCK_SIZE, --block-size BLOCK_SIZE
Укажите размер блока для последовательностей обработки. Это максимальная длина последовательности или длина одного блока текста. Настройка на -1 определяет размер блока автоматически. По умолчанию -1.
--model_max_length MODEL_MAX_LENGTH, --model-max-length MODEL_MAX_LENGTH
Установите максимальную длину для обработки модели в одну партию, которая может повлиять как на производительность, так и на использование памяти. По умолчанию 1024
SFT Trainer
--block_size BLOCK_SIZE, --block-size BLOCK_SIZE
Укажите размер блока для последовательностей обработки. Это максимальная длина последовательности или длина одного блока текста. Настройка на -1 определяет размер блока автоматически. По умолчанию -1.
--model_max_length MODEL_MAX_LENGTH, --model-max-length MODEL_MAX_LENGTH
Установите максимальную длину для обработки модели в одну партию, которая может повлиять как на производительность, так и на использование памяти. По умолчанию 1024
Reward Trainer
--block_size BLOCK_SIZE, --block-size BLOCK_SIZE
Укажите размер блока для последовательностей обработки. Это максимальная длина последовательности или длина одного блока текста. Настройка на -1 определяет размер блока автоматически. По умолчанию -1.
--model_max_length MODEL_MAX_LENGTH, --model-max-length MODEL_MAX_LENGTH
Установите максимальную длину для обработки модели в одну партию, которая может повлиять как на производительность, так и на использование памяти. По умолчанию 1024
DPO Trainer
--dpo-beta DPO_BETA, --dpo-beta DPO_BETA
Бета для DPO тренера
--model-ref MODEL_REF
Эталонная модель для использования для DPO, когда не использует PEFT
--block_size BLOCK_SIZE, --block-size BLOCK_SIZE
Указать размер блока для последовательностей обработки. Это максимальная длина последовательности или длина одного блока текста. Настройка на -1 определяет размер блока автоматически. По умолчанию -1.
--model_max_length MODEL_MAX_LENGTH, --model-max-length MODEL_MAX_LENGTH
Установить максимальную длину для обработки модели в одну партию, которая может повлиять как на производительность, так и на использование памяти. По умолчанию 1024
--max_prompt_length MAX_PROMPT_LENGTH, --max-prompt-length MAX_PROMPT_LENGTH
Указать максимальную длину для подсказок, используемых при обучении, особенно для задач, требующих начального контекстуального ввода. Используется только для тренера `orpo`.
--max_completion_length MAX_COMPLETION_LENGTH, --max-completion-length MAX_COMPLETION_LENGTH
Длина завершения для использования, только для моделей ORPO: Encoder-Decoder
ORPO Trainer
--block_size BLOCK_SIZE, --block-size BLOCK_SIZE
Указать размер блока для последовательностей обработки. Это максимальная длина последовательности или длина одного блока текста. Настройка на -1 определяет размер блока автоматически. По умолчанию -1.
--model_max_length MODEL_MAX_LENGTH, --model-max-length MODEL_MAX_LENGTH
Установить максимальную длину для обработки модели в одну партию, которая может повлиять как на производительность, так и на использование памяти. По умолчанию 1024
--max_prompt_length MAX_PROMPT_LENGTH, --max-prompt-length MAX_PROMPT_LENGTH
Указывает максимальную длину для подсказок, используемых при обучении, особенно для задач, требующих начального контекстуального ввода. Используется только для тренера `orpo`.
--max_completion_length MAX_COMPLETION_LENGTH, --max-completion-length MAX_COMPLETION_LENGTH
Длина завершения для использования, только для моделей ORPO: Encoder-Decoder