딥러닝 & 머신러닝/Pytorch

[Pytorch] 1. torch 라이브러리 내부 구조 분석 (cpython, ctype, __init__)

윤창이 2021. 1. 20. 18:04
728x90

 

[주의] 개인 공부를 위해 쓴 글이기 때문에 주관적인 내용은 물론, 쓰여진 정보가 틀린 것일 수도 있습니다!

피드백 부탁드립니다. (- -)(_ _) 꾸벅

Pytorch Logo


[환경 구성하기]

pytorch : https://pytorch.org/

 나는 아나콘다 환경에서 해보려고 Anaconda 용 Pytorch를 선택했다. CUDA는 11.1이 깔려있었는데 파이토치는 11.0까지 지원한다 해서 다운그레이드 하였다 ㅠㅠ. 다운그레이드 하는 방법은 이전 글을 참고.

 

conda create –n pytorch_env
conda activate pytorch_env
conda install matplotlib
conda install pylint
conda install pytorch torchvision torchaudio cudatoolkit=11.0 -c pytorch 

아나콘다 환경을 만들어준 뒤 필수 라이브러리와 파이토치를 위 명령어로 깔아주었다. 

 

 


[Pytorch 내부 개요]

 먼저 Pytorch는 내부 함수가 모두 C로 짜여져 있는 것 같다. 라이브러리의 내부를 살펴보아도 _C라는 모듈을 사용하는 것 같고, C++로 짜인 _C 모듈을 Extension 하여 Python 모듈로 쓰는 듯하다. C는 Python에 비해 속도도 매우 빠르고, 저수준의 지원 액세스가 가능하기 때문에 메모리 관리를 직접 할 수 있다는 장점이 있다. 

 

위치  :  ~/anaconda3/env/{환경이름}/lib/python3.8/site-packages/torch

 

내부 구조를 분석하는 것에 대해 자료가 많지는 않아서 의식이 흐르는 대로 분석하였다.. 먼저 pytorch 패키지 폴더로 이동하여 살펴보았는데 __init__. py가 있었고, 이 모듈은 torch가 import 될 때 자동으로 실행되는 모듈이기에 __init__.py를 먼저 살펴보기로 한다.

__init__.py

이 __init__.py가 하는 일을 크게 6가지로 축약해보았다. 가장 주된 부분은 _C module을 불러오는 것이다. 근데 아나콘다에 깐 pytorch는 배포하는 버전을 받은 것이므로 C source 파일이 없고, 대신 공유 라이브러리 파일인 _C.cpython-38-x86_64-linux-gnu.so 파일이 존재하는 것 같다. 그래서 github에서 pytorch의 소스파일을 받기로 한다.

 

github.com/pytorch/pytorch

 

pytorch/pytorch

Tensors and Dynamic neural networks in Python with strong GPU acceleration - pytorch/pytorch

github.com

역시 torch/csrc가 존재함을 알 수 있었다! _C module은 torch/csrc 안에 Module.cpp와 연결되어 있다고 하는데, 소스파일을 이제 열어볼 수 있으니 연관성을 확인할 수 있겠다. 그중에 일부 중요한 역할 세가지만 살펴보았다.

 

1) Load the Extension module

실제로 __init__. py에서 torch._C를 load하는 부분을 확인할 수 있었다. 그 중에는 _initExtension 이라는 함수도 import하는데, Module.cpp 파일 안에서는 THPModule_initExtension() 이라는 함수로 정의되어 있었다.  

 

Global Dependency는 ctypes라는 extension 패키지를 통해 가져오는 것을 확인할 수 있었다.

이렇게 extension 모듈을 load하는 부분이 __init__.py에 포함되어 있는 것을 정확히는 모르겠지만 짐작할 수 있었다.

 

2) Initialize Extension

초기화는 아까 1단계에서 load 하면서 불러온 _initExtension 함수를 가져오는데, 이 함수는 공유 메모리 관리자의 위치를 인수로 받아서 사용한다. 정확히 어떤 식으로 구동되는지는 더 오랫동안 봐야겠지만.. C extension을 사용함으로써 저수준의 공유 메모리도 관리가 가능함을 알 수 있었다.

 

3) Import common sub-packages

torch 패키지 안에는 다양한 서브 패키지가 있는데, 예를 들면 neural network를 구성할 때 필요한 Layer 정보를 담고 있는 nn 패키지라던가, 자동으로 gradient를 계산해주는 autograd 패키지, cuda를 사용할 때 필요한 cuda 패키지, TensorRT를 사용할 때 필요한 onnx 패키지 등, torch 패키지를 import 하면 자동으로 서브 패키지들이 import 되게끔 구성되어 있었다.

 


_C 모듈은 주로 THP를 이용하여 구성되어 있는 것 같다. (함수 이름만 봐도 앞에 모두 THP가 붙는다.) THP 모듈이 무슨 역할인지, THP 모듈로 이루어진 Module.cpp는 대충 어떻게 구성되는지는 다음 글에서 다뤄야겠다..

 

아무리 봐도 너무 복잡하고 방대한 pytorch 구조에 페이스북 유수한 인재들은 이런 식으로 코딩하는구나를 느꼈다.. 나는 겉핥기 수준으로 분석해본 거지만 아무리 핥아도 맛이 나지 않는다 ㅎ.ㅎ 더 열심히 해야겠다..

728x90