accelerate launch로 스크립트 실행하기

accelerate launch로 스크립트 실행하기

Accelerate로 바꾼 훈련 스크립트는 결국 특별한 하드웨어를 활용하도록 실행해야 해요. 이를 도와주는 CLI가 accelerate launch 입니다. 다양한 플랫폼에서 스크립트를 띄우는 여러 명령을 하나로 감싸서, 각 플랫폼의 명령을 외울 필요가 없게 해줘요.

출처: https://huggingface.co/docs/accelerate/basic_tutorials/launch

준비: main 함수로 감싸기

훈련 코드를 실행 가능한 스크립트로 만들기 위해 코드를 함수로 감싸고 __main__ 가드를 붙이세요.

  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 {script_name.py} --arg1 --arg2 ...

torchrun으로 직접 실행하는 것도 가능하지만 필수는 아니에요. accelerate config를 먼저 실행해주는 게 권장되는데, 그러면 이후엔 accelerate launch {script_name.py} ...만으로 충분합니다.

단일 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 config를 먼저 안 했다면 파라미터를 직접 넘겨야 해요. 예를 들어 모든 GPU를 쓰되 혼합 정밀도를 끄려면:

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

두 GPU에서 혼합 정밀도 fp16으로 모든 경고 없이 실행하려면:

accelerate launch --multi_gpu --mixed_precision=fp16 --num_processes=2 {script_name.py} {--arg1} {--arg2} ...

전체 파라미터 목록은 accelerate launch -h로 확인할 수 있어요. 코드에 Accelerate를 쓰지 않아도 런처만 실행 용도로 쓸 수 있습니다. 파이썬 모듈 방식으로 쓰려면 python -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2} 처럼 실행하고, -u 같은 파이썬 플래그도 섞을 수 있어요.

커스텀 설정 파일

accelerate config가 만든 설정은 캐시 폴더의 default_config.yaml 파일에 저장돼요. 캐시 폴더 위치 우선순위는 다음과 같아요.

  • 환경 변수 HF_HOME 값에 accelerate를 붙인 곳
  • 없으면 XDG_CACHE_HOME 값에 huggingface/accelerate를 붙인 곳
  • 이 둘도 없으면 ~/.cache/huggingface/accelerate

여러 설정을 두려면 --config_file 플래그로 yaml 경로를 지정하면 됩니다. 단일 머신 두 GPU + fp16 예시 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

실행은 설정 파일을 가리켜 진행해요.

accelerate launch --config_file {path/to/config/my_config_file.yaml} {script_name.py} {--arg1} {--arg2} ...

멀티노드 훈련

코드와 데이터를 모든 노드에 복사(또는 공유 파일시스템 사용)하고, 각 노드에 파이썬 패키지를 설치한 뒤, 메인 노드에서 accelerate config를 실행해 노드 수와 각 노드의 rank(메인/마스터는 0), 메인 프로세스의 IP·포트를 지정하세요. 그 설정 파일을 다른 노드에 복사하되 machine_rank를 1, 2, 3...으로 바꾸면 됩니다. 명령은 모든 노드에서 실행돼야 시작돼요. 메인 노드 IP는 공개 IP보다 내부 IP(192.168.x.x172.x.x.x)를 권장해요.

더 알아보기