32 位 Linux 上的 TensorFlow?

TensorFlow on 32-bit Linux?

是否有适用于 32 位的 TensorFlow 版本Linux?我只看到 64 位轮盘可用,并没有在网站上找到任何相关信息。

我们只在 64 位 Linux 和 Mac OS X 上测试了 TensorFlow 发行版,并且仅为这些平台分发二进制包。尝试按照 source installation instructions 为您的平台构建版本。

编辑: 一位用户发布了 instructions for running TensorFlow on a 32-bit ARM processor,这对其他 32 位架构来说很有希望。这些说明可能具有使 TensorFlow 和 Bazel 在 32 位环境中工作的有用指示。

看来 Google 还不支持 32 位机器上的 tensorflow。

在32位机器上运行Centos 6.5,执行"import tensorflow as tf"命令后出现如下错误: ImportError: tensorflow/python/_pywrap_tensorflow.so: 错误的 ELF class: ELFCLASS64

在 Google 分发 32 位版本的 tensorflow 之前,我还建议从指定的源构建 tensorflow here

我在 32 位 Ubuntu (16.04.1 Xubuntu) 上构建了一个仅 CPU 版本的 TensorFlow。这么复杂的库官方不支持32位架构,比预想的顺利很多

这可以通过遵循这两个指南的交集的子集来完成:

如果我没有忘记任何事情,以下是我采取的步骤:

  1. 安装 Oracle Java 8 JDK:

    $ sudo apt-get remove icedtea-8-plugin  #This is just in case
    $ sudo add-apt-repository ppa:webupd8team/java
    $ sudo apt-get update
    $ sudo apt-get install oracle-java8-installer
    

(这是您在原始 Xubuntu 安装中所需要的全部,但 google 上面的关键字,否则,请阅读有关选择默认 JRE 和 javac 的信息。)

  1. 依赖关系:

    sudo apt-get update
    sudo apt-get install git zip unzip swig python-numpy python-dev python-pip python-wheel
    pip install --upgrade pip
    
  2. 按照 the instructions that come with Bazel,下载一个 Bazel 源 zip(我得到 bazel-0.4.3-dist.zip),创建一个类似 ~/tf/bazel/ 的目录并在那里解压。

  3. 我在接下来的构建过程中得到了一个 OutOfMemoryError,但是 this fix 处理了它(即为 bootstrap 添加 -J-Xmx512m构建).

  4. 打电话给bash ./compile.sh,等了好久(我等了一晚上,但是看到最后的备注)

  5. $ git clone -b r0.12 https://github.com/tensorflow/tensorflow

  6. 这似乎是对源代码唯一必要的更改!

    $ cd tensorflow
    $ grep -Rl "lib64"| xargs sed -i 's/lib64/lib/g'
    
  7. 然后$ ./configure然后对所有事情说。 (接受相关的默认值。)

  8. 我的设置花了好几个小时:

    $ bazel build -c opt --jobs 1 --local_resources 1024,0.5,1.0 --verbose_failures //tensorflow/tools/pip_package:build_pip_package
    $ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
    $ pip install --user /tmp/tensorflow_pkg/ten<Press TAB here>
    

要查看它是否已安装,请查看它是否适用于 TensorFlow Beginners tutorial。我使用 jupyter qtconsole(即 IPython 的新名称)。 运行中的代码mnist_softmax.py。即使在非常有限的机器上也应该花费很少的时间。

出于某种原因,TensorFlow's guide to building from source doesn't suggest

$ bazel test //tensorflow/...

(是的,输入省略号。)

虽然我不能 运行 他们 — 它花了 19 个小时试图 link libtensorflow_cc.so,然后一些东西杀死了 linker。这是半个核心和 1536 MB 内存限制。也许拥有更大机器的其他人可以报告单元测试的进展情况。

为什么我们不需要做那两个演练中提到的其他事情?首先,大部分工作都是关于处理 GPU 接口。其次,自第一个演练编写以来,Bazel 和 TensorFlow 都变得更加独立。

请注意,为构建 Bazel 提供的上述设置非常保守(1024 MB RAM,半个内核,一次一个作业),因为我运行通过 VirtualBox 使用英特尔为委内瑞拉、巴基斯坦和尼日利亚的弱势儿童生产的 200 美元上网本的单核。 (顺便说一句,如果你这样做,请确保虚拟 HDD 至少为 20 GB — 尝试构建上面的单元测试需要大约 5 GB space。)轮子的构建花费了将近 20小时和从 the second tutorial 到 运行 在现代桌面 CPUs 上需要半小时的适度深度 CNN,在此设置下需要大约 80 小时。有人可能想知道为什么我没有台式机,但事实是,使用 TensorFlow 进行实际训练只在高端 GPU(或一组)上才有意义,而我们什么时候可以租用具有此类 GPU 的 AWS 现场实例以每小时 10 美分的价格,在没有承诺的情况下,在可行的临时基础上,在其他地方接受培训没有多大意义。 480000% 的加速非常明显。另一方面,本地安装的便利性非常值得经历上述过程。

我已经使用了这个问题的回复中的信息并生成了一个详细的说明列表来在 32 位 linux 系统中编译和安装 tensorflow。

最新版本的说明可在 github 中找到:tensorflow-32-bits-linux

在 32 位 linux 系统中安装 Tensorflow 的说明

我使用以下步骤在旧的 Asus Eee-Pc 1000H 中安装了 tensorflow。当然,它已从原来的 1 GB RAM 和 80 GB HDD 升级到 2 GB RAM 和 480 GB SSD 存储。

我使用以下 OS 版本测试了这些说明,并且没有问题: * Xubuntu 16.04.6 Xenial Xerus 32 位。 * Xubuntu 18.04.3 Bionic Beaver 32 位。 * Debian 9.11 Stretch 32 位。

选择方便的linux系统

我已经用 2 GB 内存测试了 Ubuntu 16.04 (Xenial) 和 Debian 9.11 (Stretch) 系统。

我将系统设置为具有 4 GB 的 SWAP space。只有 1 GB 的 SWAP,一些编译失败。

重要的是该发行版具有 Java SDK 的版本 8:openjdk-8-jdk

安装 Java 8 SDK 和构建工具

sudo apt-get update
sudo apt-get install openjdk-8-jdk
sudo apt-get install git zip unzip autoconf automake libtool curl zlib1g-dev swig build-essential

安装 Python 库

接下来,我们安装python 3个开发库和tensorflow需要的keras模块。

sudo apt-get install python3-dev python3-pip python3-wheel
sudo python3 -m pip install --upgrade pip
python3 -m pip install --user keras

您可以使用 python 3 或 python 2 并为该版本编译 tensorflow。

从源代码安装和编译 Bazel

我们需要源代码 bazel 0.19.2 发行版。我们可以获得它并安装在一个新的文件夹中。

cd $HOME
wget https://github.com/bazelbuild/bazel/releases/download/0.19.2/bazel-0.19.2-dist.zip
mkdir Bazel-0-19.2
cd Bazel-0-19.2
unzip ../bazel-0.19.2-dist.zip

在编译之前,我们需要删除 ./src/tools/singlejar/mapped_file_posix.inc 文件的第 30 行 (#error This code for 64 bit Unix.) 如果我们不在 64 位机器中。这个 bazel 版本在 32 位中工作正常。

vi  ./src/tools/singlejar/mapped_file_posix.inc

我们还需要增加 Bazel 可用的 java 内存并开始编译它。

export BAZEL_JAVAC_OPTS="-J-Xmx1g"
./compile.sh

完成后(可能需要几个小时),我们将 bazel 编译的可执行文件移动到当前用户路径中的某个位置

sudo cp output/bazel /usr/local/bin

从源代码编译 Tensorflow

创建一个文件夹并将 tensorflow 的 1.13.2 版本克隆到其中。从 1.14 版本开始,tensorflow 使用 Intel MKL DNN 优化库,它只适用于 64 位系统。所以 1.13.2 是 运行 32 位的最后一个版本。

cd $HOME
mkdir Tensorflow-1.13.2
cd Tensorflow-1.13.2
git clone -b v1.13.2 --depth=1 https://github.com/tensorflow/tensorflow .

在编译之前,我们将对 64 位库的引用替换为 32 位库。

grep -Rl "lib64"| xargs sed -i 's/lib64/lib/g'

我们开始tensorflow配置。我们需要明确禁止使用在 32 位系统上不可用或不支持的几个可选库。

export TF_NEED_CUDA=0
export TF_NEED_AWS=0
./configure

我们必须考虑以下因素: * 当要求指定 python 的位置时。 [默认为/usr/bin/python]:我们应该响应/usr/bin/python3使用python 3。 * 当要求输入想要使用的 Python 库路径时。默认是 [/usr/local/lib/python3.5/dist-packages] 我们只是按 Enter * 我们应该对所有 Y/N 个问题做出 N 的回答。 * 当要求在指定 bazel 选项“--config=opt”时指定编译期间使用的优化标志 [默认为 -march=native -Wno-sign-compare]:只需按 Enter

现在我们开始编译 tensorflow,禁用 aws、kafka 等可选组件

bazel build --config=noaws --config=nohdfs --config=nokafka --config=noignite --config=nonccl -c opt --verbose_failures //tensorflow/tools/pip_package:build_pip_package

如果一切顺利,现在我们生成 pip 包。

bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

然后我们安装 pip 包

python3 -m pip install --user /tmp/tensorflow_pkg/tensorflow-1.13.2-cp35-cp35m-linux_i686.whl

测试tensorflow

现在我们 运行 一个小测试来检查它是否有效。我们创建一个包含以下内容的 test.py 文件:

import tensorflow as tf

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)

而我们运行测试

python3 test.py

这是输出

Epoch 1/5
60000/60000 [==============================] - 87s 1ms/sample - loss: 0.2202 - acc: 0.9348
Epoch 2/5
60000/60000 [==============================] - 131s 2ms/sample - loss: 0.0963 - acc: 0.9703
Epoch 3/5
60000/60000 [==============================] - 135s 2ms/sample - loss: 0.0685 - acc: 0.9785
Epoch 4/5
60000/60000 [==============================] - 128s 2ms/sample - loss: 0.0526 - acc: 0.9828
Epoch 5/5
60000/60000 [==============================] - 128s 2ms/sample - loss: 0.0436 - acc: 0.9863
10000/10000 [==============================] - 3s 273us/sample - loss: 0.0666 - acc: 0.9800

享受你的新 Tensorflow 库!!