
Режущая кромка и легкая производительность LLM с использованием наиболее продвинутых методов (Qlora, Deepspeed, GPTQ, Flash Hite 2, FSDP и т. Д.)
Разработано Борисом Зубаревом | CV | LinkedIn | [email protected]
Вы используете модели крупных языков (LLMS) для своей работы и хотите обучить их более эффективно с помощью передовых методов? Хотите сосредоточиться на данных и улучшениях, а не на повторяющемся и трудоемком кодировании для обучения LLM?
X - llm - ваше решение. Это удобная библиотека, которая оптимизирует оптимизацию обучения, поэтому вы можете сосредоточиться на улучшении своих моделей и данных . Оснащенный современными методами обучения , X-LLM разработан для эффективности инженерами, которые понимают ваши потребности.
X - LLM идеально подходит, независимо от того, готовитесь к производству или нуждаетесь в инструменте быстрого прототипирования .
W&BYi-34B , Mistal AI , Llama 2 , Zephyr , OpenChat , Falcon , Phi , Qwen , MPT и многие другие X—LLM тестируется на Python 3.8+, Pytorch 2.0.1+ и Cuda 11.8.
pip install xllm Версия, которая включает в себя deepspeed , flash-attn и auto-gptq :
pip install " xllm[train] " Версия по умолчанию xllm Рекомендуется для локальной разработки, xllm[train] Рекомендуется для обучения.
Версия CUDA: 11.8 Docker: huggingface/transformers-pytorch-gpu:latest
from xllm import Config
from xllm . datasets import GeneralDataset
from xllm . experiments import Experiment
# Init Config which controls the internal logic of xllm
# QLoRA example
config = Config (
model_name_or_path = "HuggingFaceH4/zephyr-7b-beta" ,
apply_lora = True ,
load_in_4bit = True ,
)
# Prepare the data
train_data = [ "Hello!" ] * 100
train_dataset = GeneralDataset . from_list ( data = train_data )
# Build Experiment from Config: init tokenizer and model, apply LoRA and so on
experiment = Experiment ( config = config , train_dataset = train_dataset )
experiment . build ()
# Run Experiment (training)
experiment . run ()
# # [Optional] Fuse LoRA layers
# experiment.fuse_lora()
# [Optional] Or push LoRA weights to HuggingFace Hub
experiment . push_to_hub ( repo_id = "YOUR_NAME/MODEL_NAME" )Config управляет xllmПодробнее о конфигурации
config = Config (
model_name_or_path = "openchat/openchat_3.5" ,
apply_lora = True ,
) config = Config (
model_name_or_path = "openchat/openchat_3.5" ,
apply_lora = True ,
lora_rank = 8 ,
lora_alpha = 32 ,
lora_dropout = 0.05 ,
raw_lora_target_modules = "all" ,
# Names of modules to apply LoRA. A comma-separated string, for example: "k,q,v" or "all".
) Чтобы обучить модель QLoRA , нам нужно загрузить модель магистрали, используя библиотеку bitsandbytes и веса Int4 (или Int8).
config = Config (
model_name_or_path = "01-ai/Yi-34B" ,
apply_lora = True ,
load_in_4bit = True ,
prepare_model_for_kbit_training = True ,
) config = Config (
model_name_or_path = "01-ai/Yi-34B" ,
apply_lora = True ,
load_in_4bit = True ,
prepare_model_for_kbit_training = True ,
llm_int8_threshold = 6.0 ,
llm_int8_has_fp16_weight = True ,
bnb_4bit_use_double_quant = True ,
bnb_4bit_quant_type = "nf4" ,
) Перед этим вы должны войти в Huggingface Hub или добавить API Token в переменные среды.
config = Config (
model_name_or_path = "HuggingFaceH4/zephyr-7b-beta" ,
push_to_hub = True ,
hub_private_repo = True ,
hub_model_id = "BobaZooba/AntModel-7B-XLLM-Demo-LoRA" ,
save_steps = 25 ,
)save_stepsLoRA , то будут сохранены только веса LoRA Перед этим вы должны войти в W&B или добавить API Token в переменные среды.
config = Config (
model_name_or_path = "HuggingFaceH4/zephyr-7b-beta" ,
report_to_wandb = True ,
logging_steps = 5 ,
wandb_project = "xllm-demo" ,
) Это поможет использовать less GPU memory во время обучения, то есть вы сможете учиться больше, чем без этой техники. Недостатки этой техники замедляют передний шаг, то есть slowing down training .
Вы будете тренировать более крупные модели (например, 7b в Colab), но за счет скорости тренировок.
config = Config (
model_name_or_path = "HuggingFaceH4/zephyr-7b-beta" ,
use_gradient_checkpointing = True ,
) Это ускоряет обучение и потребление памяти графических процессоров, но не работает со всеми моделями и графическими процессорами. Вы также должны установить flash-attn для этого. Это можно сделать с помощью:
pip install "xllm[train]"
config = Config (
model_name_or_path = "meta-llama/Llama-2-7b-hf" ,
use_flash_attention_2 = True ,
)apply_lora ). Это обеспечивает огромное сокращение затрат на обучение и, кроме того, очень эффективно борется с катастрофическими забываниями.load_in_4bit и prepare_model_for_kbit_training вместе. Это также значительно снижает потребление памяти.use_gradient_checkpointing . Этот метод также значительно снижает потребление памяти, но за счет замедления тренировок.push_to_hub и hub_private_repo , а также указать имя модели в hub_model_id и save_steps . Пример: «Bobazooba/Supadupallama-7b-Lora». Во время обучения каждая контрольная точка вашей модели будет сохранена в центре Hurgingface. Если вы указали apply_lora , то будут сохранены только веса LORA, которые впоследствии вы можете легко объединиться с основной моделью, например, с использованием xllm .use_flash_attention_2report_to_wandb , также указывающий wandb_project (имя проекта в W & B) и wandb_entity (имя пользователя или организации в W & B).push_to_hub вам необходимо заранее войти в концентратор Huggingface или указать токен ( HUGGING_FACE_HUB_TOKEN ) в файле .env. Аналогичным образом, при использовании report_to_wandb вам нужно будет войти в систему в W & B. Вы можете указать токен ( WANDB_API_KEY ) в файле .env, либо вам будет предложено ввести токен в командной строке. Qlora
Градиент контрольно -пропускной пункт
Вспыхивать внимание 2
Стабилизировать обучение
Нажмите на контрольные точки в центр huggingface
W & B отчет
config = Config (
model_name_or_path = "meta-llama/Llama-2-7b-hf" ,
tokenizer_padding_side = "right" , # good for llama2
warmup_steps = 1000 ,
max_steps = 10000 ,
logging_steps = 1 ,
save_steps = 1000 ,
per_device_train_batch_size = 2 ,
gradient_accumulation_steps = 2 ,
max_length = 2048 ,
stabilize = True ,
use_flash_attention_2 = True ,
apply_lora = True ,
load_in_4bit = True ,
prepare_model_for_kbit_training = True ,
use_gradient_checkpointing = True ,
push_to_hub = False ,
hub_private_repo = True ,
hub_model_id = "BobaZooba/SupaDupaLlama-7B-LoRA" ,
report_to_wandb = False ,
wandb_project = "xllm-demo" ,
wandb_entity = "bobazooba" ,
)Эта операция предназначена только для моделей с адаптером Lora.
Вы можете явно указать, чтобы объединить модель после обучения.
config = Config (
model_name_or_path = "HuggingFaceH4/zephyr-7b-beta" ,
apply_lora = True ,
fuse_after_training = True ,
)Даже когда вы используете qlora
config = Config (
model_name_or_path = "HuggingFaceH4/zephyr-7b-beta" ,
apply_lora = True ,
load_in_4bit = True ,
prepare_model_for_kbit_training = True ,
fuse_after_training = True ,
)Или вы можете объединить модель самостоятельно после тренировки.
experiment . fuse_lora () DeepSpeed необходим для обучения моделей на multiple GPUs . DeepSpeed позволяет efficiently manage the resources of several GPUs during training . Например, вы можете distribute the gradients and the state of the optimizer to several GPUs , а не хранить полный набор градиентов и состояния оптимизатора на каждом графическом процессоре. Начало обучения с использованием DeepSpeed может произойти только из command line .
train.py
from xllm import Config
from xllm . datasets import GeneralDataset
from xllm . cli import cli_run_train
if __name__ == '__main__' :
train_data = [ "Hello!" ] * 100
train_dataset = GeneralDataset . from_list ( data = train_data )
cli_run_train ( config_cls = Config , train_dataset = train_dataset ) Запустите поезд (в параметре num_gpus , укажите столько же графических процессоров, сколько у вас есть)
deepspeed --num_gpus=8 train.py --deepspeed_stage 2Вы также можете передать другие параметры
deepspeed --num_gpus=8 train.py
--deepspeed_stage 2
--apply_lora True
--stabilize True
--use_gradient_checkpointing True| Имя | Комментарий | Связь |
|---|---|---|
| X - llm -прототипирование | В этой записной книжке вы узнаете основы библиотеки | |
| Llama2 и Mistral AI эффективная тонкая настройка | 7b модели обучение в Колабе с использованием Qlora, Bnb Int4, градиентной контрольной точки и x - llm |
X—LLM позволяет не только для прототипа моделей, но и облегчает разработку готовых к производству решений посредством встроенных возможностей и настройки.
Использовать X—LLM для обучения модели легко и включает в себя эти несколько шагов:
Prepare - подготовьте данные и модель, загрузив и подготовив их. Сохраняет данные локально для config.train_local_path_to_data и config.eval_local_path_to_data , если вы используете набор данных EvalTrain - используйте данные, полученные на предыдущем шаге для обучения моделиFuse - если вы использовали Лору во время обучения, слитесьQuantize - оптимизируйте использование памяти вашей модели, квантовая ее Помните, что эти задачи в X—LLM начинаются с командной строки. Итак, когда вы готовы к работе, запуск вашего полного проекта будет выглядеть примерно так:
python3 MY_PROJECT/cli/prepare.py
--dataset_key MY_DATASET
--model_name_or_path mistralai/Mistral-7B-v0.1
--path_to_env_file ./.envdeepspeed --num_gpus=8 MY_PROJECT/cli/train.py
--use_gradient_checkpointing True
--deepspeed_stage 2
--stabilize True
--model_name_or_path mistralai/Mistral-7B-v0.1
--use_flash_attention_2 False
--load_in_4bit True
--apply_lora True
--raw_lora_target_modules all
--per_device_train_batch_size 8
--warmup_steps 1000
--save_total_limit 0
--push_to_hub True
--hub_model_id MY_HF_HUB_NAME/LORA_MODEL_NAME
--hub_private_repo True
--report_to_wandb True
--path_to_env_file ./.envpython3 MY_PROJECT/cli/fuse.py
--model_name_or_path mistralai/Mistral-7B-v0.1
--lora_hub_model_id MY_HF_HUB_NAME/LORA_MODEL_NAME
--hub_model_id MY_HF_HUB_NAME/MODEL_NAME
--hub_private_repo True
--force_fp16 True
--fused_model_local_path ./fused_model/
--path_to_env_file ./.envpython3 MY_PROJECT/cli/quantize.py
--model_name_or_path ./fused_model/
--apply_lora False
--stabilize False
--quantization_max_samples 128
--quantized_model_path ./quantized_model/
--prepare_model_for_kbit_training False
--quantized_hub_model_id MY_HF_HUB_NAME/MODEL_NAME_GPTQ
--quantized_hub_private_repo True
--path_to_env_file ./.env Прямо сейчас библиотека X—LLM позволяет вам использовать только набор данных соды. Мы установили это таким образом для демонстрационных целей, но мы планируем добавить больше наборов данных в ближайшее время. Вам нужно будет выяснить, как загрузить и обрабатывать ваш набор данных. Проще говоря, вы заботитесь о своих данных, а X—LLM обрабатывает остальные. Мы сделали это нарочно, чтобы дать вам достаточно места, чтобы проявить творческий подход и настроить до контента вашего сердца.
Вы можете подробно настроить свой набор данных, добавив дополнительные поля. Все это позволит вам выполнить практически любую задачу в областях Supervised Learning и Offline Reinforcement Learning .
В то же время у вас всегда есть простой способ отправить данные для языкового моделирования.
from xllm import Config
from xllm . datasets import GeneralDataset
from xllm . cli import cli_run_train
if __name__ == '__main__' :
train_data = [ "Hello!" ] * 100
train_dataset = GeneralDataset . from_list ( data = train_data )
cli_run_train ( config_cls = Config , train_dataset = train_dataset ) Чтобы настроить свой собственный проект с помощью X—LLM , вам нужно сделать две вещи:
X—LLM в свой проектКак только это будет сделано, ваш проект будет хорошо, чтобы идти, и вы можете начать выполнять необходимые шаги (например, подготовка, тренировка и так далее).
Чтобы получить контроль над созданием своего проекта с помощью X—LLM , посмотрите материалы ниже.
X—LLM и вписать его в свой собственный проект Библиотека X—LLM использует одну настройку конфигурации для всех этапов, таких как подготовка, обучение и другие шаги. Он разработан таким образом, чтобы вы легко понимали доступные функции и то, что вы можете настроить. Config имеет управление почти над каждой части каждого шага. Благодаря конфигурации вы можете выбрать свой набор данных, установить свой коллатор, управлять типом квантования во время обучения, решить, хотите ли вы использовать Lora, если вам нужно подтолкнуть контрольную точку в HuggingFace Hub и многое другое.
Путь конфигурации: src.xllm.core.config.Config
Или
from xllm import Config У вас есть гибкость, чтобы настроить многие аспекты обучения вашей модели: данные, как обрабатываются данные, тренер, конфигурация, как загружается модель, что происходит до и после обучения, и многое другое.
Мы готовы к использованию компонентов для каждой части конвейера xllm . Вы можете полностью переключить некоторые компоненты, такие как набор данных, коллатор, тренер и эксперимент. Для некоторых компонентов, таких как эксперимент и конфигурация, у вас есть возможность просто опираться на то, что уже есть.
Строите что -нибудь прохладное с x - llm? Пожалуйста, обратитесь ко мне по адресу [email protected]. Я хотел бы услышать от вас.
Напишите нам, чтобы мы могли добавить ваш проект.
Подумайте о добавлении значка в свою модельную карту.
Для проекта GitHub:
[ < img src = " https://github.com/BobaZooba/xllm/blob/main/static/images/xllm-badge.png " alt = " Powered by X—LLM " width = " 175 " height = " 32 " / > ](https://github.com/BobaZooba/xllm)Для обнимающегося карты модельной карты Hub:
[ < img src = " https://cdn-uploads.huggingface.co/production/uploads/6074d5f1134c000d1ae10d42/JudU3rrPP5i87CfwINANO.png " alt = " Powered by X—LLM " width = " 175 " height = " 32 " / > ](https://github.com/BobaZooba/xllm)Это будет похоже на это:
![]()
На данный момент у нас нет тестов непрерывной интеграции, которые используют графический процессор. Тем не менее, мы могли бы разработать такие тесты в будущем. Важно отметить, однако, что это потребует инвестирования времени в их разработку, а также финансирование для технического обслуживания машины.
Experiment