Accelerate documentation

Accelerate 스크립트 실행

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.15.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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 launch를 사용하기 전에 accelerate config를 실행하여 환경을 원하는 대로 구성하는 것이 좋습니다. 그렇지 않으면 Accelerate는 시스템 설정에 따라 매우 기본적인 기본값을 사용합니다.

accelerate launch 사용

Accelerate에는 accelerate launch를 통해 시스템에서 코드를 실행하는 데 도움이 되는 특수 CLI 명령이 있습니다. 이 명령은 각 명령이 무엇인지 기억할 필요 없이 다양한 플랫폼에서 스크립트를 실행하는 데 필요한 모든 다른 명령을 감싸줍니다.

torchrun와 같이 PyTorch에서 스크립트를 실행하는 방법에 익숙하다면, 여전히 그렇게 할 수 있습니다. accelerate launch를 사용하는 것은 필수 사항이 아닙니다.

다음 명령을 사용하여 스크립트를 빠르게 실행할 수 있습니다:

accelerate launch {script_name.py} --arg1 --arg2 ...

명령어 앞에 accelerate launch를 붙이고, 그 뒤에 스크립트에 추가 인자와 매개변수를 평소처럼 전달하면 됩니다!

여러 torch spawn 메서드를 실행하므로, 예상되는 모든 환경 변수도 여기서 수정할 수 있습니다. 예를 들어, 단일 GPU로 accelerate launch를 사용하는 방법은 다음과 같습니다:

# 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 config를 먼저 실행하지 않고 accelerate launch를 사용할 수도 있지만, 이 경우 올바른 구성 매개변수를 수동으로 전달해야 할 수 있습니다. 이 경우 Accelerate는 하이퍼파라미터에 대한 일부 결정을 대신 내립니다. 예를 들어 GPU가 사용 가능한 경우, 혼합 정밀도(mixed precision)를 사용하지 않고 기본적으로 모든 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를 사용하지 않더라도 스크립트를 시작하는 데 런처를 사용할 수 있습니다!

이 차이를 시각적으로 확인하기 위해, 다중 GPU에서 accelerate launch를 실행하면 torchrun을 사용할 때 다음과 같은 형태가 됩니다:

MIXED_PRECISION="fp16" torchrun --nproc_per_node=2 --nnodes=1 {script_name.py} {--arg1} {--arg2} ...

launch CLI를 Python 모듈로 직접 사용하여 스크립트를 실행할 수도 있습니다. 이를 통해 Python에 특화된 다른 실행 동작을 전달할 수 있습니다. 이렇게 하려면 accelerate launch 대신 accelerate.commands.launch를 사용하세요:

python -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2}

-m와 유사하게 다른 Python 플래그를 실행 스크립트에 전달할 수 있습니다. 예를 들어, 아래 예시에서는 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 명령으로 만든 설정을 조합하여 사용하는 것이 좋습니다. 이러한 설정은 Accelerate의 캐시 폴더에 있는 default_config.yaml 파일에 저장됩니다. 이 캐시 폴더는 (우선순위가 낮은 순서대로) 다음 위치에 있습니다:

  • 환경 변수 HF_HOME의 값 뒤에 accelerate가 붙은 경로입니다.
  • 존재하지 않는 경우, 환경 변수 XDG_CACHE_HOME의 값 뒤에 huggingface/accelerate가 붙은 경로가 사용됩니다.
  • 이것도 존재하지 않는 경우, ~/.cache/huggingface/accelerate 폴더를

여러 구성을 사용하려면 accelerate launch 명령에 --config_file 플래그를 커스텀 yaml의 위치와 함께 전달할 수 있습니다.

fp16를 혼합 정밀도로 사용하는 단일 머신의 두 GPU에 대한 예시 yaml은 다음과 같은 형태일 수 있습니다:

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 대신 메인 노드의 내부 네트워크 IP를 사용하는 것이 좋습니다. 이는 메인 노드에서 hostname -I를 실행할 때 확인되는 192.168.x.x 또는 172.x.x.x 주소입니다.

멀티노드 학습에 대한 더 자세한 내용을 확인하려면 FSDP를 사용한 멀티노드 학습 예제를 참고하세요.

Update on GitHub