0%

tutorial to compile and use pytorch on ubuntu 16.04

PyTorch for Python

install pytorch from anaconda

1
2
3
4
5
6
7
8
9
10
conda info --envs
conda activate py35

# newest version
# 1.1.0 pytorch/0.3.0 torchvision
conda install pytorch torchvision cudatoolkit=9.0 -c pytorch

# old version [NOT]
# 0.4.1 pytorch/0.2.1 torchvision
conda install pytorch=0.4.1 cuda90 -c pytorch

output

The following NEW packages will be INSTALLED:

  pytorch            pytorch/linux-64::pytorch-1.1.0-py3.5_cuda9.0.176_cudnn7.5.1_0
  torchvision        pytorch/linux-64::torchvision-0.3.0-py35_cu9.0.176_1

download from channel pytorch will cost much time!
下载pytorch/linux-64::pytorch-1.1.0-py3.5_cuda9.0.176_cudnn7.5.1_0速度非常慢!

install pytorch from tsinghua

add tsinghua pytorch channels

1
2
3
4
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
# for legacy win-64
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/peterjc123/
conda config --set show_channel_urls yes

使用anaconda官方pytorch源非常慢,用清华源代替。
see tsinghua anaconda

cat ~/.condarc

1
2
3
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
- defaults

install pytorch from tsinghua

1
2
3
4
5
conda create --name torch python==3.7
conda activate torch

conda install -y pytorch torchvision
conda install -y scikit-learn scikit-image pandas matplotlib pillow opencv

The following NEW packages will be INSTALLED:

  pytorch            anaconda/cloud/pytorch/linux-64::pytorch-1.1.0-py3.5_cuda9.0.176_cudnn7.5.1_0
  torchvision        anaconda/cloud/pytorch/linux-64::torchvision-0.3.0-py35_cu9.0.176_1

test pytorch

1
2
3
4
5
6
7
8
import torch
print(torch.__version__)
'1.1.0'
```
or
```bash
python -c 'import torch; print(torch.cuda.is_available())'
#True

pre-trained models

pre-trained model saved to /home/kezunlin/.cache/torch/checkpoints/

Downloading: “https://download.pytorch.org/models/shufflenetv2_x0.5-f707e7126e.pth“ to /home/kezunlin/.cache/torch/checkpoints/shufflenetv2_x0.5-f707e7126e.pth

PyTorch for C++

download LibTorch

download from LibTorch

compile from source

compile pytorch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# method 1
git clone --recursive https://github.com/pytorch/pytorch
cd pytorch

# method 2, if you are updating an existing checkout
git clone https://github.com/pytorch/pytorch
cd pytorch
git submodule sync
git submodule update --init --recursive
```
check tags
```bash
git tag -l

v0.4.0
v0.4.1
v1.0.0
v1.0.1
v1.0rc0
v1.0rc1
v1.1.0

now compile

1
2
git checkout v1.1.0
mkdir build && cd build && cmake-gui ..

with configs

BUILD_PYTHON OFF

be sure to use stable version 1.1.0 from here instead of latest version 20190724 (unstable version 1.2.0)
because error will occurs when load models.

  • for 1.1.0:

    1
    std::shared_ptr<torch::jit::script::Module> module = torch::jit::load("./model.pt");
  • for latest 1.2.0

    1
    torch::jit::script::Module module = torch::jit::load("./model.pt");

    configure output

    ******** Summary ********
    General:
    CMake version : 3.5.1
    CMake command : /usr/bin/cmake
    System : Linux
    C++ compiler : /usr/bin/c++
    C++ compiler id : GNU
    C++ compiler version : 5.4.0
    BLAS : MKL
    CXX flags : -fvisibility-inlines-hidden -fopenmp -O2 -fPIC -Wno-narrowing -Wall -Wextra -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math
    Build type : Release
    Compile definitions : ONNX_ML=1;ONNX_NAMESPACE=onnx_torch;USE_GCC_ATOMICS=1;HAVE_MMAP=1;_FILE_OFFSET_BITS=64;HAVE_SHM_OPEN=1;HAVE_SHM_UNLINK=1;HAVE_MALLOC_USABLE_SIZE=1
    CMAKE_PREFIX_PATH :
    CMAKE_INSTALL_PREFIX : /usr/local

    TORCH_VERSION : 1.1.0
    CAFFE2_VERSION : 1.1.0
    BUILD_CAFFE2_MOBILE : ON
    BUILD_ATEN_ONLY : OFF
    BUILD_BINARY : OFF
    BUILD_CUSTOM_PROTOBUF : ON
    Link local protobuf : ON
    BUILD_DOCS : OFF
    BUILD_PYTHON : OFF
    BUILD_CAFFE2_OPS : ON
    BUILD_SHARED_LIBS : ON
    BUILD_TEST : OFF
    INTERN_BUILD_MOBILE :
    USE_ASAN : OFF
    USE_CUDA : ON
    CUDA static link : OFF
    USE_CUDNN : ON
    CUDA version : 9.2
    cuDNN version : 7.1.4
    CUDA root directory : /usr/local/cuda
    CUDA library : /usr/local/cuda/lib64/stubs/libcuda.so
    cudart library : /usr/local/cuda/lib64/libcudart.so
    cublas library : /usr/local/cuda/lib64/libcublas.so
    cufft library : /usr/local/cuda/lib64/libcufft.so
    curand library : /usr/local/cuda/lib64/libcurand.so
    cuDNN library : /usr/local/cuda/lib64/libcudnn.so
    nvrtc : /usr/local/cuda/lib64/libnvrtc.so
    CUDA include path : /usr/local/cuda/include
    NVCC executable : /usr/local/cuda/bin/nvcc
    CUDA host compiler : /usr/bin/cc
    USE_TENSORRT : OFF
    USE_ROCM : OFF
    USE_EIGEN_FOR_BLAS : ON
    USE_FBGEMM : OFF
    USE_FFMPEG : OFF
    USE_GFLAGS : OFF
    USE_GLOG : OFF
    USE_LEVELDB : OFF
    USE_LITE_PROTO : OFF
    USE_LMDB : OFF
    USE_METAL : OFF
    USE_MKL : OFF
    USE_MKLDNN : OFF
    USE_NCCL : ON
    USE_SYSTEM_NCCL : OFF
    USE_NNPACK : ON
    USE_NUMPY : ON
    USE_OBSERVERS : ON
    USE_OPENCL : OFF
    USE_OPENCV : OFF
    USE_OPENMP : ON
    USE_TBB : OFF
    USE_PROF : OFF
    USE_QNNPACK : ON
    USE_REDIS : OFF
    USE_ROCKSDB : OFF
    USE_ZMQ : OFF
    USE_DISTRIBUTED : ON
    USE_MPI : ON
    USE_GLOO : ON
    USE_GLOO_IBVERBS : OFF
    NAMEDTENSOR_ENABLED : OFF
    Public Dependencies : Threads::Threads
    Private Dependencies : qnnpack;nnpack;cpuinfo;/usr/lib/x86_64-linux-gnu/libnuma.so;fp16;/usr/lib/openmpi/lib/libmpi_cxx.so;/usr/lib/openmpi/lib/libmpi.so;gloo;aten_op_header_gen;foxi_loader;rt;gcc_s;gcc;dl
    Configuring done

install pytorch

now compile and install

1
2
make -j8
sudo make install

output

Install the project...
-- Install configuration: "Release"
-- Old export file "/usr/local/share/cmake/Caffe2/Caffe2Targets.cmake" will be replaced.  Removing files [/usr/local/share/cmake/Caffe2/Caffe2Targets-release.cmake].
-- Set runtime path of "/usr/local/bin/protoc" to "$ORIGIN"
-- Old export file "/usr/local/share/cmake/Gloo/GlooTargets.cmake" will be replaced.  Removing files [/usr/local/share/cmake/Gloo/GlooTargets-release.cmake].
-- Set runtime path of "/usr/local/lib/libonnxifi_dummy.so" to "$ORIGIN"
-- Set runtime path of "/usr/local/lib/libonnxifi.so" to "$ORIGIN"
-- Set runtime path of "/usr/local/lib/libfoxi_dummy.so" to "$ORIGIN"
-- Set runtime path of "/usr/local/lib/libfoxi.so" to "$ORIGIN"
-- Set runtime path of "/usr/local/lib/libc10.so" to "$ORIGIN"
-- Set runtime path of "/usr/local/lib/libc10_cuda.so" to "$ORIGIN:/usr/local/cuda/lib64"
-- Set runtime path of "/usr/local/lib/libthnvrtc.so" to "$ORIGIN:/usr/local/cuda/lib64/stubs:/usr/local/cuda/lib64"
-- Set runtime path of "/usr/local/lib/libtorch.so" to "$ORIGIN:/usr/local/cuda/lib64:/usr/lib/openmpi/lib"
-- Set runtime path of "/usr/local/lib/libcaffe2_detectron_ops_gpu.so" to "$ORIGIN:/usr/local/cuda/lib64"
-- Set runtime path of "/usr/local/lib/libcaffe2_observers.so" to "$ORIGIN:/usr/local/cuda/lib64"

pytorch 1.1.0
compile and install will cost more than 2 hours
lib install to /usr/local/lib/libtorch.so
cmake install to /usr/local/share/cmake/Torch

C++ example

load pytorch model in c++
see load pytorch model in c++

cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <torch/script.h> // One-stop header.

#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;
}

// Deserialize the ScriptModule from a file using torch::jit::load().
std::shared_ptr<torch::jit::script::Module> module = torch::jit::load(argv[1]);

assert(module != nullptr);
std::cout << "ok\n";

// 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 = module->forward(inputs).toTensor();

std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n';
}

CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(custom_ops)

# /usr/local/share/cmake/Torch
find_package(Torch REQUIRED)
MESSAGE( [Main] " TORCH_INCLUDE_DIRS = ${TORCH_INCLUDE_DIRS}")
MESSAGE( [Main] " TORCH_LIBRARIES = ${TORCH_LIBRARIES}")
include_directories(${TORCH_INCLUDE_DIRS})

add_executable(example-app example-app.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 11)

output

Found torch: /usr/local/lib/libtorch.so  
[Main] TORCH_INCLUDE_DIRS = /usr/local/include;/usr/local/include/torch/csrc/api/include
[Main] TORCH_LIBRARIES = torch;torch_library;/usr/local/lib/libc10.so;/usr/local/cuda/lib64/stubs/libcuda.so;/usr/local/cuda/lib64/libnvrtc.so;/usr/local/cuda/lib64/libnvToolsExt.so;/usr/local/cuda/lib64/libcudart.so;/usr/local/lib/libc10_cuda.so
[TOLOWER] ALGORITHM_TARGET = algorithm

make

1
2
3
mkdir build 
cd build && cmake-gui ..
make -j8

set Torch_DIR to /home/kezunlin/program/libtorch/share/cmake/Torch
auto-set Torch_DIR to /usr/local/share/cmake/Torch

run

1
2
./example-app model.pt
-0.2698 -0.0381 0.4023 -0.3010 -0.0448

errors and solutions

compile errors with libtorch

@soumith
You might be building libtorch with a compiler that is incompatible with the compiler building your final app.
For example, you built libtorch with gcc 4.9.2 and your final app with gcc 5.1, and the C++ ABI between both of them is not the same, so you are seeing linker errors like these

@christianperone

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  set(TORCH_CXX_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=0")
endif()

Which forces GCC to use the old C++11 ABI.

@ smth
we have that flag set because we build with gcc 4.9.x, which only has the old ABI.
In GCC 5.1, the ABI for std::string was changed, and binaries compiling with gcc >= 5.1 are not ABI-compatible with binaries build with gcc < 5.1 (like pytorch) unless you set that flag.

resons and solutions

  • Reasons: ** LibTorch compiled with GCC-4.9.X (only has the old ABI), and binaries compiling with gcc >= 5.1 are not ABI-compatible**
  • Solution: compile pytorch from source instead of using LibTroch downloaded from the website.

runtime errors with pytorch

errors

/usr/local/lib/libopencv_imgcodecs.so.3.1.0: undefined reference to `TIFFReadRGBAStrip@LIBTIFF_4.0'

which means opencv link against libtiff 4.0.6

ldd check

ldd /usr/local/lib/libopencv_imgcodecs.so.3.1.0
    linux-vdso.so.1 =>  (0x00007ffc92ffc000)
    libopencv_imgproc.so.3.1 => /usr/local/lib/libopencv_imgproc.so.3.1 (0x00007f32afbca000)
    libjpeg.so.8 => /usr/local/lib/libjpeg.so.8 (0x00007f32af948000)
    libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f32af723000)
    libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f32af4ae000)
    

when compile opencv-3.1.0, cmake find /usr/lib/x86_64-linux-gnu/libtiff.so.5

locate libtiff

locate libtiff.so

/home/kezunlin/anaconda3/envs/py35/lib/libtiff.so
/home/kezunlin/anaconda3/envs/py35/lib/libtiff.so.5
/home/kezunlin/anaconda3/envs/py35/lib/libtiff.so.5.4.0
/home/kezunlin/anaconda3/lib/libtiff.so
/home/kezunlin/anaconda3/lib/libtiff.so.5
/home/kezunlin/anaconda3/lib/libtiff.so.5.4.0
/home/kezunlin/anaconda3/pkgs/libtiff-4.0.10-h2733197_2/lib/libtiff.so
/home/kezunlin/anaconda3/pkgs/libtiff-4.0.10-h2733197_2/lib/libtiff.so.5
/home/kezunlin/anaconda3/pkgs/libtiff-4.0.10-h2733197_2/lib/libtiff.so.5.4.0
/opt/MATLAB/R2016b/bin/glnxa64/libtiff.so.5
/opt/MATLAB/R2016b/bin/glnxa64/libtiff.so.5.0.5
/usr/lib/x86_64-linux-gnu/libtiff.so
/usr/lib/x86_64-linux-gnu/libtiff.so.5
/usr/lib/x86_64-linux-gnu/libtiff.so.5.2.4

It seems that my OpenCV was compiled against libtiff 4, but I have libtiff 5, how to solve this problem?

re-compile opencv-3.1.0 again, new errors occur
see here

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CUDA_nppi_LIBRARY (ADVANCED)
    linked by target "opencv_cudev" in directory /home/kezunlin/program/opencv-3.1.0/modules/cudev
    linked by target "opencv_cudev" in directory /home/kezunlin/program/opencv-3.1.0/modules/cudev
    linked by target "opencv_test_cudev" in directory /home/kezunlin/program/opencv-3.1.0/modules/cudev/test

solutions:

WITH_CUDA OFF

WITH_VTK OFF
WITH_TIFF OFF
BUILD_PERF_TESTS OFF

for python2, use default /usr/bin/python2.7
for python3, NOT USE anaconda version
编译的过程中,尽量避免使用anaconda目录下的lib

install libwebp

1
sudo apt-get -y install libwebp-dev

Reference

History

  • 20190626: created.