クーの自由研究

マスターのかえるのクーは、弟子達の召喚術により新たな依り代を得てⅡ世として復活しました。

まったりJava+CUDAしてみる

月がきれいですね

こんにちわ、こんばんわ。中秋の名月は本当に綺麗でした。かえるクーだ!の助手の「井戸中 聖」(いとなか セイ)でございます。

この記事は前回の「ゆっくりJava+CUDAしてみる」の続きです。

BGMは ジャバジャバビバドゥーです。よろしくお願いします。

あまるにもゆっくりしすぎているので、ページを改めました。

方針変更

・GPUのターゲットをわたくしのメインマシンにつけているRTX 3060にする

・OSはWin10 および WSL2上のUbuntuとする。(このページではWindowsのみ)

・JCUDAのターゲットは12.0.0とし、ローカルバイナリはWindows版とLinux版を両方ビルドしてみる。

・CUDAはそれにあわせ12.x版とする

まずはWindowsでやってみます。WindowsがうまくいってもいかなくてもUbuntuでも確認する予定です。

まずはWIndows(10)環境から

CUDAの12.0.0をインストールといきたいのですが、すでに12.6をインストール済なのでまずはこれでチャレンジしてみます。NGなら指定の版にダウンしようと思います。

基本的にはTeqStock.tokyo の部屋 - JCuda - Java で CUDA を動かす様のページに従ってやってみます。

0.開発ツール系のインストール準備

pleiadesの2024-06版(作業時点で最新)をインストールしてあります。

また、Visual Studio Community 2022をインストールし、C++系の開発環境がはいっています。

1. CUDAバージョンを確認します

とりあえずの12.6系/cuDNNはとりあえずのv9.3で進めます

2.JCuda(master)ほか一式をCloneします

git clone https://github.com/jcuda/jcuda.git

ほか、/jcudaにあるjcu*なgitを全部cloneします。(C:\Workにいれてみました)

3. mavenを使うようなのでインストールします

この作業時点ではVersionは3.99でした。Windows版BinaryZipをダウンロードします。

apache-maven-3.9.9-bin.zip

zipを展開してC:¥apache-maven-3.9.9 に置きました。

バージョンを確認してみます。

4. 作業用フォルダに移って、cmake ./jcuda-main を実行します

CUDAはv12.6をいれていたのですが、その前のバージョンのv12.5も入れていたので、そちらが使われるようです。ちなみにv11.*系も複数はいっていましたが、それは使われないみたいです。

5.nvcc にパスが通っているか確認します

通っていなかったので、とおしました。V12.6でもよかったのですが、上とあわせてV12.5のほうにpathを通しました。

mavenにもpathを通しました。

6. いきなり mvn clean install してみます→失敗

ですよね~。

さて、ここからがきっと長丁場です。あきらめて試合終了するまで頑張ります。

-e と -X オプションをつけて確認すると、pom.xmlはどこ?ないよ。といわれてます。mvnの実行フォルダがよくないようです。また、Javaのバージョン(21)が新しすぎるようです。Pleiadesにはいっている「8」に切り替えてみます。

だめでした。

いまここ

確認するとDLLが一切できていません。よく見ると、4.のcmakeでclがskippedしてます。エラーばかり気にしていたので気がつきませんでした。

作成しないくてはいけないdllは「たくさん」ある気がするのですが、1個もできてませんでした。mavenで「いい感じ」に全部やってくれるのかな的な認識でしたが、甘かったです。

7. DLLソリューションを手動でビルド

原因がわからないので、VisualCode Studioでソリューションを手動でビルドしてできるかやってみていきます。

いつの間にかフォルダ直下にJCudaMain.sln(VisualStudioのソリューションファイル)ができています。クリックして起動してみます。起動しました。

ご丁寧に必要なソリューションが束ねてあります。

Releaseにしてソリューションのビルド(またはクリーンしてリビルド)を実行します。

cuDnn(の.h(cのヘッダファイル))がみつからないエラーのようです。

こんな時は参照パスを設定するか、実物(ヘッダファイル)を所定のライブラリフォルダに複写するかどちらかですが、どうしましょう。

cuda_runtime.hはみえているようなので、cudnn.hなどのcuDnnファイルをCUDAライブラリに複写してみることにします。

7.1 C:\Program Files\NVIDIA\CUDNN\v9.3\include\12.6 のファイルすべてをC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.5\includeに複写します。

cuDnnのフォルダをみると、CUDA v12.6用なのですが、v12.5ではじめてしまったので、これで実行します。何かうまくいかければ、次はすべてv12.6用にします。それでだめなら。。。できるまでバージョンを下げていきます。

はじめからは対応バージョンや準備されているバージョンがわからないことがあるので、この手のことに試行錯誤はつきものです。

となりのフォルダのlibの内容も同様に複写しておきます。野生の勘もしくは一般化された経験によるものです。

7.2 C:\Program Files\NVIDIA\CUDNN\v9.3\lib\12.6\x64の内容をC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.5\lib\x64に

複写します。

7.3 クリーンしてリビルドします。

4つでいいか知らないのですが、エラーや問題になりそうな警告がないので、あらためてmavenをやってみます。

8. mvn clean install してみます(再試行)

VisualStudioをひらいているのがいけないようです。閉じて再実行してみます。

途中問題かもしれないような警告もあったのですが、jcudnnまで前進しました。いい感じです。

JCudnn-12......x86_64.dllがないエラーとなりました。

さきほどのdllにはふくまれていませんので確認します。

JCUDnnのみを手動でリビルドしてみます。識別子(型)が認識されないようです。

詰んでます。CUDA v11系で使用されていてToDo removeの記載の下にある構造体を使用していますね。。。これはver不整合っぽい「かほり」がします。

v12.5 対応の cuDNNがあるか探してみます。それでもNGならverを遡っていくことにします。

cuDNN v9.2を入れてみましたが結果はかわらずです。cuDNNはこの(今回のWindows10+cuDnn(CUDA12系))流れでは断念しようと思います。断念ついでにcuDNNv9.2にCUDA11系もあるので、いれてみて状況がかわるか確認します。

9. jcuda-main/pom.xmlを編集してcuDNN関連の記載を削除します

cuDNN系はこの流れではうまくいきそうにないので諦めようと思います。

mavenの定義ファイルであるpom.xmlを編集してcuDNN関連をすべて削除します。

※再試行のためにファイルの退避はお忘れなく。

10.改めてmvn clean install してみます(再々...試行)

jcdnn系はありませんが、予定(調整)したビルドがすべて正常終了しました。

JNI*1に必要なDLLもビルドされているようです

11. うまくいったのでジャバジャバビバドゥーを歌いましょう

はい。みなさん、ご一緒に。🎵ジャバ ジャバ ビバ ドゥ ジャバ ビバ ドゥ~♫

次は動作確認します。長くなったので、動作確認は次の「のんびり編」にご期待ください。

(蛇足)SCOとしては同一サイト/URLパスからの似た名前の表題/タイトルは抑制しあうので、皆さまはやらないほうがよいですよ。

 

*1:JNIとは:Java Native Interface とはJavaがVMの箱庭を飛び出して、OSのネイティブなバイナリ実行機能を使えるようにするものです。皆様あまり使用にならないのですが、とても簡単で安定した動作が可能なイメージを持っています。お勧めです。CUDA機能はJavaから直接使えないので、JNIなどのインターフェースを介して実行することになります。当然オーバーヘッドは多少あります。