Zexin Li

Please keep honest, open, patient, happy and visionary.

NVIDIA Jetson从源码安装tensorflow 2.x

总述

Q: 什么人需要源码安装tensorflow?

A: 1. tensorflow的开发者(想改进它的代码); 2. 需要指定版本tensorflow但没有下载资源的开发者。仅使用tensorflow API的开发者不需要编译,建议使用NVIDIA官方镜像,或者从官方下载编译好的.whl文件并使用pip安装。

tensorflow 1.x源码安装

Jetsonhacks提供了github安装指导

tensorflow 2.x源码安装

目前公网基本没有编译2.x的教程,因此需要大量踩坑。遇到问题请查看文末【潜在问题】。

准备工作

  1. 查询官方指南确定需要安装的版本。tensorflow官方编译指南 NVIDIA编译tensorflow指南

目前经测试可编译+运行:

  1. Jetpack 3.3 (python 3.5/3.6) + CUDA 10.2 + CUDNN 7.1 + tensorflow r2.2;

  2. Jetpack 4.6 (python 3.6) + CUDA 10.2 + CUDNN 7.1 + tensorflow r2.2;

  3. (推荐)Jetpack 4.6 (python 3.6) + CUDA 10.2 + CUDNN 8.2 + tensorflow r2.4。

  4. 正确刷机: 使用NVIDIA官方提供的NVIDIA SDK Manager刷入Jetpack【刷机教程】。以TX2为例,目前Jetpack可选版本4.6, 4.5.1, 4.5, 3.3。注意: 4.5+版本CUDA/CUDNN版本较高,可能会出现不兼容情况。

  5. 安装python依赖库
    对于jetpack 4.5+

    1
    2
    3
    4
    5
    6
    7
    sudo apt-get update
    sudo apt install python3-dev python3-pip
    sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran
    sudo apt-get install python3-pip
    sudo pip3 install -U pip testresources setuptools==49.6.0
    sudo pip3 install -U --no-deps numpy==1.18.5 future==0.18.2 mock==3.0.5 keras_preprocessing==1.1.2 keras_applications==1.0.8 gast==0.4.0 protobuf pybind11 cython pkgconfig
    sudo env H5PY_SETUP_REQUIRES=0 pip3 install -U h5py==2.10.0

    对于jetpack 3.3

    1
    2
    3
    4
    5
    6
    7
    sudo apt-get update
    sudo apt install python3-dev python3-pip
    sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran
    curl -fsSL https://bootstrap.pypa.io/pip/3.5/get-pip.py | python3.5 # 因为pip3已经放弃对python 3.5的支持, 所以不能从apt安装pip
    sudo pip3 install -U testresources setuptools
    sudo pip3 install -U --no-deps numpy future mock keras_preprocessing keras_applications gast protobuf pybind11 cython pkgconfig
    sudo env H5PY_SETUP_REQUIRES=0 pip3 install -U h5py

注意: python依赖库版本,装错可能会冲突和import core dumped。装完开一个交互式命令行python3尝试import这几个包。一个常见的方案是降级numpy版本至1.18.5。

  1. 安装jdk依赖库

    1
    2
    3
    4
    5
    参考https://docs.bazel.build/versions/main/install-ubuntu.html
    # 对于jetpack 4.5+ Ubuntu 18.04 (LTS) uses OpenJDK 11 by default:
    sudo apt-get install openjdk-11-jdk
    # 对于jetpack 3.3 Ubuntu 16.04 (LTS) uses OpenJDK 8 by default:
    sudo apt-get install openjdk-8-jdk
  2. 安装bazel
    编译/下载安装bazel,版本号参考.bazelversion

    1
    2
    3
    4
    5
    6
    7
    8
    mkdir bazel-$BAZEL_VERSION
    cd bazel-$BAZEL_VERSION
    wget https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-dist.zip
    unzip bazel-$BAZEL_VERSION-dist.zip
    rm bazel-bazel-$BAZEL_VERSION-dist.zip
    ./compile.sh
    sudo cp output/bazel /usr/local/bin
    bazel version
  3. 挂载交换区,否则可能会内存错误(编译期间使用超过8GB内存) -> Error: c++ compiling error *** Killed

    1
    2
    3
    4
    5
    fallocate -l 8G swapfile
    chmod 600 swapfile
    mkswap swapfile
    sudo swapon swapfile
    swapon -s # 输出结果中应有priority -1的swap

    或者,直接使用jetsonhack提供的创建swap脚本

    1
    2
    wget https://raw.githubusercontent.com/jetsonhacks/installTensorFlowTX2/master/createSwapfile.sh
    ./createSwapfile.sh -d /experiment -s 8

编译/安装/测试

  1. 获取tensorflow源码

    1
    2
    3
    git clone https://github.com/tensorflow/tensorflow.git
    cd tensorflow
    git checkout r2.2 # 对于jetpack 3.3
  2. 配置/编译 (编译特别耗时, 在全功率模式下TX2需要大约13h, AGX需要大约6h::建议起一个防断连接session(例如tmux), 否则编译到一半连接没了那真的是emo了)

    1
    2
    3
    4
    5
    #配置正确的python路径,CUDA那一项输入y,其他全部回车跳过
    ./configure
    # 注意设置output_base路径,如果跨盘会导致编译比不跨盘慢很多。默认为~/.cache/
    bazel --output_base=/experiment/tensorflow_pkg build --verbose_failures --config=noaws --config=cuda //tensorflow/tools/pip_package:build_pip_package
    ./bazel-bin/tensorflow/tools/pip_package/build_pip_package /experiment/tensorflow_tmp
  3. 安装tensorflow .whl

    1
    pip install /experiment/tensorflow_tmp/tensorflow-$version-$tags.whl
  4. 测试

    1
    2
    3
    4
    python3
    >> import tensorflow # 冒烟测试
    >> exit()
    GPU/mnist测试 #参考 https://github.com/peterlee0127/tensorflow-nvJetson/tree/master/tf-test

潜在问题

  1. pip3安装h5py编译不通过: 全部使用root账户安装pip3依赖库
  2. local_cuda_not_found的编译错误: 切换已知可用版本(tensorflowr2.5+jetpack 4.5+版本可能会出现此错误)
  3. c++ compiling error+cannot write file: 需要至少32GB外置储存设备,NVIDIA Jetson系列的内置储存(通常为32GB)不足以容纳编译tensorflow产生的大量中间文件
  4. c++ compiling error+process xx killed: 对于TX2/Nano一定要先设置8GB交换区(swap),否则会出现内存不足错误
  5. cannot import name ‘function_pb2’: 切换当前目录,不要在tensorflow源代码路径import tensorflow
  6. 能够编译+pip安装,但无法通过测试,执行测试文件卡住: 由于jetpack默认安装的CUDA/CUDNN版本和tensorflow官方推荐版本不匹配,可能会出现类似的兼容性问题。可能的解决方案: (1)使用推荐版本编译 (2)从jetpack下载/编译对应版本的CUDA/CUDNN,再编译tensorflow (3)到NVIDIA开发者论坛提问,但目前官方也没有很好的解决办法。
  7. C++ compilation of rule ‘//tensorflow/python:bfloat16_lib’ failed (Exit 1): 对于tensorflow<=2.2 可能是因为numpy版本太高不兼容,使用conda/pip降级numpy版本
    1
    2
    pip install 'numpy<1.19.0'
    # conda install 'numpy<1.19.0'
  8. Runtime error: “CUDA driver version is insufficient for CUDA runtime version”。手动安装了个cuda10.2+cudnn7.0,这两者会冲突。重新链接cuda9.0+cudnn7.0编译,一切就正常了。
  9. 执行长时间python tensorflow脚本后,可能会出现再执行tensorflow脚本就出现CUDA_UNKNOWN_ERROR并异常退出情况。猜测可能是tensorflow自身的bug或者内存问题。解决方案:重新启动,pip uninstall tensorflow; pip install tensorflow-xxx.whl
  10. tensorflow启动GPU需要非常久(例如在TX2上启动ResNet50的训练需要加载20min以上): 设置环境变量export CUDA_CACHE_MAXSIZ="2147483648"
  11. import numpy/tensorflow 出现core dumped: 降级numpy版本<=1.18.5
  12. h5py安装编译很长时间,持续无法编译通过,虽然Cython已经安装,但报错类似’Cython is not installed’: 降级numpy版本<=1.18.5