日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch默认初始化_PyTorch的初始化

發布時間:2024/7/23 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch默认初始化_PyTorch的初始化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景

在使用PyTorch深度學習框架的時候,不管是訓練還是測試,代碼中引入PyTorch的第一句總是:

import torch

在Gemfield前述專欄文章里,我們已經得知,torch/csrc/stub.cpp鏈接libshm.so、libtorch_python.so、libcaffe2_gpu.so生成了_C.cpython-37m-x86_64-linux-gnu.so庫,而像前述方式import torch的時候,按照python規范,會找到torch package目錄下的__init__.py,在這個文件中進一步會調用:

from torch._C import *

其中torch._C就是_C.cpython-37m-x86_64-linux-gnu.so。因為(以Python3為例)按照Python規范,由于默認的引擎都是CPython,而CPython的C/C++擴展是一個共享庫,并且這個共享庫安裝在PYTHONPATH目錄下,并且文件名(不包含后綴)要和module的名字一樣,并且這個共享庫中要實現PyInit_modulename符號來作為import時候的邏輯入口。

對于PyTorch來說這個modulename 是_C,因此我們可以揣測,在torch/csrc/stub.cpp中一定實現了PyInit_C這個函數。是的,PyTorch就是這么做的,torch/csrc/stub.cpp中的代碼就是下面這樣:

#include

extern PyObject* initModule();

PyMODINIT_FUNC PyInit__C()

{

return initModule();

}

本文將從initModule函數展開,全面闡述PyTorch框架的初始化工作。initModule就是PyTorch初始化時候的第一層調用棧了,因為所有的初始化工作都是在這個函數內完成的,內容比較多,gemfield將其劃分為7部分:

1,torch._C的誕生:

這一步就是產生torch._C類,并在這個python類上面注冊眾多函數:

PyObject* initModule() {

//openmp的設置

THInferNumThreads();

THPUtils_addPyMethodDefs(methods, TorchMethods);

THPUtils_addPyMethodDefs(methods, DataLoaderMethods);

THPUtils_addPyMethodDefs(methods, torch::autograd::python_functions());

THPUtils_addPyMethodDefs(methods, torch::multiprocessing::python_functions());

THPUtils_addPyMethodDefs(methods, THCPModule_methods());

THPUtils_addPyMethodDefs(methods, THCUDNN_methods());

THPUtils_addPyMethodDefs(methods, THDPModule_methods());

THPUtils_addPyMethodDefs(methods, torch::distributed::c10d::python_functions());

module = Py_InitModule("torch._C", methods.data());

......

}

其中TorchMethods注冊了29個方法,都是THPModule_前綴的函數;DataLoaderMethods注冊了4個方法,都是THPModule_前綴的函數;torch::autograd::python_functions注冊了4個方法;torch::multiprocessing::python_functions注冊了1個方法;THCPModule_methods注冊了37個CUDA相關的函數,前綴都是THCPModule_;THCUDNN_methods注冊了1個方法;THDPModule_methods注冊了28個方法;torch::distributed::c10d::python_functions注冊了1個方法。

總而言之,在這一小步,我們達到了這樣一個里程碑,torch._C符號誕生,并且向torch._C注冊了一百余個函數,涉及torch、dataloader、autograd、multiprocess、cuda、cudnn、distribute、c10d方面。

2,一些關鍵類型

以下代碼先后初始化了torch._C._PtrWrapper、torch._C.Generator(含5個方法)、FatalError、torch.Size、torch.dtype、torch.iinfo、torch.layout、torch.device:

PyObject* initModule() {

......

THPWrapper_init(module);

THPGenerator_init(module);

THPException_init(module);

THPSize_init(module);

THPDtype_init(module);

THPDTypeInfo_init(module);

THPLayout_init(module);

THPDevice_init(module);

THPVariable_initModule(module);

THPFunction_initModule(module);

THPEngine_initModule(module);

......

}

3,torch._C._TensorBase的誕生

Gemfield將以下三個初始化函數歸為這一小節:

PyObject* initModule() {

......

THPVariable_initModule(module);

THPFunction_initModule(module);

THPEngine_initModule(module);

......

}

為什么呢?因為地位太顯赫了。

THPVariable_initModule(module) 創建了torch._C._TensorBase,這是一切Tensor的基類,在Gemfield的其它專欄文章里將單獨解釋;

THPFunction_initModule(module)創建了torch._C._FunctionBase,在torch/autograd/function.py中,以下兩個類以torch._C._FunctionBase為基類:

class Function(with_metaclass(FunctionMeta, _C._FunctionBase, _ContextMethodMixin, _HookMixin))

class BackwardCFunction(_C._FunctionBase, _ContextMethodMixin, _HookMixin)

這個Function繼承體系就構成了DAG的基礎。

THPEngine_initModule(module)創建了torch._C._EngineBase,_EngineBase這個類負責動態圖執行之前的preprocess,_EngineBase會將torch.autograd的backward之類的請求預處理后送給真正的Engine去執行。

4,pybind11綁定

這一小節的初始化內容都是和pybind11相關的:

PyObject* initModule() {

......

// NOTE: We need to be able to access OperatorExportTypes from ONNX for use in

// the export side of JIT, so this ONNX init needs to appear before the JIT

// init.

torch::onnx::initONNXBindings(module);

torch::jit::initJITBindings(module);

torch::autograd::initNNFunctions(module);

torch::autograd::init_legacy_variable(module);

torch::python::init_bindings(module);

torch::cuda::initModule(module);

......

}

initONNXBindings是ONNX的python binding:torch._C._onnx.TensorProtoDataType和torch._C._onnx.OperatorExportTypes:

>>> dir(torch._C._onnx.TensorProtoDataType)

['BOOL', 'COMPLEX128', 'COMPLEX64', 'DOUBLE', 'FLOAT', 'FLOAT16', 'INT16', 'INT32', 'INT64', 'INT8', 'STRING', 'UINT16', 'UINT32', 'UINT64', 'UINT8', 'UNDEFINED', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__int__', '__le__', '__lt__', '__members__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', 'name']

>>> dir(torch._C._onnx.OperatorExportTypes)

['ONNX', 'ONNX_ATEN', 'ONNX_ATEN_FALLBACK', 'RAW', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__int__', '__le__', '__lt__', '__members__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', 'name']

initJITBindings則是通過pybind11往torch._C上注冊了一堆和JIT相關的C++函數/對象;

initNNFunctions初始化了一個torch._C._nn 對象,并注冊了一些nn相關的函數:

>>> dir(torch._C._nn)

['__doc__', '__loader__', '__name__', '__package__', '__spec__', '_parse_to', 'adaptive_avg_pool2d', 'adaptive_avg_pool3d', 'adaptive_max_pool2d', 'adaptive_max_pool3d', 'avg_pool2d', 'avg_pool3d', 'binary_cross_entropy', 'elu', 'elu_', \

'fractional_max_pool2d', 'glu', 'hardtanh', 'hardtanh_', 'l1_loss', 'leaky_relu', 'leaky_relu_', 'log_sigmoid', 'max_pool2d_with_indices', 'max_pool3d_with_indices', 'max_unpool2d', 'max_unpool3d', 'mse_loss', 'multi_margin_loss', \

'multilabel_margin_loss', 'nll_loss', 'nll_loss2d', 'reflection_pad1d', 'reflection_pad2d', 'replication_pad1d', 'replication_pad2d', 'replication_pad3d', 'rrelu_with_noise', 'rrelu_with_noise_', 'smooth_l1_loss', 'soft_margin_loss', \

'softplus', 'softshrink', 'thnn_conv2d', 'thnn_conv3d', 'thnn_conv_depthwise2d', 'thnn_conv_dilated2d', 'thnn_conv_dilated3d', 'thnn_conv_transpose2d', 'thnn_conv_transpose3d', 'upsample_bilinear2d', 'upsample_linear1d', 'upsample_nearest1d', \

'upsample_nearest2d', 'upsample_nearest3d', 'upsample_trilinear3d']

init_legacy_variable注冊了torch._C._LegacyVariableBase:

>>> dir(torch._C._LegacyVariableBase)

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', \

'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', \

'__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', \

'__setattr__', '__sizeof__', '__str__', '__subclasshook__']

_LegacyVariableBase類會派生出Variable類(該類的_execution_engine會初始化為torch._C._EngineBase):

class Variable(with_metaclass(VariableMeta, torch._C._LegacyVariableBase))

init_bindings是通過pybind11往torch._C上注冊一些函數,torch::cuda::initModule類似,也是通過pybind11往torch._C上注冊一些函數,只不過內容是和cuda相關的。

5,在torch._C上注冊StorageBase類

PyObject* initModule() {

......

THPDoubleStorage_init(module);

THPFloatStorage_init(module);

THPHalfStorage_init(module);

THPLongStorage_init(module);

THPIntStorage_init(module);

THPShortStorage_init(module);

THPCharStorage_init(module);

THPByteStorage_init(module);

THCPDoubleStorage_init(module);

THCPFloatStorage_init(module);

THCPHalfStorage_init(module);

THCPLongStorage_init(module);

THCPIntStorage_init(module);

THCPShortStorage_init(module);

THCPCharStorage_init(module);

THCPByteStorage_init(module);

THCPStream_init(module);

......

}

這些初始化工作主要就是往torch._C上注冊了以下類:

CudaByteStorageBase

CudaCharStorageBase

CudaDoubleStorageBase

CudaFloatStorageBase

CudaHalfStorageBase

CudaIntStorageBase

CudaLongStorageBase

CudaShortStorageBase

ByteStorageBase

CharStorageBase

DoubleStorageBase

FloatStorageBase

HalfStorageBase

IntStorageBase

LongStorageBase

ShortStorageBase

比如以FloatStorageBase為例的話,我們可以這樣查看它注冊的方法:

>>> dir(torch._C.FloatStorageBase)

['__class__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', \

'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '_cdata', '_expired', '_free_weak_ref', \

'_get_shared_fd', '_new_shared_fd', '_new_shared_filename', '_new_using_fd', '_new_using_filename', '_new_with_file', '_new_with_weak_ptr', '_set_cdata', '_set_from_file', '_share_fd_', \

'_share_filename_', '_shared_decref', '_shared_incref', '_weak_ref', '_write_file', 'copy_', 'data_ptr', 'element_size', 'fill_', 'from_buffer', 'from_file', 'is_pinned', 'is_shared', 'new', \

'resize_', 'size']

這些類會在python體系中被繼承:

class FloatStorage(_C.FloatStorageBase, _StorageBase)

另外注意下這塊代碼使用了一些宏來復用不同storage的代碼,如下所示:

aten/src/TH/THGenerateLongType.h:10:#define Real Long

aten/src/TH/THGenerateHalfType.h:10:#define Real Half

aten/src/TH/THGenerateIntType.h:10:#define Real Int

aten/src/TH/THGenerateFloatType.h:9:#define Real Float

aten/src/TH/THGenerateShortType.h:10:#define Real Short

aten/src/TH/THGenerateCharType.h:8:#define Real Char

aten/src/TH/THGenerateByteType.h:8:#define Real Byte

aten/src/TH/THGenerateDoubleType.h:9:#define Real Double

aten/src/THC/THCGenerateIntType.h:7:#define Real Int

aten/src/THC/THCGenerateLongType.h:7:#define Real Long

aten/src/THC/THCGenerateCharType.h:7:#define Real Char

aten/src/THC/THCGenerateFloatType.h:9:#define Real Float

aten/src/THC/THCGenerateDoubleType.h:7:#define Real Double

aten/src/THC/THCGenerateHalfType.h:9:#define Real Half

aten/src/THC/THCGenerateShortType.h:7:#define Real Short

aten/src/THC/THCGenerateByteType.h:7:#define Real Byte

6,ATen的初始化

本小節會進行ATen的global context的初始化,然后使用at::globalContext().defaultGenerator(at::kCPU)進行generator的初始化。

另外,PyTorch會根據編譯環境和用戶配置,然后向torch._C上注冊一些flag。這些flag有has_cudnn、has_mkl、has_lapack、_GLIBCXX_USE_CXX11_ABI:

PyObject* initModule() {

......

PyObject *has_cudnn = Py_True;

set_module_attr("has_cudnn", has_cudnn);

at::init();

py::reinterpret_borrow<:module>(module).def("_demangle", &c10::demangle);

::c10::Warning::set_warning_handler(&warning_handler);

set_module_attr("has_mkl", at::hasMKL() ? Py_True : Py_False);

set_module_attr("has_lapack", at::hasLAPACK() ? Py_True : Py_False);

set_module_attr("_GLIBCXX_USE_CXX11_ABI", _GLIBCXX_USE_CXX11_ABI ? Py_True : Py_False);

auto& defaultGenerator = at::globalContext().defaultGenerator(at::kCPU);

THPDefaultGenerator = (THPGenerator*)THPGenerator_NewWithGenerator(defaultGenerator);

set_module_attr("default_generator", (PyObject*)THPDefaultGenerator, /* incref= */ false);

7,torch._C._THNN和torch._C._THCUNN的初始化

PyTorch在這一小節里注冊了torch._C._THNN和torch._C._THCUNN類:

PyObject* initModule() {

......

torch::nn::init__THNN(module);

torch::nn::init__THCUNN(module);

......

}

這兩個類都擁有數量巨大的op函數,一個是CPU版的,一個是CUDA版的。

initModule之后

在initModule()函數初始化完畢之后,import torch的初始化工作還沒有結束。因為在這之后,python的初始化腳本還要調用以下2個API才算真正完成全部的初始化:

_C._initExtension(manager_path())

_C._init_names(list(torch._storage_classes))

其中主要的工作都是在_C._initExtension中,這個初始化做了以下的工作:

torch::utils::initializeLayouts();

torch::utils::initializeDtypes();

torch::tensors::initialize_python_bindings();

THPDoubleStorage_postInit(module);

THPFloatStorage_postInit(module);

THPHalfStorage_postInit(module);

THPLongStorage_postInit(module);

THPIntStorage_postInit(module);

THPShortStorage_postInit(module);

THPCharStorage_postInit(module);

THPByteStorage_postInit(module);

THPBoolStorage_postInit(module);

//定義在THPStorage_(postInit)函數中,因為THPStorage_會被宏替換THPDoubleStorage_ \

//THPFloatStorage_、THPHalfStorage_、THPLongStorage_......

THPAutograd_initFunctions();

最后的THPAutograd_initFunctions()則是初始化了torch的自動微分系統,這是PyTorch動態圖框架的基礎。

總結

在PyTorch的初始化階段,(python)torch模塊先后初始化產生torch._C、torch._C._TensorBase、pybind11綁定、torch._C.*StorageBase、torch._C._THNN、torch._C._THCUNN,并進行了ATen context的初始化。在initModule()結束之后,初始化工作還進行了_C._initExtension()的初始化。

總結

以上是生活随笔為你收集整理的pytorch默认初始化_PyTorch的初始化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 福利在线免费 | 欧美图片一区二区三区 | 捆绑裸体绳奴bdsm亚洲 | 97色伦97色伦国产欧美空 | 色哟哟在线 | 免费av资源| 灌满闺乖女h高h调教尿h | 九色蝌蚪porny| 午夜在线国产 | 天天操天天操天天操天天操 | 欧美激精品 | 福利91| 中文字幕在线影院 | 成人免费视频播放 | 国产免费av网站 | x88av视频 | 男生尿隔着内裤呲出来视频 | 国产精品宾馆在线精品酒店 | 亚洲男人的天堂在线视频 | 丝袜人妖| 亚洲天天综合 | 99热这里只有精品首页 | 亚洲精品天堂在线 | av在线播放网 | 亚洲自拍偷拍欧美 | 日本做爰高潮又黄又爽 | 欧美另类综合 | 成人激情视频在线播放 | 美女扒开腿让男人操 | 黑人导航 | 亚洲国产aⅴ成人精品无吗 日韩乱论 | 天堂网色 | 香蕉在线视频观看 | 五月婷婷综合激情网 | 欧美综合影院 | 欧美一级在线免费 | 久久精品久久久久久 | 亚洲射射射 | 黄色小说在线免费观看 | av资源库 | 欧美日韩国产成人 | 亚洲hhh | 国产麻豆一区二区 | 国产激情一区 | 日本高清在线播放 | 日b视频免费观看 | 欧美日韩在线看 | 爱爱综合网 | 一个人看的www视频在线观看 | 噜噜色av | 美女视频久久 | 久久久久久艹 | 女同一区二区 | 黄色特级一级片 | 超碰av男人的天堂 | 亚洲日本精品视频 | 欧美大片在线观看 | 国产十八熟妇av成人一区 | 超碰人人爱人人 | 一区二区三区精品 | 超碰av人人 | 美妇湿透娇羞紧窄迎合 | 91九色丨porny丨国产jk | 后入内射欧美99二区视频 | 大地资源二中文在线影视观看 | 国产xxxxx | 国产精品国产精品国产专区不片 | 人妻互换一区二区激情偷拍 | 99久久网站 | 国产精品熟女久久久久久 | 性xxxx视频| av激情久久 | 草草久久久无码国产专区 | 91久久精品国产91久久 | 丰满人妻一区二区三区53视频 | 国产精品天天干 | 99热这里只有精品2 91免费版黄 | 精品国产乱码久久久久久郑州公司 | 亚洲激情网站 | jizz日本在线观看 | 亚洲免费大全 | 91chinese在线 | 免费在线观看网址 | 精品无码久久久久久久 | 天天做天天爱天天爽综合网 | 丰满熟女人妻一区二区三 | 91精品国产99久久久久久 | 亚洲视屏在线观看 | 空姐吹箫视频大全 | 欲求不满在线小早川怜子 | 2014亚洲天堂 | 91性生活 | 人妻内射一区二区在线视频 | 国产三级中文字幕 | 久久精品香蕉视频 | 亚洲成人无码久久 | 中国成人av| 亚洲成人中文字幕在线 | 精品人妻无码一区二区三区蜜桃一 |