仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

KubeVirtでNVIDIA GPUをVMにスケジューリングしてTensorflowで利用する

KubeVirtで何ができるのか、引き続き調査しています。

先日、NVIDIAのTeslaを買ってもらったので、KubeVirtでNVIDIA GPUをVMにスケジューリングしてPython+Tensorflowで利用できるか確認してみました。結果、問題なく利用することができました。

TensorflowのGPUサポートは公式サイトのこのドキュメントに書かれている通りです。 以前、コンテナーでTensorflowを動かしてみたのですが、仮想マシンでも同様にTensorflowでGPUを使うことができました。

www.tensorflow.org

以上の構成でセットアップしたところ、手元の環境で動作確認できました。ちょっと普通と違う点は、Windows Server 2016はKubeVirtで作成した点です。

  • Windows Server 2016
  • Visual Studio 2019
  • CUDA Toolkit 11.3.0_465.89
  • cuDNN v8.2.0 (April 23rd, 2021), for CUDA 11.x
  • Python 3.7.8 64bit(Visual Studio Installerで「Python開発」を選択するとインストールされるもの)

各種セットアップ

CUDAをインストールして、cuDNNをダウンロードしてきて追加する方法は次を参考にしました。 バージョンが異なるので、それぞれCUDA 11.3向けに置き換えています。

qiita.com

Visual StudioでPythonモジュールを追加する方法についてはこちらの情報を参照しました。

baba-s.hatenablog.com

Pythonモジュールのインストールというと「pip install」コマンドでインストールするのかなと思ったのですが、Visual Studio 2019をせっかく使っているなら「ソリューションエクスプローラーのPythonパッケージの管理」からインストールする方がお作法としては良いみたいです。

f:id:virtualtech:20210511180141p:plain:w360

「Pythonパッケージの管理」を開いて、「tensorflow」と入力して関連モジュールをセットアップしました。1.15以前のバージョンではCPU版のtensorflow、GPU対応版のtensorflow-gpuとパッケージが分かれていましたが、現在は一つのパッケージで両方提供するようです。特にエラーが生きることなくインストールが完了しました。

f:id:virtualtech:20210511180214p:plain:w360

これでおしまい...だったはずですが、「Couuld not load dynamic library 'cusolver64_10.dll'; dlerror: cusolver64_10.dll not found」みたいなエラーが出ていました。エラーで検索した結果、dllファイルをリネームせよとのこと。

stackoverflow.com

f:id:virtualtech:20210511180454p:plain

(そんなバカな)と思いつつもリネーム...ではなくてコピーして別名で保存して再度コードを実行してみたところ、問題なくPython + TensorflowでもGPUを使えるようになりました。

f:id:virtualtech:20210511180513p:plain

(やっぱりWindows Serverはいいな。この程度で済むなら

付録: KubeVirtでGPUをスケジューリングする

最後におまけとして、KubeVirtでGPUをスケジューリングする場合に必要な環境をざっとまとめてみます。 この環境ではCentOS 8.3を用いていますが、RHELでもRHELクローンでも同様に環境が作れると思います。

少なくともKubeVirt 0.40.0以降のバージョンであれば、UbuntuでもKubeVirtが手元の環境で動いたので、GPUスケジューリングも可能なんではないかと思います。

以下は手元で動いた時のソフトウェアとそのバージョン、ハードウェアの構成例です。

ホストOS

  • CentOS 8.3
    • vfio-pciモジュールを有効に設定

Kubernetes関連

  • Kubernetes 1.20.0
    • Kubeadmでセットアップ

KubeVirt関連

VMイメージの作成