Sonnetをインストールしてみる（メモ）

#初めに
本記事を含めて基本的にはMacOSを利用していきます。
検証した環境が異なる場合には前提条件として記載を行うようにします。
今回の記事はGoogleのDeepMind社がリリースしたニューラルネットワークライブラリである
sonnetのインストールと実装を行なってみようと思います。

#sonnet とは
DeepMind社がリリースしたpython用ニューラルネットワークライブラリです。
社内で利用しているライブラリをオープンソースとしてリリースしたとのことです。
Tensorflowでもディープラーニングは出来るのですが、
Tensorflowをラップしてさらにディープラーニングを行いやすくしますよ的な位置づけなのかなぁと
個人的には思って居ます。
Sonnetの特徴としてはSonnet + Tensorflowでミックスして使える点にあるようです。
Tensorflowが裏で動くという意味ではKerasなどのライブラリもあると思いますが、
Kerasとの違いなんかもおっていければいいのかなぁなどと思って居ます。（公式でサポートして居たような...?）

#導入してみる
早速導入してみたいと思います。
ここから先は基本的に以下のURLを参考にします。
https://github.com/deepmind/sonnet

##bazelのインストールを行う
bazelはGoogle社がリリースしているbuildツールです。
Sonnetを利用する上で、必要になるbuildツールですので、
bazelのインストールを行います。以下はbazelのURL
https://bazel.build/
bazelにはJDK 8が必要になるようなので、事前に入れておきます。

```
brew cask install java 
```

JDKを入れた後、bazelをインストールします。

```
brew install bazel
```

## gitでSonnetをcloneする
Pythonにはpipというコマンドでライブラリを入れられるのですが、
sonnetはgitでcloneしてインストールしてねと記載があるので、gitでsonnetリポジトリをcloneします。

``` command
git clone --recursive https://github.com/deepmind/sonnet
```

## TensorflowのHeadersファイルを作成する？
git cloneでsonnetをcloneするとTensorflowもcloneされるらしいです。
sonnet用にTensorflowをsubmoduleとして持つらしいので、
githubの説明に則り、操作しておく

``` command
cd sonnet/tensordlow
./configure
```

configureすると以下のようなメッセージが出てくるので適宜、設定しておく。
今回はGoogle Cloud PlatformもHadoopも利用しないし、CUDAなども利用しないので基本的には全てSupport関連はNを選択。

```
Please specify the location of python. [Default is ]:
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]:
Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] N
No Google Cloud Platform support will be enabled for TensorFlow
Do you wish to build TensorFlow with Hadoop File System support? [y/N] N
No Hadoop File System support will be enabled for TensorFlow
Do you wish to build TensorFlow with the XLA just-in-time compiler (experimental)? [y/N] N
No XLA JIT support will be enabled for TensorFlow
Found possible Python library paths:
  path
Please input the desired Python library path to use.  Default is [path]

Using python library path: path
Do you wish to build TensorFlow with OpenCL support? [y/N] N
No OpenCL support will be enabled for TensorFlow
Do you wish to build TensorFlow with CUDA support? [y/N] N
No CUDA support will be enabled for TensorFlow
Configuration finished
```

これでheaderファイルができたはず。

##sonnetのbuildを行う
ここまでできたら、bazelを利用してbuildを行います。

```
mkdir /tmp/sonnet
bazel build --config=opt :install
```

インストール用のwhlファイルを生成する場所を作成しておきます。
その次にbazelを利用してbuildします。

```
INFO: From Linking sonnet/python/gen_resampler_py_wrapper_py_wrappers_cc [for host]:
clang: warning: argument unused during compilation: '-pthread'
Target //:install up-to-date:
  bazel-bin/install
INFO: Elapsed time: 704.528s, Critical Path: 667.50s
```

このようなメッセージが最後に出てくればbuildが完了していると思われます。

```
./bazel-bin/install /tmp/sonnet
pip install /tmp/sonnet/*.whl
```

これでpythonにsonnetが入ります。

##確認する
sonnetが無事に動くことを確認します。

```
>> import sonnet as snt
>> import tensorflow as tf
>> snt.resampler(tf.constant[.0], tf.constant[.0])
```

この時、動作しない可能性があります。
私が発生したエラーメッセージはこんな感じのエラーメッセージ

```error_messege.txt
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "sonnet/python/ops/resampler.py", line 65, in resampler
    raise ImportError("_gen_resampler could not be imported.")
ImportError: _gen_resampler could not be imported.
```

このようなメッセージが出てきた時は、一旦sonnetをアンインストール後、
再度、sonnetをpip installすることで動作する可能性があります。