Accelerate documentation

빠른 시작

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

빠른 시작

학습 환경(torchrun, DeepSpeed 등)과 사용 가능한 하드웨어에 따라 코드를 시작하고 실행하는 방법은 다양합니다. Accelerate는 다양한 분산 설정에서 코드를 시작하고 학습할 수 있는 통합 인터페이스를 제공하여, 코드를 이러한 다양한 설정에 맞게 조정하는 복잡한 과정 대신 PyTorch 학습 코드에 집중할 수 있게 합니다. 이를 통해 GPU와 TPU와 같은 하드웨어를 갖춘 분산 설정에서 PyTorch 코드를 학습 및 추론용으로 쉽게 확장할 수 있습니다. Accelerate는 Big Model Inference를 제공하여, 일반적으로 메모리에 맞지 않는 매우 큰 모델을 로드하고 추론을 실행하는 과정을 보다 쉽게 사용할 수 있게 합니다.

이 퀵투어는 Accelerate의 세 가지 주요 기능을 소개합니다:

  • 분산 학습 스크립트를 위한 통합된 커맨드 라인 실행 인터페이스
  • PyTorch 학습 코드를 다양한 분산 환경에서 실행하도록 조정하기 위한 학습 라이브러리
  • 대형 모델 추론

통합 런치 인터페이스

Accelerate는 accelerate config 명령을 통해 생성된 통합 구성 파일을 사용하여 주어진 분산 학습 프레임워크(DeepSpeed, FSDP 등)에 적합한 구성 값을 자동으로 선택합니다. SLURM을 사용하는 경우와 같은 특정 상황에서 유용하므로, 구성 값을 명령줄에 명시적으로 전달할 수도 있습니다.

하지만 대부분의 경우, Accelerate가 학습 환경을 파악할 수 있도록 항상 먼저 accelerate config를 실행해야 합니다.

accelerate config

accelerate config 명령은 Accelerate의 캐시 폴더에 default_config.yaml 파일을 생성하고 저장합니다. 이 파일은 학습 환경의 구성을 저장하며, Accelerate가 사용자의 머신에 맞게 학습 스크립트를 올바르게 시작하는 데 도움이 됩니다.

환경을 설정한 후에는 accelerate test를 사용하여 설정을 테스트할 수 있습니다. 이 명령은 분산 환경을 테스트하기 위한 짧은 스크립트를 실행합니다.

accelerate test

--config_file를 accelerate test 또는 accelerate launch 명령에 추가하여 캐시와 같은 기본 위치가 아닌 다른 위치에 설정 파일이 저장된 경우 해당 위치를 지정할 수 있습니다.

환경 설정이 완료되면 accelerate launch로 학습 스크립트를 실행하세요!

accelerate launch path_to_script.py --args_for_the_script

자세한 내용은 스크립트 실행에 대한 추가 정보를 제공하는 Launch distributed code 튜토리얼을 참고하세요.

다양한 설정에서 실행할 수 있는 여러 최소 예제 구성을 보여주는 구성 자료실도 있습니다.

학습 코드 수정

Accelerate의 다음 주요 기능은 Accelerator 클래스입니다. 이 클래스는 PyTorch 코드를 다양한 분산 환경에서 실행하도록 조정합니다.

여러 GPU 또는 TPU에서 실행할 수 있도록 학습 스크립트에 몇 줄의 코드만 추가하면 됩니다.

+ from accelerate import Accelerator
+ accelerator = Accelerator()

+ device = accelerator.device
+ model, optimizer, training_dataloader, scheduler = accelerator.prepare(
+     model, optimizer, training_dataloader, scheduler
+ )

  for batch in training_dataloader:
      optimizer.zero_grad()
      inputs, targets = batch
-     inputs = inputs.to(device)
-     targets = targets.to(device)
      outputs = model(inputs)
      loss = loss_function(outputs, targets)
+     accelerator.backward(loss)
      optimizer.step()
      scheduler.step()
  1. 학습 스크립트 시작 부분에 Accelerator 클래스를 가져와서 인스턴스를 생성합니다. Accelerator 클래스는 분산 학습에 필요한 모든 것을 초기화하며, 코드가 어떻게 실행되었는지에 따라 학습 환경(GPU가 하나 있는 단일 머신, 여러 GPU가 있는 머신, 여러 GPU가 있는 여러 머신 또는 TPU 등)을 자동으로 감지합니다.
from accelerate import Accelerator

accelerator = Accelerator()
  1. 모델 및 입력 데이터에 대한 .cuda()와 같은 호출을 제거하세요. Accelerator 클래스가 이러한 객체를 적절한 장치에 자동으로 배치해 줍니다.

이 단계는 선택 사항이지만, Accelerate가 디바이스 배치를 처리하도록 하는 것이 모범 사례로 간주됩니다. Accelerator를 초기화할 때 device_placement=False를 전달하여 자동 디바이스 배치를 비활성화할 수도 있습니다. .to(device)를 사용하여 객체를 특정 디바이스에 명시적으로 배치하려면, 대신 accelerator.device를 사용하도록 하십시오. 예를 들어, 모델을 accelerator.device에 배치하기 전에 옵티마이저를 생성하면 TPU에서 학습이 실패합니다.

Accelerate의 자동 장치 배치에서는 기본적으로 non-blocking transfers를 사용하지 않으므로, 원치 않는 CUDA 동기화가 발생할 수 있습니다. Accelerator를 초기화할 때 dataloader_config로 non_blocking=True가 설정된 DataLoaderConfiguration를 전달하면 non-blocking transfers를 활성화할 수 있습니다. 마찬가지로, non-blocking transfers는 dataloader에도 pin_memory=True가 설정된 경우에만 작동합니다. GPU에서 CPU로의 non-blocking transfers를 사용하면, 준비되지 않은 텐서에 대한 CPU 연산이 수행되어 잘못된 결과가 발생할 수 있으므로 주의하세요.

device = accelerator.device
  1. 학습에 필요한 모든 PyTorch 객체(옵티마이저, 모델, 데이터로더, 학습률 스케줄러)를 생성한 직후 prepare() 메서드에 전달하세요. 이 메서드는 분산 환경에 최적화된 컨테이너로 모델을 감싸고, Accelerate 버전의 옵티마이저와 스케줄러를 사용하며, GPU 또는 TPU에 분배하기 위해 데이터로더의 샤드된 버전을 생성합니다.
model, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(
    model, optimizer, train_dataloader, lr_scheduler
)
  1. loss.backward()를 backward()로 교체하여 학습 설정에 맞는 올바른 backward() 메서드를 사용하세요.
accelerator.backward(loss)

Accelerate가 코드를 어떻게 적응시키는지에 대한 자세한 내용을 알아보려면 Accelerate의 내부 메커니즘 가이드를 읽어보세요.

분산 평가

분산 평가를 수행하려면 검증 dataloader를 prepare() 메서드에 전달하세요:

validation_dataloader = accelerator.prepare(validation_dataloader)

Each device in your distributed setup only receives a part of the evaluation data, which means you should group your predictions together with the gather_for_metrics() method. This method requires all tensors to be the same size on each process, so if your tensors have different sizes on each process (for instance when dynamically padding to the maximum length in a batch), you should use the pad_across_processes() method to pad you tensor to the largest size across processes. Note that the tensors needs to be 1D and that we concatenate the tensors along the first dimension.

for inputs, targets in validation_dataloader:
    predictions = model(inputs)
    # Gather all predictions and targets
    all_predictions, all_targets = accelerator.gather_for_metrics((predictions, targets))
    # Example of use with a *Datasets.Metric*
    metric.add_batch(all_predictions, all_targets)

더 복잡한 경우(예: 2D 텐서, 텐서 연결을 원하지 않는 경우, 3D 텐서의 dict)에는 gather_for_metrics에 use_gather_object=True를 전달할 수 있습니다. 이렇게 하면 수집된 객체의 리스트가 반환됩니다. GPU 텐서와 함께 사용할 경우 지원이 잘 되어 있지 않고 비효율적이라는 점에 유의하세요.

데이터셋의 끝부분 데이터는 배치(workers)가 모든 워커에 균등하게 나뉘도록 중복될 수 있습니다. gather_for_metrics() 메서드는 더 정확한 메트릭을 계산하기 위해 중복된 데이터를 자동으로 제거합니다.

대형 모델 추론

Accelerate의 Big Model Inference에는 일반적으로 메모리에 맞지 않는 대규모 모델을 추론용으로 로드하기 위한 두 가지 주요 기능, init_empty_weights()와 load_checkpoint_and_dispatch()가 있습니다.

Big Model Inference의 내부 작동 방식을 더 잘 이해하려면 추론을 위한 대형 모델 처리 가이드를 참고하세요.

빈 가중치 초기화

init_empty_weights() 컨텍스트 매니저는 모델 스켈레톤을 생성하고 매개변수가 생성될 때마다 PyTorch의 meta 디바이스로 이동 및 배치하여 어떤 크기의 모델이든 초기화합니다. 이렇게 하면 모든 가중치가 즉시 로드되지 않고, 모델의 일부만 한 번에 메모리에 로드됩니다.

예를 들어, 빈 Mixtral-8x7B 모델을 로드하는 데 필요한 메모리는 CPU에서 모델과 가중치를 완전히 로드하는 경우보다 훨씬 적습니다.

from accelerate import init_empty_weights
from transformers import AutoConfig, AutoModelForCausalLM

config = AutoConfig.from_pretrained("mistralai/Mixtral-8x7B-Instruct-v0.1")
with init_empty_weights():
    model = AutoModelForCausalLM.from_config(config)

가중치 로드 및 디스패치

load_checkpoint_and_dispatch() 함수는 전체 또는 샤드된 체크포인트를 빈 모델에 로드하고, 가중치를 모든 사용 가능한 장치에 자동으로 분배합니다.

device_map 매개변수는 각 모델 레이어를 어디에 배치할지 결정하며, "auto"를 지정하면 먼저 GPU, 다음으로 CPU, 그리고 여전히 메모리가 부족하면 하드 드라이브에 메모리 매핑 텐서로 배치합니다. no_split_module_classes 매개변수를 사용하여 여러 디바이스에 걸쳐 분할해서는 안 되는 모듈(일반적으로 잔차 연결이 있는 모듈)을 지정합니다.

from accelerate import load_checkpoint_and_dispatch

model_checkpoint = "your-local-model-folder"
model = load_checkpoint_and_dispatch(
    model, checkpoint=model_checkpoint, device_map="auto", no_split_module_classes=['Block']
)

다음 단계

주요 Accelerate 기능에 대해 소개를 마쳤으므로, 다음 단계로 다음을 수행할 수 있습니다:

  • Accelerate를 부드럽게 안내하는 튜토리얼을 확인해 보세요. 분산 학습과 이 라이브러리에 처음 접하는 경우 특히 유용합니다.
  • 구체적인 사용 사례에서 Accelerate를 사용하는 방법을 확인하려면 가이드를 살펴보세요.
  • 개념 가이드를 읽고 Accelerate의 내부 작동 방식을 개념적으로 더 깊이 이해해 보세요.
  • 사용 가능한 매개변수와 옵션을 확인하려면 API 참조에서 클래스와 명령을 검색하세요.
Update on GitHub