Accelerate documentation
Запуск скриптов Accelerate
Запуск скриптов Accelerate
В предыдущем учебном материале вы узнали, как изменить текущий скрипт обучения, чтобы использовать Accelerate. Итоговая версия этого кода приведена ниже:
from accelerate import Accelerator
accelerator = Accelerator()
model, optimizer, training_dataloader, scheduler = accelerator.prepare(
model, optimizer, training_dataloader, scheduler
)
for batch in training_dataloader:
optimizer.zero_grad()
inputs, targets = batch
outputs = model(inputs)
loss = loss_function(outputs, targets)
accelerator.backward(loss)
optimizer.step()
scheduler.step()Но как запустить этот код так, чтобы он использовал доступное ему специальное оборудование?
Сначала следует переписать приведённый выше код в функцию и сделать его вызываемым как скрипт. Например:
from accelerate import Accelerator
+ def main():
accelerator = Accelerator()
model, optimizer, training_dataloader, scheduler = accelerator.prepare(
model, optimizer, training_dataloader, scheduler
)
for batch in training_dataloader:
optimizer.zero_grad()
inputs, targets = batch
outputs = model(inputs)
loss = loss_function(outputs, targets)
accelerator.backward(loss)
optimizer.step()
scheduler.step()
+ if __name__ == "__main__":
+ main()Далее вам нужно запустить его с помощью accelerate launch.
Рекомендуется выполнить
accelerate configперед использованиемaccelerate launch, чтобы настроить окружение под свои нужды. В противном случае Accelerate будет использовать базовые значения по умолчанию в зависимости от конфигурации вашей системы.
Использование accelerate launch
Accelerate имеет специальную команду CLI, которая помогает запускать ваш код в вашей системе с помощью accelerate launch.
Эта команда объединяет все различные команды, необходимые для запуска вашего скрипта на разных платформах, избавляя вас от необходимости запоминать каждую из них.
Если вы знакомы с запуском скриптов в PyTorch самостоятельно, например с помощью
torchrun, вы можете продолжать делать это. Использованиеaccelerate launchне является обязательным.
Вы можете быстро запустить свой скрипт, используя:
accelerate launch {script_name.py} --arg1 --arg2 ...Просто добавьте accelerate launch в начало вашей команды, а затем передайте дополнительные аргументы и параметры вашему скрипту как обычно!
Поскольку здесь вызываются различные методы запуска torch, все ожидаемые переменные окружения также можно изменить в этом месте.
Например, вот как использовать accelerate launch с одним GPU:
# for cuda device:
CUDA_VISIBLE_DEVICES="0" accelerate launch {script_name.py} --arg1 --arg2 ...
# for xpu device:
ZE_AFFINITY_MASK="0" accelerate launch {script_name.py} --arg1 --arg2 ...Вы также можете использовать accelerate launch без предварительного выполнения accelerate config, но в этом случае вам, возможно, придется вручную передать необходимые параметры конфигурации.
В таком случае Accelerate примет некоторые решения по гиперпараметрам за вас, например, если доступны GPU, по умолчанию будут использованы все они без смешанной точности.
Вот как использовать все GPU и обучать модель с отключенной смешанной точностью:
accelerate launch --multi_gpu {script_name.py} {--arg1} {--arg2} ...Или, указав количество используемых GPU:
accelerate launch --num_processes=2 {script_name.py} {--arg1} {--arg2} ...Чтобы быть более конкретным, вы должны сами передать необходимые параметры. Например, вот как запустить тот же самый скрипт на двух GPU с использованием смешанной точности, избегая всех предупреждений:
accelerate launch --multi_gpu --mixed_precision=fp16 --num_processes=2 {script_name.py} {--arg1} {--arg2} ...Для полного списка параметров, которые можно передать, выполните:
accelerate launch -h
Даже если вы не используете Accelerate в своём коде, вы всё равно можете использовать лаунчер для запуска своих скриптов!
Для наглядного представления этой разницы, ранее описанный запуск accelerate launch на нескольких GPU с помощью torchrun выглядел бы примерно так:
MIXED_PRECISION="fp16" torchrun --nproc_per_node=2 --nnodes=1 {script_name.py} {--arg1} {--arg2} ...Вы также можете запускать свой скрипт, используя accelerate.commands.launch как Python-модуль, что позволяет передавать специфичные для Python параметры запуска. Для этого используйте accelerate.commands.launch вместо accelerate launch:
python -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2}Если вы хотите выполнить скрипт с другими флагами Python, вы можете передать их аналогично -m, например, как в примере ниже, где включён вывод stdout и stderr без буферизации:
python -u -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2}Вы также можете запускать код на CPU! Это полезно для отладки и тестирования на небольших моделях и наборах данных.
accelerate launch --cpu {script_name.py} {--arg1} {--arg2}
Почему следует всегда использовать accelerate config
Почему это настолько полезно, что всегда стоит запускать accelerate config?
Вспомните, что ранее мы обращались к accelerate launch, а также к torchrun?
После настройки, чтобы запустить этот скрипт с необходимыми компонентами, достаточно просто использовать accelerate launch, не передавая никаких дополнительных аргументов:
accelerate launch {script_name.py} {--arg1} {--arg2} ...Пользовательские конфигурации
Как кратко упоминалось ранее, accelerate launch следует использовать в основном в сочетании с настройками, созданными с помощью команды accelerate config. Эти конфигурации сохраняются в файле default_config.yaml в каталоге кэша Accelerate.
Этот каталог кэша находится по одному из следующих путей (в порядке убывания приоритета):
- Содержимое переменной окружения
HF_HOMEс суффиксомaccelerate. - Если он не существует, используется содержимое переменной окружения
XDG_CACHE_HOMEс добавлением суффиксаhuggingface/accelerate. - Если этого тоже нет, создайте папку
~/.cache/huggingface/accelerate.
Чтобы использовать несколько конфигураций, флаг --config_file можно передать команде accelerate launch вместе с путём к пользовательскому файлу yaml.
An example yaml may look something like the following for two GPUs on a single machine using fp16 for mixed precision:
compute_environment: LOCAL_MACHINE
deepspeed_config: {}
distributed_type: MULTI_GPU
fsdp_config: {}
machine_rank: 0
main_process_ip: null
main_process_port: null
main_training_function: main
mixed_precision: fp16
num_machines: 1
num_processes: 2
use_cpu: falseЗапуск скрипта из расположения этого пользовательского файла yaml выглядит следующим образом:
accelerate launch --config_file {path/to/config/my_config_file.yaml} {script_name.py} {--arg1} {--arg2} ...Обучение на нескольких узлах
Многоузловая тренировка с Accelerate аналогична многоузловой тренировке с torchrun. Самый простой способ запустить многоузловую тренировку — выполнить следующее:
- Скопируйте кодовую базу и данные на все узлы (или разместите их на общей файловой системе).
- Настройте пакеты Python на всех узлах.
- Сначала выполните
accelerate configна основном узле. После указания количества узлов вас попросят задать ранг каждого узла (для основного/главного узла это будет 0), а также IP-адрес и порт для основного процесса. Это необходимо для связи рабочих узлов с основным процессом. После этого вы можете скопировать или отправить этот файл конфигурации на все ваши узлы, изменивmachine_rankна 1, 2, 3 и т. д., чтобы не запускать команду повторно (или просто следуйте их инструкциям по запуску с помощьюtorchrun).
После выполнения этих шагов вы можете запустить обучение на нескольких узлах, выполнив accelerate launch (или torchrun) на всех узлах.
It is required that the command be run on all nodes for everything to start, not just running it from the main node. You can use something like SLURM or a different process executor to wrap around this requirement and call everything from a single command.
Рекомендуется использовать внутренний IP-адрес вашего основного узла вместо публичного для снижения задержки. Это адрес
192.168.x.xили172.x.x.x, который вы видите при выполнении командыhostname -Iна основном узле.
Чтобы лучше понять обучение на нескольких узлах, ознакомьтесь с нашим примером обучения на нескольких узлах с FSDP.
Update on GitHub