官方文件
需求:當你需要頻繁的使用該自定義操作,或者呼叫很昂貴,或者需該操作要用到一些c/c++庫。
c++擴充套件允許使用者建立源外定義的pytorch運算子,即與pytorch後端分離的運算子。
c++擴充套件有兩種形式:
使用setuptools提前構建
使用torch.utils.cpp_extension.load()即使構建
寫setup.py
來讓setuptools編譯c++**
from setuptools import setup, extension
from torch.utils import cpp_extension
setup(name=
'lltm_cpp'
, ext_modules=
[cpp_extension.cppextension(
'lltm_cpp',[
'lltm.cpp'])
],# cppextension是setuptools的便利包裝.extension傳遞正確的include路徑並將擴充套件語言設定為c++
cmdclass=
)# buildextension執行許多必需的配置步驟並檢查,並且在混合c++ / cuda擴充套件的情況下還管理混合編譯
aten庫:用於張量計算的主要api
pybind11:為c++**建立的python繫結方式
headers:管理aten和pybind11之間的互動資訊
模板:
#include
#include
torch::tensor d_sigmoid
(torch::tensor z)
前傳:基本上1:1翻譯過去
#include
std::vector
lltm_forward
( torch::tensor input,
torch::tensor weights,
torch::tensor bias,
torch::tensor old_h,
torch::tensor old_cell)
,/*dim=*/1)
;auto gate_weights = torch::
addmm
(bias, x, weights.
transpose(0
,1))
;// f.linear(x, self.weights, self.bias)
auto gates = gate_weights.
chunk(3
,/*dim=*/1)
;auto input_gate = torch::
sigmoid
(gates[0]
);auto output_gate = torch::
sigmoid
(gates[1]
);auto candidate_cell = torch::
elu(gates[2]
,/*alpha=*/
1.0)
;auto new_cell = old_cell + candidate_cell * input_gate;
auto new_h = torch::
tanh
(new_cell)
* output_gate;
return
;}
反向
c++擴充套件api當前不提供自動求導的方法,需要自己寫
繫結pybin docs
pybind11_module
(torch_extension_name, m)
// torch_extension_name pytorch構建過程中將其定義為您在setup.py指令碼中為擴充套件程式指定的名稱,在這裡為lltm
使用
pytorch/
lltm-extension/
lltm.cpp
setup.py
macos : clang
ubuntu16.04 : gcc >=4.9
from torch.utils.cpp_extension import load
lltm_cpp =
load
(name=
"lltm_cpp"
, sources=
["lltm.cpp"
], verbose=true)
//verbose 可見具體過程
在後台會執行以下操作:
建立乙個臨時目錄/tmp/torch_extensions/lltm
將ninja構建檔案傳送到該臨時目錄中
將原始檔編譯為共享庫
將該共享庫匯入為python模組
cuda程式設計 c 使用Go和C輕鬆進行CUDA程式設計
cuda程式設計 c 與其他語言相比,使用go程式設計cuda有點複雜。儘管有一些出色的軟體包,例如mumax,但是文件很差,缺少示例並且很難使用。cuda用於c語言,所以最好的選擇是使用command cgo並使用您的cuda核心呼叫外部函式。這就是我在此示例中所做的事情,在該示例中,我使用cud...
Linq To Sql高階系列(三)CUD和Log
cud就是create,update,delete。在別人都寫過了後,還有什麼是新鮮的呢?1,createdatabase northwind db new northwind you connection string 注意database項,起乙個 不存在的資料庫名稱 db.log consol...
linux中同時安裝CUDA8 0和CUDA9 0
1.準備cuda安裝包c.本機已經安裝的版本是cuda8.0和cudnn5.1 2.參考官方文件 cuda 看左上角是不是cuda9.0版本的文件,如果顯示最新版本,需要去找舊的9.0版本 cudnn 3.開始安裝 3.1 除了安裝顯示卡選擇no,還有一步要選擇no 因為之前第一次安裝cuda8.0...