一 编译torch
我这是用torch==2.3.1,torchvision==0.18.1,注意torch和torchvision的版本要对应上。
1. 克隆源码
git clone --recursive https://github.com/pytorch/pytorch.git
cd pytorch
git checkout v2.3.1 #跳转到你指定的版本
git submodule sync
git submodule update --init --recursive
2. 编译安装
我这里是安装到/opt/libtorch下,没有GPU加速,编译选项按自己的需求进行修改。
cd pytorch
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/opt/libtorch -DCMAKE_CXX_STANDARD=17 -D CMAKE_CXX_STANDARD_REQUIRED=ON -D USE_CUDA=OFF -D USE_CUDNN=OFF -D USE_OPENCV=ON -D BUILD_CAFFE2_MOBILE=OFF -D BUILD_PYTHON=OFF -D BUILD_CAFFE2_OPS=OFF -D BUILD_TEST=OFF -D USE_TBB=OFF ..
make -j4
sudo make install
3. 报错解决
torch的编译是需要依赖python环境的,缺啥模块就安装啥模块,下面的两个模块是我碰到需要安装的
pyyaml typing_extensions
4. 测试
4.1 测试程序,example-torch.cpp
#include <torch/torch.h>
#include <iostream>
int main() {
torch::Tensor tensor = torch::rand({2, 3});
std::cout << tensor << std::endl;
return 0;
}
4.2 CMakeLists.txt
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(example-torch)
set(Torch_DIR /opt/libtorch/share/cmake/Torch/)
find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
add_executable(example-torch example-torch.cpp)
target_link_libraries(example-torch "${TORCH_LIBRARIES}")
set_property(TARGET example-torch PROPERTY CXX_STANDARD 17)
注意1. 查找Torch,需要设置Torch_DIR 或者 CMAKE_PREFIX_PATH,
set(Torch_DIR /opt/libtorch/share/cmake/Torch)
set(CMAKE_PREFIX_PATH /opt/libtorch)
注意2. 需要添加set_property,不然会报错,#error C++17 or later compatible ,compiler is required to use PyTorch.
set_property(TARGET example-torch PROPERTY CXX_STANDARD 17)
4.3 测试结果如下,说明torch编译成功
注意:在这下载的是x86-64格式的
二 编译torchvision
1. 获取源码
git clone --recursive https://github.com/pytorch/vision // 下载跟torch对应的版本
cd vision
git checkout v0.18.1 #跳转到你指定的版本
git submodule sync
git submodule update --init --recursive
# 或者 去 https://github.com/pytorch/vision/releases/tag/v0.18.1 下载压缩包也可以
2. 编译
同级目录下创建目录torchvision,用来存放编译好的torchvision。
编译选项按自己的需求进行修改。
编译时会找libz库,我这装了opencv,里面有这个库,能找到,没有的就去装一个。
cd vision
mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH=/opt/libtorch -DCMAKE_INSTALL_PREFIX=/home/toybrick/torch/torchvision -DWITH_CUDA=OFF -DCMAKE_BUILD_TYPE=Release ..
make -j4
make install
3. 报错解决
报错:Could NOT find PNG (missing: PNG_LIBRARY PNG_PNG_INCLUDE_DIR)
sudo apt-get install libjpeg-dev
报错:Could NOT find JPEG (missing: JPEG_LIBRARY JPEG_INCLUDE_DIR)
sudo apt-get install libpng-dev
4. 测试
使用vision/examples/cpp/hello_world/这个例子进行测试
4.1 运行trace_model.py,获取模型
python trace_model.py
4.2 运行main.cpp
# 修改CMakeLists.txt
set(CMAKE_PREFIX_PATH "/opt/libtorch;/home/toybrick/torchvision/") # 按实际路径进行修改
mkdir build
cd build
cmake ..
make
mv hello-world ..
cd ..
./hello-world
运行结果没问题,说明安装成功。
三 编译ncnn
1. 获取源码
git clone https://github.com/Tencent/ncnn.git
2. 安装依赖
按自己的实际情况安装依赖,protobuf最好单独编译,参考网上教程。
sudo apt install cmake protobuf-compiler libprotobuf-dev libopencv-dev protobuf build-essential git autoconf automake libtool curl make g++ unzip
3.1 编译pnnx,也可以去https://github.com/pnnx/pnnx/releases直接下载pnnx的可执行文件
mkdir ncnn/tools/pnnx/build
cd ncnn/tools/pnnx/build
cmake -DCMAKE_INSTALL_PREFIX=install -DTorch_INSTALL_DIR=/opt/libtorch -DTorchVision_INSTALL_DIR=/home/toybrick/torchvision .. # 按实际路径进行修改
cmake --build . --config Release -j 4
cmake --build . --config Release --target install
3.2 编译ncnn
cd ncnn
mkdir -p build
cd build
// CMakeLists.txt文件中有用于控制构建的选项,根据不同的编译需求,可自定义打开或关闭对应功能,NCNN_BENCHMARK---是否打印每个算个耗时 NCNN_SHARED_LIB---动态库
cmake -DNCNN_BUILD_EXAMPLES=ON -DNCNN_SHARED_LIB=ON ..
make -j4
make install
4. 验证
使用ncnn源码中examples的例子进行验证,编译完后,在build/install下就是ncnn的 库和头文件等,build/example下是所有例子的可执行程序。
cd ../examples
../build/examples/squeezenet IMAGE_PATH // 选一张用于分类的图片
结果正确即安装成功。
5.使用
其他项目中使用ncnn
//添加下面三行即可(按实际路径修改,下面只做为参考)
include_directories(/***/ncnn/include)
link_directories(/***/ncnn/lib)
target_link_libraries(*** -lncnn)
模型转换
1. 使用install/bin下的工具进行转换,如
onnx2ncnn ***.onnx // 即可生成ncnn的.bin和.param文件
2. 使用pnnx进行转换
把 libtorch/lib 目录下的 so 全部拷贝到 ncnn/tools/pnnx/build/install/bin 里面
cd 到 ncnn/tools/pnnx/build/install/bin 目录,运行 ./pnnx