FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Ubuntu on ZedBoardにTensorFlowをインストールして夢を見たい(と思い奮闘中)

Ubuntu on ZedBoard、コンソールが出るところまで到達し、とても感動している。さて、コンソールが出たら今度は何をやろう(ちゃんとGUIを立ち上げろ、というところではあるが)。

という訳で、最近流行りのTensorFlowだって、Ubuntuが動作しているんだからインストールできるはずだ!ということで無謀にもTensorFlow on ZedBoardに挑戦してみる。

注意!この記事では、結果的に未だTensorFlowの動作に成功していません。現在奮闘中です。

どのUbuntuを選択すべきか

前回の日記では、いくつかのUbuntuのバージョンイメージを用意し、GUIが動作するかを確かめてみたのだった。結果的には12.10と比較的古めのイメージがGUIが動きやすいということが分かったが、TensorFlowで必要なのはそこじゃない。 ちゃんとしたパッケージが動作することが必要なのだ。

まずは予備評価としていくつか必要なパッケージをインストールに挑戦した結果、12.10では動作しないことが分かってきた。という訳で、比較的新しいリリースであるUbuntu15.04(Vivid)を展開したイメージをZedBoardで走らせ、TensorFlowのインストールに挑戦してみよう。

以下のサイトのlinaro-vivid-gnome-20150618-705.tar.gzをRootFsに展開してZedBoardからブートした。

Linaro Releases

方法1. 普通にpipからインストールする

とりあえずは、簡単にパッケージでインストールできるならばそれに越したことはない。やってみよう。 TensorFlowにはWindows版とMac版があるが、x86って書いてあるぞ、やばいなあ。。。

sudo apt-get install python-pip python-dev
sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl

そもそもアーキテクチャが合ってないと怒られた。そりゃそうだ。

Mac版にはアーキテクチャの名前が記されていない。これは期待。

sudo pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.7.1-cp27-none-any.whl

問題無くインストールできた!

f:id:msyksphinz:20160228232318p:plain

実行してみよう。

~# python
Python 2.7.9 (default, Apr  2 2015, 16:04:32)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/__init__.py", line 23, in <module>
    from tensorflow.python import *
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/__init__.py", line 49, in <module>
    from tensorflow import contrib
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/__init__.py", line 23, in <module>
    from tensorflow.contrib import layers
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers/__init__.py", line 68, in <module>
    from tensorflow.contrib.layers.python.layers import *
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers/python/layers/__init__.py", line 22, in <module>
    from tensorflow.contrib.layers.python.layers.initializers import *
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/layers/python/layers/initializers.py", line 24, in <module>
    from tensorflow.python.ops import random_ops
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/random_ops.py", line 23, in <module>
    from tensorflow.python.framework import ops
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 39, in <module>
    from tensorflow.python.framework import versions
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/versions.py", line 22, in <module>
    from tensorflow.python import pywrap_tensorflow
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/pywrap_tensorflow.py", line 28, in <module>
    _pywrap_tensorflow = swig_import_helper()
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/pywrap_tensorflow.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow', fp, pathname, description)
ImportError: /usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so: invalid ELF header

あちゃー、やはりELFの形式が違うと動作しない。やはり、フルスクラッチからビルドしないとダメか。

方法2. TensorFlowのフルスクラッチビルドに挑戦する

TensorFlowのビルドには、以下のパッケージを必要とする。これらほ全て、ARMのアーキテクチャでビルドし直さないとだめだ。

  • Bazel
  • ProtoBuf

2.1 ProtoBufのビルド

ProtoBufのビルドのためには、やはりソースコードgithubから取得し、コンパイル、インストールする。

sudo apt-get install autoreconf
git clone https://github.com/google/protobuf
cd protobuf/src/
./autogen.sh
./configure --host=arm-linux CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++
make
make install
ldconfig

CCとCXXをarm-linux-gnueabihfにしているのがミソだ。インストールは成功した。やったぜ!

2.2 Bazelのビルド

Bazelも、ソースコードGithubからダウンロードしてビルドする。

git clone https://github.com/bazelbuild/bazel.git
cd bazel
cp /usr/local/bin/protoc ~/bazel/third_party/protobuf/protoc-linux-arm32.exe   # コレをコピーしないとインストールが進まない。
./compile.sh

しかし、途中で失敗した。

# ./compile.sh
INFO: You can skip this first step by providing a path to the bazel binary as second argument:
INFO:    ./compile.sh compile /path/to/bazel
🍃  Building Bazel from scratch../usr/lib/jvm/java-8-openjdk-armhf/bin/javac -classpath third_party/joda_time/joda-time-2.3.jar:third_party/jgit/org.eclipse.jgit-4.0.1.201506240215-r.jar:third_party/maven_model/maven-model-3.2.3.jar:third_party/maven_model/maven-aether-provider-3.2.3.jar:third_party/maven_model/maven-model-builder-3.2.3.jar:third_party/maven_model/maven-repository-metadata-3.2.3.jar:third_party/truth/truth-0.28.jar:third_party/java/jdk/langtools/javac.jar:third_party/java/jarjar/jarjar-1.4.jar:third_party/java/dd_plist/libdd_plist.jar:third_party/junit/junit-4.11.jar:third_party/apache_commons_collections/commons-collections-3.2.1.jar:third_party/hazelcast/hazelcast-client-3.5.4.jar:third_party/hazelcast/hazelcast-3.5.4.jar:third_party/android_common/com.android.tools.layoutlib_layoutlib_23.1.3.jar:third_party/android_common/com.android.tools.build_manifest-merger_23.1.3.jar:third_party/android_common/com.android.tools.build_builder-model_0.13.3.jar:third_party/android_common/com.android.tools_common_23.1.3.jar:third_party/android_common/com.android.tools_sdk-common_23.1.3.jar:third_party/android_common/com.android.tools.build_builder_0.13.3.jar:third_party/android_common/com.android.tools_sdklib_23.1.3.jar:third_party/tomcat_annotations_api/tomcat-annotations-api-8.0.5.jar:third_party/aether/aether-transport-classpath-1.0.0.v20140518.jar:third_party/aether/aether-spi-1.0.0.v20140518.jar:third_party/aether/aether-impl-1.0.0.v20140518.jar:third_party/aether/aether-api-1.0.0.v20140518.jar:third_party/aether/aether-connector-basic-1.0.0.v20140518.jar:third_party/aether/aether-transport-file-1.0.0.v20140518.jar:third_party/aether/aether-transport-http-1.0.0.v20140518.jar:third_party/aether/aether-util-1.0.0.v20140518.jar:third_party/aether/aether-transport-wagon-1.0.0.v20140518.jar:third_party/guava/guava-19.0.jar:third_party/guava/guava-testlib.jar:third_party/apache_commons_pool2/commons-pool2-2.3.jar:third_party/apache_commons_compress/apache-commons-compress-1.9.jar:third_party/asm/asm-5.0.4.jar:third_party/asm/asm-5.0.3.jar:third_party/asm/asm-util-5.0.4.jar:third_party/asm/asm-commons-5.0.4.jar:third_party/jimfs/jimfs-1.1-rc1.jar:third_party/plexus_component_annotations/plexus-component-annotations-1.6.jar:third_party/plexus_utils/plexus-utils-3.0.21.jar:third_party/apache_commons_logging/commons-logging-1.1.1.jar:third_party/jsr305/jsr-305.jar:third_party/hamcrest/hamcrest-core-1.3.jar:third_party/bytebuddy/byte-buddy-dep-0.7-rc6.jar:third_party/apache_velocity/velocity-1.7.jar:third_party/mockito/mockito-all-1.10.19.jar:third_party/xz/xz-1.5.jar:third_party/pcollections/pcollections-2.1.2.jar:third_party/ijar/test/libwrongcentraldir.jar:third_party/guice/guice-4.0-no_aop.jar:third_party/guice/guice-multibindings-4.0.jar:third_party/protobuf/protobuf-java-3.0.0-beta-1.jar:third_party/auto/auto-service-1.0-rc2.jar:third_party/auto/auto-value-1.0.jar:third_party/auto/auto-common-0.3.jar:third_party/error_prone/error_prone_core-2.0.9-20160129.jar:third_party/error_prone/error_prone_annotation-2.0.9-20160129.jar:third_party/error_prone/error_prone_annotations-2.0.9-20160129.jar:third_party/jsch/jsch-0.1.51.jar:third_party/maven/maven-settings-3.3.3.jar:third_party/maven/maven-settings-builder-3.3.3.jar:third_party/maven/maven-builder-support-3.3.3.jar:third_party/jformatstring/jFormatString-3.0.0.jar:third_party/slf4j/slf4j-api-1.7.7.jar:third_party/slf4j/slf4j-jdk14-1.7.7.jar:third_party/gson/gson-2.2.4.jar:third_party/plexus_interpolation/plexus-interpolation-1.22.jar:third_party/apache_httpclient/httpclient-4.2.5.jar:third_party/checker_framework_dataflow/dataflow-1.8.10.jar:third_party/apache_httpcore/httpcore-4.2.4.jar:third_party/apache_commons_codec/commons-codec-1.9.jar:third_party/jcip_annotations/jcip-annotations-1.0-1.jar:third_party/jsr330_inject/javax.inject.jar:: -sourcepath src/java_tools/singlejar/java/com/google/devtools/build/zip:src/main/java:src/tools/xcode-common/java/com/google/devtools/build/xcode/common:src/tools/xcode-common/java/com/google/devtools/build/xcode/util:/tmp/bazel.w4S4OI8D/src -d /tmp/bazel.w4S4OI8D/classes -source 1.8 -target 1.8 -encoding UTF-8 @/tmp/bazel.0E04mwWZ/param
src/main/java/com/google/devtools/build/lib/server/signal/InterruptSignalHandler.java:19: warning: Signal is internal proprietary API and may be removed in a future release
import sun.misc.Signal;
               ^
src/main/java/com/google/devtools/build/lib/server/signal/InterruptSignalHandler.java:20: warning: SignalHandler is internal proprietary API and may be removed in a future release
import sun.misc.SignalHandler;
               ^


The system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryError: Java heap space
        at com.sun.tools.javac.file.ZipFileIndex.readBytes(ZipFileIndex.java:380)
        at com.sun.tools.javac.file.ZipFileIndex.read(ZipFileIndex.java:359)
        at com.sun.tools.javac.file.ZipFileIndexArchive$ZipFileIndexFileObject.openInputStream(ZipFileIndexArchive.java:151)
        at com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:2508)
        at com.sun.tools.javac.jvm.ClassReader.complete(ClassReader.java:2440)
        at com.sun.tools.javac.jvm.ClassReader.access$000(ClassReader.java:76)
        at com.sun.tools.javac.jvm.ClassReader$1.complete(ClassReader.java:240)
        at com.sun.tools.javac.code.Symbol.complete(Symbol.java:574)
        at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1037)
        at com.sun.tools.javac.jvm.ClassReader.loadClass(ClassReader.java:2621)
        at com.sun.tools.javac.comp.Resolve.loadClass(Resolve.java:1896)
        at com.sun.tools.javac.comp.Resolve.findGlobalType(Resolve.java:1996)
        at com.sun.tools.javac.comp.Resolve.findType(Resolve.java:2074)
        at com.sun.tools.javac.comp.Resolve.findIdent(Resolve.java:2099)
        at com.sun.tools.javac.comp.Resolve.resolveIdent(Resolve.java:2373)
        at com.sun.tools.javac.comp.Attr.visitIdent(Attr.java:3138)
        at com.sun.tools.javac.tree.JCTree$JCIdent.accept(JCTree.java:2011)
        at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
        at com.sun.tools.javac.comp.Attr.attribType(Attr.java:628)
        at com.sun.tools.javac.comp.Attr.attribType(Attr.java:621)
        at com.sun.tools.javac.comp.Attr.visitTypeApply(Attr.java:3879)
        at com.sun.tools.javac.tree.JCTree$JCTypeApply.accept(JCTree.java:2135)
        at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
        at com.sun.tools.javac.comp.Attr.attribType(Attr.java:628)
        at com.sun.tools.javac.comp.Attr.attribType(Attr.java:621)
        at com.sun.tools.javac.comp.Attr.attribAnyTypes(Attr.java:677)
        at com.sun.tools.javac.comp.Attr.attribTypes(Attr.java:685)
        at com.sun.tools.javac.comp.Attr.visitTypeApply(Attr.java:3882)
        at com.sun.tools.javac.tree.JCTree$JCTypeApply.accept(JCTree.java:2135)
        at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
        at com.sun.tools.javac.comp.Attr.attribType(Attr.java:628)
        at com.sun.tools.ja
root@linaro-gnome:~/bazel#

リソース不足?メモリ不足か?

ちゃんとログを取っていなかったのも問題だが、これはGNOME版なので、かなりのリソースを食っているに違いない。メモリの量を節約するために、同じVividでもNano版を使えばうまくいくのかもしれない。 挑戦してみよう。