Accelerate documentation
Процесс выполнения
Процесс выполнения
При работе с системами распределённого обучения важно управлять тем, как и когда процессы выполняются на GPU. Некоторые процессы завершаются быстрее других, а некоторые не должны начинаться, пока другие не завершены. Accelerate предоставляет инструменты для оркестрации момента выполнения процессов, чтобы обеспечить синхронизацию на всех устройствах.
В этом руководстве вы узнаете, как запускать процесс только на одном компьютере и как откладывать выполнение до тех пор, пока все процессы не достигнут определённой точки.
Выполнение в одном процессе
Определённый код нужно выполнять только один раз на конкретной машине, например, для вывода строки журнала или отображения одной полосы прогресса в локальном главном процессе.
Для указания кода, который должен выполняться только один раз, следует использовать accelerator.is_local_main_process.
from tqdm.auto import tqdm
progress_bar = tqdm(range(args.max_train_steps), disable=not accelerator.is_local_main_process)Вы также можете обернуть оператор в accelerator.is_local_main_process.
Для отдельных операторов
accelerator.is_local_main_process, замените
if accelerator.is_local_main_process:
print("Accelerate is the best")Для функции, которая должна выполняться только один раз, используйте on_local_main_process().
@accelerator.on_local_main_process
def do_my_thing():
"Something done once per server"
do_thing_once_per_server()Вы также можете указать Accelerate выполнять код один раз на всех процессах, независимо от количества машин. Это полезно, если вы загружаете итоговую модель в Hub.
Для указания кода, который должен выполняться только один раз во всех процессах, следует использовать accelerator.is_main_process.
if accelerator.is_main_process:
repo.push_to_hub()Для функции, которая должна выполняться только один раз во всех процессах, используйте on_main_process().
@accelerator.on_main_process
def do_my_thing():
"Something done once per server"
do_thing_once()Выполнить на конкретном процессе
Accelerate также позволяет выполнять функции, которые должны запускаться только на определённом процессе или локальном индексе процесса.
Используйте метод on_process() и укажите индекс процесса, на котором следует выполнить функцию.
@accelerator.on_process(process_index=0)
def do_my_thing():
"Something done on process index 0"
do_thing_on_index_zero()Используйте метод on_local_process() и укажите индекс локального процесса, на котором следует выполнить функцию.
@accelerator.on_local_process(local_process_idx=0)
def do_my_thing():
"Something done on process index 0 on each server"
do_thing_on_index_zero_on_each_server()Отложенное выполнение
При запуске скрипта на нескольких GPU одновременно часть кода может выполняться быстрее, чем другая. Возможно, потребуется дождаться, пока все процессы не достигнут определённой точки, прежде чем выполнять следующий набор инструкций. Например, не следует сохранять модель, не убедившись, что каждый процесс завершил обучение.
Для этого добавьте wait_for_everyone() в ваш код. Это блокирует все процессы, которые завершили работу раньше, от дальнейшего выполнения, пока все остальные процессы не достигнут той же точки (это не имеет эффекта, если вы работаете на одном GPU или CPU).
accelerator.wait_for_everyone()