基于bazel源码编译tensorflow的CPU版本wheel包

避坑笔记,知识分享,原创不易,转载请注明。

在云端容器中部署tensorflow测试代码,简单使用pip安装tensorflow 2.9.1版本,安装成功。但是,import时报错如下:

The TensorFlow library was compiled to use SSE4.1 instructions, but these aren't available on your machine

错误原因是:pip安装的1.6及以上版本的tensorflow包,编译时默认开启了SSE优化选项,而云端服务器的CPU架构老旧,不支持此类型优化。因此,需要从源码重新编译tensorflow安装包。本文中,由于云端服务器的性能较弱,故在本地的CPU机器上编译。具体操作如下:

(1)环境:centos 7.9.2009,docker 23.0.1,python3.8,git 2.39.2,java 1.8.0,gcc 9.3.1,tensorflow 2.9.1,bazel 5.0.0

(2)硬件:bazel编译内存占用很大,利用CPU多线程能够加速编译;在80核机器上亲测编译大约需要80GB内存,耗时30min左右;

(3)Step1:为了不影响编译机本身的环境,故安装了docker,并启用一个centos7容器来做tensorflow的编译工作:

docker run -it --name=tf --network=host -v /home/:/home/ centos7_image_id /bin/bash

(4)Step2:安装miniconda,创建需要的python环境,并安装相关依赖:

conda create -n py38 python=3.8
conda activate py38
pip install numpy wheel
pip install keras_preprocessing --no-deps

(5)Step3:安装JDK8:

# 查找java包
yum search java
# 根据机器选择对应的版本
yum install java-1.8.0-openjdk-devel.x86_64
# 判断是否安装成功,保证java和javac都能运行
java -version
javac -version

(6)Step4:安装bazel:

bazel的版本和tensorflow版本的兼容关系可以参考:https://www.tensorflow.org/install/source?hl=zh-cn

不知道版本可以先任意装一个,在编译tensorflow时会报错并提示所需要的bazel版本。本文需要 5.0.0版本的bazel,从官网download后安装

# 默认安装即可,默认安装在/root/bin/目录下
bash bazel-5.0.0-installer-linux-x86_64.sh --user
# 将bazel软链接到PATH
cd /usr/local/bin/
ln -s /root/bin/bazel bazel

(7)Step4:安装gcc,为了安装9.0以上版本gcc并方便管理不同版本的gcc,建议安装devtoolset-9并使用scl工具管理:

# 安装SCL工具
yum install -y centos-release-scl centos-release-scl-rh
# 安装devtoolset-9
yum install -y devtoolset-9
# 激活环境
scl enable devtoolset-9 bash
# 查看gcc版本
gcc --version

(8)Step5:下载tensorflow源码并切换对应分支:

git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
git checkout v2.9.1

运行配置:

# 所有选项全部选 NO, 若需要包含各种优化配置,请自行google
./configure

开始编译:

bazel build -c opt --verbose_failures //tensorflow/tools/pip_package:build_pip_package

注意,这里编译的tensorflow不需要任何针对CPU的优化(因为本地机器和云端服务器的CPU版本有差异),否则本地编译的wheel包仍不能在云端服务器中import。因此编译时没有加入相应的编译选项,如:

# 自动检测CPU架构进行编译优化
--copt=-march=native 
# 为指定指令集生成浮点运算特性(优化浮点运算功能)
--copt=-mfpmath=both

如果在云端服务器直接编译,可以加上这些选项。编译过程中可能遇到第三方文件下载不成功的问题,建议手动下载所需版本并拷贝至对应的位置。漫长的编译后,显示以下类似信息即成功:

INFO: Build completed successfully, 87 total actions

编译成功后,运行

bazel-bin/tensorflow/tools/pip_package/build_pip_package your_target_dir/

就可以在 your_target_dir 目录下生成tensorflow的wheel包,然后就可以上传至云端并用pip安装了,亲测可以成功 import tensorflow 而不报错。

参考资料:

http://fancyerii.github.io/2020/11/16/centos-build-tf-en/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值