源码编译最新Tensorflow2.18版所遇到的各种坑
系统环境:
- ubuntu 22.04
- python3.10
- Tensorflow2.18
- bazel 6.5.0
- Clang17
前言
为了让Tensorflow支持avx2指令集,从源代码编译了Tensorflow2.18版本,其过程主要参考了:https://huanyouchen.github.io/2018/05/25/compile-tensorflow-from-source-with-FMA-and-avx2-instructions-on-ubuntu/,由于这篇博文比较老,编译的是1.0时代的tensorflow,其中很多细节已经发生变动。
第一步,安装Bazel
具体方法参考:https://bazel.google.cn/install/ubuntu?hl=en#binary-installer,如果github下载缓慢可以在链接: https://https://mirrors.huaweicloud.com/bazel/国内镜像下载相应的sh文件。
我安装的是6.5.0版本,如果不确定安装哪个版本,可以查看https://github.com/tensorflow/tensorflow/blob/master/.bazelversion,这里有推荐的bazel版本。
安装完成后:bazel version
如果出现:Build label: 6.5.0这样的就表示安装好了。
最后安装 :sudo apt-get install python3-numpy python3-dev python3-pip python3-wheel
第二步,安装Clang
Tensorflow从2.15版开始使用Clang工具链编译,所以一定要安装clang编译器,不然编译过程会出错。
具体安装步骤参考:https://cn.linux-terminal.com/?p=5997
我安装的是clang17版,完毕后就可以进行下一步操作
第三步 下载tensorflow源码
新建目录:
mkdir tf
进入到该目录下:
cd tf
使用git来clone最新的TensorFlow的源码:git clone https://github.com/tensorflow/tensorflow(第一个坑,我在这一步卡了半天,最后艰难通过代理git clone https://mirror.ghproxy.com/https://github.com/tensorflow/tensorflow.git下载到源码了)
下载完成后,进入到tensorflow的目录里:
cd tensorflow
第四步,配置configure
执行命令: ./configure
这一步很重要,不要选错
You have bazel 6.5.0 installed.
Please specify the location of python. [Default is /usr/bin/python3]:
确认你的python安装路径,没问题直接回车
Please input the desired Python library path to use. Default is [/usr/lib/python3/dist-packages]:
输入的你的python库文件路径,直接默认回车就行
Do you wish to build TensorFlow with ROCm support? [y/N]:
ROCm相当于就是A卡的cuda,如果用A卡加速就选y,我用CPU就选的N
Do you wish to build TensorFlow with CUDA support? [y/N]:
CUDA支持,N卡选y,我选的N
Do you want to use Clang to build TensorFlow? [Y/n]:
这一个很重要,问是否使用Clang编译,当然选y,参考第二步内容
Please specify the path to clang executable. [Default is /usr/lib/llvm-17/bin/clang]:
确认Clang的路径,默认回车就行
You have Clang 17.0.6 installed.
如果Clang安装成功并且地址正确就会出现以上这句回复。
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -Wno-sign-compare]:
这里默认回车
Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]:
这个选N
第五步,执行编译
这也是一个坑,最新的编译命令会直接打包好wheel文件,不要用//tensorflow/tools/pip_package:build_pip_package,这个会报错找不到target
正确编译命令:bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.1 --copt=-msse4.2 -k //tensorflow/tools/pip_package:wheel
整个编译过程前期会下载各种库,由于网络问题,一直超时报错,多执行几次编译命令把库下载到缓存就好了
最后一次报错:
FileNotFoundError: [Errno 2] No such file or directory: 'patchelf'
解决方法:sudo apt-get install patchelf
最后经过无数次失败,漫长的等待,最终出现INFO: Build completed successfully,代表编译成功。
第五步,安装
最后编译完毕的tensorflow已经打包好whl文件在./bazel-bin/tensorflow/tools/pip_package/wheel_house路径下,直接运行pip install ./bazel-bin/tensorflow/tools/pip_package/wheel_housetensorflow-2.18.0-cp310-cp310-linux_x86_64.whl
,不需要再进行打包操作。
完结