• Pytorch internal에 대한 탐구를 해본다.
  • Pytorch와 C와의 연결성에 대해 공부해본다.

1. where is torch.tensor.item() defined at the Github?

2. PyTorch internals. How PyTorch start?

  • torch/csrc/Module.cpp 이 python과 C++를 연결해준다.
  • Medium Link
  1. import torch를 하는 순간 torch/init.py를 읽고 from torch._C import *를 실행한다. 이 작업을 통해서 Pytorch 속 C 모듈을 실행한다.
  2. torch._C에는 pyi라는 python 파일들이 있고, 이것이 torch/csrc/Module.cpp와 연결되어 있다.
  3. torch/csrc/Module.cpp를 보면
    1. PyObject 라는 자료형이 원래 어딘가 저장되어 있는 듯 하다. (나중에 VScode에 전체 페키지를 올리고 go to definition 해볼것.)

    2. THPModule_initExtension라는 함수가 정의 되어 있다.

      - torch::utils::initializeLayouts(); // torch/csrc/utils/tensor_qschemes.h
      - torch::utils::initializeMemoryFormats();
      - torch::utils::initializeQSchemes();
      - torch::utils::initializeDtypes();
      - torch::tensors::initialize_python_bindings(); // torch/csrc/tensor/python_tensor.h
      
      • 이 함수는 파이썬 클래스의 추가적인 초기화(C를 사용한 tensor 맴버함수들을 사용할 수 있게끔 Ex.item())를 위해 사용된다.
    3. Tensor storage(tensor 저장공간)은 이 코드에 의해서 메모리 공간이 생성된다.

      auto module = THPObjectPtr(PyImport_ImportModule("torch"));
      
      THPDoubleStorage_postInit(module);
      THPFloatStorage_postInit(module);
      THPHalfStorage_postInit(module);
      THPLongStorage_postInit(module);
      ...
      ...
      
    4. THPModule_initNames 라는 함수에 의해서 메모리 공간 이름이 정의 된다.(?)

    5. PyObject* initModule() 이 함수에 의해서, torch._C의 python이 csrc 내부의 C++파일들을 사용할수 있게 만들어준다.

    6. static struct PyModuleDef torchmodule 이 부분에 의해서 torch._C 를 위한 메모리 공간을 잡아준다.

3. A Tour of PyTorch Internals (Part I)

  • document link
  • 우선 지금 이게 급한게 아니라서 나중에 하도록 하자.

4. PyTorch Internals Part II - The Build System