2022網易微專業(yè)高級前端開發(fā)工程師日出東方其道大光
Pytorch在C++中加載TORCHSCRIPT模型
2022網易微專業(yè)高級前端開發(fā)工程師日出東方其道大光
download:https://www.51xuebc.com/thread-501-1-1.html
備用:3w 51xuebc com
PyTorch的主要編程接口是Python語言。雖然對于很多需要動態(tài)快速迭代的場景,Python是一種合適的首選語言,但也有很多情況下,Python的這些屬性恰恰是不利的。經常使用后者的一個環(huán)境是生產環(huán)境,它要求低延遲和嚴格的部署。對于生產場景,C++通常是首選語言,即使它只綁定了另一種語言,如Java、Rust或Go。以下內容將概述如何使用PyTorch提供C++庫來加載現(xiàn)有的Python序列化模型,該模型完全獨立于Python在C++環(huán)境中的執(zhí)行。
步驟1:將PyTorch模型轉換為Torch腳本。
PyTorch模型從Python到C++遷移的媒介是通過Torch腳本實現(xiàn)的,Torch腳本是PyTorch模型的中間表示,可以被Torch腳本編譯器理解、編譯和序列化。如果從vanilla“eager”API編寫的現(xiàn)有PyTorch模型開始,必須先將模型轉換成Torch腳本。在下面討論的最常見的情況下,這只需要很少的工作。如果你已經有一個Torch腳本模塊,你可以跳到本教程的下一部分。
有兩種方法可以將PyTorch模型轉換成Torch腳本。第一個稱為跟蹤,這是一種通過使用樣本輸入評估一次來捕獲模型結構的機制,并記錄這些輸入在模型中的流動。這適用于限制控制流使用的模型(即,如果模型中不存在)。第二種方法是向模型添加顯式注釋,以通知Torch腳本編譯器,它可以直接解析和編譯模型代碼,受Torch腳本語言施加的約束。
提示:
這兩種方法的完整文檔可以在官方的Torch腳本參考中找到,以及關于它們的使用的進一步指導。
1.1通過跟蹤轉換為Torch腳本
要通過跟蹤將PyTorch模型轉換為Torch腳本,必須將模型實例與樣本輸入一起傳遞給torch.jit.trace函數(shù)。這將生成一個torch.jit.ScriptModule對象,它包含嵌入在模塊的forward方法中的模型評估跟蹤:
進口火炬
進口火炬視覺
#你的模型的一個實例。
model = torch vision . models . resnet 18()
#您通常會提供給模型的forward()方法的示例輸入。
example = torch.rand(1,3,224,224)
#使用torch.jit.trace通過跟蹤生成torch.jit.ScriptModule。
#將模型模型和樣本數(shù)據(jù)示例傳遞到torch.jit.trace中
traced _ script _ module = torch . JIT . trace(模型,示例)
復制代碼
與傳統(tǒng)的PyTorch模塊一樣,您現(xiàn)在可以對被跟蹤的ScriptModule進行相同的推斷和預測:
in[1]:output = traced _ script _ module(torch . ones(1,3,224,224))
在[2]:輸出[0,:5]
Out[2]:張量([-0.2698,-0.0381,0.4023,-0.3010,-0.0448],grad_fn=)
復制代碼
1.2通過注釋轉換為Torch腳本
在某些情況下,如果模型采用特定形式的控制流,您可以直接用Torch腳本編寫模型,并相應地對模型進行注釋。例如,假設有以下普通Pytorch模型:
進口火炬
MyModule類(torch.nn.Module):
def __init__(self,N,M):
超級(MyModule,self)。__init__()
self . weight = torch . nn . parameter(torch . rand(N,M))
向前定義(自身,輸入):
如果input.sum() > 0: ###</p>