9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Hyper-V上のUbuntuでCUDAを導入する 準備編

Last updated at Posted at 2017-10-10

(追記)Windows 10でこれを行うことは無理だということがわかりました。Windows Server 2016なら可能のようですが、手元にないので諦めます。

UbuntuでCUDAを利用する機会が多いのですが、ハードウェア関連の設定に失敗すると、最悪再インストールなど非常に時間を取られてしまいます。GPU、CUDAとも非常に進化が速く、少しバージョンアップするだけで動かなくなったりと、なるべく出来上がった環境を使いたいところです。
Windows環境をメインに、Linuxをサブでという場合でもGPUはシェアしたい、となり、Windows環境を壊したくないとなると安全策は仮想化でしょうか。Hyper-Vを使って手ごろにそのような、CUDA on Ubuntu on Hyper-V on Windowsの環境を作れないか、先人の知恵を参考にやってみたいと思います。

ハードウェア、Linux関連とも、間違いがあると思うので、ご指摘ください。
まず、目標と前提となる環境についてです。

やりたいこと

とりあえず、現状の最新環境で使ってみようと思いました。

ホストOS:Windows 10 Pro (Creators Update) 15063.608
Hyper-V マネージャ:バージョン 10.0.15063.0
ゲストOS:Ubuntu 16.04
CUDAバージョン : 9.0

システム要件

GPUドライバ、CUDAを仮想環境で動かすには、ハードウェア、ソフトウェアの対応が必要です。それぞれ、以下の情報が役に立つでしょうか?

TensorFlow + CUDA > 実行環境の検討 / PCIパススルー対応かどうか

PCIパススルー/IOMMU 対応

IOメモリマッピングを仮想化できるように、IOMMUをサポートするCPUが必要なようです。
もともとはグラフィックメモリのメインメモリへの拡張とかDMA経由のアタックとかに対処するためのもののようでしたが、仮想化に利用されるようです。ホストOSのIOをゲストOSにもIOMMU経由で見えるようにするものです。
List of IOMMU-supporting hardware

Intel でいうVT-dに相当し、対応リストを見るとCore2時代のCPUやチップセットから導入されているので、今時のPCなら大丈夫でしょう。

RemoteFX 対応

RemoteFXはもともとVDIを用いたリモートグラフィックの規格ですが、これに対応するためには、こちらのようにCPU,GPUの対応が必要です。

CPUは Second-Level Address Translation (SLAT)対応が必要です。IntelCPUでは Extended Page Tables (EPT), AMD CPUでは Nested Page Tables (NPT)と呼ばれます。昨今のCPUではほぼ対応しています。

GPUは、DirectX 9.0c と DirectX 10.0のサポートが必要です。

ここまで書くと、何かLinuxには関係ないんじゃないかとも思えますが、いくつかLinux上での記述があるので、利用していると思われます。

※DDA?

最新のWindows Server 2016などでは、これに代わって、DDA(Discrete Device Assignment)というものが導入されており、Windows/Linuxで仮想デバイスを実現するようです。NVMeデバイスなどのサポートも行われ、より高速なアクセスを実現するものだと思われます。

GPUの仮想化とは

ところで、そもそもハイパバイザでの仮想GPU対応って、どこまで進んでいるんでしょうか?

仮想環境でのGPUの利用について、以下のようにまとめられています。従来は一度抽象化されたジェネリックなGPUドライバを利用していた(Shared GPU)が、ハードウェアのマッピングによりアクセラレーションの恩恵を受けられるようになるのがGPUパススルーやvGPUなどの機能です。

image.png

詳しくはわかりませんが、GPU Pass thruというのは1台のGPUを1つのVMに割り当てるシンプルな構成である一方、vGPUは1台のGPUをタイムシェアリングなどで複数のVMでシェアができるようです。クライアントで異なるゲストOSでもGPUを使いたいというような需要にはパススルーで十分です。

またことVDIに限っては、以下のようにパフォーマンスを考えるとパススルーの方が有利であるとも言えます。

CAD on VDIを最大限に活用するための仮想化GPUガイド

image.png

各ハイパバイザ、OSの対応

こちら"State of GPU Virtualization for CUDA Applications 2014"のページに、整理されています。ですが、2014年なのでHyper-Vの状況はかなり変わっているようです。

image.png

Hyper-Vの弱点がこのPCIパススルーであるといわれている時期があったようですが、以下のように現在は対応しています。

Windows Server 2016 Hyper-V on PCI-E パススルー

GRIDなど仮想化用のハードウェアを使うとか、様々なソリューションがありますが、手元のPCでいろいろなOSでGPGPUをやりたいなどの向きにはHyper-Vを入れるだけで試せるのはいいですね。

(追記)調べたところ、上記パススルーは、Windows Server 2016固有のDDA機能を利用しており、Windows 10では無理でした。インストールもUbuntuにドライバを入れた時点で起動しなくなるという現象でした。

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?