KubeVirtで何ができるのか、引き続き調査しています。
先日、NVIDIAのTeslaを買ってもらったので、KubeVirtでNVIDIA GPUをVMにスケジューリングしてPython+Tensorflowで利用できるか確認してみました。結果、問題なく利用することができました。
TensorflowのGPUサポートは公式サイトのこのドキュメントに書かれている通りです。 以前、コンテナーでTensorflowを動かしてみたのですが、仮想マシンでも同様にTensorflowでGPUを使うことができました。
以上の構成でセットアップしたところ、手元の環境で動作確認できました。ちょっと普通と違う点は、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向けに置き換えています。
Visual StudioでPythonモジュールを追加する方法についてはこちらの情報を参照しました。
Pythonモジュールのインストールというと「pip install」コマンドでインストールするのかなと思ったのですが、Visual Studio 2019をせっかく使っているなら「ソリューションエクスプローラーのPythonパッケージの管理」からインストールする方がお作法としては良いみたいです。
「Pythonパッケージの管理」を開いて、「tensorflow」と入力して関連モジュールをセットアップしました。1.15以前のバージョンではCPU版のtensorflow、GPU対応版のtensorflow-gpuとパッケージが分かれていましたが、現在は一つのパッケージで両方提供するようです。特にエラーが生きることなくインストールが完了しました。
これでおしまい...だったはずですが、「Couuld not load dynamic library 'cusolver64_10.dll'; dlerror: cusolver64_10.dll not found」みたいなエラーが出ていました。エラーで検索した結果、dllファイルをリネームせよとのこと。
(そんなバカな)と思いつつもリネーム...ではなくてコピーして別名で保存して再度コードを実行してみたところ、問題なくPython + TensorflowでもGPUを使えるようになりました。
(やっぱり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関連
- KubeVirt 0.40.0
- NVIDIA K8s Device Plugin
- NVIDIA Tesla P100
VMイメージの作成
- Containerized Data Importer (CDI) を利用
- Linuxのクラウドイメージはこのドキュメントのリンク先から入手
- WindowsのクラウドイメージはCloudbase Imaging Toolsを使って作成したものを利用