NVIDIA ドライバーと CUDA と OpenCL の設定について
CentOS 7 が動作する AMD A10 APU のパソコンに、GeForce GTX 1650 グラフィックボードを付けました。
APU は、グラフィックチップが内蔵されているので、グラフィックボードがなくても単体で GUI が使えるます。
グラフィックボードを追加することで、CPU で利用できるメモリ領域が増える、GPU が計算に使える、高速化が期待できる利点があります。
ここでは、以下のことを行いました。
- グラフィックボードを挿して、認識するか確認します。
- CentOS7 で、起動時に GUI が立ち上がるのをやめ、CUI 環境にします。
- ディスプレイケーブルを差し替え、BIOS を操作し、APU のグラフィック機能を停止します。
- カーネルのソフトウェアの確認とカーネルの更新を防止します。
- 標準のグラフィックドライバを利用しないようにします。
- NVIDIA のグラフィックドライバーをインストールします。
- CentOS 起動時に GUI で立ち上がるようにします。
- CUDA をインストールします。
- OpenCL の環境を整えます。
- CUDA のサンプルプログラムをコンパイルし、動作させます。
グラフィックボードの装着
電源を落とし、グラフィックボードに付属の手順書に従って、グラフィックボードを挿します。
電源を投入し、従来通り起動することを確認します。
端末を開き、新しく挿したボードが認識されているか確認します。
$ lspci | grep -i vga
今回のケースでは、APU にある Radeon と ボードにある GeForce の2つが確認できました。
GUI から CUI への切り替え
GUI(グラフィカルユーザインタフェース) で立ち上がる場合、CUI(キャラクタユーザインタフェース) で立ち上がるように変更します。
gdm.service を確認し、enabled になっているなら GUI で起動します。
$ systemctl list-unit-files
gdm.service enabled
gdm.service を一旦停止します。
$ sudo systemctl disable gdm.service
再起動し、CUI で立ち上がることを確認します。
CUI の環境でも、GUI 環境を立ち上げることができます。
(※ 日本語の入力は出来ませんでした)
$ LANG=ja_JP.UTF-8 startx
APU のグラフィック機能の停止
電源を落とし、ディスプレイケーブルをグラフィックボードからの出力に切り替えます。
立ち上げ時に、BIOS を起動します。
BIOS の起動は、立ち上げ直後にあるキーを何回か押すことで実現します。
あるキーとは、F1, F2, F4, F9, F10, F12, Del, ESC など BIOS によってまちまちなので、事前の下調べが必要です。
今回のマシンでは、BIOS の以下の設定を、Auto から Disabled に変更することで、APU のグラフィック機能をオフにできました。
Advanced -> Integrated Graphic Configuration -> Initiate Graphic Devices -> Auto=>Disabled
設定を保存して、立ち上げ、VGA が1つになっていれば成功です。
$ lspci | grep -i vga
カーネルソフトウェアの確認とカーネルの更新停止
カーネル関係のソフトウェアを確認します。
バージョンは、以下の例より新しくなっていると思います。
$ yum list installed | grep kernel
kernel.x86_64 3.10.0-1127.18.2.el7
kernel-devel.x86_64 3.10.0-1127.18.2.el7
kernel-headers.x86_64 3.10.0-1127.18.2.el7
kernel-tools.x86_64 3.10.0-1127.18.2.el7
kernel-tools-libs.x86_64 3.10.0-1127.18.2.el7
足りないようでしたら、インストールします。
$ sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
NVIDIA のグラフィックドライバーをインストールするとカーネルが更新されるたびに、グラフィックドライバの再インストールが必要なようです。
なので、カーネルの自動更新を停止させます。
/etc/yum.conf の [main] の項目の最後にでも、exclude=kernel* を追加します。
$ sudo vi /etc/yum.conf
[main]
exclude=kernel*
標準のグラフィックドライバの利用停止
標準では、NVIDIA のボードを挿すと nouveau ドライバが機能します。
$ lsmod | grep nouveau
これを、動作しないように、以下の内容のファイルを作成します。
$ sudo vi /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
カーネルを構築し、リブートします。
$ sudo dracut --force
$ sudo reboot
NVIDIA のグラフィックドライバのインストール
NVIDIA のサイト https://www.nvidia.com/Download/index.aspx?lang=en から、適切なドライバをダウンロードし、実行してインストールします。
$ sudo sh NVIDIA-Linux-x86_64-450.57.run
インストールに成功したら、再起動します。
$ sudo reboot
デバイスドライバを確認します。
$ ls /dev/nvidia*
起動時のエラーがないか確認します。
$ dmesg | grep NVRM
[ 2.403696] NVRM: loading NVIDIA UNIX x86_64 Kernel Module 450.51.06 Sun Jul 19 20:02:54 UTC 2020
GUI への切り替え
OS 起動時に GUI で立ち上がるように、設定を変更します。
$ sudo systemctl enable gdm.service
$ sudo reboot
起動後に、操作してみると、APU のみの時に比べ、操作感が若干早くなった気がします。
CUDA のインストール
CUDA は、NVIDIA のグラフィックボードを利用したソフトウェアを開発する環境です。
NVIDIA のサイト https://developer.nvidia.com/cuda-downloads から、適切なソフトウェアをダウンロードして、インストールします。
$ wget https://developer.download.nvidia.com/compute/cuda/11.0.3/local_installers/cuda-repo-rhel7-11-0-local-11.0.3_450.51.06-1.x86_64.rpm
$ sudo rpm -i cuda-repo-rhel7-11-0-local-11.0.3_450.51.06-1.x86_64.rpm
$ sudo yum clean all
$ sudo yum -y install nvidia-driver-latest-dkms cuda
$ sudo yum -y install cuda-drivers
CUDA が、/usr/local/cuda にインストールされているようであれば、以下のような感じで、環境変数を整えます。
$ vi ~/.bash_profile
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/cuda/bin
export PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64
export CUDA_DEVICE_ORDER=PCI_BUS_ID
OpenCL の環境設定
OpenCL は、GPU を使って計算などを行う環境です。
以下のような設定ファイルに、以下のような内容の記述がなさそうな場合、設定ファイルを作成します。
$ sudo vi /etc/OpenCL/vendors/nvidia.icd
/usr/lib64/libnvidia-opencl.so.1
clinfo コマンドで利用できる環境の情報が表示されます。
$ sudo yum install clinfo
$ clinfo
Number of platforms 1
Platform Name NVIDIA CUDA
Platform Vendor NVIDIA Corporation
Platform Version OpenCL 1.2 CUDA 11.0.197
Platform Profile FULL_PROFILE
Platform Extensions cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_fp64 cl_khr_byte_addressable_store cl_khr_icd cl_khr_gl_sharing cl_nv_compiler_options cl_nv_device_attribute_query cl_nv_pragma_unroll cl_nv_copy_opts cl_nv_create_buffer cl_khr_int64_base_atomics cl_khr_int64_extended_atomics
Platform Extensions function suffix NV
以下略
CUDA のサンプルプログラムのコンパイルと実行
CUDA のサンプルプログラムは、以下にあり、make コマンドでコンパイルできます。
$ cd /usr/local/cuda/samples
$ ls
0_Simple 2_Graphics 4_Finance 6_Advanced EULA.txt Makefile
1_Utilities 3_Imaging 5_Simulations 7_CUDALibraries LICENSE common
$ make
コンパイルが正常終了すれば、それぞれのディレクトリ下にある実行ファイルを起動するとサンプルプログラムが起動します。