老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

如何在C++中加載TorchScript模型

這篇文章主要講解了“如何在C++中加載TorchScript模型”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何在C++中加載TorchScript模型”吧!

10多年的旌德網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。營銷型網站的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整旌德建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯公司從事“旌德網站設計”,“旌德網站推廣”以來,每個客戶項目都認真落實執行。

步驟1:將PyTorch模型轉換為Torch腳本

PyTorch模型從Python到C ++的旅程由Torch Script啟動,Torch Script是PyTorch模型的一種表示形式,可以由Torch Script編譯器理解,編譯和序列化。如果您是從使用vanilla“eager” API編寫的現有PyTorch模型開始的,則必須首先將模型轉換為Torch腳本。在最常見的情況下(如下所述),這只需要花費很少的功夫。如果您已經有了Torch腳本模塊,則可以跳到本教程的下一部分。

有兩種將PyTorch模型轉換為Torch腳本的方法。第一種稱為跟蹤,一種機制,其中通過使用示例輸入對模型的結構進行一次評估,并記錄這些輸入在模型中的流量,從而捕獲模型的結構。這適用于有限使用控制流的模型。第二種方法是在模型中添加顯式批注,以告知Torch Script編譯器可以根據Torch Script語言施加的約束直接解析和編譯模型代碼。

提示:您可以在官方Torch腳本參考 中找到有關這兩種方法的完整文檔,以及使用方法的進一步指導。

方法1:通過跟蹤轉換為Torch腳本

要將PyTorch模型通過跟蹤轉換為Torch腳本,必須將模型的實例以及示例輸入傳遞給torch.jit.trace 函數。這將產生一個torch.jit.ScriptModule 對象,該對象的模型評估痕跡將嵌入模塊的forward 方法中:

import torchimport torchvision# 你模型的一個實例.model = torchvision.models.resnet18()# 您通常會提供給模型的forward()方法的示例輸入。example = torch.rand(1, 3, 224, 224)# 使用`torch.jit.trace `來通過跟蹤生成`torch.jit.ScriptModule`traced_script_module = torch.jit.trace(model, example)

現在可以對跟蹤的 ScriptModule 進行評估,使其與常規PyTorch模塊相同:

In[1]: output = traced_script_module(torch.ones(1, 3, 224, 224))In[2]: output[0, :5]Out[2]: tensor([-0.2698, -0.0381, 0.4023, -0.3010, -0.0448], grad_fn=)

方法2:通過注釋轉換為Torch腳本

在某些情況下,例如,如果模型采用特定形式的控制流,則可能需要直接在Torch腳本中編寫模型并相應地注釋模型。例如,假設您具有以下vanilla Pytorch模型:

import torchclass MyModule(torch.nn.Module): def __init__(self, N, M):  super(MyModule, self).__init__()  self.weight = torch.nn.Parameter(torch.rand(N, M)) def forward(self, input):  if input.sum() > 0:   output = self.weight.mv(input)  else:   output = self.weight + input  return output

因為此模塊的前向方法使用取決于輸入的控制流,所以它不適合跟蹤。相反,我們可以將其轉換為ScriptModule 。為了將模塊轉換為ScriptModule ,需要使用torch.jit.script 編譯模塊,如下所示:

class MyModule(torch.nn.Module): def __init__(self, N, M):  super(MyModule, self).__init__()  self.weight = torch.nn.Parameter(torch.rand(N, M)) def forward(self, input):  if input.sum() > 0:   output = self.weight.mv(input)  else:   output = self.weight + input  return outputmy_module = MyModule(10,20)sm = torch.jit.script(my_module)

如果您需要在nn.Module 中排除某些方法,因為它們使用了TorchScript 尚不支持的Python功能,則可以使用@torch.jit.ignore 對其進行注釋

my_module 是ScriptModule 的實例,可以序列化。

步驟2:將腳本模塊序列化為文件

一旦有了ScriptModule(通過跟蹤或注釋PyTorch模型),您就可以將其序列化為文件了。稍后,您將可以使用C ++從此文件加載模塊并執行它,而無需依賴Python。假設我們要序列化先前在跟蹤示例中顯示的ResNet18 模型。要執行此序列化,只需在模塊上調用save 并傳遞一個文件名即可:

traced_script_module.save("traced_resnet_model.pt")

這將在您的工作目錄中生成traced_resnet_model.pt 文件。如果您還想序列化my_module ,請調用my_module.save("my_module_model.pt") 我們現在已經正式離開Python領域,并準備跨入C ++領域。

步驟3:在C ++中加載腳本模塊

要在C ++中加載序列化的PyTorch模型,您的應用程序必須依賴于PyTorch C ++ API(也稱為LibTorch)。LibTorch發行版包含共享庫,頭文件和CMake構建配置文件的集合。雖然CMake不是依賴LibTorch的要求,但它是推薦的方法,并且將來會得到很好的支持。 對于本教程,我們將使用CMake和LibTorch構建一個最小的C ++應用程序,該應用程序簡單地加載并執行序列化的PyTorch模型。

最小的C ++應用程序

讓我們從討論加載模塊的代碼開始。以下將已經做:

include // One-stop header.#include #include int main(int argc, const char* argv[]) { if (argc != 2) { std::cerr << "usage: example-app \n"; return -1; } torch::jit::script::Module module; try { // 使用以下命令從文件中反序列化腳本模塊: torch::jit::load(). module = torch::jit::load(argv[1]); } catch (const c10::Error& e) { std::cerr << "error loading the model\n"; return -1; } std::cout << "ok\n";}

標頭包含運行示例所需的LibTorch庫中的所有相關包含。我們的應用程序接受序列化的PyTorch ScriptModule的文件路徑作為其唯一的命令行參數,然后使用torch::jit::load() 函數繼續對該模塊進行反序列化,該函數將此文件路徑作為輸入。作為返回,我們收到一個Torch::jit::script::Module 對象。我們將稍后討論如何執行它。

取決于LibTorch和構建應用程序

假設我們將以上代碼存儲在名為example-app.cpp 的文件中。最小的CMakeLists.txt 可能看起來很簡單:

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)project(custom_ops)find_package(Torch REQUIRED)add_executable(example-app example-app.cpp)target_link_libraries(example-app "${TORCH_LIBRARIES}")set_property(TARGET example-app PROPERTY CXX_STANDARD 11)

建立示例應用程序的最后一件事是LibTorch發行版。您可以隨時從PyTorch網站的下載頁面 上獲取最新的穩定版本。如果下載并解壓縮最新的歸檔文件,則應收到具有以下目錄結構的文件夾:

libtorch/ bin/ include/ lib/ share/

find_package(Torch)

提示;在Windows上,調試和發行版本不兼容ABI。 如果您打算以調試模式構建項目,請嘗試使用LibTorch的調試版本。

最后一步是構建應用程序。為此,假定示例目錄的布局如下:

example-app/ CMakeLists.txt example-app.cpp

現在,我們可以運行以下命令從example-app/ 文件夾中構建應用程序:

mkdir buildcd buildcmake -DCMAKE_PREFIX_PATH=/path/to/libtorch ..make

/path/to/libtorch 應該是解壓縮的LibTorch發行版的完整路徑。如果一切順利,它將看起來像這樣:

root@4b5a67132e81:/example-app# mkdir buildroot@4b5a67132e81:/example-app# cd buildroot@4b5a67132e81:/example-app/build# cmake -DCMAKE_PREFIX_PATH=/path/to/libtorch ..-- The C compiler identification is GNU 5.4.0-- The CXX compiler identification is GNU 5.4.0-- Check for working C compiler: /usr/bin/cc-- Check for working C compiler: /usr/bin/cc -- works-- Detecting C compiler ABI info-- Detecting C compiler ABI info - done-- Detecting C compile features-- Detecting C compile features - done-- Check for working CXX compiler: /usr/bin/c++-- Check for working CXX compiler: /usr/bin/c++ -- works-- Detecting CXX compiler ABI info-- Detecting CXX compiler ABI info - done-- Detecting CXX compile features-- Detecting CXX compile features - done-- Looking for pthread.h-- Looking for pthread.h - found-- Looking for pthread_create-- Looking for pthread_create - not found-- Looking for pthread_create in pthreads-- Looking for pthread_create in pthreads - not found-- Looking for pthread_create in pthread-- Looking for pthread_create in pthread - found-- Found Threads: TRUE-- Configuring done-- Generating done-- Build files have been written to: /example-app/buildroot@4b5a67132e81:/example-app/build# makeScanning dependencies of target example-app[ 50%] Building CXX object CMakeFiles/example-app.dir/example-app.cpp.o[100%] Linking CXX executable example-app[100%] Built target example-app

如果我們提供了我們之前創建的到示例應用程序二進制文件的跟蹤ResNet18模型traced_resnet_model.pt 的路徑,則應該以友好的“ ok”作為獎勵。 請注意,如果嘗試使用my_module_model.pt 運行此示例,則會收到一條錯誤消息,提示您輸入的形狀不兼容。my_module_model.pt 需要1D而不是4D。

root@4b5a67132e81:/example-app/build# ./example-app /traced_resnet_model.ptok

步驟4:在C ++中執行腳本模塊

成功用C ++加載了序列化的ResNet18之后,我們現在只需執行幾行代碼即可!讓我們將這些行添加到C ++應用程序的main() 函數中:

// 創建輸入向量std::vector inputs;inputs.push_back(torch::ones({1, 3, 224, 224}));// 執行模型并將輸出轉化為張量at::Tensor output = module.forward(inputs).toTensor();std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n';

前兩行設置了我們模型的輸入。我們創建一個torch::jit::IValue 的向量(類型為type-erased的值Script::Module 方法接受并返回),并添加單個輸入。要創建輸入張量,我們使用torch::ones() ,等效于C ++ API中的torch.ones 。然后,我們運行script::Module 的forward 方法,并向其傳遞我們創建的輸入向量。作為回報,我們得到一個新的IValue,通過調用 toTensor() 將其轉換為張量。

提示:要總體上了解有關torch::ones和PyTorch C ++ API之類的功能的更多信息,請參閱其文檔,網址為https://pytorch.org/cppdocs。

PyTorch C ++ API提供了與Python API幾乎相同的功能奇偶校驗,使您可以像在Python中一樣進一步操縱和處理張量。

在最后一行中,我們打印輸出的前五個條目。由于在本教程前面的部分中,我們向Python中的模型提供了相同的輸入,因此理想情況下,我們應該看到相同的輸出。讓我們通過重新編譯我們的應用程序并以相同的序列化模型運行它來進行嘗試:

root@4b5a67132e81:/example-app/build# makeScanning dependencies of target example-app[ 50%] Building CXX object CMakeFiles/example-app.dir/example-app.cpp.o[100%] Linking CXX executable example-app[100%] Built target example-approot@4b5a67132e81:/example-app/build# ./example-app traced_resnet_model.pt-0.2698 -0.0381 0.4023 -0.3010 -0.0448[ Variable[CPUFloatType]{1,5} ]

作為參考,Python以前的輸出為:

tensor([-0.2698, -0.0381, 0.4023, -0.3010, -0.0448], grad_fn=)

看來匹配得很好!

提示:要將模型移至GPU內存,可以編寫model.to(at::kCUDA);。通過調用tensor.to(at::kCUDA),確保模型的輸入也位于CUDA內存中,

這將在CUDA內存中返回新的張量。

步驟5:獲取幫助并探索API

本教程有望使您對PyTorch模型從Python到C ++的路徑有一個大致的了解。使用本教程中描述的概念,您應該能夠從vanilla, “eager” PyTorch模型,到Python中的已編譯ScriptModule ,再到磁盤上的序列化文件,以及–結束循環–到可執行腳本: C ++中的模塊。

當然,有許多我們沒有介紹的概念。例如,您可能會發現自己想要使用以C ++或CUDA實現的自定義運算符擴展ScriptModule ,并在加載到純C ++生產環境中的ScriptModule中執行此自定義運算符。好消息是:這是可能的,并且得到了很好的支持!現在,您可以瀏覽此文件夾 中的示例,我們將很快提供一個教程。 目前,以下鏈接通常可能會有所幫助:

Torch Script參考:https://pytorch.org/docs/master/jit.htmlPyTorch C ++ API文檔:https://pytorch.org/cppdocs/PyTorch Python API文檔:https://pytorch.org/docs/

感謝各位的閱讀,以上就是“如何在C++中加載TorchScript模型”的內容了,經過本文的學習后,相信大家對如何在C++中加載TorchScript模型這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創新互聯,小編將為大家推送更多相關知識點的文章,歡迎關注!


標題名稱:如何在C++中加載TorchScript模型
轉載來于:http://www.xueling.net.cn/article/jhddig.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 亚洲第一福利网站在线 | 日韩精品无码免费专区午夜不卡 | 国产日韩精品一区 | 互换人妻500部 | 国产黄频免费高清视频 | 久久伊人八月婷婷综合激情 | 免费无码成人片 | 九九热黄色片 | 男人的天堂无码动漫AV | 无码免费人妻A片AAA毛片西瓜 | 亚洲中文字幕无码一区二区三区 | 无码久久综合免费 | 中文字幕无码免费久久91 | av无码一区二区三区午夜 | 国产真实露脸乱子伦原著 | 日韩欧美二区 | 免费看国产美女裸体视频 | 大地影视中文第二页的背景故事 | 在线免费观看国产 | 中文字幕四虎 | 免费看无码自慰一区二区 | 久久97精品久久久久久 | 无码成人片一区二区三区 | 麻豆国产精品视频 | 无码成人AAAAA毛片专区调教 | 久久久久亚洲精品无码网址 | 透逼视频 | 狠狠五月深爱婷婷网 | 国产一级一片免费播放 | 毛片免费小视频 | 黄色av一级 | 天天干伊人 | 亚洲无需播放器 | 国产高清一二三区 | 亚洲欧洲专线一区 | 日韩网站免费 | 国产精品99久久久久久久女警 | 亚洲乱亚洲乱妇50P 免费日韩中文字幕 | 一级性毛片 | 国产日韩精品一区二区在线观看播放 | 妞干网免费在线视频 |