torch::deploy¶
torch::deploy
是一个允许您运行多个嵌入式 Python 的系统
C++ 进程中的解释器,没有共享的全局解释器锁。了解更多
有关内部工作原理的信息,请参阅相关的 arXiv 论文。torch::deploy
警告
这是一个原型功能。仅支持 Linux x86,并且 API 可以 更改而不发出警告。
开始¶
安装torch::deploy
¶
torch::deploy
在我们的二进制版本中尚未默认构建,因此要获取
启用了 libtorch 的副本,请按照从源构建 PyTorch 的说明进行操作。torch::deploy
运行 时,您需要指定 ,例如:setup.py
USE_DEPLOY=1
export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"}
export USE_DEPLOY=1
python setup.py bdist_wheel
python -mpip install dist/*.whl
在 Python 中创建模型包¶
torch::deploy
可以加载和运行打包有 的 Python 模型。您可以在文档中了解更多信息。torch.package
torch.package
torch.package
现在,让我们创建一个可以在 中加载和运行的简单模型。torch::deploy
from torch.package import PackageExporter
import torchvision
# Instantiate some model
model = torchvision.models.resnet.resnet18()
# Package and export it.
with PackageExporter("my_package.pt") as e:
e.intern("torchvision.**")
e.extern("sys")
e.save_pickle("model", "model.pkl", model)
现在,您的工作目录中应该有一个名为 的文件。my_package.pt
注意
目前,仅支持 Python 标准库和 AS 中的 模块。未来,我们规划
透明地支持您向我们推荐的任何 Conda 环境。torch::deploy
torch
extern
torch.package
在 C++ 中加载和运行模型¶
让我们创建一个最小的 C++ 程序来加载模型。
#include <torch/deploy.h>
#include <torch/script.h>
#include <iostream>
#include <memory>
int main(int argc, const char* argv[]) {
if (argc != 2) {
std::cerr << "usage: example-app <path-to-exported-script-module>\n";
return -1;
}
// Start an interpreter manager governing 4 embedded interpreters.
torch::deploy::InterpreterManager manager(4);
try {
// Load the model from the torch.package.
torch::deploy::Package package = manager.loadPackage(argv[1]);
torch::deploy::ReplicatedObj model = package.loadPickle("model", "model.pkl");
} catch (const c10::Error& e) {
std::cerr << "error loading the model\n";
return -1;
}
std::cout << "ok\n";
}
这个小程序介绍了 的许多核心概念。torch::deploy
一个独立的 Python 集合的抽象
解释器,允许您在运行代码时对它们进行负载均衡。InterpreterManager
使用该方法,您可以从磁盘加载 a 并使其可供所有解释器使用。InterpreterManager::loadPackage
torch.package
Package::loadPickle
允许您检索特定的 Python 对象
,就像我们之前保存的 ResNet 模型一样。
最后,模型本身是一个 .这是
在多个解释器之间复制的对象。当您互动时
替换为 a (例如,通过调用 ),它将选择
一个免费的解释器来执行该交互。ReplicatedObj
ReplicatedObj
forward
构建和运行应用程序¶
假设上述C++程序存储在名为 example-app.cpp 的文件中,则 最小CMakeLists.txt文件如下所示:
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(deploy_tutorial)
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)
最后一步是配置和构建项目。假设我们的代码 目录的布局如下:
example-app/
CMakeLists.txt
example-app.cpp
现在,我们可以运行以下命令从文件夹中构建应用程序:example-app/
mkdir build
cd build
# Point CMake at the built version of PyTorch we just installed.
SITE_PACKAGES="$(python -c 'from distutils.sysconfig import get_python_lib; print(get_python_lib())')"
cmake -DCMAKE_PREFIX_PATH="$SITE_PACKAGES/torch" ..
cmake --build . --config Release
现在我们可以运行我们的应用程序:
./example-app /path/to/my_package.pt
在 C++ 中执行forward
¶
一旦您用 C++ 加载了模型,则很容易执行它:
// Create a vector of inputs.
std::vector<torch::jit::IValue> inputs;
inputs.push_back(torch::ones({1, 3, 224, 224}));
// Execute the model and turn its output into a tensor.
at::Tensor output = model(inputs).toTensor();
std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n';
值得注意的是,模型的 forward 函数在 Python 中执行,在嵌入式
CPython 解释器。请注意,该模型是 ,这意味着
,您可以从多个线程调用,并且 forward 方法将
在多个独立解释器上执行,没有全局解释器
锁。ReplicatedObj
model()