テーマ的には新鮮味のないエントリーですが、nvidia-xconfigするとCentOS7のXウィンドウズが起動しないという事実を突き止めることができたので備忘録としてメモ。
環境 | 要件 |
ハードウェア | 富士通 TX1310 M3 |
仮想化 | ESXi6.7 Update3 |
グラフィックボード | NVIDIA GTX1050Ti |
ゲストOS | CentOS7.8 |
ドライバー | NVIDIA-Linux-x86_64-450.51.run |
CUDA | CUDA 11.0.3 |

Yahoo!ショッピングで購入した中古のNVIDIA GeForce GTX1050Ti
補助電源を必要とせず、富士通 TX1310 M3のコンパクトな筐体に収まるショート基盤のPalit GeForce GTX1050Ti です。マザーボードに差してDisplay Portから変換ケーブルでHDMIディスプレイに接続すると何もせずに映りましたが、今回は ESXi のゲストOSにコンソールでログインしてXウィンドウを起動してnvidia-smi コマンドが通ることを目標にしました。
1.ESXi のGPUパススルー設定
グラフィックボードをVMから認識できるようにする設定をしていきます。左ペインの[ホスト]-[管理]をクリックして[ハードウェア]-[PCIデバイス]-[NVIDIA Corporation GP107[GeForce GTX 1050Ti]] を選択して[パススルーの切り替え]をクリック。同様にAudio デバイスもパススルーして再起動します。

2.VMの新規作成
「ML Server」という名前でCentOS7.isoからEFI起動オプションのVMを新規作成します。
仮想ハードウェア | 要件 |
CPU | 4 |
メモリ | 16GB(すべてのゲストメモリを予約(すべてロック) |
ハードディスク | 100GB |

[仮想マシンオプション]から[起動オプション]-[ファームウェア]-[EFI]を選択。

ゲストOSを起動してインストーラーを開始。今回は「サーバー(GUI使用)」をベースとします。

ここからはCentOS での作業となります。
3.nouveau を無効にする
GUI起動したらroot からCUIログインに変更して再起動します。
# systemctl set-default multi-user.target
/etc/modprobe.d/modprobe.conf と/etc/modprobe.d/blacklist-nouveau.conf ファイルでOS起動と同時に立ち上がる標準のグラフィックドライバー nouveau をブラックリストに登録します。
# vi /etc/modprobe.d/modprobe.conf
blacklist nouveau
# vi /etc/modprobe.d/blacklist-nouveau.conf
options nouveau modeset=0
blacklist nouveau
yum で最新のカーネルに更新してnouveau ドライバーを無効にした起動イメージを作ります。
# yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
CentOS によるdracut では明示的に–omit-drivers nouveau しないとだめでした。
# mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r)-nouveau.img
# dracut --force --omit-drivers nouveau /boot/initramfs-$(uname -r).img $(uname -r)
いったん、VMをシャットダウンしてPCIデバイスとしてグラフィックボードを追加します。


Audioデバイスもついでに追加して[仮想マシンオプション]-[詳細]-[構成の編集]から下記設定をします。(何故だかは分かりません。)
hypervisor.cpuid.v0 | FALSE |


4.VMを起動→CUDAをインストール
CUDAをインストールするため、再びのCentOSでの作業となります。nouveauがロードされていないことを確認します。
$ lsmod | grep nouveau
何も表示されなければOK
$ lspci | grep -i nvidia
13:00.0 VGA compatible controller: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti] (rev a1) 13:00.1 Audio device: NVIDIA Corporation GP107GL High Definition Audio Controller (rev a1)
つづいてCUDAのコンパイルに必要なgcc gcc-c++ dkms などをyum で一気に揃えます。
# yum install epel-release
epelリポジトリを導入
# yum install --enablerepo=epel dkms
# yum install pciutils gcc gcc-c++ libglvnd libglvnd-devel
# yum install centos-release-scl
scl(Software Collection) を導入
# yum install devtoolset-9
# yum install llvm-toolset-7
rhel ツールセットを導入
# scl enable devtoolset-9 bash
# scl enable llvm-toolset-7 bash
あらかじめhttps://developer.nvidia.com/cuda-toolkit からwgetでクライアントにダウンロードしたcuda_11.0.3_450.51.06_Linux.run ファイルをscp で転送して実行権限を与えて実行します。

$ wget https://developer.download.nvidia.com/compute/cuda/11.0.3/local_installers/cuda_11.0.3_450.51.06_Linux.run
$ chmod 705 ./cuda_11.0.3_450.51.06_Linux.run
$ sudo sh ./cuda_11.0.3_450.51.06_Linux.run
cudaインストールのついでにグラフィックドライバーもインストールできる優れものなのですが、nvidia-xconfig をオプションで有効にするとXウィンドウズが 「no screens found」となり起動しません。(/var/log/Xorg.0.log を良く読む。)最終的にはnvidia-uninstallしてドライバーのアンインストールが必要でした。このあたりの細かい設定は再調査が待たれます。ここでは、drm-kernelオプションと共に無効にしてインストールしました。

パスを登録してVMを再起動します。
$ vi .bashrc
export PATH=/usr/local/cuda-11.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
$ source ~/.bashrc
$ echo $PATH
パス確認
# shutdown -r now
nvidia-smi と入力すると
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
エラーでドライバーが認識されていない模様。NVIDIA公式から単体でNVIDIA-Linux-x86_64-450.51.runをダウンロード、インストール、再起動すると良かったようです。
$ startx

# nvidia-smi が通りました。こんどは、anaconda, cuDNN, TensorFlow インストールしたいですね。
参考URL
インストールガイド CentOS 7.5 minimal with MATE & Nvidia CUDA 9.2 – 脱N00Bしたいエンジニア
ESXi6.7でGPUパススルーしてCUDA10とChainer4.4を使ってみる – Qiita
OS付属コンパイラが古すぎて困った人へ | HPCシステムズ Tech Blog
slurm+mpich+cudaの設定(CentOS7) – 株式会社バイオモデリングリサーチ
他