딥러닝 & 머신러닝/Pytorch

[Pytorch] 2. torch 라이브러리 내부 구조 분석 (Module.cpp, THP 모듈)

윤창이 2021. 3. 27. 16:28
728x90

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

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


지금까지 살펴본 바를 정리하자면

  1. import torch를 하게 되면 torch 라이브러리의 __init__,py가 실행됨
  2. __init__.py에서는 from torch._C import *를 통해 C extension module을 Load 함
  3. _C module들은 _C 폴더에 pyi 파일로 정의되어 있고 이는 torch/csrc/Module과 연결되어 있음
  4. 실제로 Module.cpp 파일에 __init__.py에 _initExtension 같은 함수들이 정의가 되어있음 

그럼 Module.cpp에서의 주요 함수에 대해 알아보았다.

[ Module.cpp ]

 

 pytorch의 1편에서 보았던 것 처럼 __init__.py에서 여러가지 C extenstion module들을 Load를 하였다. 근데 C extension으로 작성된 Module.cpp에서는 그 함수들 마다 앞에 THP 모듈이라는 이름이 붙혀져 있었다. 예를 들어 __init__.py에서 불려지는 _initExtension이라는 함수는 Module.cpp에서 THPModule_initExtension이라는 함수로 정의되어 있었다. 

 

 파이썬에서 모듈을 import할 때에는 다음 세가지 단계의 초기화를 거치는데

  1. 모듈을 찾음
  2. 모듈을 초기화
  3. Local Namespace에 이름을 정의

 

파이썬으로 작성된 모듈은 파이썬 내부에서 자동으로 모듈 초기화 작업을 수행하지만, C/C++로 모듈을 작성하고 import할 때는 2,3 단계를 직접 수행해주어야 한다고 한다. (참고 : eunguru.tistory.com/84) PyMethodDef 라는 구조체에서 C++로 작성된 함수 포인터를 파이썬에서 사용 될 매서드 이름으로 일종의 매핑이 되는 것 같다.

 

PyMethodDef 구조체의 필드

 

일단 __init__.py에서 _initExtension 함수를 사용하여 모듈을 초기화하며, Module.cpp에서는 다음과 같이 정의되어 있다.

_initExtension()

Layouts, MemoryFormats, QSchemes, Dtpes, python_bindings 등을 초기화 해준다.

또한 Tensor storage(tensor 저장공간)의 메모리 공간을 생성해준다. 

 

 

_initNames()

_initNames 에서는 storage 공간의 이름이 정의되는 것 같다.

 

initModule()

Pyobject* initModule() 함수에 의해서, torch._C의 python이 csrc 내부의 C++ 파일들을 사용할 수 있게 만들어 준다는데, 정확한 동작 방식은 모르겠다.

initModue() 안의 PyModuleDef 구조체

initModule() 함수 안에는 위와 같은 구문이 있는데, 모듈 객체를 만들어주기 위해 필요한 모든 정보를 담고있는 구조체로 torch._C를 만들어 주는 듯 하다.

(참고 : medium.com/@andreiliphd/pytorch-internals-how-pytorch-start-211e0d57ad26)


[ THP모듈이란? ]

 

 Module.cpp의 대부분의 함수 이름에는 THPModule이라는 수식어구가 붙었다. THPtensor, THPObjectPtr, THP.h와 관련이 있을 것 같은데 정확한 연결성은 모르지만 THP 방식을 사용하는 것 같다. (다음에 araboza)

THP(Transparent Huge Pages) 의 특성은 다음과 같다.

 

728x90