Hugging Face Accelerate
딥러닝을 하다 보면 모델 학습 코드 자체보다 GPU 설정, 멀티 GPU 분산 학습(DDP), 혼합 정밀도(FP16) 설정 등 하드웨어 최적화를 위한 복잡한 코드 작성에 더 많은 시간을 쏟게 되는 경우가 많다.
Accelerate는 바로 이 문제를 해결해 주는 도구이다.
파이토치 하드웨어 설정 코드를 걷어내고, 단 몇 줄의 변경만으로 코드를 CPU, GPU, 멀티 GPU, TPU 어디서든 돌아가게 만들어 준다.
Accelerate란
기존의 순수 PyTorch로 딥러닝 코드를 짤 때, 하드웨어를 효율적으로 쓰려면 이런거 했어야 했다.
- .to(device)를 변수마다 붙여줘야 한다 (CPU/GPU 이동)
- 멀티 GPU를 쓰려면 DistributedDataParallel 설정을 짜야 했다.
- 메모리를 아끼기 위해 FP16(Mixed Precision)을 쓰려면 GradScaler 등을 써야 함
Accelerate는 이 모든 과정을 자동화한다.
진짜 개꿀
코드 하나로 CPU, GPU(1개), 멀티 GPU, TPU에서 모두 실행 가능해진다.
또한 복잡한 설정 없이 데이터 분산 학습(DDP)을 바로 적용할 수 있다.
코드 한 줄 변경 없이 FP16, BF16 연산 수행할 수 있다.
무엇보다, 새로운 프레임워크가 아니라, 기존 PyTorch 코드 스타일을 그대로 유지하는거라 배우기 개쉽다.
사용 방법 (Step-by-Step)
1. 설치
터미널에서 pip를 이용해 설치해보자.
pip install accelerate
2. 환경 설정
코드를 고치는 대신 터미널에서 환경을 설정한다 ㅋㅋㅋㅋ.
accelerate config
이 명령어를 입력하면 질문들이 나온다. (예: GPU를 몇 개 쓸 건지, FP16을 쓸 건지 등).
여기서 설정한 내용은 저장되어 나중에 코드를 실행할 때 자동으로 적용된다.
3. 파이썬 코드 수정
기존 PyTorch 코드에 3가지만 변경하면 된다.
- Accelerator 객체 생성
- 모델, 옵티마이저, 데이터로더를 prepare()로 감싸기
- loss.backward() 대신 accelerator.backward(loss) 사용
한번 기존 코드랑 비교해 보며 얼마나 사기적인지 한번 봐 보자.
기존 PyTorch 코드
import torch
# 1. 디바이스 설정 (매번 확인해야 함)
device = "cuda" if torch.cuda.is_available() else "cpu"
model = MyModel().to(device) # 모델을 GPU로 보냄
optimizer = torch.optim.Adam(model.parameters())
# 데이터 로더
dataloader = ...
for batch in dataloader:
# 2. 데이터를 일일이 GPU로 보내야 함
inputs = batch["input"].to(device)
labels = batch["label"].to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = loss_fn(outputs, labels)
# 3. 역전파
loss.backward()
optimizer.step()
Accelerate 적용 코드
from accelerate import Accelerator # 추가
# 1. Accelerator 객체 생성
accelerator = Accelerator()
model = MyModel() # .to(device) 불필요
optimizer = torch.optim.Adam(model.parameters())
dataloader = ...
# 2. 모든 객체를 prepare()로 감싸면 알아서 디바이스 할당 및 분산 처리 설정 완료
model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)
for batch in dataloader:
# .to(device) 제거 (알아서 처리됨)
inputs = batch["input"]
labels = batch["label"]
optimizer.zero_grad()
outputs = model(inputs)
loss = loss_fn(outputs, labels)
# 3. 역전파를 accelerator가 담당
accelerator.backward(loss)
optimizer.step()
4. 실행
파이썬 스크립트를 실행할 때 python train.py 대신 아래 명령어를 쓴다.
accelerate launch train.py
이렇게 하면 2단계에서 설정한 값(GPU 개수, FP16 여부 등)을 불러와서 자동으로 최적화하여 실행한다.
자동으로 최적화 한다.
언제 사용하면 좋을까
GPU가 여러 개 있는 서버에서 코드를 돌려야 할 때
Colab이나 Kaggle처럼 GPU 환경이 계속 바뀌는 곳에서 작업할 때
- 복잡한 파이토치 분산 학습 코드를 공부하기엔 시간이 부족할 때
- 거대 언어 모델(LLM) 등을 불러올 때 메모리가 부족해서
Big Model Inference기능이 필요할 때 (Accelerate는 큰 모델을 자동으로 CPU RAM과 Disk에 분산시켜 로딩해주는 기능도 있다)
요약
| 특징 | 기존 PyTorch | Hugging Face Accelerate |
|---|---|---|
| 디바이스 지정 | x.to('cuda') 수동 지정 |
자동 처리 (prepare) |
| 멀티 GPU | DistributedDataParallel 등 복잡한 코드 작성 |
코드 변경 없음 (Config로 해결) |
| Mixed Precision | AutoCast, GradScaler 수동 구현 |
Config에서 선택만 하면 됨 |
| 실행 방법 | python script.py |
accelerate launch script.py |
결론
Accelerate는 딥러닝 엔지니어들이 하드웨어 설정 자동화 해 주는 아주 좋은 그런거다.
원래는 모델 하나 분할해서 여러 GPU에 올리는게 말도 안되게 어려웠었는데, 이걸로 딸깍이 된다.
이 얼마나 큰 발전인가 안그래도 랩값 미쳐 날뛰어서 사기 힘든데
이런걸로라도 허리 비틀어야 하지 않겠는가.