aws g2インスタンスでtensorflowをGPUサポートで動作させる

概要

機械学習をやる機会があり、巡り巡って こちら の word-rnn を tensorflow 上で動作させるものにめぐりあいました。

学習をするにあたって入力データがそれなりの量になってくると学習に時間がかかり、現実的な時間では終了しません。
そこで色々調べてみると tensorflow には GPUをサポートする機能があり、それによって処理の高速化が図れるようです。
GPUは通常名前のごとくグラフィック処理用の演算装置ですが、その演算処理が機械学習にも応用できるということですね。

今回はそれをaws環境で実行するべく、グラフィックボードを持つg2タイプのインスタンスで動かすことを目標としました。

先人たちの遺産について

一年くらい前から同じようなことをやろうとしていた人たちの記事が結構色々出てきます。
日本でのドキュメントもそこそこ出てきます、が初めから断言しておきますと、かなりの記事がもはや古くなりすぎていて参考になりません

このあたりの流れが非常に早く、現在では随分具合が異なるようです。

またこの記事も将来的に現実と乖離してくると思いますので、その点は十分注意してください。

インストールしてみる

色々参考にしたところ皆さん Ubuntu14.04 のAMIでやられていたので、自分もそれに倣うことにしました。
インスタンス起動後、まずは様々な記事でも導入されているように、必要なモジュールをインストールします。

$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install -y build-essential python-pip python-dev git python-numpy swig python-dev default-jdk zip zlib1g-dev ipython

二つ目のコマンドを実行するとGRUBローダーの設定を迫られたりしますが、自分の場合は何も選択せずに次に進み
次の選択肢では install package maintainers version を選択しました。

また参考記事の通りに実行していきます。

$ echo -e "blacklist nouveau\nblacklist lbm-nouveau\noptions nouveau modeset=0\nalias nouveau off\nalias lbm-nouveau off\n" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
$ echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
$ sudo update-initramfs -u
$ sudo reboot

ここで一旦再起動

$ sudo apt-get install -y linux-image-extra-virtual
$ sudo reboot
# Install latest Linux headers
$ sudo apt-get install -y linux-source linux-headers-<code>uname -r</code>

ここまで来たら tensorflowの公式ページ に従ってインストール作業を進めましょう。

以下は公式サイトの引用ですが、現在では Cubaのバージョンを8.0、cuDNNのバージョンを5をインストールすれば問題ないようです。

Download and install Cuda Toolkit
https://developer.nvidia.com/cuda-downloads
Install version 8.0 if using our binary releases.
Install the toolkit into e.g. /usr/local/cuda.
Download and install cuDNN
https://developer.nvidia.com/cudnn
Download cuDNN v5.

この2つのモジュールをインストールしたあとで 公式ページに則ってpip経由でインストール作業を行います。

自分の場合は python2系 を対象としたかったので下記のように実行しました。

$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.0rc0-cp27-none-linux_x86_64.whl
$ sudo pip install --upgrade $TF_BINARY_URL

アプリケーションコードを実行したところ下記のように正常にモジュールライブラリを実行できているようです。
(幾つか警告のようなものもありますが)
またGRID K520というg2インスタンスで搭載しているグラフィックボードの名前も確認できます。

I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:885] Found device 0 with properties:
name: GRID K520

処理自体もCPUでの処理と比べて高速化できているようでしたので、これにてインストール作業を完了しました。

参考記事

http://qiita.com/h860a/items/294262d98e1223008252


mariadbのcollationをutf8mb4 に対応させる

概要

アプリケーション開発を行っていたところ下記のようなエラーが出た。
この現象について調査する。

Caused by: java.sql.SQLException: Illegal mix of collations (utf8mb4_bin,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

原因

これは utf8mb8 で作成したテーブル内部に varchar binary のカラムに対して where 条件を指定したときに発現しているようである。

collation の設定を確認したところ下記のようになっている。

MariaDB [(none)]> show variables like '%collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8_general_ci    |
| collation_database   | utf8_general_ci    |
| collation_server     | utf8_general_ci    |
+----------------------+--------------------+

どうやら mysqld の持っている collation が色々存在して
それとテーブルの照合順序が食い違っているということが原因のようである。
というわけで collation を一致させることで不具合の修正を図る。

対応

この辺を参考にしながら文字コードを設定する。

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin

あまりMariaDBの設定には詳しくないが、どうやらMySQLのそれとは多少なり異なるようである。
修正して再度 collation を表示してみると無事に修正された。

MariaDB [(none)]> show variables like '%collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_bin        |
| collation_server     | utf8mb4_bin        |
+----------------------+--------------------+

アプリケーションの方も無事に動作した。


osx brew で easy_install が正常にインストールされない

概要

python を使用する機会があり、brew経由でインストールを行った。
ついで pip をインストールしようとしたところ下記のようなエラーがでてしまって pip のインストールができない。
これについて対応してみる。

$ easy_install
Traceback (most recent call last):
  File "/usr/local/bin/easy_install", line 9, in <module>
    load_entry_point('setuptools==29.0.1', 'console_scripts', 'easy_install')()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py", line 357, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py", line 2394, in load_entry_point
    return ep.load()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py", line 2108, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "build/bdist.macosx-10.11-intel/egg/setuptools/__init__.py", line 10, in <module>
  File "build/bdist.macosx-10.11-intel/egg/setuptools/extern/__init__.py", line 1, in <module>
ImportError: No module named extern

調査する

brew を用いてインストールしたのだが、一度消してまた入れてみる

$ brew install python
==&gt; Downloading https://homebrew.bintray.com/bottles/python-2.7.12_2.el_capitan.bottle.tar.gz
Already downloaded: .../Caches/Homebrew/python-2.7.12_2.el_capitan.bottle.tar.gz
==&gt; Pouring python-2.7.12_2.el_capitan.bottle.tar.gz
==&gt; Using the sandbox
Warning: The post-install step did not complete successfully
You can try again using <code>brew postinstall python</code>
==&gt; Caveats
Pip and setuptools have been installed. To update them
  pip install --upgrade pip setuptools

You can install Python packages with
  pip install &lt;package&gt;

They will install into the site-package directory
  /usr/local/lib/python2.7/site-packages

See: https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md

.app bundles were installed.
Run <code>brew linkapps python</code> to symlink these to /Applications.
==&gt; Summary
🍺  /usr/local/Cellar/python/2.7.12_2: 2,948 files, 39.8M

すると読み飛ばしていたのだがインストール後の処理が正常に完了していないようなことが表示されていた。

手動で実行してみると

$ brew postinstall python
==> Using the sandbox
Error: Permission denied - /usr/local/lib/python2.7/site-packages/sitecustomize.py20161201-35997-9nuclf

すると権限がないようなことを言われる。これが原因か?

対応

brew は sudo で実行することはできないので(詳しくないができるかも。できても推奨していないが。)
権限で文句を言われている lib/python2.7 に直接一般ユーザでの権限を与える

$ sudo chown -R <user>:<group> /usr/local/lib/python2.7

そして再度後処理を実行してみる

$ brew postinstall python
==> Using the sandbox
==> /usr/local/Cellar/python/2.7.12_2/bin/python -s setup.py --no-user-cfg install --force --verbose
==> /usr/local/Cellar/python/2.7.12_2/bin/python -s setup.py --no-user-cfg install --force --verbose
==> /usr/local/Cellar/python/2.7.12_2/bin/python -s setup.py --no-user-cfg install --force --verbose

原因はよくわからないが動いた。easy_installも動作することが確認できました。
なんてことはありませんでした。