pytorch的部署——把pytorch模型集成到so库

前沿

需要pytorch1.0版本及以上,linux环境下进行,借助cmake编译

1.编写保存pytorch模型代码
//main.py
import torch
class MyModule(torch.jit.ScriptModule):
    def __init__(self, N, M):
        super(MyModule, self).__init__()
        self.weight = torch.nn.Parameter(torch.rand(N, M))

    @torch.jit.script_method
    def forward(self, input):
        if bool(input.sum() > 0):
          output = self.weight.mv(input)
        else:
          output = self.weight + input
        return output

my_script_module = MyModule(2, 3)
my_script_module.save("model.pt")

执行python main.py得到模型

2. 编写被打包的so代码
//test.cpp
#include <torch/script.h> // One-stop header.

#include <iostream>
#include <memory>
#include "test.h"
//arg为传入的模型name
void test(char* arg) {
  // Deserialize the ScriptModule from a file using torch::jit::load().
  std::shared_ptr<torch::jit::script::Module> module = torch::jit::load(arg);
  std::cout << "hello pytorch lib,ok\n";
}
3. 编写cmake配置文件
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(custom_ops2)

find_package(Torch REQUIRED)
#生成可执行文件
#add_executable(example-app example-app.cpp)
#生成so库
add_library( # Sets the name of the library.
             pytorchtest
             # Sets the library as a shared library.
             SHARED
             # Provides a relative path to your source file(s).
             test.cpp)

target_link_libraries(pytorchtest "${TORCH_LIBRARIES}")
set_property(TARGET pytorchtest PROPERTY CXX_STANDARD 11)
4. 编译

在当前目录新建build文件夹,然后编译,如下:

mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH=/XXX/libtorch ..
make

这里的/XXX/libtorch路径是在pytorch官网下载的c++库解压后的路径,因为前面建立的模型没有用到GPU,这里下载的是linux中的cpu版本:
在这里插入图片描述

5. 调用共享库so

前面步骤将在build目录下生成库文件libpytorchtest.so,调用so库需要配置找到该库文件的路径,这里把so放到~/lib中,配置环境变量:
export LD_LIBRARY_PATH=/home/haward/lib:$LD_LIBRARY_PATH
接着编写main.c去调用so

//main.c
#include "test.h"
int main()
{
	test("model.pt");
    return 0;		
}

编译main.c的命令:
g++ main.cpp -L ~/lib -lpytorchtest -o main
其中,-L表示链接的so存放的路径;-l接省略lib…so的命名(-Iinclude表示找到头文件include目录,这里在.目录下,可省略)

得到main可执行文件:执行./main

输出:"hello pytorch lib,ok\n"表示加载模型成功。
参考:
https://pytorch.org/tutorials/advanced/cpp_export.html
代码下载

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 要将PyTorch模型部署到Android设备上,可以使用以下步骤: 1. 将PyTorch模型换为ONNX格式。可以使用PyTorch官方提供的torch.onnx模块将模型换为ONNX格式。 2. 使用ONNX Runtime for Android将ONNX模型部署到Android设备上。可以使用ONNX Runtime for Android提供的Java API将模型加载到Android应用程序中。 3. 在Android应用程序中使用模型进行推理。可以使用Java API调用模型进行推理,并将结果返回给应用程序。 需要注意的是,在将模型部署到Android设备上之前,需要确保模型的大小和计算量适合在移动设备上运行。可以使用模型压缩和量化等技术来减小模型的大小和计算量。 ### 回答2: PyTorch是一个开源的Python机器学习,它为深度学习提供了强大的支持。PyTorch模型可以在计算机上进行训练和调试,但当我们需要将模型部署到移动设备(如Android)上时,我们需要将PyTorch模型换并集成到移动应用程序中,这需要一系列的步骤。 首先,我们需要将PyTorch模型换为TorchScript格式,这是一种在移动设备上运行的地图。使用TorchScript脚本将PyTorch模型序列化为可运行的形式,它可以在没有Python运行时进行部署。我们可以使用以下代码将PyTorch模型换为TorchScript格式: ``` import torch import torchvision # load the PyTorch model model = torchvision.models.resnet18(pretrained=True) # set the model to evaluation mode model.eval() # trace the model to generate a TorchScript traced_model = torch.jit.trace(model, torch.randn(1, 3, 224, 224)) ``` 上面的代码将一个预训练的ResNet模型换为TorchScript格式,现在我们可以将其保存到文件中以备以后使用: ``` traced_model.save('resnet18_model.pt') ``` 接下来,我们需要将TorchScript模型集成到Android应用程序中。我们可以使用Android Studio提供的Android Neural Networks API(NNAPI)来加速我们的深度学习推理。NNAPI是一个Google开发的Android框架,它提供了一些API,可以加速计算机视觉和自然语言处理应用程序中的神经网络推理。我们可以在Gradle文件中添加以下代码,以添加NNAPI支持: ``` dependencies { implementation 'org.pytorch:pytorch_android:1.7.0' implementation 'org.pytorch:pytorch_android_torchvision:1.7.0' } ``` 然后将TorchScript模型文件复制到Android项目中的`assets`文件夹中。 最后,我们需要编写代码将TorchScript模型加载到我们的应用程序中,并使用它来进行推理。下面是一个简单的Android应用程序,可以使用加载的TorchScript模型对图像进行分类: ```java import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.widget.ImageView; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import org.pytorch.IValue; import org.pytorch.Module; import org.pytorch.Tensor; public class MainActivity extends AppCompatActivity { private TextView mResultTextView; private ImageView mImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mResultTextView = findViewById(R.id.result_text_view); mImageView = findViewById(R.id.image_view); // Load the TorchScript model from the assets folder Module module = Module.load(assetFilePath(this, "resnet18_model.pt")); // Load the image and convert it to a PyTorch Tensor Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.test_image); float[] mean = new float[]{0.485f, 0.456f, 0.406f}; float[] std = new float[]{0.229f, 0.224f, 0.225f}; Tensor inputTensor = TensorImageUtils.bitmapToFloat32Tensor(bitmap, mean, std); // Run the input through the model IValue outputTensor = module.forward(IValue.from(inputTensor)); // Get the predicted class index from the output Tensor float[] scores = outputTensor.toTensor().getDataAsFloatArray(); int predictedIndex = -1; float maxScore = 0.0f; for (int i = 0; i < scores.length; i++) { if (scores[i] > maxScore) { predictedIndex = i; maxScore = scores[i]; } } // Display the result String[] classNames = {"cat", "dog", "fish", "horse", "spider"}; mResultTextView.setText("Prediction: " + classNames[predictedIndex]); mImageView.setImageBitmap(bitmap); } public static String assetFilePath(Context context, String assetName) { File file = new File(context.getFilesDir(), assetName); try (InputStream is = context.getAssets().open(assetName)) { try (OutputStream os = new FileOutputStream(file)) { byte[] buffer = new byte[4 * 1024]; int read; while ((read = is.read(buffer)) != -1) { os.write(buffer, 0, read); } os.flush(); } return file.getAbsolutePath(); } catch (IOException e) { e.printStackTrace(); } return null; } } ``` 上面的代码将载入从`assets`文件夹中加载的TorchScript模型,为它准备好图像数据,并将其运行给模型模型返回一个输出张量,我们得到预测的类别。 总之,将PyTorch模型部署到Android可以通过换为TorchScript格式,集成到Android应用程序中,以及编写可以使用它进行推理的代码来实现。厂商和第三方可用工具也可以帮助简化部署过程。 ### 回答3: 在让PyTorch模型部署到Android设备之前,你需要确保你的模型可用且现在运行良好。这涉及到以下步骤: 1. 在PyTorch中定义并训练模型 首先在PyTorch中定义并训练模型。你需要训练一个模型,这个模型可以处理你希望在移动设备上使用的数据。你需要确保在训练模型时,使用了适当的数据预处理和清理过程。然后,导出模型以便在Android设备上使用。 2. 将PyTorch模型换为TorchScript格式 将训练好的PyTorch模型化成TorchScript格式,这是 PyTorch模型导出方面提供的一种功能强大的框架。你可以使用 torch.jit.load() 函数来加载 TorchScript 模型,并在移动设备上使用它。你可以使用torchscript_builder.py 脚本来PyTorch 模型,这个脚本也可以根据你的需要在运行时执行换。 3. 集成模型到Android应用中: Android应用可以使用自己的Java代码,但也可以使用C++接口以及原生代码。所以,集成模型到 Android 应用可以使用两种方式: Java 接口和 C++ 接口。 3.1 Java 接口 Java 接口可以用于创建用 Java 编写的 Android 应用程序。以下是使用 Java 接口加载 TorchScript 模型的步骤: - 创建一个 Android 应用程序项目。 - 在 Android Studio 中安装 PyTorch 的 Gradle 插件。 - 将 torch-android pytorch_android 添加到项目中的 build.gradle 文件中。 - 在代码中使用 TorchScript 加载模型,并使用该程序的 Android 功能来运行。 3.2 C++ 接口 使用 C++ 接口可以创建用 C++ 编写的 Android 应用程序。以下是使用 C++ 接口加载 TorchScript 模型的步骤: - 创建一个 Android 应用程序项目。 - 编写 C++ 代码来加载 TorchScript 模型。 - 在 Android Studio 中创建一个 Android.mk 文件和 Application.mk 文件。 - 将 C++ 代码编译成共享,然后将共享打包到 Android 应用程序 APK 文件中。 - 在代码中使用 TorchScript 加载模型,并调用 C++ 程序的 Android 功能来运行。 以上是部署 PyTorch 模型到 Android 设备的步骤和过程。在集成模型到 Android 应用中时,需要注意处理异常和各种错误,确保模型可以在 Android 设备上成功加载。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值