Swift for TensorFlowを触る

 すっごい久しぶりのブログ更新です。最近になって、Swift for TensorFlowのmacOS向けpre-builtパッケージが一応リリース扱いになったり、Colabで利用できるようになったり、今週予定されているTensorFlow Dev Summit 2019の初日のトリにSwift for TensorFlowが予定されていたりと最近開発が活発化してきているので、自称 日本で唯一Swift4TFを最初期から追っかけてきた人間 としては嬉しい限りです。

 この記事の目的は、Swift for TensorFlowを簡単に触れてみたり、自分がぶち当たった問題等をまとめておくことです。

Swift for TensorFlowとは

 GoogleがSwiftの始祖 Chris Lattner氏をとっ捕まえてきてAppleの Swift言語を拡張する形でTensorFlowを統合した新しいプログラミング言語

Swift for TensorFlow is a next-generation platform for machine learning, incorporating the latest research across: machine learning, compilers, differentiable programming, systems design, and beyond.

と宣言してるのかなり野心的なプロジェクト。

 なお、Swiftのフォークとして現在開発されているが、このプロジェクトの成果物は最終的に元のSwift言語に還元されるらしい。

 コーディングはTensorFlow EagerやPyTorchのようなDefine by Run風。コードを書くとコンパイラが自動的にグラフに変換してくれる。 TensorFlow 2.0の @tf.function に近い(?)

 詳しくは、プロジェクトページ のREADMEとかdocs をみて欲しい。

 今後記事を書く予定であるが、Swift for TensorFlowのAPIPython版TFより見やすいと言うかPyTorchっぽい雰囲気になってる。 まあ、Chris Lattnerがプロジェクトのボスなので汚いAPIになるはずがない

Swift for TensorFlowの下準備

 Swift4TFのインストーラは、GitHubのプロジェクトページmacOS向けとUbuntu向けの2種類が公開されています。今回は、macOS向け Kind: Release, Ver: 0.2 を使います。

 インストールの手順は、プロジェクトページの該当記事を参考にしてもらい、これに加えSwift4TFの目玉機能の一つである Python Interoperability の準備をします。

 この機能は端的に言うとSwift言語上でPythonのライブラリを import してSwiftのライブラリとして使ってしまおうというもの。(まあ、Swiftの数値計算ライブラリなんてマイナーだし、下手に新しく作るくらいならNumPy使えたら楽だしね笑)

 

// NumPyを使った例
import Python
let np = Python.import("numpy")
let a = np.linspace(-5, 5)
let b = np.arange(Python.len(b))

 

 当然、Swiftはコンパイラ言語なのでNumPyやらMatplotlibを読み込んだ状態で実行ファイルを吐かせる事というロマンも可能!

Swift for TensorFlowの為のPythonの準備

 Swift4TFではPython 2系、3系双方に対応しています。ここでは、Python 3系を使う前提で話を進めます。

 macOSは2019年3月時点で、Python 3系のインタプリタがデフォルトではないのでこっちで用意してあげなければなりません。Homebrew もしくは Python公式ページからダウンロードしてきます。 今回はPython 3.6を使います。

 

AnacondaでインストールしたPythonを使ってるけどダメなの?

ダメ。と言うか無理。

Swift for TensorFlowで、Pythonを使う場合、

  • 2系の場合 /System/Library/Frameworks/Python.framework/Versions/2.7/ 以下
  • 3系の場合 /Library/Frameworks/Python.framework/Versions/3.6/lib/ 以下

を参照します。(pipでインストールしたライブライの場合は site-packages の中身を参照)

 Anacondaを使っている場合は、別のディレクトリにライブラリ等がインストールされているのでそもそも動かない。  

Python Interoperabilityを使う

 Swift4TFとPython 3がインストールをインストールしたら早速SwiftのREPL(インタプリタモード)を使ってPythonライブライをいじってみましょう。

 ターミナルで swift を起動し、Welcome to Swift version 5.0-dev になってることを確認して以下のコードを実行してください。

 

import Python
PythonLibrary.useVersion(3, 6)
let np = Python.import("numpy")
let plt = Python.import("matplotlib.pyplot")

let a = np.linspace(-5, 5)
let b = np.arange(Python.len(a))

plt.plot(a, b)
plt.show()

 

 NumPyとMatplotlibを使ってグラフを表示される簡単なコードです。ご覧のようにほぼPythonです。

 ここで、一番重要なの2行目の PythonLibrary.useVersion(3, 6) です。Python 2系と3系が混在しているので、これを実行しないと クラッシュします。

 

plt.show() を実行したら Windowは表示されたが真っ白 or 真っ黒

こちらのサイトを参考にしてみてください。

murabitoleg.com

(ただ、 empty dSYM file detected, dSYM was created with an executable with no debug info. と警告が出るようになった...)  

コンパイルする

 先のコードをコンパイルしてみます。 plt.swift と言う名前のファイルを作って先のコードを書き込んでおきます。

ターミナルで

swiftc -O -sdk `xcrun --show-sdk-path` plt.swift

を実行するとコンパイル可能です。

f:id:Hiro2201:20190304111335p:plain
コンパイルした plt.swift を実行した様子。

 実行ファイルを開くと Matplotlib の画面が開くのはロマン(笑) ただ、この実行ファイルを他所に配布してもちゃんと動作するのかはまだ試してない。

Google Colaboratory を使ってSwift4TF を触る。

 なんかインストールしなきゃいけないとか面倒臭いと思う方は諦めてColabを使ってくれ。 (普通にColabにつないでランタイムを変更するだけじゃSwift4TFを使えないので、注意)

colab.research.google.com

 

 もし、Linuxで S4TF を使いたい方は、S4TFのDeepLearning LibraryのページでCUDA:10をベースにしたDockerfileが公開されているのでそれを使ってみては?

次回は高レベルAPIを使ってMNISTか何かをやる予定 時期未定

 

 

TensorFlow、Metal対応するって言ってたけどいつするの? developer.apple.com

 

 

かぐや様尊い

ラブ・ドラマティック feat. 伊原六花

ラブ・ドラマティック feat. 伊原六花

  • 鈴木 雅之
  • R&B/ソウル
  • ¥250