【问题标题】:Bazel cross compile of tensorflow for ARM fails用于 ARM 的 tensorflow 的 Bazel 交叉编译失败
【发布时间】:2019-02-04 22:02:16
【问题描述】:

我正在尝试构建 tensorflow 以在 Zynq,特别是 Z7020 上运行。我在板上运行 petalinux 和 python 3.4.9。尝试按照此处找到的说明构建张量流时:[https://www.tensorflow.org/install/install_raspbian#cross-compiling_from_sources] 请注意,petalinux 和 raspbian 都是 Debian 衍生产品,Z7020 具有与 raspberry-pi 0 和 1 系列板相同的 CortexA9 内核。

我正在尝试在 Ubuntu 16.04 主机上构建。我用来构建的命令是:

sudo CI_DOCKER_EXTRA_PARAMS="-e CI_BUILD_PYTHON=python3 -e CROSSTOOL_PYTHON_INCLUDE=/home/rklein/Python-3.4.9/Include" tensorflow/tools/ci_build/ci_build.sh PI-PYTHON3 tensorflow/tools/ci_build/pi/build_raspberry_pi.sh PI_ONE

Bazel 搅动了大约 2 小时,然后返回以下错误消息:

    /home/rklein/tensorflow/bazel-ci_build-cache/.cache/bazel/_bazel_root/eab0--lots of hex digits--85e8/external/arm_compiler/bin/arm-linux-gnueablhf-gcc --lots of options

    In file included from /usr/include/python2.7/Python.h:8:0, from ./tensorflow/python/lib/core/bfloat16.h:19, 
                     from tensorflow/python/lib/core/bfloat16.h:18:
                     from /usr/include/python2.7/pyconfig.h:13:54: 
    fatal error: arm-linux-gnueabihf/python2.7/pyconfig.h: No such file or directory
    #include <arm-linux-gnueabihf/python2.7/pyconfig.h>
                                                       ^
    compilation terminated.

告诉 Bazel 使用 python3 需要哪些设置?请注意,主机上没有 /usr/include/python2.7 目录,所以我怀疑巴塞尔在幕后做了一些巫术。命令

find ~ -name python2.7

空出来的。

我已尝试尽可能多地阅读 Bazel,但文档似乎很精简 - 任何好的参考资料将不胜感激。

【问题讨论】:

    标签: python tensorflow arm bazel zynq


    【解决方案1】:

    我无法帮助您解决错误消息(或完全是 Bazel)。但是,我将 TensorFlow 安装在具有 Petalinux 内核和 Ubuntu (arm64) 根文件系统的 Xilinx Zynq Ultrascale+ 上。它不是完全相同的芯片(但安装过程应该相似)。我没有自己构建 TensorFlow,而是使用了tensorflow-on-arm 项目提供的包。也许我的经验对其他人运行 TensorFlow 会有所帮助:

    1. 您需要一个正常工作的操作系统(Xilinx 有这方面的文档)。根据您的芯片,您需要 32 (armhf) 或 64 位 (arm64) rootfs。我使用的是 Ubuntu rootfs,所以我可以使用 apt-install。

    2. 您需要安装一些依赖项。我按照tensorflow-on-arm 项目的说明进行操作。
      apt-get install openjdk-8-jdk automake autoconf curl zip unzip libtool swig libpng12-dev zlib1g-dev pkg-config git g++ wget xz-utils

    3. 您还需要 Python(请务必安装 Python v3.5 - 而不是 Python v3.6 等)。
      apt-get install python3-numpy python3-dev python3-pip python3-mock

    4. 我还需要安装两个未列出的软件包。
      apt-get install cython3 libhdf5-dev

    5. 安装一些 pip3 包(您可能希望在虚拟环境中安装这些包并更新 pip3)。
      pip3 install -U --user keras_applications==1.0.5 --no-deps
      pip3 install -U --user keras_preprocessing==1.0.3 --no-deps
      pip3 install -U --user numpy grpcio h5py

    6. 现在您应该下载 TensorFlow pip 包。 Releases 下列出了不同的软件包。我为 Python v3.5 和 arm64 / aarch64 选择了 TensorFlow v.1.12。
      wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.12.0/tensorflow-1.12.0-cp35-none-linux_aarch64.whl

    7. 现在您可以使用 pip3 安装该软件包。
      pip3 install -U --user tensorflow-1.12.0*

    我希望它对你有用!

    【讨论】:

    • 感谢您的信息。你能告诉我你是如何在 peta-linux 内核上运行 ubuntu 磁盘映像的吗?如何确保两个分布之间的正确性?我假设您为 Xilinx 开发板创建了一个比特流,将两个发行版合二为一。你是怎么做到的?任何细节将不胜感激。谢谢,
    • 我非常关注这个tutorial。简而言之:首先我用 petalinux 创建一个内核。我将创建的文件 BOOT.BIN 和 image.ub 放在我的 SD 卡的 BOOT 分区中。然后我将 rootfs(来自教程)放在第二个分区中。据我所知,它是一个定制的 Ubuntu 核心 rootfs。 Xilinx 也有一些关于它的信息。
    • 我无法告诉你这个过程有多正确。但是,对于我的小项目,它运行良好。我最大的问题是从 ARM 32 位到 64 位 rootfs 的转换(我使用了 Zynq Ultrascale+,但大多数教程都是为 Zynq 7000 编写的)。对我来说,最大的优势是之后我可以使用 apt-get。出于好奇:过去几个月你的解决方案是什么?
    • 我仍然无法解决这个问题。具体来说,我确实需要能够为 ARM 系统重建张量流,而不是使用其他人的。我无法让 google/tensorflow 的任何人对此做出回应。但是能够在 Xilinx Zynq UltraScale 上运行其他人的 ARM 端口对我有很大帮助。非常感谢本教程的指针。 apt-get 的使用能力非常强大。
    • 经过大量研究后,我得出结论,ARM 的交叉编译张量流已(或至少已)损坏。获得 ARM 端口的唯一方法是本地编译。当然,问题在于 Bazel 带来的大量依赖项,所有这些依赖项都需要为目标平台提供或构建。因此,尝试在受限的 ARM 平台上执行此操作是困难和不可能的。
    猜你喜欢
    • 2015-06-11
    • 1970-01-01
    • 2022-10-18
    • 2021-02-26
    • 1970-01-01
    • 2023-03-16
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多