nvidiaドライバを入れてみる
nvidiaドライバは、
の2つの経路があるのかなと思っている.
片方はドライバのみ、もう片方はcudaライブラリと共にnvidiaドライバをインストール.
前者を選ぶとcudaライブラリがインストールできないわけではない. あとで必要なcudaライブラリのみを入れればいい.
前者の利点は、最新のnvidiaドライバが利用できる. 後者は「どうせ後からcudaライブラリも使うから一緒に」なシーンかな.
anaconda/minicondaで構築するアプリは「nvidiaドライバ」のみでいい. なぜなら必要なcudaライブラリをcondaコマンドらで
cudatoolkitらの名前で自ら引き込むので. relionとかはそのソースしか提供しないので別途cudaライブラリを用意しておく必要がある.
なのでcryoSPARCも「nvidiaドライバ」さえ入っていればいい(v4.4以降)
NVIDIA/ubuntu
ではnvidiaドライバを淹れてみる.
現状確認
[root@centos7 ~]# uname -r
3.10.0-1160.el7.x86_64
[root@centos7 ~]# lspci -v |grep NVIDIA
13:00.0 VGA compatible controller: NVIDIA Corporation Device 2531 (rev a1) (prog-if 00 [VGA controller])
Subsystem: NVIDIA Corporation Device 151d
[root@centos7 ~]#
GUI環境のログイン画面であると、nvidiaドライバのインストール時に怒られる場合があるので、CUI環境モードに移行させておく
「systemctl isolate multi-user.target」の後で「rmmod nouveau」でもいいけど
[root@centos7 ~]# systemctl set-default multi-user.target
っで次に開発環境を用意する.
カーネル部分に関しては使用したusbに入っているkernel関連パッケージを利用するのもあり
[root@centos7 ~]# yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
[root@centos7 ~]# yum groupinstall "Development Tools"
[root@centos7 ~]# yum install epel-release
[root@centos7 ~]# yum install dkms
あと、boot段階でnouveauを排除するようにしてからreboot
[root@centos7 ~]# vi /etc/default/grub
:
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet"
↓
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet nouveau.modeset=0 modprobe.blacklist=nouveau"
:
[root@centos7 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
[root@centos7 ~]# grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
[root@centos7 ~]# reboot
boot後に「lsmod | grep nouveau」でnouveauがないことを確認します
[root@centos7 ~]# lsmod | grep nouveau
っでnvidiaドライバをインストール
[root@centos7 ~]# bash NVIDIA-Linux-x86_64-525.105.17.run --disable-nouveau --no-opengl-files --no-libglx-indirect --dkms
For some distributions, Nouveau can be disabled by adding a file in the modprobe configuration directory.
--> Yes -> OK
Would you like to register the kernel module sources with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later.
--> Yes
Install NVIDIA's 32-bit compatibility libraries?
--> No
Would you like to run the nvidia-xconfig utility to automatically update your X configuration file so that the NVIDIA X driver will be used when you restart X?
--> No -> OK
(ここをYesで選択したら「rm /etc/X11/xorg.conf」で削除. これがあるとXが正しく動かない)
[root@centos7 ~]#
確認は「nvidia-smi」が正しく出力されたら.
[root@centos7 ~]# nvidia-smi
あとはGUI環境に戻すとかで
[root@centos7 ~]# systemctl set-default graphical.target
[root@centos7 ~]# reboot
これで上手く行くみたい
ほか確認方法として「lshw」とかで NVIDIA が見つかればいいかなと.
[root@centos7 ~]# lshw -class display
*-display
description: VGA compatible controller
product: SVGA II Adapter
vendor: VMware
physical id: f
bus info: pci@0000:00:0f.0
version: 00
width: 32 bits
clock: 33MHz
capabilities: vga_controller bus_master cap_list rom
configuration: driver=vmwgfx latency=64
resources: irq:16 ioport:2040(size=16) memory:e8000000-efffffff memory:f9000000-f97fffff memory:ff300000-ff307fff
*-display
description: VGA compatible controller
product: NVIDIA Corporation
vendor: NVIDIA Corporation
physical id: 0
bus info: pci@0000:13:00.0
version: a1
width: 64 bits
clock: 33MHz
capabilities: pm msi pciexpress vga_controller bus_master cap_list
configuration: driver=nvidia latency=248
resources: irq:65 memory:fb000000-fbffffff memory:c0000000-cfffffff memory:d0000000-d1ffffff ioport:3000(size=128)
[root@centos7 ~]#
とか
nvidiaドライバをインストールしたからには削除も明記する必要があるかなと
nvidiaドライバの削除ですが、2通りあるかな. それはどうやってnvidiaドライバを入れたかに寄ります.
こちらはnvidiaドライバを「bash NVIDIA-Linux-x86_64-525.105.17.run」とかドライバのみを入れた場合です.
この時 uninstall向けのスクリプト「nvidia-uninstall」も一緒にインストールされます
っで削除手順
systemctl get-default <--現在のモードを確認
systemctl isolate multi-user.target <--もし「graphical.target」なら一時的にCUIモードに変更
systemctl stop nvidia-persistenced.service <-- nvidia-persistenced を停止(もし使ってら)
lsmod | grep nvidia <-- カーネルにロードされている nvidia関連カーネルモジュール を見つける
rmmod nvidia_drm nvidia_modeset nvidia <-- nvidia関連カーネルモジュールをカーネルから外す
エラーがあるなら、「lsof | grep nvidia」でその噛んでいるプロセスを探して停止させて再度外す
(slurmで噛んでいる時もあるので)
lsmod | grep nvidia <-- 再度確認します
nvidia-uninstall <-- っで削除コマンドを実行します
dkms status <-- dkmsでエントリーがあるならそれも削除
dkms nvidia_drm nvidia/525.105.17 --all
lsinitrd | grep nvidia <-- /boot/initramfs でnvidia.ko らがあるか確認
(rm /lib/modules/3.10.0-1160.71.1.el7.x86_64/extra/nvidia.*) <-- あるならnvidia関連モジュールを削除
(dracut --force) <-- /boot/initramfsを作り直し
こんな感じで削除します
こちらはCUDAと共にnvidiaドライバを入れた場合の削除方法かと.
コマンド「nvidia-uninstall」がなくて、「yum list installed」に「nvidia-driver-latest」パッケージがあるならこの方法かな.
systemctl get-default <--現在のモードを確認
systemctl isolate multi-user.target <--もし「graphical.target」なら一時的にCUIモードに変更
systemctl stop nvidia-persistenced.service <-- nvidia-persistenced を停止(もし使ってら)
lsmod | grep nvidia <-- カーネルにロードされている nvidia関連カーネルモジュール を見つける
rmmod nvidia_drm nvidia_modeset nvidia <-- カーネルモジュールを外して
lsmod | grep nvidia <-- 再度確認します. 外れない場合は「lsof | grep nvidia」でプロセスを探して停止させrmmodする.
yum remove nvidia-driver-latest -y <-- nvidiaドライバを削除
これでnvidiaのカーネルモジュールが削除されます.
これが正しいかは不明ですが、各種nvidiaドライバを入れて、nvidia-smiを叩いて「CUDA Version:」の値を調べた
Driver Version | CUDA Version | メモ |
535.xx.yy | 12.2 | |
530.xx.yy | 12.1 | |
525.60.11 | 12.0 | RTX40x0対応 |
520.56.06 | 11.8 | RTX4090対応のはじめ |
515.76 | 11.7 | |
515.65.01 | 11.7 | |
510.85.02 | 11.6 | |
510.47.03 | 11.6 | |
470.141.03 | 11.4 | Keplerの上限 |
RTX40x0を搭載するには520以上が必要. 520は新機能ブランチでNVIDIAの推奨である525以降を使った方がいいのかも
https://developer.nvidia.com/cuda-downloadsから必要なcudaライブラリを入手します
こちらでは「 rpm (local) 」なファイル、
cuda-repo-rhel8-11-7-local-11.7.0_515.43.04-1.x86_64.rpm
とか
cuda-repo-rhel8-11-8-local-11.8.0_520.61.05-1.x86_64.rpm
なファイルを取得している. これから必要なライブラリは
yum localinstall cuda-repo-rhel7-11-7-local-11.7.0_515.43.04-1.x86_64.rpm
yum install cuda-toolkit-11-7
と「cuda-toolkit-<バージョン>」のみを淹れる
大抵はaptなんとかでnvidiaドライバのインストールはできるようですが、ここでは上のCentOSのように組み込みたいとおもう
root@ubuntu22:~# uname -r
5.19.0-35-generic
root@ubuntu22:~# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
:
root@ubuntu22:~# apt install build-essential dkms
root@ubuntu22:~# vi /etc/default/grub
:
GRUB_CMDLINE_LINUX=""
↓
GRUB_CMDLINE_LINUX="nouveau.modeset=0 modprobe.blacklist=nouveau"
:
root@ubuntu22:~# update-grub
root@ubuntu22:~# systemctl set-default multi-user.target
root@ubuntu22:~# reboot
lsmodでnouveauがないことを確認して、
root@ubuntu22:~# lsmod |grep nouveau
その後にnvidiaドライバをインストールします
root@ubuntu22:~# bash /Public/cuda/NVIDIA-Linux-x86_64-525.105.17.run --disable-nouveau --no-opengl-files --no-libglx-indirect --dkms
root@ubuntu22:~# systemctl set-default graphical.target
root@ubuntu22:~# reboot
nvidia-smiと実行してしばらくして結果が表示される. これは nvidiaドライバがロードされてなく、nvidia-smiの実行で呼び込まれたからワンテンポ遅れて表示されるそうな
・・・でもlsmodでみるとnvidia.koはkernelに組み込まれている. それとは違った所での「ロード」なのだろうか?まぁそれはいいとして、
っでこの「ワンテンポ遅れる」のをさせず即座に応答させるには「persistence mode」を有効にするといいみたい。
現在の状態はというと
[root@centos7 ~]# nvidia-smi -q | grep "Persistence Mode"
Persistence Mode : Disabled
[root@centos7 ~]#
と「Disabled」と無効となっている。これを有効にするには「nvidia-smi -pm 1」と実行する
[root@centos7 ~]# nvidia-smi -pm 1
Enabled persistence mode for GPU 00000000:13:00.0.
All done.
[root@centos7 ~]# nvidia-smi -q | grep "Persistence Mode"
Persistence Mode : Enabled
[root@centos7 ~]#
っがどうやらこの方法はレガシーな方法のようで、今はもっとエレガントらしい。
参照先https://download.nvidia.com/XFree86/Linux-x86_64/510.47.03/README/nvidia-persistenced.html
ここから下記の中でnvidiaドライバと同じバージョンのソースを取得します
https://download.nvidia.com/XFree86/nvidia-persistenced/
ここでは
[root@centos7 ~]# nvidia-smi -q | grep "Driver Version"
Driver Version : 525.105.17
[root@centos7 ~]#
なので「nvidia-persistenced-525.105.17.tar.bz2」を取得します
[root@centos7 ~]# wget https://download.nvidia.com/XFree86/nvidia-persistenced/nvidia-persistenced-525.105.17.tar.bz2
[root@centos7 ~]# tar xf nvidia-persistenced-525.105.17.tar.bz2
[root@centos7 ~]# cd nvidia-persistenced-525.105.17/
[root@centos7 nvidia-persistenced-525.105.17]# make
[root@centos7 nvidia-persistenced-525.105.17]# make install
mkdir -p /usr/local/bin
install -m 755 _out/Linux_x86_64/nvidia-persistenced /usr/local/bin/nvidia-persistenced
mkdir -p /usr/local/share/man/man1
install -m 755 _out/Linux_x86_64/nvidia-persistenced.1.gz /usr/local/share/man/man1/nvidia-persistenced.1.gz
[root@centos7 nvidia-persistenced-525.105.17]#
次に自動で「persistence mode」を有効にするserviceをインストールします
[root@centos7 nvidia-persistenced-525.105.17]# cd init/
[root@centos7 init]# ./install.sh systemd
これで「nvidia-persistenced」ユーザが作られて、「nvidia-persistenced.service」が用意される.
[root@centos7 ~]# systemctl list-unit-files | grep nvidia
nvidia-hibernate.service enabled
nvidia-persistenced.service enabled
nvidia-powerd.service disabled
nvidia-resume.service enabled
nvidia-suspend.service enabled
[root@centos7 ~]#
一応「./install.sh systemd」でOS起動時に稼働する設定は施されている
[root@centos7 ~]# systemctl status nvidia-persistenced.service
● nvidia-persistenced.service - NVIDIA Persistence Daemon
Loaded: loaded (/usr/lib/systemd/system/nvidia-persistenced.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2023-04-13 01:30:15 JST; 2min 32s ago
Process: 2753 ExecStart=/usr/bin/nvidia-persistenced --user nvidia-persistenced (code=exited, status=0/SUCCESS)
Main PID: 2755 (nvidia-persiste)
Tasks: 1
CGroup: /system.slice/nvidia-persistenced.service
mq2755 /usr/bin/nvidia-persistenced --user nvidia-persistenced
Apr 13 01:30:14 centos7 systemd[1]: Starting NVIDIA Persistence Daemon...
Apr 13 01:30:14 centos7 nvidia-persistenced[2755]: Started (2755)
Apr 13 01:30:15 centos7 systemd[1]: Started NVIDIA Persistence Daemon.
[root@centos7 ~]#
「nvpd_rpc.h:9:10: fatal error: rpc/rpc.h: No such file or directory」と言われたらlibtirpc-develを「dnf --enablerepo=devel install libtirpc-devel」として入れる
下記コマンドでの違いについて
「bash /Public/cuda/NVIDIA-Linux-x86_64-525.105.17.run --disable-nouveau --no-opengl-files --no-libglx-indirect --dkms」
「bash /Public/cuda/NVIDIA-Linux-x86_64-525.105.17.run」
引数をを入れた場合(左) と 何も引数を入れない場合(右) の差
/usr/lib/modprobe.d
nvidia-installer-disable-nouveau.conf -
/usr/lib64/xorg/modules/extensions/
- libglxserver_nvidia.so.525.105.17
/usr/lib64/
libEGL_nvidia.so.525.105.17
libGLESv1_CM_nvidia.so.525.105.17
libGLESv2_nvidia.so.525.105.17
libGLX_nvidia.so.525.105.17
libnvidia-eglcore.so.525.105.17
libnvidia-egl-gbm.so.1.1.0
libnvidia-egl-wayland.so.1.1.10
libnvidia-glcore.so.525.105.17
libnvidia-glsi.so.525.105.17
libnvidia-glvkspirv.so.525.105.17
libnvidia-ngx.so.525.105.17
libnvidia-rtcore.so.525.105.17
libnvidia-tls.so.525.105.17
libnvidia-vulkan-producer.so.525.105.17
libnvoptix.so.525.105.17
/usr/share/glvnd/egl_vendor.d/
- 10_nvidia.json
/usr/share/egl/egl_external_platform.d/
10_nvidia_wayland.json
15_nvidia_gbm.json
/etc/modprobe.d/
nvidia-installer-disable-nouveau.conf
「--disable-nouveau --no-opengl-files --dkms」とすると「10_nvidia.json」含まれた
{
"file_format_version" : "1.0.0",
"ICD" : {
"library_path" : "libEGL_mesa.so.0"
}
}
どうやらこの辺になると上級者っぽい
NVIDIA-Linux-x86_64-515.105.01.run --expert
(オプション)どうも計算中にコケるので試してみた. GPUカードによっては指定値に範囲があるみたい.
[root@xxxxx ~]# nvidia-smi --power-limit=125
Power limit for GPU 00000000:08:00.0 was set to 125.00 W from 250.00 W.
Power limit for GPU 00000000:09:00.0 was set to 125.00 W from 250.00 W.
Power limit for GPU 00000000:43:00.0 was set to 125.00 W from 250.00 W.
Power limit for GPU 00000000:44:00.0 was set to 125.00 W from 250.00 W.
All done.
[root@xxxxx ~]#
手元にあるRTX A2000(6GB)で調べると
[root@rockylinux9 ~]# nvidia-smi -q
:
GPU Power Readings
Power Draw : 24.26 W
Current Power Limit : 70.00 W
Requested Power Limit : 70.00 W
Default Power Limit : 70.00 W
Min Power Limit : 10.00 W
Max Power Limit : 70.00 W
:
[root@rockylinux9 ~]#
最低値は10Wに定義できるそうな
っで現実的な値「nvidia-smi --power-limit=40」としても再起動すれば元に戻る. これを再起動しても同じ値にるすには?
やっぱりsystemdを立てるのがいいみたい
[root@rockylinux9 ~]# vi /usr/lib/systemd/system/nvidia-powerlimit.service
[Unit]
Description=set cap power usage of GPU
Wants=syslog.target
After=nvidia-persistenced.service
[Service]
Type=forking
User=root
Restart=on-abort
ExecStart=/usr/bin/nvidia-smi --power-limit=40
[Install]
WantedBy=multi-user.target
[root@rockylinux9 ~]#
[root@rockylinux9 ~]# systemctl daemon-reload
[root@rockylinux9 ~]# systemctl enable nvidia-powerlimit.service --now
いちいち「/usr/lib/systemd/system/nvidia-powerlimit.service」を弄るハードコーディングは微妙ですが、単純で明確ならいいのかなと
問題があるなら「systemd-analyze plot > plot.svg」で起動順とか調べてみる
VirtualGLを使い場合、nvidiaドライバー由来のopenglファイルが必要のようで
bash /Public/cuda/NVIDIA-Linux-x86_64-525.105.17.run --disable-nouveau --dkms
と「--no-opengl-files --no-libglx-indirect」を外して入れる必要がります