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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Pytorch源码分析

發布時間:2023/12/29 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pytorch源码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

命名空間/類/方法/函數/變量

torch.autograd.Function中的ctx參數

DDP(DistributedDataParallel)的構造函數?

torch.floor(input, out=None)

nametuple

argmax

view函數

void c10::TensorImpl::refresh_contiguous

void c10::TensorImpl::refresh_numel

numel()函數

ExecutionStep?

DeviceGuardImplInterface

CAFFE_ENFORCE

Concat層

im2col

torch.ones()

state_dict

DataPtr

at

autograd

torch.rand和torch.randn

torch.jit.trace

各種錯誤

THCudaCheck FAIL file=torch\csrc\generic\StorageSharing.cpp line=252 error=63 : OS call failed or operation not supported on this OS

Pytorch 代碼構成

AdaptiveMaxPooling2d.cu文件

THC——基于CUDA的張量代數庫

C10、ATen、torch


命名空間/類/方法/函數/變量

torch.autograd.Function中的ctx參數

計算的上下文環境Context,這個參數用于在前向計算和反向傳播之間共享張量。

經常用到的就是在ctx中保存輸入張量的值,這個上下文環境可以在反向傳播中被用到,通過輸入張量的值,結合后一層的輸出梯度grad_output,來計算前一層的輸入梯度grad_input。

DDP(DistributedDataParallel)的構造函數?

每個進程都有一個模型(module)。在構造函數中,DDP首先獲得該module的引用,然后將module.state_dict()從master進程廣播到全體進程,使得所有進程具有相同的初始狀態。state_dict的返回值是buffer等不在參數列表中但是代表了網絡狀態的數據,例如batch normalization中的running_mean。不同進程間梯度的匯總、求和和同步是通過一個Reducer類實現的。在構造函數中初始化了一個Reducer對象,并通過該對象管理梯度計算。在Reducer對象的構造函數中,首先將所有的參數裝進若干個bucket(桶),之后一桶一桶地計算可以提高效率。參數進入桶的順序和其在數組Model.parameters中的順序相反,后向傳播中最后一層的梯度是最先被計算完畢的,因此應該最先參加求和。然后,Reducer為每個參數注冊了一個autograd_hook,在該參數被計算完畢后觸發。

torch.floor(input, out=None)

說明:床函數,返回一個新張量,包含輸入input張量每個元素的floor,即取不大于元素的最大整數。

參數

  • input(Tensor) -- 輸入張量
  • out(Tenosr, 可選) -- 輸出張量

nametuple

namedtuple是一個 工廠函數,定義在python標準庫的collections模塊中,使用此函數可以創建一個可讀性更強的元組

namedtuple函數所創建(返回)的是一個 元組的子類(python中基本數據類型都是類,且可以在buildins模塊中找到)

namedtuple函數所創建元組,中文名稱為具名元組

在使用普通元組的時候,我們只能通過index來訪問元組中的某個數據 使用具名元組,我們既可以使用index來訪問,也可以使用具名元組中每個字段的名稱來訪問

具名元組和普通元組所需要的內存空間相同,所以 不必使用性能來權衡是否使用具名元組

argmax

argmax(f(x))是使得函數 f(x)取得最大值所對應的變量點x(或x的集合)。

arg即argument,此處意為“自變量”。

view函數

view函數相當于numpy的reshape。

view函數只能用在contiguous的變量上。

如果在調用view函數之前用了transpose, permute之類的,需要先調用contiguous(),把變量變成在內存中連續分布的形式。

x.contiguous().view(2, -1)

不確定的數用“-1”表示。

void c10::TensorImpl::refresh_contiguous

Recompute the cached contiguity of a tensor. Call this if you modify sizes or strides.

void c10::TensorImpl::refresh_numel

Recompute the cached numel of a tensor. Call this if you modify sizes.

numel()函數

返回數組中元素的個數

ExecutionStep?

用于進行迭代計算:

message?ExecutionStep?{optional?string?name?=?1;????//ExecutionStep要么可以包含一個substep的集合,要么可以包含一些要運行的network的名稱,但兩者不能同時被設置repeated?ExecutionStep?substep?=?2;repeated?string?network?=?3;????//當前的迭代需要運行的輪次,substeps和networks需要被順序執行,每次執行被視為一輪迭代optional?int64?num_iter?=?4;????//迭代執行結束的判斷條件optional?string?criteria_network?=?5;????//如果這個字段被設置,那么就周期性的執行optional?int64?run_every_ms?=?11;????//對于sub-steps,是順序執行還是并行執行optional?bool?concurrent_substeps?=?6;????//一個用來判斷當前執行是否需要終結的標志optional?string?should_stop_blob?=?9;????//如果為真,則當前執行僅執行一次,注意僅當should_stop_blob有效時才有效optional?bool?only_once?=?10;????//是否為當前執行構建一個子workspaceoptional?bool?create_workspace?=?12;????//子執行的并行度optional?int32?num_concurrent_instances?=?13; }

DeviceGuardImplInterface

DeviceGuardImplInterface represents the virtual interface which provides?functionality to provide an RAII class for device and stream switching,?via DeviceGuard.

RAII是Resource Acquisition Is Initialization(wiki上面翻譯成 “資源獲取就是初始化”)的簡稱,是C++語言的一種管理資源、避免泄漏的慣用法。利用的就是C++構造的對象最終會被銷毀的原則。RAII的做法是使用一個對象,在其構造時獲取對應的資源,在對象生命期內控制對資源的訪問,使之始終保持有效,最后在對象析構的時候,釋放構造時獲取的資源。

CAFFE_ENFORCE

判斷數據合法性,如果不合法會報錯

Concat層

Concat層的作用就是將兩個及以上的特征圖按照在channel或num維度上進行拼接,并沒有eltwise層的運算操作

im2col

caffe里的卷積運算實際上是把待輸入圖像和卷積核都轉換成矩陣,然后通過矩陣的乘法一步得出

caffe中卷積采用的是im2col和sgemm的方式

使用im2col的方法將卷積轉為矩陣相乘

sgemm完成矩陣乘法

torch.ones()

torch.ones(*sizes, out=None) → Tensor

返回一個全為1?的張量,形狀由可變參數sizes定義。

參數:

  • sizes (int...) – 整數序列,定義了輸出形狀
  • out (Tensor, optional) – 結果張量
>>> torch.ones(2, 3)1 1 11 1 1 [torch.FloatTensor of size 2x3]>>> torch.ones(5)11111 [torch.FloatTensor of size 5]

state_dict

state_dict本質上是Python字典對象

在pytorch中,torch.nn.Module模塊中的state_dict變量存放訓練過程中需要學習的權重和偏執系數,state_dict作為python的字典對象將每一層的參數映射成tensor張量,需要注意的是torch.nn.Module模塊中的state_dict只包含卷積層和全連接層的參數,當網絡中存在batchnorm時,例如vgg網絡結構,torch.nn.Module模塊中的state_dict也會存放batchnorm's running_mean。

DataPtr

這個類位于最底層,用來直接維護tensor所需的內存。

at

命名空間,ATen目錄下的文件使用

autograd

在PyTorch中,autograd是所有神經網絡的核心內容,為Tensor所有操作提供自動求導方法。

它是一個按運行方式定義的框架,這意味著backprop是由代碼的運行方式定義的。

autograd.Variable 是autograd中最核心的類。 它包裝了一個Tensor,并且幾乎支持所有在其上定義的操作。一旦完成了你的運算,你可以調用 .backward()來自動計算出所有的梯度。

Variable有三個屬性:data,grad以及creator。

訪問原始的tensor使用屬性.data; ?關于這一Variable的梯度則集中于 .grad; ?.creator反映了創建者,標識了是否由用戶使用.Variable直接創建(None)。

還有一個對autograd的實現非常重要的類——Function。Variable?和Function數是相互關聯的,并建立一個非循環圖,從而編碼完整的計算過程。每個變量都有一個.grad_fn屬性引用創建變量的函數(除了用戶創建的變量,它們的grad_fn是None)。

torch.rand和torch.randn

?y = torch.rand(5,3) #均勻分布

y=torch.randn(5,3) #標準正態分

均勻分布 ?torch.rand(*sizes, out=None) → Tensor ?返回一個張量,包含了從區間[0, 1)的均勻分布中抽取的一組隨機數。張量的形狀由參數sizes定義。

標準正態分布 ?torch.randn(*sizes, out=None) → Tensor ?返回一個張量,包含了從標準正態分布(均值為0,方差為1,即高斯白噪聲)中抽取的一組隨機數。張量的形狀由參數sizes定義。 ?

torch.jit.trace

使用torch.jit.trace,您可以獲取現有模塊或python函數,提供示例輸入,然后運行該函數,記錄在所有張量上執行的操作。 我們將生成的記錄轉換為Torch Script方法,該方法作為ScriptModule的正向方法安裝。 該模塊還包含原始模塊所具有的任何參數。
Example:

import torchdef foo(x, y):return 2*x + ytraced_foo = torch.jit.trace(foo, (torch.rand(3), torch.rand(3)))

注意:由于跟蹤僅記錄張量上的操作,因此它不會記錄任何控制流操作,如if語句或循環。 當這個控制流在你的模塊中保持不變時,這很好,它通常只是內聯配置決策。 但有時控制流實際上是模型本身的一部分。 例如,序列到序列轉換中的波束搜索是輸入的(變化的)序列長度上的循環。 在這種情況下,跟蹤不合適,并且應使用腳本編寫波束搜索。

torch.jit.trace函數接受一個模塊或函數以及一組示例輸入。然后,它在跟蹤遇到的計算步驟時通過函數或模塊運行示例輸入,并輸出執行Tracing操作的基于圖形的函數。Tracing非常適用于不涉及數據相關控制流的簡單模塊和功能,例如標準卷積神經網絡。但是,如果Tracing具有依賴于數據的if語句和循環的函數,則僅記錄由示例輸入執行的執行路徑調用的操作。換句話說,不捕獲控制流本身。 為了轉換包含依賴于數據的控制流的模塊和函數,提供了一種 Script機制。 Script顯式將模塊或功能代碼轉換為Torch Script,包括所有可能的控制流路徑。?

各種錯誤

THCudaCheck FAIL file=torch\csrc\generic\StorageSharing.cpp line=252 error=63 : OS call failed or operation not supported on this OS

They are not supported on Windows. Something like doing multiprocessing on CUDA tensors cannot succeed, there are two alternatives for this.

1. Don’t use multiprocessing. Set the num_worker of DataLoader to zero.

2. Share CPU tensors instead. Make sure your custom DataSet returns CPU tensors.

Pytorch 代碼構成

AdaptiveMaxPooling2d.cu文件

1. adaptive_max_pool2d_out_cuda / adaptive_max_pool2d_cuda

2.?adaptive_max_pool2d_out_cuda_template

3.?adaptivemaxpool

實現了AdaptiveMaxPooling2d的前向

1.?adaptive_max_pool2d_backward_out_cuda / adaptive_max_pool2d_backward_cuda

2.?adaptive_max_pool2d_backward_out_cuda_template

3.?atomicadaptivemaxgradinput / adaptivemaxgradinput

實現了AdaptiveMaxPooling2d的反向

THC——基于CUDA的張量代數庫

C10、ATen、torch

我們知道PyTorch的的代碼主要由C10、ATen、torch三大部分組成的。其中:

1,C10,來自于Caffe?Tensor Library的縮寫。這里存放的都是最基礎的Tensor庫的代碼,可以運行在服務端和移動端。PyTorch目前正在將代碼從ATen/core目錄下遷移到C10中。C10的代碼有一些特殊性,體現在這里的代碼除了服務端外還要運行在移動端,因此編譯后的二進制文件大小也很關鍵,因此C10目前存放的都是最核心、精簡的、基礎的Tensor函數和接口。

C10目前最具代表性的一個class就是TensorImpl了,它實現了Tensor的最基礎框架。

C10中還使用/修改了來自llvm的SmallVector,在vector元素比較少的時候用以代替std::vector,用以提升性能;?

2,ATen,來自于?A TENsor library for C++11的縮寫;PyTorch的C++ tensor library。ATen部分有大量的代碼是來聲明和定義Tensor運算相關的邏輯的,除此之外,PyTorch還使用了aten/src/ATen/gen.py來動態生成一些ATen相關的代碼。ATen基于C10,Gemfield本文討論的正是這部分

Aten,Aten的核心源文件

TH,Torch張量計算庫

THC,Torch CUDA張量計算庫

THCUNN,Torch CUDA神經網絡庫

THNN,Torch神經網絡庫

3,Torch,部分代碼仍然在使用以前的快要進入歷史博物館的Torch開源項目,比如具有下面這些文件名格式的文件:

TH* = TorcH THC* = TorcH Cuda THCS* = TorcH Cuda Sparse (now defunct) THCUNN* = TorcH CUda Neural Network (see cunn) THD* = TorcH Distributed THNN* = TorcH Neural Network THS* = TorcH Sparse (now defunct) THP* = TorcH Python

其核心模塊的說明

├── autograd (梯度處理)

├── backends (后向處理,包含cuda、cudnn、mkl、mkldnn、openmp和quantized庫)

├── csrc (csrc目錄包含與Python集成有關的所有代碼。這與lib(它包含與Python無關的Torch庫)形成對比。csrc取決于lib,反之則不然。具體包含api、autograd、cuda、distributed、generic、jit、multiprocessing、onnx、tensor和utils)

├── cuda (cuda)

├── distributed (分布式處理,包括autograd)

├── distributions

├── jit (用于最優性能編譯)

├── legacy (低于0.5版本才有)

├── lib (它包含與Python無關的Torch庫,具體包括:c10d、libshm和libshm_windows)

├── multiprocessing (cuda多線程處理)

├── nn (與神經網絡有關的操作與聲明,具體包括backends、intrinsic、modules、parallel、qat、quantized和utils)

├── onnx (模型交換格式)

├── optim (優化)

├── quantization (量化)

├── utils (具體包括backcompat、bottleneck、data、ffi、hipify和tensorboard)

代碼目錄中的third party(1.3版本)

├── third_party(谷歌、Facebook、NVIDIA、Intel等開源的第三方庫) │ ├── benchmark(谷歌開源的benchmark庫) │ ├── cpuinfo(Facebook開源的cpuinfo,檢測cpu信息) │ ├── cub(NVIDIA開源的CUB is a flexible library of cooperative threadblock primitives and other utilities for CUDA kernel programming) │ ├── eigen(線性代數矩陣運算庫) │ ├── fbgemm(Facebook開源的低精度高性能的矩陣運算庫,目前作為caffe2 x86的量化運算符的backend) │ ├── foxi(ONNXIFI with Facebook Extension) │ ├── FP16(Conversion to/from half-precision floating point formats) │ ├── FXdiv(C99/C++ header-only library for division via fixed-point multiplication by inverse) │ ├── gemmlowp(谷歌開源的矩陣乘法運算庫Low-precision matrix multiplication,https://github.com/google/gemmlowp) │ ├── gloo(Facebook開源的跨機器訓練的通信庫Collective communications library with various primitives for multi-machine training) │ ├── googletest(谷歌開源的UT框架) │ ├── ideep(Intel開源的使用MKL-DNN做的神經網絡加速庫) │ ├── ios-cmake(用于ios的cmake工具鏈文件) │ ├── miniz-2.0.8(數據壓縮庫,Miniz is a lossless, high performance data compression library in a single source file) │ ├── nccl(NVIDIA開源的多GPU通信的優化原語,Optimized primitives for collective multi-GPU communication) │ ├── neon2sse(與ARM有關,intende to simplify ARM->IA32 porting) │ ├── NNPACK(多核心CPU加速包用于神經網絡,Acceleration package for neural networks on multi-core CPUs) │ ├── onnx(Open Neural Network Exchange,Facebook開源的神經網絡模型交換格式,目前Pytorch、caffe2、ncnn、coreml等都可以對接) │ ├── onnx-tensorrt(ONNX-TensorRT: TensorRT backend for ONNX) │ ├── protobuf(谷歌開源的protobuf) │ ├── psimd(便攜式128位SIMD內部函數,Portable 128-bit SIMD intrinsics) │ ├── pthreadpool(用于C/C++的多線程池,pthread-based thread pool for C/C++) │ ├── pybind11(C ++ 11和Python之間的無縫可操作性支撐庫,Seamless operability between C++11 and Python) │ ├── python-enum(Python標準枚舉模塊,Mirror of enum34 package (PeachPy dependency) from PyPI to be used in submodules) │ ├── python-peachpy(用于編寫高性能匯編內核的Python框架,PeachPy is a Python framework for writing high-performance assembly kernels) │ ├── python-six(Python 2 and 3兼容性庫) │ ├── QNNPACK(Facebook開源的面向移動平臺的神經網絡量化加速庫) │ ├── README.md │ ├── sleef(SIMD Library for Evaluating Elementary Functions,SIMD庫,用于評估基本函數) │ ├── tbb(Intel開源的官方線程構建Blocks,Official Threading Building Blocks (TBB)) │ └── zstd((Facebook開源的Zstandard,快速實時壓縮算法庫)

總結

以上是生活随笔為你收集整理的Pytorch源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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