書評を追加しました。
気ままな技術者生活から人生について考える
書評を追加しました。
AutoEncoder による DNN 初期化方法に関する記述を
ホームページ記事に追加しました。
今回の検証は python で行ったため、レポジトリを分けました。
Java による実装はそのうち手が空いた時に行おうと思います。
ようやく AutoEncoder を使った DNN が動いたので、GItHub に公開しました。
とりあえず、途中まで教科書「ゼロから作る Deep Learning」を参考にしつつ、
AutoEncoder クラスや MultiLayerNet クラスを追加しています。
4000回の学習でテストデータに対し、最小 88%、最大 96%程度の認識率を
持たせることができました。
DNN は途中のデバッグが非常に困難に感じます。既存の DNN ライブラリは
どうやってデバッグを解決しているのでしょうか。
記事の方はそのうち更新したいと思います。
numba パッケージを使う場合のヒントに関する記事をこちらにアップしました。
ループ数が小さかったり配列数が小さかったりすると CUDA の効果はほぼないです。
手軽に CUDA を使って実験したい場合に重宝しそうです。
なお、一定数ループを回ると実行速度がぐんと上がる現象が見られています。
(python3 の実行エンジンの関係かもしれませんが)
python3 で2次元の cavity 問題を解いたサイトがないか調査していたが、探しきれなかったので、
https://github.com/minosys-jp/Fluid.git
の方に登録してみました。高速化は numpy, numba で実行していますが、numpy のみを使った方が成績が良いようです。
出力をアニメーションしようとすると多大な時間がかかります。matplotlib の実装が悪いからだと思います。
後日談: OpenFOAM があることに気づきました。でもたまには自分の手を動かすのもよいかと。
技術置き場に新しい検索エンジンを実装しました。
ベースは N-gram ですが、出現確率が高いほどスコアが高くなるような計算を行い、スコアに関して降順に結果が表示されます。ただし、スコアが0.0001より小さくなる場合は検索対象にはなりません。スコアの最大値は恐らく1.0です。
この検索エンジンのよいところは比較的あいまいな検索に対応できることです。特に動詞、助動詞と言った、語尾が変化する単語の検索に威力を発揮します。
なお、本検索エンジンはN-gramの軽微な改良であるため、記事化は予定しておりません。
このホームページを拡張してサブフォルダを作ってみたり、他のサイトを参照したりした結果、scrayping.py がエラーを出力するようになりました。
このバグを修正した版を GitHub に上げておきました。
意外に修正が難しかった。
Volta 対応の CUDA 9.0 が出ましたが、Anaconda の cudatoolkit は 8.0 までしか対応していないため、そのままでは Python の Numba パッケージが使えません。
というわけで、悪戦苦闘した結果を書いておきます。
Numba を利用するためには以下の環境変数を設定する必要があります。
CUDA 9.0 をインストールすると /usr/local/cuda/nvvm/lib64/libnvvm.so.* というライブラリがが作成されますので、このパスを NUMBAPRO_NVVM に設定します。(ファイル名まで含む。)
また、/usr/local/cuda/nvvm/libdevice の下に libdevice.10.bc というファイルがありますので、シンボリックリンクで
libdevice.compute_XX.10.bc というリンクを貼っておきます。(XX は使用している GPU の Compute Capability を指定します。例えば GTX 1080 なら compute_61 となります。)NUMBAPRO_LIBDEVICE には /usr/local/cuda/nvvm/libdevice を指定します。
Anaconda 5.0.0 の Numba には Compute Capability が 5.0 までしか登録されていないため、GPU によっては実行エラーが出てしまいます。ちょっと汚いやり方ですが、Numba パッケージに新しい Compute Capability を追加する方法で回避しました。
GTX 1080 用なら、具体的には ~/anaconda3/lib/python3.6/site-packages/numba/cuda/cudadrv/nvvm.py に以下の2点を追加します。
変数やクラス | 修正内容 |
---|---|
SUPPORTED_CC | リストの最後に (6, 1) を追加 |
LibDevice クラスの _known_arch 変数 | “compute_61” をリストの最後に追加 |
NVidia のサイトで説明しているサンプルは numbapro を使ったものなので、numba 用に修正が必要となります。
import numpy as np from numpy.random import rand from numba import vectorize @vectorize(['float32(float32, float32)'], target='cuda') def VectorAdd(a, b): return a + b def main(): N = 100000000 # 100M print("wait for initialization...") A = rand(N).astype(np.float32) B = rand(N).astype(np.float32) C = np.zeros(N, dtype=np.float32) print("OK. Let's start!") C = VectorAdd(A, B) print("C[:5] = " + str(C[:5])) if __name__ == "__main__": main()
ちなみに、Anaconda3 は Intel の MKL を抱えているっぽいので、この程度の演算だと GPU の方が CPU より遅いという結果となりました。PCIe 上のメモリ転送がボトルネックを引き起こしているためと思われます。
デバイスメモリに結果をキャッシュするような例なら速くなるはず。
GitHub にはすでにサンプルを上げてありますが、N-gram 解説記事を新たに展開しました。
使い古されてあまり顧みられなくなった感のある N-gram ですが、実装が簡単な割には厳密な検索が可能なので、個人的には重宝しています。
解説記事はネットに多数掲載されていますが、他の検索エンジン技術と比較するときに対象記事があったほうが便利なので書いてみました。
振り返ってみると、あまり万人向けの解説になっていませんね..。