很多时候为了方便图省事,是通过pip安装TensorFlow的,然而很不幸运行的服务器不支持AVX指令,引入模块的时候会报错:
The TensorFlow library was compiled to use AVX instructions, but these aren’t available on your machine.
这种时候没办法了,需要自己编译了。编译必须Bazel,而Bazel推荐用Bazelisk安装。
安装Bazelisk
前往Bazelisk,下载最新可执行文件:
上传bazelisk-linux-amd64
到/usr/local/bin
下。改名bazel,赋予执行权限:
chmod +x bazel
之后确保将bazel加入到PATH
中。
安装Python
确保安装了正确版本的Python,并且安装了开发包(本例TensorFlow 2.11.0对应Python版本是3.9.13):
# 检查Python版本
python -version
# 检查是否安装了开发包(重要!你也不想编译一个多小时突然报错找不到Python文件吧)
find / -name Python.h 2>/dev/null
# 安装开发包
sudo yum install python3-devel
配置环境变量:
# 根据实际修改,该目录下需要包含Python.h
export PYTHON_INCLUDE_PATH=/usr/include/python3.9
安装依赖
pip install -U --user pip numpy wheel
pip install -U --user keras_preprocessing --no-deps
这些依赖的版本与TensorFlow的版本有关。
以TensorFlow2.11.0为例,这个版本已经比较老了,应该指定numpy版本为1.26.4,新版numpy 2.0.2与旧版tensorflow不兼容:
pip install -U --user numpy==1.26.4
版本对应关系没有参考资料,只能根据发布时间和零星的github issue摸索。
更搞笑的是,还有降依赖的情况,例如2.11.0允许依赖numpy 1.26.4,但是2.12.0必须numpy<1.24,参考这里。
安装TensorFlow
前往TensorFlow,下载源码:
本例是tensorflow-2.11.0.tar.gz
。
然后上传tensorflow-2.11.0.tar.gz
并解压,cd到解压后的源码根目录,运行:
./configure
接下来会询问若干配置,没有特殊需求的话,尽量都选no然后回车,否则编译时有可能报错。
注意./configure询问Python位置时,默认是软链接/usr/bin/python3
请替换为实际可执行文件,例如/usr/bin/python3.9,否则编译时会报错找不到Python.h,参考这里。
另外,请确保指定了正确的python lib路径(例如/usr/local/lib/python3.9/site-packages)。
必须能在指定目录下找到numpy、wheel和keras_preprocessing的包。
然后开始用bazel编译:
bazel build --local_ram_resources=2048 //tensorflow/tools/pip_package:build_pip_package
需要等待极漫长的时间,配置差的话可能要数小时,耐心等待。
完成后,构建.whl:
./bazel-bin/tensorflow/tools/pip_package/build_pip_package --nightly_flag /tmp/tensorflow_pkg
项目pip安装:
# 此处根据实际的生成结果修改
pip install /tmp/tensorflow_pkg/tensorflow-2.11.0.whl