Raspberry 上的 Libtorch 无法加载 pt 文件但在 ubuntu 上工作
Posted
技术标签:
【中文标题】Raspberry 上的 Libtorch 无法加载 pt 文件但在 ubuntu 上工作【英文标题】:Libtorch on Raspberry can't load pt file but working on ubuntu 【发布时间】:2020-10-26 13:24:37 【问题描述】:我正在尝试在 Raspberry PI 上使用 libtorch 构建 C++ 程序。该程序在 Ubuntu 上运行,但在 Raspberry 上构建时出现以下错误:
error: use of deleted function ‘void torch::jit::script::Module::operator=(const torch::jit::script::Module&)’
In file included from /usr/include/torch/csrc/jit/ir.h:18,
from /usr/include/torch/csrc/jit/tracer.h:9,
from /usr/include/torch/csrc/autograd/generated/variable_factories.h:8,
from /usr/include/torch/csrc/api/include/torch/types.h:7,
from /usr/include/torch/script.h:3,
from /tmp/tmp.k6618dczxt/src/../include/suvoNet.h:26,
from /tmp/tmp.k6618dczxt/src/../include/classifier.h:17,
from /tmp/tmp.k6618dczxt/src/classifier.cpp:11:
/usr/include/torch/csrc/jit/script/module.h:319:3: note: declared here
TH_DISALLOW_COPY_AND_ASSIGN(Module);
这是崩溃的代码:
MyClass::MyClass()
try
// Deserialize the ScriptModule from a file using torch::jit::load().
network = torch::jit::load(MODEL_FILE);
catch (const c10::Error& e)
std::cerr << "Error loading the model\n";
exit(-1);
network
声明为私有 torch::jit::script::Module network
我在 '1.0.0a0+8322165' 版本中使用来自 github 的 pyTorch 为 Raspberry (ARM) 构建 libtorch
【问题讨论】:
你为什么用pytorch 1.0.0版本?当前是 1.5 和 C++ API 稳定的第一个版本。也许试试最新的头(1.7
IIRC,但应该是稳定的,或者结帐到1.5.0
)。
你好,我20h前开始编译1.6.0版本,编译需要24多小时,明天给你反馈。如果这不起作用,我会尝试 1.5
谢谢@SzymonMaszke,该构建在我的 Raspberry PI 4 上运行(并且 PI 3 仍在构建中)。我用我的所有程序发布了一个答案,并把它变成了一个社区维基。您可以更新它以改进它。我还是 CMake / libtorch / C++ 的初学者,所以可能会有一些不好的做法
【参考方案1】:
TLDR :在 1.6.0 中编译 libtorch,效果很好。
如何编译 Libtorch for Raspberry 并在我的 C++ 项目中使用?
准备构建
增加 RBPi 交换
首先,如果你有 Raspberry PI 3 或更低版本,你需要增加 SWAP,因为构建是吃 RAM 的。
如果您的 RBPi 4 或更高版本的 RAM 超过 3GB,请跳过此步骤。
修改文件/etc/dphys-swapfile
:
CONF_SWAPFILE=2048M
然后调用以下命令更新更改。
sudo dphys-swapfile setup
安装基础包
安装以下软件包:
sudo apt install build-essential make cmake git python3-pip libatlas-base-dev
Libtorch 需要 CMake>=3.15
才能正确构建,使用
cmake --version` 检查 cmake 版本
如果低于 3.15,请按照以下命令构建更新版本并删除之前的版本:
wget https://github.com/Kitware/CMake/releases/download/v3.18.0-rc1/cmake-3.18.0-rc1.tar.gz
tar -xzf cmake-3.18.0-rc1.tar.gz
cd cmake<version>
mkdir build
cd build
cmake ..
make
sudo make install
sudo apt remove cmake
sudo ln -s /usr/local/bin/cmake /usr/bin/cmake
sudo ldconfig
从源代码构建 PyTorch 以获取 ARM 的 libtorch 后端
如果您没有 3GB 或 RAM,请不要忘记将 SWAP 增加到 2048M。
获取所有需要的库:
sudo apt-get update
sudo apt-get install build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev
获取 PyTorch 源代码:
git clone --recursive https://github.com/pytorch/pytorch --branch=release/1.6
cd pytorch
初始化所有子模块:
git submodule update --init --recursive
git submodule update --remote third_party/protobuf # To prevent a bug I had
获取所有需要的库:
sudo apt-get update
sudo apt-get install build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev
获取 PyTorch 源代码:
git clone --recursive https://github.com/pytorch/pytorch --branch=release/1.6
cd pytorch
为构建设置环境变量。
将以下行添加到~/.bashrc
文件中。
export NO_CUDA=1
export NO_DISTRIBUTED=1
export NO_MKLDNN=1
export NO_NNPACK=1
export NO_QNNPACK=1
以root用户登录,使用.bashrc文件设置环境变量
sudo su
source /home/<user>/.bashrc
安装python依赖项
pip3 install setuptools pyyaml numpy
构建和安装 PyTorch,是时候来一杯 :coffee: 了,这需要一段时间。
不要忘记强制使用环境变量的
-E
。
sudo -E python3 setup.py install
检查安装是否成功:
cd
python3
import torch
torch.__version__
使用 Torch 构建您的程序
在你的CMakeLists.txt
:
cmake_minimum_required(VERSION 2.6)
project(projectName)
set(CMAKE_PREFIX_PATH "/home/pi/pytorch/torch") # Adding the directory where torch as been installed
set(CMAKE_CXX_STANDARD 14) # C14 required to compile Torch
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
add_compile_definitions(_GLIBCXX_USE_CXX11_ABI=0) # Torch is compiled with CXX11_ABI, so your program needs to be also, or you may have conflicts in some libraries (such as GTest for example)
# Specifying we are using pthread for UNIX systems.
set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS $TORCH_CXX_FLAGS -pthread -Wall")
find_package(Torch REQUIRED)
if(NOT Torch_FOUND)
message(FATAL_ERROR "Pytorch Not Found!")
endif(NOT Torch_FOUND)
message(STATUS "Pytorch status :")
message(STATUS " libraries: $TORCH_LIBRARIES")
message(STATUS " Torch Flags: $TORCH_CXX_FLAGS")
# Program executable
add_executable(projectName <sources>)
target_link_libraries(projectName PRIVATE pthread dl util $TORCH_LIBRARIES)
【讨论】:
以上是关于Raspberry 上的 Libtorch 无法加载 pt 文件但在 ubuntu 上工作的主要内容,如果未能解决你的问题,请参考以下文章
Android Things 3 无法从 Raspberry PI 3 上的 rxtx 读取
Raspberry Pi 上的 ssh 连接被拒绝 [关闭]
Raspberry Pi 上的 GStreamer 全高清视频 RTP 流