[주의] 개인 공부를 위해 쓴 글이기 때문에 주관적인 내용은 물론, 쓰여진 정보가 틀린 것일 수도 있습니다!
피드백 부탁드립니다. (- -)(_ _) 꾸벅
지금까지 살펴본 바를 정리하자면
- import torch를 하게 되면 torch 라이브러리의 __init__,py가 실행됨
- __init__.py에서는 from torch._C import *를 통해 C extension module을 Load 함
- _C module들은 _C 폴더에 pyi 파일로 정의되어 있고 이는 torch/csrc/Module과 연결되어 있음
- 실제로 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할 때에는 다음 세가지 단계의 초기화를 거치는데
- 모듈을 찾음
- 모듈을 초기화
- Local Namespace에 이름을 정의
파이썬으로 작성된 모듈은 파이썬 내부에서 자동으로 모듈 초기화 작업을 수행하지만, C/C++로 모듈을 작성하고 import할 때는 2,3 단계를 직접 수행해주어야 한다고 한다. (참고 : eunguru.tistory.com/84) PyMethodDef 라는 구조체에서 C++로 작성된 함수 포인터를 파이썬에서 사용 될 매서드 이름으로 일종의 매핑이 되는 것 같다.
일단 __init__.py에서 _initExtension 함수를 사용하여 모듈을 초기화하며, Module.cpp에서는 다음과 같이 정의되어 있다.
Layouts, MemoryFormats, QSchemes, Dtpes, python_bindings 등을 초기화 해준다.
또한 Tensor storage(tensor 저장공간)의 메모리 공간을 생성해준다.
_initNames 에서는 storage 공간의 이름이 정의되는 것 같다.
Pyobject* initModule() 함수에 의해서, torch._C의 python이 csrc 내부의 C++ 파일들을 사용할 수 있게 만들어 준다는데, 정확한 동작 방식은 모르겠다.
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) 의 특성은 다음과 같다.
'연구 > Pytorch' 카테고리의 다른 글
[Fashion Mnist] pytorch train & test코드 (0) | 2021.03.30 |
---|---|
[Pytorch] 3. torch 라이브러리 내부 구조 분석 (Convolution) (0) | 2021.03.27 |
Test Picture (2) | 2021.02.02 |
[Pytorch] 1. torch 라이브러리 내부 구조 분석 (cpython, ctype, __init__) (0) | 2021.01.20 |