C++呼び出しpytorchモデルlibtorch ubuntu/windows構成
24667 ワード
参考ブログ:https://blog.csdn.net/tlzhatao/article/details/86555269?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
PyTorchモデルをTorch Scriptに変換する2つの方法
tracing
annotation
ubuntu
公式サイトは対応するlibtorchをダウンロードします:https://download.pytorch.org/libtorch/nightly/cu100/libtorch-shared-with-deps-latest.zipあ、ホームページのダウンロードが遅すぎてwgetが使えます.準備するcppファイル
CmakeListsを準備する.txtファイルは、最後の行の基準が14であることに注意してください.そうしないと、エラーが発生します.
新規ビルドファイル
windows
公式サイトは対応するlibtorchをダウンロードします:https://download.pytorch.org/libtorch/nightly/cu90/libtorch-win-shared-with-deps-latest.zipあ、ホームページのダウンロードが遅すぎてwgetが使えます.準備するcppファイル注意、1.1バージョン以下であれば、ポインタです.1.2以上は変更されています.moduleを使用する場所も変更されています.
CmakeListsを準備する.txtファイルは、最後の行の基準が14であることに注意してください.そうしないと、エラーが発生します.
新規ビルドファイル
最後にVSでプロジェクトを開きます.私のcudaパスはデフォルトのパスではありませんので、いくつかのライブラリディレクトリを変更して、最後に生成する必要があります.exeファイルの実行にはnvToolsExt 64_が必要になる場合があります.1.dll、ネットでダウンロードすればいいです.ここにリンクがあります.https://www.dll4free.com/nvtoolsext64_1.dll.html
PyTorchモデルをTorch Scriptに変換する2つの方法
tracing
import torch
import torchvision
# An instance of your model.
model = torchvision.models.resnet18()
# model.eval()
# An example input you would normally provide to your model's forward() method.
example = torch.rand(1, 3, 224, 224)
# Use torch.jit.trace to generate a torch.jit.ScriptModule via tracing.
traced_script_module = torch.jit.trace(model, example)
# ScriptModule
output = traced_script_module(torch.ones(1, 3, 224, 224))
traced_script_module.save("resnet18_model.pt")
annotation
import torch
import torchvision
class MyModule(torch.jit.ScriptModule):
def __init__(self):
super(MyModule, self).__init__()
self.weight = torch.nn.Parameter(torch.rand(1, 3, 224, 224))
@torch.jit.script_method
def forward(self, input):
if input.sum() > 0:
output = self.weight.mv(input)
else:
output = self.weight + input
return output
my_script_module = MyModule()
my_script_module.save("model.pt")
ubuntu
公式サイトは対応するlibtorchをダウンロードします:https://download.pytorch.org/libtorch/nightly/cu100/libtorch-shared-with-deps-latest.zipあ、ホームページのダウンロードが遅すぎてwgetが使えます.準備するcppファイル
#include "torch/script.h"
#include "torch/torch.h"
#include
#include
#include
using namespace std;
int main(int argc, const char* argv[])
{
if (argc != 2) {
std::cerr << "usage: example-app
" ;
return -1;
}
//
torch::jit::script::Module module = torch::jit::load(argv[1]);
module.to(at::kCUDA);
std::cout << "ok
";
// , (1,3,224,224), cuda
for(int i=0;i<100;i++){
std::vector<torch::jit::IValue> inputs;
inputs.push_back(torch::ones({1, 3, 224, 224}).to(at::kCUDA));
clock_t startTime,endTime;
startTime = clock();
at::Tensor output = module.forward(inputs).toTensor();
endTime = clock();//
cout << "The run time is: " <<(double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;
}
// Execute the model and turn its output into a tensor.
//std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '
';
}
CmakeListsを準備する.txtファイルは、最後の行の基準が14であることに注意してください.そうしないと、エラーが発生します.
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(example-app)
set(Torch_DIR /home/wxy/code/libtorch)
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 14)
新規ビルドファイル
cmake -DCMAKE_PREFIX_PATH=/home/wxy/code/libtorch ..
make
./example-app ../model.pt
windows
公式サイトは対応するlibtorchをダウンロードします:https://download.pytorch.org/libtorch/nightly/cu90/libtorch-win-shared-with-deps-latest.zipあ、ホームページのダウンロードが遅すぎてwgetが使えます.準備するcppファイル注意、1.1バージョン以下であれば、ポインタです.1.2以上は変更されています.moduleを使用する場所も変更されています.
std::shared_ptr<torch::jit::script::Module> module = torch::jit::load(argv[1]);
#include // One-stop header.
#include
#include
#include
using namespace std;
int main(int argc, const char* argv[]) {
/*if (argc != 2) {
std::cerr << "usage: example-app
";
return -1;
}*/
// Deserialize the ScriptModule from a file using torch::jit::load().
torch::jit::script::Module module = torch::jit::load("F:/python_project/pytorch/inference_c++/demo/resnet18_model.pt");
module.to(at::kCUDA);
std::cout << "ok
";
// Create a vector of inputs.
std::vector<torch::jit::IValue> inputs;
inputs.push_back(torch::rand({1, 3, 224, 224}).to(at::kCUDA));
// Execute the model and turn its output into a tensor.
auto output = module.forward(inputs).toTensor();
std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/10) << '
';
}
CmakeListsを準備する.txtファイルは、最後の行の基準が14であることに注意してください.そうしないと、エラーが発生します.
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(example-app)
set(Torch_DIR F:/python_project/pytorch/inference_c++/libtorch-win-shared-with-deps-latest/libtorch)
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 14)
新規ビルドファイル
cmake -DCMAKE_PREFIX_PATH=F:/python_project/pytorch/inference_c++/libtorch-win-shared-with-deps-latest/libtorch -DCMAKE_GENERATOR_PLATFORM=x64 -DCMAKE_BUILD_TYPE=Release ..
make
最後にVSでプロジェクトを開きます.私のcudaパスはデフォルトのパスではありませんので、いくつかのライブラリディレクトリを変更して、最後に生成する必要があります.exeファイルの実行にはnvToolsExt 64_が必要になる場合があります.1.dll、ネットでダウンロードすればいいです.ここにリンクがあります.https://www.dll4free.com/nvtoolsext64_1.dll.html