はじめに
Deep Leaningのモデル学習や物体検知(Object Detection)など,GPUを使って高速に処理を行いたい時があります。しかし、GPUを使った処理は、NVIDA系のGPUが必要となる場合が多く、ノートPCのCPUに内蔵されているIntel系のGPUは使えません💦eGPUを購入するという選択肢もありますが、ゲームをする訳でもないのでeGPUを買うのも躊躇します。そこで、考えるのがクラウドを使うという選択肢です。
そこで、AWSのEC2でGPUを搭載した仮想サーバを立ち上げ,DeepStreamやCUDA対応のOpenCVを利用する方法をまとめます。Ubuntsuの仮想サーバを立ち上げて、自力でNVIDA Driver、CUDA、TensorRT、DeepStream、OpenCVとインストールしても良いのですが、バージョンの不整合などなどで非常に苦労しました。そんな中見つけたのが,NVIDA DeepLeaning AMIとNVIDA DeepStream Dockerコンテナを利用する方法です。これを使うことで、1時間程度でDeepStreamとOpenCVが使えるようにできてしまいます。
用意するもの
用意するものは以下の1点だけです。昔だったら,NVIDAのGPUを使うためには,大きなPCケース、マザーボード、CPU、メモリ、GPUカードが必要だったのに,便利な世の中ですねー😍
①AWSアカウント
言わずとしれたAWSを利用するためのアカウントです。
作業手順
それでは、早速さくっとEC2上でDeepStream&OpenCV環境を構築していきましょう。
EC2インスタンス の立ち上げ
まずは、EC2上にGPUが使えるインスタンス を立ち上げていきます。AWS上でGPUが使えるインスタンスタイプは「AWSのGPU系EC2インスタンスをまとめてみた」でまとめて下さっているので、そちらを参照いただければと思います。今回はGPUが使える最も安い「g4dn.xlarge(0.75ドル/時間)」を使っていきます。なお、GPUインスタンス は無料枠で使える物はないので、多少お金がかかります💧
①制限の緩和
AWSの個人アカウントでは、GPUが使えるG系インスタンスの利用は制限されているので、制限緩和の申請を出す必要があります。申請と言っても簡単、EC2ダッシュボードの「制限」のメニューから「G instances」を検索して、「All G instranceのオンデマンドを実行」にチェックを入れて「制限緩和のリクエスト」を行うだけです。g4dn.xlargeは4cpuなので、緩和条件には「4」以上の数値を入力してくださいね。早ければ、1時間程度で制限緩和のメールが届きます。

②インスタンス の起動
制限緩和のメールが届いたら、EC2ダッシュボードの「インスタンス 」メニューから「インスタンス を起動」ボタンをクリックします。

②NVIDA Deep Leaning AMIの選択
DeepStreamを早く利用するためには、AMI の選択で「NVIDIA Deep Learning AMI」を利用することが最短ルートです。このAMIを利用することでNVIDA Driverが入ったインスタンスを利用できます。
手順としては、左メニューから「AWS Makerplace」を選択し、検索欄に「NVIDIA Deep Learning」と入力して検索します。検索結果に出てきた「NVIDIA Deep Learning AMI」の「選択」ボタンをクリックします。

利用料金に関する説明が表示されるので「Continue」ボタンをクリックします。ちなみに、このAMIは無料で使えます❗️すばらいいですね。

③インスタンスタイプの選択
インスタンスタイプの選択画面が表示されたら「すべてのインスタンスファミリー」ボタンをクリックし、リストから「g4dn」を選択します。

g4dnのインスタンスタイプがリストに表示されたら「g4dn.xlarge」を選択し「次のステップ:インスタンス の詳細設定」ボタンをクリックします。

④インスタンスの詳細の設定
インスタンス の詳細は、特に変更する必要はないので「次のステップ:ストレージの追加」ボタンをクリックします。

⑤ストレージの追加
DeepStreamのDockerイメージは10GBぐらいあるので、ルート(/dev/sda1)のサイズは「64GB」ぐらいに設定しておくことをお勧めします。

⑥タグの追加
タグの追加画面では、特に設定するものはないので「次のステップ:セキュリティグループの設定」ボタンをクリックします。

⑦セキュリティグループの設定
セキュリティグループの設定画面では、デフォルトでHTTPSと5000ポートが空いているので、これを削除しておくのが良いでしょう。

⑧インスタンス 作成の確認
最後にインスタンス 作成の確認画面が表示されるので「起動」ボタンをクリックします。

「起動」ボタンを押すと、以下のようにインスタンスが作成され、起動します。

⑨インスタンス の確認
インスタンス が起動したらSSHでログインしましょう。「/etc/os-release」を確認するとUbuntu 18.40ベースであることが確認できます。また「nvidia-smi」コマンドを実行するとNVIDIA Driverがインストール済みであること、GPUがTesla T4である事も確認できます。さらにDockerもインストール済みです。
DeepStream Dockerコンテナの利用
「NVIDIA Deep Learning AMI」は、Deep Learningと名前が付きますが、単体ではDeepStreamを利用することはできません。そこで、DeepStreamを利用できるDockerコンテナ「Containers: nvidia:deepstream」を利用します。

①コンテナのダウンロード
Dokcerコンテナのダウンロードは簡単です。「docker pull nvcr.io/nvidia/deepstream:5.0.1-20.09-triton」と入力してダウンロードします。このコンテナは8GB程度あるのでダウンロードに5分程度かかります。
②Dockerイメージの確認
ダウンロードが完了したら「dockler images」コマンドでイメージを確認しましょう。
③Dockerイメージの起動
それでは、Dockerコンテナを起動しましょう‼️「–gpus all」オプションをつけてGPUを利用可能にすることがポイントです。また、ホームディレクトリなどを共用利用できるようにしておくと便利ですね。
④DeepStreamなどの確認
Dockerコンテナが起動したらDeepStreamなどが使えるか「deepstream-app -v」と入力して確認しましょう‼️ちゃんと「deepstream-app version 5.0.0」が使えます!さらにCUDAもロードできています。
⑤nvccの確認
CUDAを使ったアプリのコンパイルに必要となる「nvcc」についても確認します。こちらもちゃんと使えます‼️CUDAのバージョンは10.2.89ですね。ちなみに、nvidia-smiコマンドのCUDAバージョンはあてになりません(笑)
OpenCVのインストール
ここからは、CUDAがインストール済みのDockerコンテナ上にCUDAに対応したOpenCVをインストールしていきます。
①必要パッケージのインストール
まずは、OpenCVに必要となるパッケージをインストールします。
②OpenCVのダウンロード
作業ディレクトリを作成し、OpenCVとOpenCV-contribをダウンロードして、解凍します。今回はOpenCV4.5.0を利用しました。
③CMAKE
「release」ディレクトリを作成したら、以下のようにcmakeします。ポイントは「WITH_CUDA=ON」と「WITH_CUDNN=ON」を設定することです。また「CUDA_ARCH_BIN」にはTesla T4のアーキテクチャ番号である「7.5」を指定します。ここで指定するGPU Compute Capabilityの一覧はここから確認できます。
CMAKEが完了すると各種情報が表示れます。ポイントは97行目の「NVIDIA CUDA」の欄です。
④ビルド
CMAKEが完了したらOpenCVをビルドします。g4dn.xlargeはCPUを4つ搭載しているので「-j4」オプションを使って4つのCPUを使うと早く終わります。といっても、ビルドには30分ぐらい掛かるので、気長に待ちましょう☕️ビルドが完了したら「make install」ですね。
⑤OpenCVの確認
make installしたらOpenCVを確認しましょう。ちゃんとPythonからOpenCVが使えています!
【参考】Docker commit
私はいつも「docker commit」を忘れて、せっかくインストールしたものが消えてしまい泣くので、備忘録として書いておきます。Dockerを使う時は注意ですね💦
おわりに
今回はGPUを使ったDeep LearningやObject Detectionを行うことを目的に、AWS EC2上でDeepStream、CUDA対応のOpenCVを利用する方法をご紹介しました。GPUを搭載したマシンが無くても、時間単位でGPUマシンが使えるのは非常に便利ですね!ただし、g4dn.xlargeは1時間に75円ほどお金がかかるので、インスタンス のあげっぱなしには注意が必要です!
関連記事




コメント