인공지능 처음 입문은 텐서플로로 했지만 요즘엔 거의 파이토치를 사용해서 코드를 짜고 있다.
파이토치로 넘어온 이유는
- 깃허브에 코드 찾다보면 다 파이토치다.
- 논문들의 연구에도 대부분 파이토치를 사용한다.
그런데 모델 학습을 더 빠르고 더 많은 batch size로 할 수 있는 방법을 알게되었다.
바로 AMP 를 사용하는 건데 이게 뭐냐면 Automatix Mixed Precision 의 줄임말이다.
물리적으로 서버환경을 개선시키는게 쉽지 않은데 코드 몇 줄을 추가해서 모델을 최적화시키고 batch size를 늘릴 수 있는 방법이라는 점에서 처음 접하고 굉장히 흥미로웠다.
NVIDIA 에서 'A Pytorch EXtension' (APEX) 라는 패키지를 만들어서 우리는 이걸 이용하면 된다.
아직 사용해보지 않았는데 사용해보고 마저 적겠다.
최적화가 되어 배치를 늘릴 수 있기 때문에 학습속도가 빨리지고 배치 뿐만 아니라 모델 최적화도 이루어지기 때문에 속도가 증가한다고 알려져있다.
성능적으로도 비슷하거나 조금 향상된다고 알려져있다.
간단히 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()
...
참고 : https://github.com/NVIDIA/apex
https://cvml.tistory.com/8