把写的libtorch调用模型的程序移植到了下Ubuntu下发现没有问题,libtorch提供了预编译好的库。放到基于Arm的国产主机上就提示libtorch.so不是动态库文件,需要从源代码编译libtorch。不过没啥难点,踩坑文。

获取源码


git clone https://github.com/pytorch/pytorch --recursive && cd pytorch
git checkout v1.2.0 # 真的勇士敢于在master分支下编译
#下载编译需要的子模块
git submodule sync
git submodule update --init --recursive

python环境

pytorch官方给出的环境是用conda装的,然而悲剧的是官方并没有给出aarch64的安装文件,所以还是使用pip来安装。还有个问题是很多python库并没有发布对应架构下的包,好在编译libtorch需要的python环境较为简单。编译完之后导出python环境发现,编译libtorch必须的包应该只有pyyaml(不太确定)。当然cmake和gcc等工具还是必须的。
安装pyyaml的命令:

pip install pyyaml

不使用tools下的脚本而直接用cmake来编译的话可能python环境都不需要了...

编译libtorch

在编译之前可以使用export或者cmake-gui关闭一些不必要的编译选项来加快编译速度,类似:

export USE_CUDA=False
export BUILD_TEST=False

官方提供了一键式编译工具,在pytorch/tools/build_libtorch.py。只需要运行:


#pytorch$
mkdir build && cd build
python ../tools/build_libtorch.py

就会在build下生成对应的文件,我们需要的动态库文件libtorch.so在build/lib/下。

整理libtorch

  1. 复制pytorch下torch、caffe2、c10以及aten\source下的ATen、TH等文件夹到libtorch/include下,得到libtorch的C++接口。
  2. 复制build/lib下编译好的库文件到libtorch/lib下。
  3. 复制pytorch/torch/share/cmake文件夹到libtorch/share下。
    得到的libtorch主要结构:
    libtorch.
    ├─include
    │ ├─ATen
    │ ├─c10
    │ ├─caffe2
    │ ├─TH
    │ ├─THCUNN
    │ ├─THNN
    │ └─torch
    ├─lib
    └─share
    └─cmake
    ├─ATen
    ├─Caffe2
    ├─Gloo
    └─Torch

如果你需要pytorch编译可以参考一下这篇
ps:还是对CMakeLists不太熟啊。