CUDA9.2 を使って JCuda0.9.0d をコンパイルする

JCuda – ダウンロードとコンパイルで解説しているように実行すると、JCufft を作成する時にエラーで止まります。

これは9.1から cufftSetCompatibilityMode() が削除されたためなので、jcufft/JCufftJNI/src/JCufft.cpp の最後の関数の戻り値を JCUFFT_INTERNAL_ERROR 等に変更します。

これでコンパイルが通るようになりますが、今度は jcuda-main に移動して mvn clean するときに失敗します。この原因は pom.xml に cuDNN の設定が入っていることと、デフォルトの Ubuntu 16.04.x に openjdk-8-jdk パッケージがインストールされていないためです。

pom.xml から cuDNN の設定を削除し、openjdk-8-jdk をインストールすると、mvn install が成功し、output ディレクトリに jar ファイルが作成されます。

そのうち HP の方も修正します。修正しました。

jcurandの記事を追加しました

cuRAND を JCuda 環境で使用するための API である、jcurand の使い方をアップしました。

お膳立てが若干ありますが、それさえクリアすれば、シンプルな呼び出しで高速に乱数生成ができます。

メモリはデバイス側に確保する必要がありますが、メモリコピーを使えばホスト側に持ってきて使用することが可能です。

JCuda 版ニューラルネット記事追加

JCuda 版ニューラルネットのコードに関する説明記事をアップしました。CPU 版と比較して、以下の変更があります、

  • CPU版では batchsize 方向の並列化はしなかったが、JCuda 版では batchsize 方向も並列計算する。
  • CPU 版ではホストメモリの管理のみだったが、JCuda 版ではホストメモリおよびデバイスメモリの両方を管理する。
  • JCuda 版では計算はデバイスメモリで閉じるようにする。
  • メソッドはほぼ共通して使えるように、デバイスメモリ管理をオブジェクト定義に追加して隠蔽する。

 

SimpleNet.java バグ修正しました

SimpleNet.java の forward() 計算で、bias を使用しないというバグがあったため、JCudaNNKernel.cu とともに修正しました。ただ、bias があってもなくても正答率に目立った変化はないようです。

JCuda 版ニューラルネットのソースコード解説は、現在作成中です。完成にはあと2〜3日かかると思いますので、好ご期待。

AutoEncoder 系のライブラリも作成中ですが、まだ動きません。

NeuralNet.java のバグを修正しました

NeuralNet.java でバグが見つかり、本来

for (int y = 0; y < ysize; ++y) {
  d += w[x][y] * bderivative[y]
}

と書くべきところを x に関して和を取っていました。修正し、GitHub を更新しました。

修正の結果、収束がさらに速くなった気がします。また、ループを繰り返すと過学習してしまう傾向がみられます。

JCuda 記事を追加しました

JCuda の記事として、デバイスメモリの使い方〜カーネルの記述までを追加しました。

preparePtxFile() は JCuda というよりは JCudaDriverSample の機能なので、敢えて解説していません。

次はいよいよ JCuda を使ってニューラルネットを構築します。

JCudaSimple

JCuda ライブラリの利用方法を説明するためのプロジェクト JCudaSimple をGitHubにアップロードしました。

中身はほとんど JCudaDriverSample と同じですが、Java8 風に書き換えてあります。外部 JAR として jcuda, jcuda-natives を参照しているので、ここだけ各自の環境にあったファイル名に書き換えてください。

解説記事は一両日中に書きたいと思います。

隠れ層のあるニューラルネットワーク

隠れ層のあるニューラルネットワークに対する逆誤差伝搬法について記述した記事をアプロードしました。

一応確認したつもりですが、式が間違っていたらごめんなさい…

最初  \bar{L} = \frac{1}{S} \sum^S_s L なので、Lの個別値を求めて満足していました。でもどうも収束が遅い。
サンプル全体について添字縮約しなければいけないことに気づいたのが午後10時30分。

なもので、まだ GitHub に上げたサンプルプログラムにはバグフィックスがかかっていません。そのうち直します。