月がきれいですね
こんにちわ、こんばんわ。中秋の名月は本当に綺麗でした。かえるのクーだ!の助手の「井戸中 聖」(いとなか セイ)でございます。
この記事は前回の「ゆっくり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などのインターフェースを介して実行することになります。当然オーバーヘッドは多少あります。