🐕

Amazon Linux2 CUDA driver install チャレンジ

2020/12/17に公開

こちらは 創薬 (dry) Advent Calendar 2020 17日目の記事です。

TL; DR

AWSのEC2 Amazon Linux2 AMIでGPUが使えるインスタンスにCUDA driverをインストールしこのインスタンスをホストサーバとしてDockerからGPUを利用するまでの流れをまとめました。

NVIDIAが用意しているAMIを使えば話が早いのですが、ケースによってはそのようなAMIが使えないこともあるのでこちらに 2020/12/13現在 の成功例を備忘録としてまとめておきます。
(私自身ググってもNVIDIAのAMIを使おうね!(そりゃそーだ間違ってない)という記事しか見つからなかったので誰かの助けになれば幸いです)

作業

1. EC2インスタンスの起動

今回は Amazon Linux 2 AMI でGPUを持っているインスタンスでは一番安い p2.xlarge を使います。ストレージはデフォルトの8GBだとSSDが足りなくなる可能性が高いので32GBぐらいにアップしておきました。

ストレージ

2. CUDAのインストール

CUDAのインストールに関してはこちらのclassmethodさんの記事をほぼそのまま実行しました。AWS公式のCUDAのインストールに関する記事もあるのですが先にyumでインストールする必要のあるツールの記載などがなくそのまま実行してもCUDAのインストール時にエラーが出てしまいます。

classmethodさんの記事の3番を今回はしています。2番でもいいかもです。

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

EC2インスタンスの再起動が始まります。しばらく待ってから再度接続しましょう。

続けてNVIDIAの公式ページからrunfileをダウンロードします。Amazon Linux2はCentOSをベースとしているので DistributionCentOS を指定しましょう。

wget https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda_11.1.1_455.32.00_linux.run

その後ダウンロードしたファイルを sh で実行します。

sudo sh cuda_11.1.1_455.32.00_linux.run

インストール中にEULAに accept を入力して同意、続けてインストールするパッケージとしてすべてにしたいので特に変更せず Install を選択しました。これでインストールが完了します。おそらく sh 実行時に --silent などを指定すればここら辺の入力は必要なくなるようなので後日調べておきます。

インストール後の画面にて指示されているように LD_LIBRARY_PATH と PATH の設定を行います。

はじめに LD_LIBRARY_PATH のために以下のコマンドを実行します。

sudo ldconfig

続けて PATH の設定です。

echo 'export CUDA_HOME=/usr/local/cuda-11.1' >> ~/.bashrc
echo 'export PATH=${CUDA_HOME}/bin:${PATH}' >> ~/.bashrc
source ~/.bashrc

nvcc -V でCUDAのバージョンを表示できたり nvidia-smi でGPUの使用状況が表示されたりしたらCUDAが無事インストールできていると言えるでしょう。

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Mon_Oct_12_20:09:46_PDT_2020
Cuda compilation tools, release 11.1, V11.1.105
Build cuda_11.1.TC455_06.29190527_0

以上で CUDA のインストールは完了です。

3. Dockerのインストール

以下のコマンドを実行してDockerをインストールします。

sudo yum install -y docker \
&& sudo systemctl start docker \
&& sudo systemctl enable docker \
&& sudo usermod -a -G docker ec2-user \
&& sudo reboot

再起動後 docker のバージョンが 19.03 以降になっているか確認しておきます。

$ docker --version
Docker version 19.03.13-ce, build 4484c46

以上で Docker のインストールは完了です。

4. nvidia-container-runtimeのインストール

CUDAをインストールしただけでは後述のGPUを認識したDocker containerの起動時に以下のようなエラーが出てしまいます。

$ docker run --rm -it --name lightweight-gan --gpus all \
    yamasakih/lightweight-gan:0.1.0 /bin/bash
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].

上記エラーメッセージをググったところ nvidia-container-runtime をインストールすればよいそうです。Amazon Linux2はCentOSをベースとしているのでCentOS distributionsRHEL-based distributionsを参照してインストールします。

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.repo | \
  sudo tee /etc/yum.repos.d/nvidia-container-runtime.repo
sudo yum install -y nvidia-container-runtime \
    && sudo reboot

インストール後EC2インスタンスの再起動が始まります。しばらく待ってから再度接続しましょう。

以上で nvidia-container-runtime のインストールは完了です。

5. Docker containerの起動

今回は例としてlightweight-GANという画像を発生させるDeep LearningでGPUを使って見たいと思います。以下のようなDockerfileからビルドしたDocker imageをDockerhubにyamasakih/lightweight-GANという名前でアップロードしておきました。

FROM nvidia/cuda:11.1-devel-ubuntu16.04

RUN apt-get update && apt-get -y upgrade \
    && apt-get install libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 \
    libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6 wget unzip -y \
    && wget -P /opt https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh \
    && bash /opt/Anaconda3-2020.11-Linux-x86_64.sh -b -p /opt/conda \
    && rm /opt/Anaconda3-2020.11-Linux-x86_64.sh \
    && echo "export PATH=/opt/conda/bin:$PATH" >> ~/.bashrc \
    && . ~/.bashrc \
    && conda init

RUN . /opt/conda/etc/profile.d/conda.sh \
    && conda install pytorch -c pytorch

RUN /opt/conda/bin/pip install lightweight-gan

こちらを以下のように起動します。

mkdir gan && cd gan
docker run --rm -it --name lightweight-gan --gpus all \
    -v $(pwd):/tmp/gan yamasakih/lightweight-gan:0.1.0 /bin/bash

以前はNVIDIA社のGPUを利用する場合は nvidia-docker を別途インストールする必要があったのですが、 docker version 19.03 以降はその必要もなくなり、オプション --gpus を指定するだけとかなりお手軽に利用できるようになりました。

比較のためにオプション --gpus をつけずに実行してGPUが認識されている確認します。

$ docker run --rm -it --name lightweight-gan \
    -v $(pwd):/tmp/gan yamasakih/lightweight-gan:0.1.0 /bin/bash
(base) root@0a9efc511aaa:/$ nvcc -V  # nvccコマンドが実行できるか確認
nvcc: NVIDIA (R) Cuda compiler driver  # ドライバは入っているためこのように表示される
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Mon_Oct_12_20:09:46_PDT_2020
Cuda compilation tools, release 11.1, V11.1.105
Build cuda_11.1.TC455_06.29190527_0
(base) root@0a9efc511aaa:/$ python
Python 3.8.5 (default, Sep  4 2020, 07:30:14) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()  # pytorchからGPUを認識しているか確認
/opt/conda/lib/python3.8/site-packages/torch/cuda/__init__.py:52: UserWarning: CUDA initialization: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx (Triggered internally at  /opt/conda/conda-bld/pytorch_1607370172916/work/c10/cuda/CUDAFunctions.cpp:100.)
  return torch._C._cuda_getDeviceCount() > 0
False  # GPUが認識できてないのでFalseとなる

GPUが認識されていないですね。では次にオプション --gpus をつけて実行してみます。

$ docker run --rm -it --name lightweight-gan --gpus all \
    -v $(pwd):/tmp/gan yamasakih/lightweight-gan:0.1.0 /bin/bash
(base) root@4643da7e43dd:/$ nvcc -V  # nvccコマンドが実行できるか確認
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Mon_Oct_12_20:09:46_PDT_2020
Cuda compilation tools, release 11.1, V11.1.105
Build cuda_11.1.TC455_06.29190527_0
(base) root@4643da7e43dd:/$ python
Python 3.8.5 (default, Sep  4 2020, 07:30:14) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()  # pytorchからGPUを認識しているか確認
True  # GPUが認識できている

GPUが認識されていました。これで長かったですがDocker内からGPUを利用することが可能になりました。お疲れ様でした。

6. おまけ lightweight-GANの実行

せっかくなのでGPUを使って計算が実行されるところまで見てみます。
lightweight-GANは画像を入力データとして学習させることで学習させた画像と似たような画像を発生させることができるDeep Learningです。

例えばこちらのTweetではお寿司の画像を学習させていますね。おいしそう。

そこで私もlightweight-GANで実家の犬の画像を学習させて発生させてみます。
画像約80枚で毛の色が白いので背景の切り抜きが難しく微妙かもですがお試しですね。

まず犬の画像(128px x 128px 80枚)を S3 にアップロードし EC2インスタンスに aws s3 cp でコピーしました。
続けて lightweight_gan というCUIコマンドで簡単に計算ができます

$ lightweight_gan \
    --data ./dog_images/ \
    --name adevent_calender \
    --batch-size 16 \
    --image-size 128 \
    --gradient-accumulate-every 4 \
    --num-train-steps 1000


大体1時間ぐらいで計算が終わりました。見本の画像が自動で生成されているので取り出して見ます。

犬のおばけかな?ただなんとなーく薄茶色の犬っぽいのを表示しようという努力は見えますね。もっと時間をかけて学習したら犬っぽくなりそうです。80枚の画像から1時間程度でここまでいくのはすごいですね!

最後に計算が終わった後はEC2インスタンスを停止しておきましょう。

まとめ

AWSのEC2 Amazon Linux2 AMIでGPUが使えるインスタンスにCUDA driverをインストールしこのインスタンスをホストサーバとしてDockerからGPUを利用するまでの流れをまとめました。

あまり需要がないかもしれませんが色々作業をすることで勉強になりました。どうしてもウェブサイトの記事はどんどん実作業とズレた古い記事になっていってしますが、この記事がしばらくはみなさんの役に立つことを願っています。よい創薬 & AWSライフを!ではでは。

参考

Amazon Linux2にDockerをインストールする
Dockerを使ってAnaconda環境を作ってみた!
NVIDIA Docker って今どうなってるの? (19.11版)
http://docs.docker.jp/v1.11/engine/admin/systemd.html#docker

Discussion