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からブートした。
方法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
問題無くインストールできた!
実行してみよう。
~# 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版を使えばうまくいくのかもしれない。 挑戦してみよう。