Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Tensorflow Scalaで遊んだ記録その1(インストール〜初回動作)

機械学習をやるためのライブラリであるTensorflowにScalaバインディングが作られているのを知った。

platanios.org

機械学習で大儲けしたいので、ちょっと触ってみることにした。

インストール

platanios.org

公式マニュアルのバージョン情報更新が滞っているが、Mavenを見たところ最新バージョンは 0.6.5 だったのでこれを採用した。

libraryDependencies += "org.platanios" %% "tensorflow" % "0.6.5" classifier "linux"

また、 classifier には本来 classifier "linux-cpu-x86_64" みたいな識別子を指定することになっているのだが、Mavenを見たところ linux ってやつしか無いようだったのでそれを使った。

Tensorflow自体のビルド

Tensorflow自体は別のライブラリなので、ビルドしてやる。

$ git clone git@github.com/tensorflow/tensorflow.git tensorflow
$ cd tensorflow
$ ./configure
Cannot find bazel. Please install bazel/bazelisk.

Bazelがないので入れる。

bazel.build

Bazel Linux、macOS、Windows に Bazel をインストールするには、Bazelisk をおすすめします。

とのことなのでBazeliskを入れる。なぜかスロットを思い出す。

$ wget https://github.com/bazelbuild/bazelisk/releases/download/v1.15.0/bazelisk-linux-amd64
$ mv bazelisk-linux-amd64 ~/bin/bazelisk
$ chmod u+x ~/bin/bazelisk

で? bazelisk を実行しても bazel が動いている雰囲気だけど何が起こっているのかよくわからない。

www.flywheel.jp

調べたところ、要するにbazeliskはbazelのラッパーで、適切なバージョンのbazelを呼び出してくれるらしい。なるほど。

というわけでtensorflowのディレクトリに戻って...

$ cd tensorflow
$ ./configure

途中でPythonの場所を聞かれたけどたぶんシステムインストールされてるやつが指定された。多分それでよいと思う・・・。他にもいろいろ聞かれるけれど、CUDA使わないなら基本的にデフォルト連打でよいと思う。 今は実家にいるのでCUDAがあるマシンがないんだよね。

あとはマニュアル通りにbazelでビルドする。今回はbazeliskがラッパーなので、bazelのかわりにbazeliskと書く。

$ bazelisk build --config=opt --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 //tensorflow:libtensorflow.so

ここでめちゃくちゃ待つ。

/usr/include/bits/string_fortified.h:59:10: error: '__builtin_memset' may write between 16 and 2147483647 bytes into a region of size 15 [-Werror=stringop-overflow=]
   59 |   return __builtin___memset_chk (__dest, __ch, __len,
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   60 |                                  __glibc_objsize0 (__dest));
      |                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~

コケた。

あきらめて、pip3 経由でインストールする。

$ pip3 install tensorflow

また、protobuf compilerが必要とのことだったので、多分これだろうというパッケージを入れておいた。

$ sudo zypper in protobuf-devel

Tensors

とりあえずドキュメント通りに進めてみる。

platanios.org

ドキュメントがやや雑なのでこのクラスどこにあるんだよという感じで読解しなければならないが、以下のようにして最初のサンプルが動作する。

import org.platanios.tensorflow.api.tensors.Tensor
import org.platanios.tensorflow.api.core.Shape

object Hello extends App {
  val tensor = Tensor.zeros[Int](Shape(2, 5))
  println(tensor.summarize())
}
sbt:tensorflow-scala-exercice> run
[info] running example.Hello 


2022-12-28 23:59:07.702875: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません
2022-12-28 23:59:07.702912: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
2022-12-28 23:59:10.226484: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-12-28 23:59:10.226904: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set
2022-12-28 23:59:10.227332: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません
2022-12-28 23:59:10.227351: W tensorflow/stream_executor/cuda/cuda_driver.cc:326] failed call to cuInit: UNKNOWN ERROR (303)
2022-12-28 23:59:10.227378: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (localhost.localdomain): /proc/driver/nvidia/version does not exist
Tensor[Int, [2, 5]]
[[0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0]]
[success] Total time: 35 s, completed 2022/12/28 23:59:10

なんかめちゃくそ怒られているが、動いているからヨシ!

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?