EC2 G4インスタンスのAmazon Linux 2にNVIDIA CUDAをインストールしてみた

NVIDIA T4 Tensor Core GPUを備えたEC2インスタンス(G4)上のAmazon Linux 2にNVIDIA TESLA GPUドライバーとCUDA 11.0をインストールしてみました。
2020.07.27

EC2 G4 インスタンスは NVIDIA Turing アーキテクチャの NVIDIA T4 Tensor コア GPU を搭載するGPU系インスタンスです。

費用対効果に優れ、機械学習推論やグラフィックスを多用するアプリケーションに向いています。

今回は、このG4にNVIDIA TeslaドライバーとCUDA環境を構築する方法を紹介します。

インストール方針

CUDA をインストールするには、主に以下の3通りがあります。

  1. インストール済みAMIを利用
  2. RPMパッケージからインストール
  3. インストーラー(runfile)からインストール

上のものほど、環境を簡単に用意でき、運用負荷も低いため、おすすめです。

後ろ2つのどちらが選ぶべきかについて、NVIDIA の公式ドキュメント *1から引用します。

2.5. Choose an Installation Method

The CUDA Toolkit can be installed using either of two different installation mechanisms: distribution-specific packages (RPM and Deb packages), or a distribution-independent package (runfile packages). The distribution-independent package has the advantage of working across a wider set of Linux distributions, but does not update the distribution's native package management system. The distribution-specific packages interface with the distribution's native package management system. It is recommended to use the distribution-specific packages, where possible.

※太字は当方が付与

以下では、各インストール手順を紹介します。

1. インストール済みAMIを利用

NVIDIAドライバー、CUDA ツールキットがインストール済み AMI を利用します。

ユーザーは特別な設定なしに CUDA を利用できるため、まずはこの方式をご検討ください。

インストール済みの AMI の例としては以下のものなどがあります。

2. RPMパッケージからインストール

パッケージマネージャー(YUM)からインストールします。

NVIDIA CUDA用のレポジトリを追加すれば、依存関係やパッケージ更新はパッケージマネージャーが解決してくれるため、構築・運用の手間は比較的軽微です。

インストールするには、NVIDIAのインストールドキュメントにある RHEL 7 向けと同等の手順を行います。

事前準備

CUDA向けGPUがあることを確認します。

$ lspci | grep -i nvidia
00:1e.0 3D controller: NVIDIA Corporation TU104GL [Tesla T4] (rev a1)

カーネルヘッダーなどをインストールします。

$ sudo amazon-linux-extras install epel
$ sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)

CUDA用のレポジトリを追加します。

インストール

$ ARCH=$( /bin/arch )
$ echo $ARCH
x86_64
$ distribution=rhel7
$ sudo yum-config-manager --add-repo http://developer.download.nvidia.com/compute/cuda/repos/$distribution/${ARCH}/cuda-$distribution.repo
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
adding repo from: http://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-rhel7.repo
grabbing file http://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-rhel7.repo to /etc/yum.repos.d/cuda-rhel7.repo
repo saved to /etc/yum.repos.d/cuda-rhel7.repo

CUDAとそのドライバーをインストールします。

$ sudo yum install -y nvidia-driver-latest-dkms cuda cuda-drivers

インストールされたことを確認します。

$ nvidia-smi -q

==============NVSMI LOG==============

Timestamp                                 : Sat Jul 25 10:14:28 2020
Driver Version                            : 450.51.06
CUDA Version                              : 11.0

Attached GPUs                             : 1
GPU 00000000:00:1E.0
    Product Name                          : Tesla T4
    Product Brand                         : Tesla
...

設定

共有ライブラリ

/etc/ld.so.conf.d/cuda-11-0.conf が追加されているので対応不要です。

PATH

$HOME/.bashrc などで CUDA へのパスを通します。

~/.bashrc

export CUDA_HOME=/usr/local/cuda-11.0
export PATH=${CUDA_HOME}/bin${PATH:+:${PATH}}

動作確認

CUDA のサンプルプログラムをビルドできることを確認します。

まず CUDA Toolkit のダウンロードページに移動し、以下を選択します。

  • Operating System : Linux
  • Architecture : x86_64
  • Distribution : CentOS
  • Version : 7
  • Installer Type : runfile(local)

手順に従い、cuda_11.0.2_450.51.05_linux.run というようなファイル名のベースインストーラーをダウンロードし、$HOME/cuda 以下に展開します。

$ wget http://developer.download.nvidia.com/compute/cuda/11.0.2/local_installers/cuda_11.0.2_450.51.05_linux.run
$ sh cuda_11.0.2_450.51.05_linux.run --extract=$HOME/cuda
$ cd cuda/
$ ls
bin             cuda_cupti          cuda_gdb       cuda_nvcc      cuda_nvprof   cuda_nvtx     cuda_sanitizer_api  libcublas  libcusolver  libnvjpeg       NVIDIA-Linux-x86_64-450.51.05.run
cuda_cudart     cuda_demo_suite     cuda_memcheck  cuda_nvdisasm  cuda_nvprune  cuda_nvvp     EULA.txt            libcufft   libcusparse  nsight_compute
cuda_cuobjdump  cuda_documentation  cuda_nsight    cuda_nvml_dev  cuda_nvrtc    cuda_samples  integration         libcurand  libnpp       nsight_systems

cuda_samples ディレクトリ以下にサンプルプログラムがあるので、移動してビルドします。

$ cd cuda_samples/1_Utilities/deviceQuery
$ make
...
$

プログラムを実行し、CUDA デバイスを認識できていれば、成功です。

$ ./deviceQuery
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "Tesla T4"
  CUDA Driver Version / Runtime Version          11.0 / 11.0
  CUDA Capability Major/Minor version number:    7.5
  Total amount of global memory:                 15110 MBytes (15843721216 bytes)
  (40) Multiprocessors, ( 64) CUDA Cores/MP:     2560 CUDA Cores
...
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.0, CUDA Runtime Version = 11.0, NumDevs = 1
Result = PASS

3. インストーラー(runfile)からインストール

ディストリビューション非依存のインストーラー(runfile)からインストールします。

インストーラーを利用すると、パッケージマネージャーに対応していないディストリビューションにもインストールできる一方で、ディストリビューションのパッケージマネージャーとコンフリクトする恐れがあります。

事前準備

カーネルヘッダーなどをインストールし、パッケージを最新にして再起動します。

$ sudo amazon-linux-extras install epel
$ sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
$ sudo yum update
$ sudo reboot

インストール

CUDA Toolkit のダウンロードページに移動し、以下を選択します。

  • Operating System : Linux
  • Architecture : x86_64
  • Distribution : CentOS
  • Version : 7
  • Installer Type : runfile(local)

手順に従い、cuda_11.0.2_450.51.05_linux.run というようなファイル名のインストーラーをダウンロードし、root 権限で実行してインストーラーを起動します。。

$ wget http://developer.download.nvidia.com/compute/cuda/11.0.2/local_installers/cuda_11.0.2_450.51.05_linux.run
$ sudo sh cuda_11.0.2_450.51.05_linux.run

EULAに同意します。

インストールパッケージをを選択します。

インストールが成功すると、以下の様なメッセージが表示されます。

$ sudo sh cuda_11.0.2_450.51.05_linux.run
===========
= Summary =
===========

Driver:   Installed
Toolkit:  Installed in /usr/local/cuda-11.0/
Samples:  Installed in /home/ec2-user/, but missing recommended libraries

Please make sure that
 -   PATH includes /usr/local/cuda-11.0/bin
 -   LD_LIBRARY_PATH includes /usr/local/cuda-11.0/lib64, or, add /usr/local/cuda-11.0/lib64 to /etc/ld.so.conf and run ldconfig as root

To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-11.0/bin
To uninstall the NVIDIA Driver, run nvidia-uninstall

Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-11.0/doc/pdf for detailed information on setting up CUDA.
Logfile is /var/log/cuda-installer.log

メッセージからは LD_LIBRARY_PATH 向けの対応が必要と読み取れますが、/etc/ld.so.conf.d/cuda-11-0.conf はインストール時に設置されます。 root 権限で ldconfig の実行だけ行います。

# インストールログを確認
$ grep ld.so /var/log/cuda-installer.log
[INFO]: Creating /etc/ld.so.conf.d/cuda-11-0.conf with content /usr/local/cuda-11.0/targets/x86_64-linux/lib

# 設定ファイルを確認
$ cat /etc/ld.so.conf.d/cuda-11-0.conf
/usr/local/cuda-11.0/targets/x86_64-linux/lib

# 設定を反映
$ sudo ldconfig

PATHを通す

YUM インストール時と同じく、$HOME/.bashrc などで CUDA へのパスを通します。

~/.bashrc

export CUDA_HOME=/usr/local/cuda-11.0
export PATH=${CUDA_HOME}/bin${PATH:+:${PATH}}

動作確認

CUDA のサンプルプログラムをビルドできることを確認します。

ビルドに必要なパッケージが足りないので、インストールします。

$ sudo yum groupinstall "Development Tools"

インストール時のログ(Samples: Installed in /home/ec2-user/, but missing recommended libraries) にあるように、 $HOME/NVIDIA_CUDA-11.0_Samples 以下にサンプルプログラムがあります。

先程と同じく、プログラムのディレクトリに移動してビルドします。

$ ls
cuda_11.0.2_450.51.05_linux.run  NVIDIA_CUDA-11.0_Samples

$ cd NVIDIA_CUDA-11.0_Samples/1_Utilities/deviceQuery
$ make
...
$

プログラムを実行し、CUDA デバイスを認識できていれば、成功です。

$ ./deviceQuery
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "Tesla T4"
  CUDA Driver Version / Runtime Version          11.0 / 11.0
  CUDA Capability Major/Minor version number:    7.5
  Total amount of global memory:                 15110 MBytes (15843721216 bytes)
  (40) Multiprocessors, ( 64) CUDA Cores/MP:     2560 CUDA Cores
...
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.0, CUDA Runtime Version = 11.0, NumDevs = 1
Result = PASS

GRIDドライバー・ゲーミングドライバーのインストール方法

本記事では、 NVIDIA TESLAドライバーのインストール方法を紹介しました。 GRIDドライバー、及び、ゲームドライバーについては、次のドキュメントを参照ください。

Linux インスタンスへの NVIDIA ドライバーのインストール - Amazon Elastic Compute Cloud

最後に

EC2 G4 インスタンス上のAmazon Linux 2に Teslta ドライバーとCUDAをインストールした環境を用意する方法を3種類紹介しました。

  1. インストール済みAMIを利用
  2. RPMパッケージからインストール
  3. インストーラー(runfile)からインストール

上のものほど、環境を簡単に用意でき、運用負荷も低いため、おすすめです。

また、後ろ2つについては、インストール後のインスタンスを AMI 化すると、横展開する時の負荷を大幅に軽減できます。

参考

脚注

  1. https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html