Amp (Automatix Mixed Precision)

하나·2022년 11월 24일
0

TIL

목록 보기
13/14
post-thumbnail

인공지능 처음 입문은 텐서플로로 했지만 요즘엔 거의 파이토치를 사용해서 코드를 짜고 있다.
파이토치로 넘어온 이유는

  1. 깃허브에 코드 찾다보면 다 파이토치다.
  2. 논문들의 연구에도 대부분 파이토치를 사용한다.

그런데 모델 학습을 더 빠르고 더 많은 batch size로 할 수 있는 방법을 알게되었다.
바로 AMP 를 사용하는 건데 이게 뭐냐면 Automatix Mixed Precision 의 줄임말이다.

물리적으로 서버환경을 개선시키는게 쉽지 않은데 코드 몇 줄을 추가해서 모델을 최적화시키고 batch size를 늘릴 수 있는 방법이라는 점에서 처음 접하고 굉장히 흥미로웠다.

NVIDIA 에서 'A Pytorch EXtension' (APEX) 라는 패키지를 만들어서 우리는 이걸 이용하면 된다.

mixed precision training

  • 처리 속도를 높이기 위한 FP16 (16bit floating point)연산과 정확도 유지를 위한 FP32 연산을 섞어 학습하는 방법
  • Tensor core를 활용한 FP16 연산을 이용하면 FP32연산과 비교했을 때 절반의 메모리 사용량과 8배의 연산 처리량, 2배의 메모리 처리량 효과가 있다고 한다.
  • Tensor core를 이용하여 FP16 연산이 가능한 그래픽 카드는 Volta 이상의 NVIDIA 그래픽카드이다. (V100, RTX2080ti, .. 등)
  • volta 이적 그래픽 카드여도 FP16 연산이 가능하다면 amp 를 사용할 수 있으나 성능 효과는 크지 않다고 한다.

속도가 얼마나 빨라지는데?

아직 사용해보지 않았는데 사용해보고 마저 적겠다.
최적화가 되어 배치를 늘릴 수 있기 때문에 학습속도가 빨리지고 배치 뿐만 아니라 모델 최적화도 이루어지기 때문에 속도가 증가한다고 알려져있다.
성능적으로도 비슷하거나 조금 향상된다고 알려져있다.

어떻게 사용하는데?

간단히 3줄만 있으면 사용할 수 있다.
1. 로드한 model과 optimizer 를 amp.initialize로 감싼다.
2. 학습 중 loss와 optimizer를 amp.scale_loss로 감싼다.(as scaled_loss)
3. 감싼 scaled_loss로 back propagation을 진행한다.

# Declare model and optimizer as usual, with default (FP32) precision
model = torch.nn.Linear(D_in, D_out).cuda()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)

# Allow Amp to perform casts as required by the opt_level
model, optimizer = amp.initialize(model, optimizer, opt_level="O1")
...
# loss.backward() becomes:
with amp.scale_loss(loss, optimizer) as scaled_loss:
    scaled_loss.backward()
...

OPT_LEVEL은 뭐야

참고 : https://github.com/NVIDIA/apex
https://cvml.tistory.com/8

0개의 댓글