이전에는 Pytorch1.x를 계속해서 사용했다. 

그렇다 보니 변경점과 어떤것을 적용해야될지 고민이 많이 되었는데 .. 이번 기회에 pytorch2.0을 알아보고 공부도 해보고 싶어서 알아보고자 한다. 

https://pytorch.org/get-started/pytorch-2.0/

 

PyTorch 2.0

Overview

pytorch.org

 

다행이도 코드는 그대로 v1.x는 그대로 지원이 가능하다고 한다. 

API와 imperative style, python integration은 그대로 되어진다. 

다만 pytorch의 내부적으로 complier level의 작동하는 방식을 변경되었음. 

 

원래라면 Python API를 사용헀는데 pytorch의 torch.compile를 사용함으로서 속도가 더욱 빨라졌다고 한다. 

이 torch.compile는 4개의 구성요소로 되어있고 아래와 같이 되어있다.

  • TorchDynamo , AOTAutograd  , PrimTorch  ,TorchInductor 

그 결과 속도가 매우 빨라졌다고 하며 성능을 확실하게 비교를 보여주기 위해서 HuggingFace, TIMM, TorchBench에 있는 Model를 전부 평가를 해보았다고 한다. 

신기한건 이때 속도를 개선할때 사용한 학습 기법은 AMP와 기존 Float32랑 Weight average를 해서 0.75*AM P + 0.25*float32로 해서 측정을 했다고 한다. 

그 결과 43%정도 빨라졌다고 하니.. 절반정도면 엄청나게 빨라진게 아닐까 싶다. 

이러한 compiler은 3가지의 구성으로 나누어져있으며 Graph acquisition, Graph lowering, Graph compilation으로 되어있다. 

기존에서는 torch.jit.trace, torchscript, Fxtracing, Lazy tesnor를 사용하였지만 일부분은 빠르지만 flexible하지 않고 몇몇에서는 좋지 않다고 한다. 

그림에서 보는 바와 같이. graph acquistion으로 나는 과정이 오래결렸다고 하며 이를 통해서 결과가 좀더 빨라졌다고 한다. 

 

앞전에 정리하였던 핵심적인 방법중에서 torchDynamo의 기술은 graph acquisition의 방법으로 CPython으로 되어있다고 한다. 

기존에서는 Torchscript는 graph를 만드는데 많은 시간이 걸렸다고 하는데 .. torchDynamo로 인해서 빠르게 만들어지는게 가능했다고 한다. 

TorchInductor는 TorchDynamo에서 생성된 FX 그래프를 최적화된 C++/Triton 커널로 컴파일하는 새로운 컴파일러 백엔드라고 한다. 

AOTAutograd의 경우에서는 training의 속도를 가속화하는 방법이라고 한다. 

 

결론.. 

결국 속도의 개선과 앞으로의 범용성으로 인해서도 변경할 필요가 있겠구나라는 생각이든다. 

 

 

반응형

+ Recent posts