機械学習をやるためのライブラリであるTensorflowにScalaバインディングが作られているのを知った。
機械学習で大儲けしたいので、ちょっと触ってみることにした。
インストール
公式マニュアルのバージョン情報更新が滞っているが、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 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
が動いている雰囲気だけど何が起こっているのかよくわからない。
調べたところ、要するに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
とりあえずドキュメント通りに進めてみる。
ドキュメントがやや雑なのでこのクラスどこにあるんだよという感じで読解しなければならないが、以下のようにして最初のサンプルが動作する。
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
なんかめちゃくそ怒られているが、動いているからヨシ!