# 실행 과정

분산 학습 시스템에서 작업할 때, 프로세스가 GPU에 걸쳐 어떻게 그리고 언제 실행되는지를 관리하는 것이 중요합니다. 일부 프로세스는 다른 프로세스보다 더 빠르게 완료되며, 다른 프로세스가 아직 완료되지 않은 경우 시작해서는 안 되는 프로세스도 있습니다. Accelerate는 모든 프로세스가 모든 장치 간에 동기화 상태를 유지하도록 프로세스 실행 시점을 조정하는 도구를 제공합니다.

이 튜토리얼에서는 프로세스를 단일 머신에서만 실행하는 방법과 모든 프로세스가 특정 지점에 도달할 때까지 실행을 지연시키는 방법을 배웁니다.

## 프로세스 하나에서 실행

특정 코드는 주어진 머신에서 한 번만 실행되어야 하는 경우가 있습니다. 예를 들어, 로그 문구를 출력하거나 로컬 메인 프로세스에서 진행률 바를 하나만 표시하는 경우입니다.

한 번만 실행되어야 하는 코드를 나타내기 위해 `accelerator.is_local_main_process`를 사용해야 합니다.

```py
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`로 문장을 감싸는 것도 가능합니다.

> [!TIP]
> `accelerator.is_local_main_process`로 감싸지 않은 독립적인 `print` 문장의 경우, `print`를 Accelerate의 [print()](/docs/accelerate/main/ko/package_reference/accelerator#accelerate.Accelerator.print) 메서드로 교체하여 프로세스당 한 번만 출력하도록 하세요.

```py
if accelerator.is_local_main_process:
    print("Accelerate is the best")
```

한 번만 실행되어야 하는 함수에는 [on_local_main_process()](/docs/accelerate/main/ko/package_reference/accelerator#accelerate.Accelerator.on_local_main_process)를 사용하세요.

```py
@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`를 사용해야 합니다.

```py
if accelerator.is_main_process:
    repo.push_to_hub()
```

모든 프로세스에 걸쳐 한 번만 실행되어야 하는 함수에는 [on_main_process()](/docs/accelerate/main/ko/package_reference/accelerator#accelerate.Accelerator.on_main_process)를 사용하세요.

```py
@accelerator.on_main_process
def do_my_thing():
    "Something done once per server"
    do_thing_once()
```

## 특정 프로세스에서 실행

Accelerate는 특정 프로세스 또는 로컬 프로세스 인덱스에서만 실행되어야 하는 함수를 실행하는 데에도 도움을 줄 수 있습니다.

[on_process()](/docs/accelerate/main/ko/package_reference/accelerator#accelerate.Accelerator.on_process) 메서드를 사용하여 함수를 실행할 프로세스 인덱스를 지정합니다.

```py
@accelerator.on_process(process_index=0)
def do_my_thing():
    "Something done on process index 0"
    do_thing_on_index_zero()
```

[on_local_process()](/docs/accelerate/main/ko/package_reference/accelerator#accelerate.Accelerator.on_local_process) 메서드를 사용하여 함수를 실행할 로컬 프로세스 인덱스를 지정합니다.

```py
@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()](/docs/accelerate/main/ko/package_reference/accelerator#accelerate.Accelerator.wait_for_everyone)를 추가합니다. 이는 먼저 완료된 모든 프로세스가 나머지 모든 프로세스가 동일한 지점에 도달할 때까지 계속 진행하는 것을 차단합니다(단일 GPU 또는 CPU에서 실행하는 경우 이 효과는 없습니다).

```py
accelerator.wait_for_everyone()
```

