torch.utils.cpp_extension對c++/cuda進行拓展

為什么pytorch要對c++/cuda進行拓展

在初始階段,使用pytorch提供的接口組合搭配自己的神經網絡就可以了,但是,隨著深入進行,比如說要實現一個自己新的算法,或者是自己定義的新的層,光使用pytorch模塊是不夠的。雖然,pytorch在特定的模塊上進行了很好的優化,,但加入將這些組合起來,一般pytorch只會按照設計好的操作去使用gpu通道,這樣會使得通道空閑或者超負載,然而python解釋器也不能對此進行優化,導致程序執行速度變慢,所以就需要對其進行拓展,才能充分利用gpu,加快算法速度。

拓展的具體實現過程

在pytorch0.4中,結合c語言和cuda進行拓展,使用torch.utils.ffi模塊,主要內容可以參考Pytorch拓展進階(一):Pytorch結合C以及Cuda語言。但在pytoch1.0之后,這個模塊就用不了了,用torch.utils.cpp_extension來進行代替,該模塊是對c++進行拓展,而且它具有最小(但通常足夠的)的參數來構建c++擴展的優點,具體的使用過程可以參考Pytorch拓展進階(二):Pytorch結合C++以及Cuda拓展。如果想要對多個c++文件和cuda文件進行拓展的話,具體實現可以參考maskrcnn-benchmark

【注】在使用的過程中遇到以下錯誤:

ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead.

這就是說明pytorch的版本不兼容,這時候就需要修改setup.py文件。但是,cpp_extension是對c++文件進行拓展,需要將c語言文件轉化為c++文件。而且使用ffi的時候會生成_ext文件,這個文件比較麻煩,在該文件夾下需要__init.py__文件。

setuptools

不論是ffi模塊或是cpp_extension模塊,它們的構建都使用了setuptools,它是python distutils增強版的集合,可以幫助我們更簡單的創建和分發Python包,尤其是擁有依賴關系的包。他還提供了自動包查詢程序,用來自動獲取包之間的依賴關系,并完成這些包的安裝,大大降低了安裝各種包的難度,使之更加方便。所以使用pytorch的這些模塊的主要目的是用來找到c文件或者是c++文件,定義編譯方式,具體的創建和安裝操作都是setuptools來完成。比如在一個文件夾下有如下文件:


image.png

__init__.py文件是必須要有的,setup.py是將correlation_cuda進行打包和安裝的文件,里面的具體內容為:

image.png

可以看到,setup里面包含了要編譯的文件(不用包含頭文件),運行python setup.py install之后會生成3個文件夾,dist文件夾下的壓縮包就是目標文件,build文件夾下會有.so文件的生成,另一個文件夾是以 .egg-info為結尾的文件。在這里我們主要是用到build文件夾下生成的共享文件,通過correlation.py來進行調用,自定義層,之后外部如果要用到這個correlation,只需要調用*.py文件就可以啦,這就相當于定義了一個新的模塊。
image.png

參考博客:
Pytorch拓展進階(一):Pytorch結合C以及Cuda語言
Pytorch拓展進階(二):Pytorch結合C++以及Cuda拓展
maskrcnn-benchmark
faster-rcnn源碼閱讀:C/C++/CU擴展的編譯和安裝

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容