スキップしてメイン コンテンツに移動

Windows ServerへのGPU設定関連の手順

クラウド上のWindows Serverを入れたベアメタルサーバーを払い出してGPUを設定することになった。
久しぶりで少しばかり手間取ったのでメモを残す。

そもそも何をしたらいいんだったかな、CUDAのツールキット入れるんだったかな?という朧げな状態だった。
次のドキュメントが、ドライバーのインストールから確認までクリアになっていてよかった。

GPUドライバーはここから取得する。

そして、インストール後に次のファイルを実行してインストールされているドライバーが認識されていることを確認する。

C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe
Sat Dec 05 17:39:17 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 452.39       Driver Version: 452.39       CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla K80           TCC  | 00000000:B1:00.0 Off |                    0 |
| N/A   30C    P8    26W / 149W |      9MiB / 11448MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  Tesla K80           TCC  | 00000000:B2:00.0 Off |                    0 |
| N/A   28C    P8    30W / 149W |      9MiB / 11448MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+


続けてCUDA Toolkitをインストールする。CUDA Toolkitについては次のページなどを参照すると良さそう。

後者のリンク内からダウンロードページに飛び、OSやインストール方法(ネットワーク経由かローカルか)を選択してインストーラーを取得する。

インストールをいざ進めると、MS Visual Studioがないと進められない旨が表示される。
というわけで次のページからインストーラーを取得してセットアップを済ませる。
もちろんCommunity EditionでもCUDA Toolkitのセットアップという観点では問題ない。

再起動が一度入ってから改めてCUDA Toolkitのインストールをする。
無事インストールが済んでいると、次のコマンドでCUDA Toolkitのバージョンが表示される。(Vは大文字なので注意)

nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Mon_Oct_12_20:54:10_Pacific_Daylight_Time_2020
Cuda compilation tools, release 11.1, V11.1.105
Build cuda_11.1.relgpu_drvr455TC455_06.29190527_0

ドライバーやCUDA Toolkitが無事入ったことを確認するために、CUDA Toolkitと一緒に同梱されているサンプルを動かしてを終わりにする。
サンプルを動かすには次のファイルをVisual Studioで開く。

C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.1\Samples_vs2019.sln

初回は次のようなエラーが出るので解決策に従って対応する。要はCUDAのプロパティファイルが見つからないとかそういう話みたいで自分で必要なものをコピーしなければいけない。

Error MSB4019 The imported project “C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 10.1.props” was not found. Confirm that the path in the declaration is correct, and that the file exists on disk. cdpSimpleQuicksort C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.1\0_Simple\cdpSimpleQuicksort\cdpSimpleQuicksort_vs2017.vcxproj

この応答の解決策で完全に解決した。

Just copy all files from this path (depends on the path you installed CUDA in)
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\visual_studio_integration\MSBuildExtensions
to this path:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations

出典:Cannot run samples on MS Visual Studi 2019 - CUDA / CUDA Setup and Installation - NVIDIA Developer Forums https://forums.developer.nvidia.com/t/cannot-run-samples-on-ms-visual-studi-2019/72472

その後、右側にあるSolution Explorerから適当なサンプルを選んでビルドする。下記はビルド結果の一部。



1>   Creating library ../../bin/win64/Debug/particles.lib and object ../../bin/win64/Debug/particles.exp
1>particles_vs2019.vcxproj -> C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.1\bin\win64\Debug\particles.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

ビルドされたものを実行すると次のページの例のようなが見れるようになるが、そのためにはもう一工夫必要。


対応前だとこんな感じでOpenGL周りのエラーが出るが想定通り。

C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.1\bin\win64\Debug\smokeParticles.exe
CUDA Smoke Particles Starting...

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

The following required OpenGL extensions missing:
       GL_VERSION_2_0
       GL_VERSION_1_5

他の例でもOpenGLが必要なものは同様。

C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.1\bin\win64\Debug\simpleGL.exe
simpleGL (VBO) starting...

GPU Device 0: "Kepler" with compute capability 3.7

ERROR: Support for necessary OpenGL extensions missing.simpleGL (VBO) completed, returned OK

一方でOpenGL周りがいらないものについては動いている。

C:\Users\Administrator>"C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.1\bin\win64\Release\asyncAPI.exe"
[C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.1\bin\win64\Release\asyncAPI.exe] - Starting...
GPU Device 0: "Kepler" with compute capability 3.7

CUDA device [Tesla K80]
time spent executing by the GPU: 18.13
time spent by CPU in CUDA calls: 0.05

CPU executed 65235 iterations while waiting for GPU to finish

C:\Users\Administrator>"C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.1\bin\win64\Release\clock.exe"
CUDA Clock sample
GPU Device 0: "Kepler" with compute capability 3.7

Average clocks/block = 3486.515625

C:\Users\Administrator>"C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.1\bin\win64\Release\binaryPartitionCG.exe"
GPU Device 0: "Kepler" with compute capability 3.7

Launching 100 blocks with 1024 threads...
Array size = 102400 Num of Odds = 51339 Sum of Odds = 1288543 Sum of Evens 1225838
...Done.

で、動かすために何をするか。
RDPにおいてもGPUを動かせるようにする+GPUの動作モードを変更するというのが答え。
これを初めは知らなくて、RDPを使用しているときはレンダリングできないと思い込んでいた。知識不足......。(最近こういう、知ってる人は知っているがそうでない人には難しい何か、というのに遭遇することが多い)

まずGPUのレンダリングはこれがわかりやすい。 グループポリシーからRDP時のセッションでのデフォルトのレンダラーを変更する。

それからGPUの動作モードをnvidia-smiで変更する。 不幸にもTCCモードのみしかサポートしていないGPUを使っていたらこれ以上あがきようがない。(Microsoft Tech Communityで質問している人はTCCしかサポートしていないT4を使用していたみたい)

WDDM/TCC mode in Windows - Learn CUDA Programming

C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe -g 0 -dm 0
C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe -g 1 -dm 0

ちなみに-gの後がGPUのID、-dmの後がGPUの動作モード。動作モードは0がWDDMで1がTCC。K80ではデフォルトがTCC。
切り替わっていれば次のようになっているはず。

C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe
Sat Dec 05 18:29:17 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 452.39       Driver Version: 452.39       CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla K80          WDDM  | 00000000:B1:00.0 Off |                    0 |
| N/A   31C    P8    27W / 149W |    102MiB / 11520MiB |      1%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  Tesla K80          WDDM  | 00000000:B2:00.0 Off |                    0 |
| N/A   28C    P8    29W / 149W |     66MiB / 11520MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

最後にこれも入れた。
これを使うためにはNVIDIA Developer Programに登録する必要があったし、これがないと動かないかどうか、実は試してない。
あーこれないとダメそうだわ、と思って入れてしまったので検証不足という点は自分の落ち度。

いずれにせよこれで動いた。先程ダメだった例もこの通り。

ちなみに、うまくいっていると次のページにも書かれているdxdiagを実行したときに、GPUが表示される。可動モードをWDDMに切り替え前はUnknownになっていた。



これでセットアップは終わり。久しぶりだと色々と知識が抜けていたり新しい解決策が出ていたりするので定期的にキャッチアップしないと危険だね。