Amazon Linux2 CUDA driver install チャレンジ
こちらは 創薬 (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をベースとしているので Distribution
は CentOS
を指定しましょう。
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 distributionsやRHEL-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