zoukankan      html  css  js  c++  java
  • Ubuntu 16.04上源码编译和安装pytorch教程,并编写C++ Demo CMakeLists.txt | tutorial to compile and use pytorch on ubuntu 16.04

    本文首发于个人博客https://kezunlin.me/post/54e7a3d8/,欢迎阅读最新内容!

    tutorial to compile and use pytorch on ubuntu 16.04

    PyTorch for Python

    install pytorch from anaconda

    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

    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

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

    install pytorch from tsinghua

    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

    import torch
    print(torch.__version__)
    '1.1.0'
    

    or

    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

    # 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

    git tag -l 
    
    v0.4.0
    v0.4.1
    v1.0.0
    v1.0.1
    v1.0rc0
    v1.0rc1
    v1.1.0
    

    now compile

    git checkout v1.1.0
    
    # method 1: offical build will generate lots of errors
    #python setup.py install 
    
    # method 2: normal make
    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:

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

      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

    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

    #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>
    ";
        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
    ";
      
      // 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) << '
    ';
    }
    

    CMakeLists.txt

    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

    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

    ./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

    sudo apt-get -y install libwebp-dev
    

    Reference

    History

    • 20190626: created.

    Copyright

  • 相关阅读:
    Python正则表达式
    机器学习--------SVM
    tensor内部结构
    Tensor类型
    Tensor索引操作
    常用的Tensor操作
    Tensor基本操作
    神经网络
    Autograd:自动微分
    nginx之fastcgi配置
  • 原文地址:https://www.cnblogs.com/kezunlin/p/11947326.html
Copyright © 2011-2022 走看看