避坑笔记,知识分享,原创不易,转载请注明。
在云端容器中部署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 而不报错。
参考资料: