はじめに
- 新年なので ESXi を構築しなおします。
- 最新の ESXi のバージョンは2019年08月20日の6.7です。
- 機械学習等の為に GPU パススルーも実施します。
VMware ESXi とは?
- VMware ESXi は、ベアメタルハイパーバイザの事です。OS が不要で、ハードウェアに直接インストールします。
- また、ESXi は、Elastic Sky X integrated の略称です。
- 有償の、VMware vSphere エディションの ESXi があります。
- 無償の、vSphere Hypervisor エディションの ESXi があります。
- もともと、ESX がありました。管理コンソール等を変更し、無償化した物が ESXi です。
- 現在は、ESXは廃止され、ESXiに一本化されています。
環境
- MSI MPG Z390 GAMING PLUS ATX
- MSI NVIDIA GeForce GT710 (管理用)
- MSI GeForce GTX 1650 AERO ITX 4G OC (GPUパススルー用)
ESXiのダウンロード
- VMware の My VMware のアカウントを作成の上、下記からダウンロードします。
- https://my.vmware.com/jp/web/vmware/evalcenter?p=free-esxi6
- ライセンス情報
- コンポーネント: VMware vSphere Hypervisor 6 License
- ライセンス キー: XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
- パッケージのダウンロード
- VMware vSphere Hypervisor 6.7 Update 3- バイナリ
- VMware vSphere Hypervisor (ESXi ISO) image (Includes VMware Tools)
- 2019-08-20 | 6.7.0U3 | 314.66 MB | iso
インストールUSBの作成
- Mac で実施した手順です。
- Mac のディスクユーティリティで USB を
MS-DOS (FAT)
でフォーマットします。
- イメージをダブルクリックしマウントします。
- マウントした全ファイルを、USBにコピーします。
- USB内のファイルを修正します。これは、USB起動するために必要です。
- USBのフォルダへ移動します。
$ cd /Volumes/ESXI
-
APPEND -c boot.cfg
をAPPEND -c boot.cfg -p 1
へ変更する。
$ vim ISOLINUX.CFG
DEFAULT menu.c32
MENU TITLE ESXi-6.7.0-20190802001-standard Boot Menu
NOHALT 1
PROMPT 0
TIMEOUT 80
LABEL install
KERNEL mboot.c32
APPEND -c boot.cfg -p 1
MENU LABEL ESXi-6.7.0-20190802001-standard ^Installer
LABEL hddboot
LOCALBOOT 0x80
MENU LABEL ^Boot from local disk
- ファイル名を変更する。
$ mv ISOLINUX.CFG SYSLINUX.CFG
- アンマウントします。
マザーボード
GPU
- MSI NVIDIA GeForce GT710 は、インストール用、その後の管理用に利用します。一番CPUに近いスロットです。
- MSI GeForce GTX 1650 AERO ITX 4G OC は、GPUパススルー用に利用します。
- GPUは、1つでもOKです。インストール用、管理用、GPUパススルー用で共用できます。
- ただし、GPUパススルーを無効から有効にすると、管理用としては使用出来なくなります。
- インストール後のVMの作成、管理等は、Webブラウザーから実施するので、多くの場合は問題ないでしょう。
- 管理用として利用する場合は、GPUパススルーを有効から無効にすればOKです。
BIOS
- 初期化グラフィックアダプターは、PEG等の PCI Express グラフィックカードにします。
- IGD等の Integrated Graphics Device(内臓グラフィックカード)は、無効にします。
- なぜ?って思われるかもしれませんが、これをやらないとGPUパススルーが出来ません。理由は、私もわかりません。。。
Settings\Advanced\Integrated Graphics Configuration
Initiate Graphic Adapter: IGD -> PEG
IGD Multi-Monitor: Enabled -> Disabled
- ブートは、UEFIにします。
Settings\Boot
Boot mode select: LEGACY+UEFI -> UEFI
- Intel VT-D を有効にします。
Overclocking\CPU Features
Intel VT-D Tech: Disabled -> Enabled
ESXiのインストール
USBブートとインストール
- 以下が設定の流れです。
- 注意する箇所は、インストールするディスクの選択箇所で、インストール用のUSBを選ばない用にしましょう。
- Welcome to the VMware ESXi 6.7.0 Installation
- End User License Agreement (EULA)
- Select a Disk to Install or Upgrade
- Confirm Disk Selection
- Please select a keyboard layout: Japanese
- Enter a root password
- Confirm Install
- Installation Complete
ネットワーク設定
- 必要に応じて、ネットワークの設定を修正します。
- 私は、静的IPv4アドレスへ変更、IPv6は無効、DNSは手動設定、ホスト名は
esxi
にしました。 - IPv4 Configuration
- Set static IPv4 address and network configuration
- IPv4 Address: 192.168.1.254
- Subnet Mask: 255.255.255.0
- Default Gateway: 192.168.1.1
- Set static IPv4 address and network configuration
- IPv6 Configuration
- Disable IPv6 (restart required)
- DNS Configuration
- Use the following DNS server addresses and hostname
- Primary DNS Server: 192.168.1.1
- Alternate DNS Server
- Hostname: esxi
ESXi Web UIで設定
-
https://192.168.1.254/
へアクセスします。
- ライセンスを割り当てます。割り当てない場合は、60日間のみ利用出来ます。
- GPUパススルーを設定します。今回は、
NVIDIA Corporation TU117 [GeForce GTX 1650]
ですね。 - 自動的に
nVidia Corporation Audio device
も選択されます。 - 指示に従い、再起動します。
Ubuntu等のisoファイルのアップロード
- データストアブラウザで、
iso
等のフォルダを作成し、Ubuntu
等のiso
イメージをアップロードします。 - 今回は、
Ubuntu Server 18.04.3 LTS
をアップロードしました。
仮想マシンの作成
- 新規仮想マシンの作成をします。
- 名前は
ubuntu-nvidia
、互換性ESXi 6.7 仮想マシン
ゲスト OS ファミリLinux
ゲスト OS のバージョンUbuntu Linux (64ビット)
にしました。
- ストレージを選択します。
- GPUパススルーを利用する場合は
すべてのゲスト メモリを予約(すべてロック)
を有効にします。
- ハードディスクは シンプロビジョニング にしておくと、実際に利用した分だけディスクが使われます。
- CD/DVD で iso メディアを選択します。
- 新規PCIデバイスから GPUを設定します。
- 起動オプションのファームウェアは
EFI
にしました。
- 詳細の構成パラメータで構成の編集をします。
- 以下を設定します。これは、仮想マシン内のNVIDIAドライバが、仮想マシンで動いている事を検知出来ないようにする設定です。
- キー: hypervisor.cpuid.v0
- 値: FALSE
- 仮想マシンを作成完了です。
Ubuntuのインストール
- こちらは、省略します。以下は、ユーザー名、ホスト名の設定箇所です。あと、
ssh
を有効にしています。
仮想マシンへログイン
- ssh で仮想マシンへログインします。
$ ssh ubuntu@192.168.1.19
- GPUを確認します。NVIDIAなど確認できますね。
$ lspci
省略
03:00.0 VGA compatible controller: NVIDIA Corporation Device 1f82 (rev a1)
03:00.1 Audio device: NVIDIA Corporation Device 10fa (rev a1)
NVIDA CUDA、Python、TensorFlow、Kerasのインストール
- 以前 機械学習(Keras, PyTorch)と分散学習(Horovod)の環境構築シェルスクリプト で紹介したものから一部を利用しています。
- 詳細は省略します。
NVIDIA CUDA
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
$ wget https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
$ sudo apt-mark hold cuda-repo-ubuntu1804 nvidia-machine-learning-repo-ubuntu1804
$ sudo apt update
$ sudo apt install -y --no-install-recommends nvidia-driver-430
$ sudo apt install -y --no-install-recommends cuda=10.0.130-1 libcudnn7=7.6.3.30-1+cuda10.0 libcudnn7-dev=7.6.3.30-1+cuda10.0
$ sudo apt-mark hold cuda libcudnn7 libcudnn7-dev
$ echo "#!/bin/sh -e\nnvidia-smi -pm 1\nexit 0" | sudo tee /etc/init.d/nvidia && sudo chmod 755 /etc/init.d/nvidia && sudo ln -s ../init.d/nvidia /etc/rc5.d/S01nvidia
Python、Keras、TensorFlow
- KerasとTensorFlowはバージョン指定しました。
$ sudo apt install -y --no-install-recommends python3 python3-dev python3-pip python3-setuptools
$ sudo pip3 install keras==2.3.1 tensorflow-gpu==1.14.0
リブート
$ sudo reboot
nvidia-smi で GPU を確認
- GPU を確認します。
$ nvidia-smi
Thu Jan 9 15:37:09 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.33.01 Driver Version: 440.33.01 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 1650 On | 00000000:03:00.0 Off | N/A |
| 30% 38C P0 15W / 75W | 0MiB / 3911MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
- もし、下記を設定していない場合の、
nvidia-smi
の例です。- キー: hypervisor.cpuid.v0
- 値: FALSE
$ nvidia-smi
Unable to determine the device handle for GPU 0000:03:00.0: Unknown Error
Keras MNIST
- では、Keras で MNIST を動かしてみます。
- まず、GPU が使われているか確認したいので、
nvidia-smi
を起動します。 - 以下は、0.1秒毎に更新しながら、
nvidia-smi
を表示しています。
$ watch -n 0.1 nvidia-smi
Every 0.1s: nvidia-smi ubuntu-nvidia: Thu Jan 9 15:45:29 2020
Thu Jan 9 15:45:29 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.33.01 Driver Version: 440.33.01 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 1650 On | 00000000:03:00.0 Off | N/A |
| 30% 33C P8 4W / 75W | 0MiB / 3911MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
- 別の端末から ssh 接続し、MNISTをダウンロードします。
$ wget https://raw.githubusercontent.com/keras-team/keras/master/examples/mnist_cnn.py
- 実行します。
TF_FORCE_GPU_ALLOW_GROWTH
は、必要な分だけ、GPUのメモリを取得する変数です。
$ TF_FORCE_GPU_ALLOW_GROWTH=true python3 mnist_cnn.py
Epoch 1/12
60000/60000 [==============================] - 8s 127us/step - loss: 0.2635 - accuracy: 0.9196 - val_loss: 0.0583 - val_accuracy: 0.9823
省略
Epoch 12/12
60000/60000 [==============================] - 6s 104us/step - loss: 0.0234 - accuracy: 0.9927 - val_loss: 0.0254 - val_accuracy: 0.9913
Test loss: 0.02537108706822928
Test accuracy: 0.9912999868392944
- GPU も使われています。
- メモリは,777MiB 使ってますね。
Every 0.1s: nvidia-smi ubuntu-nvidia: Thu Jan 9 16:49:29 2020
Thu Jan 9 16:49:29 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.33.01 Driver Version: 440.33.01 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 1650 On | 00000000:03:00.0 Off | N/A |
| 30% 47C P0 54W / 75W | 789MiB / 3911MiB | 82% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 12508 C python3 777MiB |
+-----------------------------------------------------------------------------+
EC2 p2.xlarge と GeForce GTX 1650 の比較
- 比較をしてみました。
- 実行時間は、若干
GeForce GTX 1650
が速かったです。 - MNIST は 約800MiB 程度しかメモリを使わないので良いですが、最近はメモリを沢山使う場合が多いので、EC2の利用も必要かと思います。
- 簡単な検証は、ESXiで、本番の学習は EC2でと言う感じで、使い分ければ、お金の面でも安心かも。
環境 | GPU | GPU メモリ | time | 価格 |
---|---|---|---|---|
EC2 p2.xlarge | Tesla K80 | 11441MiB | 1m39.772s | 約170円/時 (東京、オンデマンド) |
ESXi | GeForce GTX 1650 | 3911MiB | 1m19.537s | 約16,000円 |
おわりに
- ESXi と GPU パススルー の環境構築をしました。
- EC2 の Tesla K80 と GeForce GTX 1650 で Keras MNIST を速度面で確認しました。
- 次回は、GeForce RTX 2080 Ti を Windows 10(ゲーム) と Ubuntu Server(機械学習) で切り替えながら利用したいと思います。