总述
Q: 什么人需要源码安装tensorflow?
A: 1. tensorflow的开发者(想改进它的代码); 2. 需要指定版本tensorflow但没有下载资源的开发者。仅使用tensorflow API的开发者不需要编译,建议使用NVIDIA官方镜像,或者从官方下载编译好的.whl文件并使用pip安装。
tensorflow 1.x源码安装
Jetsonhacks提供了github安装指导。
tensorflow 2.x源码安装
目前公网基本没有编译2.x的教程,因此需要大量踩坑。遇到问题请查看文末【潜在问题】。
准备工作
- 查询官方指南确定需要安装的版本。tensorflow官方编译指南 NVIDIA编译tensorflow指南
目前经测试可编译+运行:
Jetpack 3.3 (python 3.5/3.6) + CUDA 10.2 + CUDNN 7.1 + tensorflow r2.2;
Jetpack 4.6 (python 3.6) + CUDA 10.2 + CUDNN 7.1 + tensorflow r2.2;
(推荐)Jetpack 4.6 (python 3.6) + CUDA 10.2 + CUDNN 8.2 + tensorflow r2.4。
正确刷机: 使用NVIDIA官方提供的NVIDIA SDK Manager刷入Jetpack【刷机教程】。以TX2为例,目前Jetpack可选版本4.6, 4.5.1, 4.5, 3.3。注意: 4.5+版本CUDA/CUDNN版本较高,可能会出现不兼容情况。
安装python依赖库
对于jetpack 4.5+1
2
3
4
5
6
7sudo 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
7sudo 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。
安装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安装bazel
编译/下载安装bazel,版本号参考.bazelversion1
2
3
4
5
6
7
8mkdir 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挂载交换区,否则可能会内存错误(编译期间使用超过8GB内存) -> Error: c++ compiling error *** Killed
1
2
3
4
5fallocate -l 8G swapfile
chmod 600 swapfile
mkswap swapfile
sudo swapon swapfile
swapon -s # 输出结果中应有priority -1的swap或者,直接使用jetsonhack提供的创建swap脚本
1
2wget https://raw.githubusercontent.com/jetsonhacks/installTensorFlowTX2/master/createSwapfile.sh
./createSwapfile.sh -d /experiment -s 8
编译/安装/测试
获取tensorflow源码
1
2
3git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
git checkout r2.2 # 对于jetpack 3.3配置/编译 (编译特别耗时, 在全功率模式下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安装tensorflow .whl
1
pip install /experiment/tensorflow_tmp/tensorflow-$version-$tags.whl
测试
1
2
3
4python3
>> import tensorflow # 冒烟测试
>> exit()
GPU/mnist测试 #参考 https://github.com/peterlee0127/tensorflow-nvJetson/tree/master/tf-test
潜在问题
- pip3安装h5py编译不通过: 全部使用root账户安装pip3依赖库
- local_cuda_not_found的编译错误: 切换已知可用版本(tensorflowr2.5+jetpack 4.5+版本可能会出现此错误)
- c++ compiling error+cannot write file: 需要至少32GB外置储存设备,NVIDIA Jetson系列的内置储存(通常为32GB)不足以容纳编译tensorflow产生的大量中间文件
- c++ compiling error+process xx killed: 对于TX2/Nano一定要先设置8GB交换区(swap),否则会出现内存不足错误
- cannot import name ‘function_pb2’: 切换当前目录,不要在tensorflow源代码路径import tensorflow
- 能够编译+pip安装,但无法通过测试,执行测试文件卡住: 由于jetpack默认安装的CUDA/CUDNN版本和tensorflow官方推荐版本不匹配,可能会出现类似的兼容性问题。可能的解决方案: (1)使用推荐版本编译 (2)从jetpack下载/编译对应版本的CUDA/CUDNN,再编译tensorflow (3)到NVIDIA开发者论坛提问,但目前官方也没有很好的解决办法。
- C++ compilation of rule ‘//tensorflow/python:bfloat16_lib’ failed (Exit 1): 对于tensorflow<=2.2 可能是因为numpy版本太高不兼容,使用conda/pip降级numpy版本
1
2pip install 'numpy<1.19.0'
# conda install 'numpy<1.19.0' - Runtime error: “CUDA driver version is insufficient for CUDA runtime version”。手动安装了个cuda10.2+cudnn7.0,这两者会冲突。重新链接cuda9.0+cudnn7.0编译,一切就正常了。
- 执行长时间python tensorflow脚本后,可能会出现再执行tensorflow脚本就出现CUDA_UNKNOWN_ERROR并异常退出情况。猜测可能是tensorflow自身的bug或者内存问题。解决方案:重新启动,pip uninstall tensorflow; pip install tensorflow-xxx.whl
- tensorflow启动GPU需要非常久(例如在TX2上启动ResNet50的训练需要加载20min以上): 设置环境变量
export CUDA_CACHE_MAXSIZ="2147483648"
- import numpy/tensorflow 出现core dumped: 降级numpy版本<=1.18.5
- h5py安装编译很长时间,持续无法编译通过,虽然Cython已经安装,但报错类似’Cython is not installed’: 降级numpy版本<=1.18.5