CUDA の新しいバージョンが必要な場合に、GPU アクセラレーションに対応した ACK ノードの NVIDIA ドライバーを更新します。
前提条件
次の条件が満たされていることを確認してください。
-
クラスターにアクセスできる
kubectlが設定されていること -
対象の GPU アクセラレーションノードへの SSH アクセス権があること
-
NVIDIA 公式サイトから新しい NVIDIA ドライバーの
.runファイルがノードにダウンロードされていること -
(条件付き) 必要に応じて、対応する NVIDIA Fabric Manager の
.rpmパッケージ (ステップ3のサブステップ5 を参照)
ステップ1:ノードの cordon と drain
-
GPU アクセラレーションノードをスケジュール不可に設定します。
kubectl cordon <NODE_NAME><NODE_NAME>を対象ノード名に置き換えます。想定される出力は次のとおりです。node/<NODE_NAME> cordoned -
ノードからワークロード Pod を退避させます。
kubectl drain <NODE_NAME> --grace-period=120 --ignore-daemonsets=true--grace-period=120は、Pod のグレースフルシャットダウン時間を最大120秒に設定します。--ignore-daemonsets=trueは DaemonSet で管理される Pod をスキップします。これらの Pod は次のステップで処理します。想定される出力は次のとおりです。There are pending nodes to be drained: <NODE_NAME>
ステップ2:現在の NVIDIA ドライバーのアンインストール
-
ノードにログインし、kubelet と containerd を停止します。これにより、
kubectl drainで退避できない GPU 参照を保持している DaemonSet Pod が終了します。sudo systemctl stop kubelet containerd -
GPU デバイスを使用しているプロセスが残っていないか確認します。
sudo fuser -v /dev/nvidia*出力がない場合は、GPU 参照を保持しているプロセスはありません。次のサブステップに進みます。出力がある場合は、表示された各プロセスを終了します。例:
USER PID ACCESS COMMAND /dev/nvidia0: root 3781 F.... dcgm-exporter /dev/nvidiactl: root 3781 F...m dcgm-exporterプロセスを終了します。
sudo kill 3781プロセスが残らなくなるまで
sudo fuser -v /dev/nvidia*を再度実行します。 -
現在の NVIDIA ドライバーをアンインストールします。
sudo nvidia-uninstall -
(オプション) NVIDIA Fabric Manager がインストールされている場合はアンインストールします。インストールされているかどうかを確認します。
sudo rpm -qa | grep ^nvidia-fabric-manager出力がない場合、NVIDIA Fabric Manager はインストールされていません。このステップはスキップします。インストールされている場合は、アンインストールします。
sudo yum remove nvidia-fabric-manager
ステップ3:新しい NVIDIA ドライバーのインストール
-
新しいドライバーをインストールします。以下は
NVIDIA-Linux-x86_64-510.108.03.runを使用した例です。sudo bash NVIDIA-Linux-x86_64-510.108.03.run -a -s -q -
インストールを検証します。
sudo nvidia-smi出力に新しいドライバーのバージョンが表示されます。以下は
510.108.03の例です。+-----------------------------------------------------------------------------+ | NVIDIA-SMI 510.108.03 Driver Version: 510.108.03 CUDA Version: 11.6 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... Off | 00000000:00:07.0 Off | 0 | | N/A 35C P0 40W / 300W | 0MiB / 32768MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+ -
インストール後に必要な設定を適用します。
sudo nvidia-smi -pm 1 || true # Persistence mode を有効化 sudo nvidia-smi -acp 0 || true # 権限を UNRESTRICTED に設定 sudo nvidia-smi --auto-boost-default=0 || true # Auto boost mode を無効化 sudo nvidia-smi --auto-boost-permission=0 || true # 管理者以外のユーザーが Auto boost mode を制御できるようにする sudo nvidia-modprobe -u -c=0 -m || true # NVIDIA unified memory カーネルモジュールをロードし、デバイスファイルを作成 -
(オプション) 起動時に NVIDIA ドライバーをロードするには、
/etc/rc.d/rc.localに次の内容が含まれていることを確認してください。sudo nvidia-smi -pm 1 || true sudo nvidia-smi -acp 0 || true sudo nvidia-smi --auto-boost-default=0 || true sudo nvidia-smi --auto-boost-permission=0 || true sudo nvidia-modprobe -u -c=0 -m || true -
NVIDIA Fabric Manager が必要かどうかを確認します。NVSwitch ベースのマルチ GPU インターコネクトを持つノードでは、このマネージャーが必要です。
sudo lspci | grep -i 'Bridge:.*NVIDIA'出力がない場合、NVIDIA Fabric Manager は必要ありません。出力がある場合は、NVIDIA YUM リポジトリから対応する NVIDIA Fabric Manager パッケージをダウンロードします。パッケージのバージョンはドライバーのバージョンと一致している必要があります。NVIDIA Fabric Manager をインストールして起動します。
# NVIDIA Fabric Manager をインストール sudo yum localinstall nvidia-fabric-manager-510.108.03-1.x86_64.rpm # 起動時に NVIDIA Fabric Manager を有効化 sudo systemctl enable nvidia-fabricmanager.service # NVIDIA Fabric Manager を起動 sudo systemctl start nvidia-fabricmanager.service -
kubelet と containerd を再起動します。
sudo systemctl restart containerd kubelet
ステップ4:ノードのクラスターへの復帰
ノードをスケジュール可能に設定します。
kubectl uncordon <NODE_NAME>
<NODE_NAME> をノード名に置き換えます。Kubernetes はノードへの Pod のスケジューリングを再開します。