基于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/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译TensorFlow的过程比较复杂,需要在你的设备上安装一些依赖项和工具,然后执行一系列命令。以下是基本的步骤: 1. 安装依赖项:在Ubuntu上,可以执行以下命令安装必要的依赖项: ``` sudo apt-get install python3-numpy python3-dev python3-pip python3-wheel libhdf5-dev libc-ares-dev libeigen3-dev libatlas-base-dev libopenblas-dev libblas-dev liblapack-dev cython3 ``` 2. 下载TensorFlow源代码:可以从GitHub上下载最新的TensorFlow源代码: ``` git clone https://github.com/tensorflow/tensorflow.git cd tensorflow git checkout r1.15 ``` 3. 配置编译选项:可以使用TensorFlow的配置脚本自动生成编译选项。对于armv7l架构,可以执行以下命令: ``` ./configure ``` 在配置过程中,你需要设置一些选项,例如Python解释器的路径、Bazel的路径等。如果你不确定如何设置这些选项,可以按Enter键接受默认值,或参考TensorFlow官方文档中的指南。 4. 编译TensorFlow:执行以下命令开始编译TensorFlow: ``` bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package ``` 这个过程可能需要几个小时才能完成,具体时间取决于你的设备性能。编译完成后,你可以使用以下命令生成离线: ``` bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg ``` 该命令将创建一个名为“tensorflow-xxx-cp3x-cp3x-linux_armv7l.whl”的离线,其中“xxx”是TensorFlow版本号。你可以将这个离线复制到你的设备上,然后使用pip安装它: ``` pip install tensorflow-xxx-cp3x-cp3x-linux_armv7l.whl ``` 请注意,这只是TensorFlow编译的基本步骤,你可能需要根据自己的需要进行更改和调整。如果你需要更详细的指导,请参考TensorFlow官方文档中的指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值