fc2ブログ
menu

Starnet++をNvidia CUDAで高速化するのにいろいろ躓いた話

※PixInsight Ver 1.8.9でGPU支援が入らないことに対する対策を追記

この記事は単体版Starnet++およびPixInsightのStarnet++モジュールをnVidia GPU(特にGeforce RTX 30xx世代)を使って高速化する手順および途中の躓きについて記載しています。

今回の教訓は
「CUDAはGeforce GPUの世代によって対応するバージョンが違うぞ!」
ということです。では行ってみましょう。



星消しツールStarnet++。効果は非常に高いのですが、いかんせん処理に長い時間がかかります。
2600万画素のTiff画像をSTRIDE値32としてCore i7-8700Tで処理して約1時間かかります。この処理、nVidiaのGPUを使用することで大幅に高速化できるのです。

だというのに私のPCに刺さっているGPUはAMD Radeon。
こいつをnVidiaのGPUに差し替えたうえでCUDAをつかってStarnet++を高速化する手順をまとめます。

なにはともあれnVidiaのGPU、Geforce RTX 3060を入手します。
20210904_09.jpg
性能的には3060tiでもいいのですが、3060tiのビデオメモリが8GBであるのに対し、無印3060は12GB。ゲームよりも画像や動画編集がメインの用途となるのでビデオメモリが大きいほうを選びました。
20210904_10.jpg
この後の手順について参考にしたのはこちら。

おそらく多くの方がこのブログを参考にされていると思います。
事前準備としてnVidia Developer Programへの加入が必要なのでアカウントを作っておきます。アカウント取得についてはこのページが参考になるでしょうか。


あわせて、nVidiaからグラフィックスドライバを入手してインストールしておきます。
Windows10ではGPUを挿すと最低限のドライバを自動でダウンロードし、つないであるディスプレイに最適化して表示するところまで勝手にやってくれるのでドライバダウンロードは不要かな?と思ったのですがnVidia謹製のドライバが必要になります。
これに関しては上記ブログの手続きを実際に説明してくれているこの動画内、8分6秒あたりから触れられています。とてもわかりやすい英語で話してくれているので聞いてみるとよいでしょう。

nVidia Developer Accountの登録とnVidia謹製グラフィックスドライバのインストールまでやったうえで3つのアイテム

・nVidia CUDA 10.1(Update 2)
・nVidia cuDNN V7.6.5 for CUDA 10.1
・libtensorflow-gpu 2.3.0

を入手してブログのインストラクション通りにインストールまたはフォルダ内に配置、環境変数の追加なども対応。

上記ブログdarksky AstrographyではPixInsightでの手順のみ触れられていますが、Starnet++単体版の場合はブログの手順に加えてStarnet++単体版インストールフォルダ内にあるtensorflow.dllをlibtensorflow-gpu-windows-x86_64-x.x.x内、libフォルダに入っているtensorflow.dllで上書きすることで有効化できます。(*バージョンをx.x.xとしている理由は後述)
20210904_05.jpg


ところがこの状態で単体版Starnet++を動かしてみてもうまく動いてくれません。

Adding visible gpu devices: 0の表示のところで5分ほど動作が止まり、Successfully opened dynamic library cudnn64_7.dllのところで15分ほど動作が止まります。
その後CUDAが動き始めると処理自体はすぐに終わるのですが、待ち時間合計20分では高速化したことになりません。
「Adding visible gpu devices: 0」で調べてみると、まったく同じ現象が起きて困っている人の質問が見つかりました。(ちなみに「devices: 0」は「0番デバイス」という意味で「デバイスがない」という意味ではありません)



Geforce RTX 3060の場合は使用するCUDA関連のバージョンが違うことが原因のようです。
こちらがGPUと対応するCUDA関連ソフトウェアバージョンの対応表。


Geforce 3060はAmpereアーキテクチャーとなっているため、対応するcuDNNは8.0以上、CUDAは11.0以上とのこと。

つまりダウンロードすべきバージョンはそれぞれ以下の通りとなります。

・nVidia CUDA 10.1(Update 2)→nVidia CUDA11.0
・nVidia cuDNN V7.6.5 for CUDA 10.1→nVidia cuDNN V8.0.5 for CUDA 11.0
・libtensorflow-gpu 2.3.0→libtensorflow-gpu 2.4.0

libtensorflowのバージョンに関しては明確なソースがなかったのですが、上記Teratailの質問に対する回答で2.4.0と書かれていたのでこのバージョンを使用することにします。それぞれダウンロードリンクを貼っておきます。


(アーカイブページです。CUDA11.0に対応するcuDNN V8.0.5を探してください。CUDAとcuDNNの組み合わせはある程度規定されています)


ここからの手順は同じです。Pathの参照先をCUDA v11.0にするのを忘れずに。
なお、上記darksky Astrographyで提示されているCUDAの組み合わせで動くのはGeforce RTX 20世代を含むそれ以前のGPUとなります。

改めてトライして、やっとうまく動きました。
2600万画素の素材をSTRIDE値32で処理して約7分。
CPU処理で60分かかっていたものが1/9になりました。爆速。
20210904_09_20210904140426309.jpg

Starnet単体版のほうでは処理の途中で大量のエラー( ”Call to CreateProcess failed. Error code: 2”)を返してきますが、こちらはインストール時にRuntimeのみを選択したことによるらしいという書き込みを見つけました。

星消し画像は正しく出力されているのでここは気にしないでおきましょう。

バージョンを取り違えた状態で動作させた場合PixInsightでは動作ログも出ずに固まって落ちるだけなのですが、Starnet++単体版では上記ログが出た状態で固まっていたため解決の糸口となりました。CUDA関連は国内海外ともフォーラムが充実していて助かりましたね。



改めて手順を簡単に解説しておきます。

libtensorflow-gpu 2.4.0を解凍して出てきたlibフォルダ中のtensorflow.dllをPixInsight>binフォルダおよびStarnetフォルダ内のtensorflow.dllに上書き。
20210904_01.jpg

cuda_11.0.2_win10_network.exeを実行しCUDAをインストール。
カスタムインストールを選び、CUDA>Runtime>Librariesのみをインストール。
20210904_04.jpg

cudnn-11.0-windows-x64-v8.0.5.39.zipを解凍して出てきたbinフォルダとlibフォルダをC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0に上書き
20210904_08JPG.jpg

コントロールパネル→システム→システムの詳細設定→環境変数
20210903_14.jpg

ユーザー環境変数→新規
20210903_15.jpg

変数名 : TF_FORCE_GPU_ALLOW_GROWTH
変数値 : true

PATHの編集
環境変数→Pathを選択して編集ボタン→新規を選んで”C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin”を指定
20210904_07.jpg

準備はここまで。

タスクマネージャからGPU>CUDAを表示させます。プルダウンメニューを出さないと表示されませんので注意してください。この状態でStarnet++(単体版でもPI版でもOK)を動かしてCUDAが使われればOKです。
20210903_17.jpg



2023.10.31追記

PixInsight ver 1.8.9あたりにアップデートした時にGPUが使われなくなってしまいましたが、なぜか環境変数のPATHに追記する項目が消えていました。
改めて下記の通り対応したところ無事にGPU支援が復活しましたので追記しておきます。

PATHの編集
環境変数→Pathを選択して編集ボタン→新規を選んで”C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin”を指定






関連記事
スポンサーサイト



4Comments

There are no comments yet.

yukina

助かりました

突然の書き込み失礼いたします。
こちらの記事を参考に我が家のPCもCUDAが動作するよう設定したところ、starnet2、NXT、BLXの処理速度がとても早くなりました。
GPUは少し古い20シリーズですが、それでもCPUメインで処理していた時とは雲泥の差です。
ありがとうございました!

  • 2023/01/13 (Fri) 23:58
  • REPLY
Aramis

Aramis

Re: 助かりました

参考になったようで何よりでございます。
GPU支援入れるとびっくりするくらい早くなりますよね。
多少古かったりスペックが低かったりしてもCPU処理とは段違いの速さになるので、よほどこだわりがなければ型落ち品を狙うのでも十分な満足を得られると思います。

  • 2023/03/04 (Sat) 23:44
  • REPLY

A-1

ありがとうございます

はじめまして。A-1(エーワン)と申します。

RTX4060が出た今頃になってRTX3060のグラボを買い、天体画像処理の高速化をしようと思って設定などをWEBで検索していたところ、こちらの記事がとても分かりやすく、大変参考になりました。

おかげざまで無事、StarNetやBlurXTerminatorなどを高速化することが出来ました。今後画像処理がはかどりそうです。
感謝申しげます。

Aramis

Aramis

Re: ありがとうございます

コメントありがとうございます。


Starnetはリリース当初CPU処理で30分以上、V2になって10分程度に、そこからGPU支援を入れることで1分以下になりました。
これだけ短くなるならお金と手間をかけてでも導入する価値は大いにありますよね。

お役に立てたようで何よりです。

  • 2023/07/13 (Thu) 23:03
  • REPLY