가속화

가속화 (Accelerate)

분산 학습을 다루는 건 복잡할 수 있는데, 여기서는 Hugging Face Accelerate 라이브러리가 어떻게 Trainer와 함께 동작해서 분산 학습을 손쉽게 만들어 주는지 알아볼 거예요. Accelerate를 설정하는 두 가지 방법(설정 파일 방식과 TrainingArguments 방식)을 차근차근 살펴볼게요.

출처: 문서

본문

Accelerate는 FSDP나 DeepSpeed 같은 분산 학습 백엔드를 위한 통합 인터페이스를 제공해요. 여러분의 환경(GPU 개수, 분산 백엔드, mixed precision 등)을 감지해서 학습을 자동으로 설정해 주지요. 1개의 GPU에서 DDP로 돌리든, 8개의 GPU에서 FSDP로 돌리든 상관없이 알아서 잘 처리해 줘요.

Accelerate는 모델을 적절한 분산 래퍼(wrapper)로 감싸고, 올바른 디바이스로 옮기며, 호환되는 optimizer를 만들어 줘요. 학습 중에는 Accelerate 자체의 backward 메서드를 사용해서 mixed precision을 위한 gradient scaling을 처리해요. Trainer는 적절한 Accelerate API를 호출하고, 분산 메커니즘 전반을 Accelerate에 위임해요.

Trainer를 위한 Accelerate는 Accelerate 설정 파일 또는 TrainingArguments 중 하나로 구성하면 돼요.

Accelerate 설정 파일 (Config file)

accelerate config 명령을 실행하고 하드웨어와 학습 설정에 대한 질문에 답하면, 캐시에 default_config.yaml 파일이 생성돼요. 아래 예시는 FSDP용 설정 파일이에요.

compute_environment: LOCAL_MACHINE
distributed_type: FSDP
fsdp_config:
  fsdp_version: 2
  fsdp_reshard_after_forward: true
  fsdp_cpu_offload: false
  fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP
  fsdp_cpu_ram_efficient_loading: true
  fsdp_activation_checkpointing: false
  fsdp_state_dict_type: SHARDED_STATE_DICT
  fsdp_transformer_layer_cls_to_wrap: LlamaDecoderLayer
mixed_precision: bf16
num_machines: 1
num_processes: 4

Trainer 기반 스크립트와 함께 accelerate launch를 실행하면, Accelerate가 설정 파일을 읽고 학습을 구성해요. fsdp_config와 deepspeed 인자는 Accelerate 설정 파일이 같은 설정을 이미 담고 있으므로 굳이 필요하지 않아요.

accelerate launch train.py

accelerator_config는 별도의 최상위 인자로 제공되지 않는 설정을 받아줘요. 예를 들어 non_blocking=True를 dataloader_pin_memory()와 함께 설정하면 데이터 전송과 연산을 겹쳐서 GPU 처리량을 높일 수 있어요.

from transformers import TrainingArguments

TrainingArguments(
    ...,
    dataloader_pin_memory=True,
    accelerator_config={
        "non_blocking": True,
    },
)

TrainingArguments

백엔드별 설정을 TrainingArguments에 전달할 수도 있어요. create_accelerator_and_postprocess() 메서드가 그 설정을 읽고 학습을 구성해 줘요.

JSON 설정 파일이나 dict를 ~TrainingArguments.fsdp_config에 전달하면 돼요. 전체 가이드와 설정 참조는 FSDP를 확인해 주세요.

from transformers import TrainingArguments

TrainingArguments(
    ...,
    fsdp=True,
    fsdp_config="path/to/fsdp.json",
)

JSON 설정 파일이나 dict를 ~TrainingArguments.deepspeed에 전달하면 돼요. 전체 가이드와 설정 참조는 DeepSpeed를 확인해 주세요.

from transformers import TrainingArguments

TrainingArguments(
    ...,
    deepspeed="path/to/ds_config.json",
)

DDP는 TrainingArguments 필드를 통해 직접 구성해요. 자세한 내용은 DDP를 참조해 주세요.

from transformers import TrainingArguments

TrainingArguments(
    ...,
    ddp_backend="nccl",
    ddp_find_unused_parameters=False,
    ddp_bucket_cap_mb=25,
    ddp_timeout=1800,
)

다음 단계 (Next steps)

  • 모델이 하나의 GPU에 들어가는 경우 데이터 병렬 학습은 DDP를 확인해 주세요.
  • 파라미터, 그래디언트, optimizer 상태를 GPU들에 걸쳐 샤딩하는 방법은 FSDP를 확인해 주세요.
  • ZeRO 최적화와 오프로딩은 DeepSpeed를 확인해 주세요.

더 알아보기 (Learn more)