お問い合わせはこちら

GPUコンテナとは何か?何が便利なのか?【第1回:GPUコンテナで速攻環境構築】

公開
更新
GPUコンテナとは何か?何が便利なのか?【第1回:GPUコンテナで速攻環境構築】

高速描画処理が必要とされるCG、VR、3DCAD等で利用されてきたGPU(Graphics Processing Unit:グラフィックス プロセッシング ユニット)ですが、近年はIoTやAIの需要が増えるにつれて科学技術計算やディープラーニングなど膨大なデータを扱う場面での利用が増えています。
ひとことでGPUと言っても、ゲーミングPCのグラフィックボードに搭載されるパーソナルユースのGPUから、CPUの数倍から100倍以上の速度で計算処理行うことを可能とするデータセンター向けGPUまで様々な種類が存在します。

[5分で理解]GPUとは?CPUとの違いや性能と活用
https://www.kagoya.jp/howto/rentalserver/gpu1/

このようにGPUの利用場面が広範にわたる中で、機械学習やディープラーニングに適したライブラリが公開されてきました。本来であればGPUを実装したコンピューター上で即座にプログラムやライブラリが稼働すれば、効率よく課題解決できるのですが、OSの種類やデバイスドライバーの組み合わせ、ライブラリのバージョンとの相性などから環境構築作業に工数を費やすことが多々あります。この問題を解決するためのひとつの手段として、コンテナ技術を活用し、環境構築の簡易化とコンテナからGPUを効率よく稼働させることを目指します。

この連載について

本連載は、全5回のシリーズを通してできるだけ効率的に、GPUの環境構築を行うためにコンテナの活用を行っていきます。「機械学習やディープラーニングをGPUで実行してみたいけど難しそう…」など導入にハードルを感じられている方に、コンテナを活用することで、環境構築に要する工数を圧倒的に削減し、即座に課題に取り組むことができるメリットを感じていただきます。そのために必要な知識や操作方法を、当社のGPUサーバーを使い解説していきます。
連載を読み終えるころには、TensorFlowPyTorchなどのメジャーなフレームワークを使った演習ができるようになっているはずです。

本連載は次回以降、こちらの手順で進めていきます

・TensorFlowとKerasによるディープラーニング(第2回)

OSS(オープンソースソフトウエア)の機械学習ライブラリの中からTensorFlow(テンソルフロー)Keras(ケラス)を取り上げ、これらが稼働するコンテナを作成し、コンテナ内からGPUを指定する方法について紹介します。TensorFlowはKerasを取り込む形で公開されていて、ディープラーニングをする際の使い勝手の良さから、多くのユーザーに利用されています。この回ではKerasを使って画像認識を行います。

・Chainerを使ったディープラーニング(第3回)

ディープラーニングのフレームワークとして有名なChainer(チェイナー)の利用方法を紹介します。コンテナからGPUを利用する手順と、GPUによってどれだけ高速化に寄与できたかについて、Pythonのプログラム実行結果を通して確認します。C言語に比べて処理時間がかかると言われているPythonですが、数値計算を効率的に行うための拡張モジュールであるNumPy(ナムパイ)についても取り上げます。

・Pytorchでニューラルネットワーク(第4回)

Pythonの機械学習用フレームワークであるPytorch(パイトーチ)を取り上げます。PyTorchではTensor(テンソル)という型で行列を表現します。Tensorは多次元配列を扱うためのデータ構造であり、GPUをサポートしていることから、Pytorchが稼働するコンテナを利用し、GPUによる高速処理を行う手順について紹介します。

・OpenPoseによる関節点抽出・姿勢推定(第5回)

カメラ画像のAI画像認識と言えば「顔認証」を思い浮かべる人が多いと思いますが、最近は一歩進み、人が映った静止画や動画から関節点抽出・姿勢推定に取り組むケースが増えています。人体、顔、手足などのキーポイントを画像から検出する技術がディープラーニングにより、実用レベルまで向上しているからです。この回ではOpenPose(オープンポーズ)というライブラリをGPU上で動かすコンテナを使い、動画ファイルの関節点抽出手順を紹介します。

GPUコンテナの基礎知識

では、ここからはGPUコンテナを活用するための基礎知識や環境構築の手順について紹介します。

そもそもコンテナ技術とは?

下図のようにホストOSの上にコンテナ管理ソフトを実装し、その上にコンテナと呼ばれる論理的な区画を作ります。このコンテナ内でアプリを動作させるために必要なライブラリ等のミドルウエアといっしょにひとつにまとめた概念です。このようにすることでひとつのコンテナをひとつのサーバーのように使用することが可能になります。

コンテナについては、以下のコラムに記載されていますので、参考にしてください。

【再入門】コンテナ技術とは?基本をわかりやすく解説します
https://www.kagoya.jp/howto/rentalserver/container-03/

本連載記事では、TensorFlowなどのメジャーなフレームワークを含むコンテナを利用し、GPUの効果的な活用方法を具体的に紹介していきます。

GPUコンテナの考え方

・GPU向けコンテナが必要な理由

AIの初学者がGPUマシン上でディープラーニング等を行うためのハードルのひとつとして、開発環境を構築するための工数が挙げられます。ドライバ、フレームワーク、ライブラリのインストールを行っても、それぞれのバージョンの組み合わせや相性でライブラリが正常に起動せず、動作検証のために数日要することがありえます。フレームワークは日々、進化しており、新しいバージョンがリリースされる頻度も高く、各ソフトのバージョンの組み合わせで動作しないことを経験されたかたも多いのではないかと思います。

・GPUコンテナを使うメリット

本来であれば、膨大なデータセットを使う学習モデル構築や高速演算処理にすぐに着手したいわけですが、前述のようなセットアップ作業に時間を要するケースを避けるためのひとつの手段として、GPUに対応したコンテナを使うことが考えられます。
ベンダーが提供しているコンテナやDocker Hubに公開されているコンテナを効果的に利用すれば、環境構築工数を大幅に削減でき、すぐに課題に取り組むことも可能です。
また、ひとつのテーマに対して、様々フレームワークを使い、処理結果の相違や処理時間をベンチマークしたい場合にも、コンテナの有効活用が期待できます。

・GPUコンテナを使うデメリット

このようにGPUコンテナを使うメリットはとても大きいと言えるのですが、利用者がコンテナの中身を理解しないと、フレームワークやライブラリのアップデート時などの環境変化に自力で対応できないことがあるため、利便性を享受しながらも同時にコンテナ内で何が行われているかについて知っておく必要があります。
では、GPUコンテナを実際に使ってみましょう。

GPUを使うための準備

ここでは、カゴヤのNVIDIA Tesla GPUサーバー P100またはP40を使って機械学習をするための準備を行います。対象プロセッサ用のデバイスドライバーのダウンロード、CUDA(クーダ:NVIDIA社が提供するGPUコンピューティング向け統合開発環境)の設定方法ならびにcuDNN(ディープラーニング用ライブラリ)の使い方など、GPU活用に不可欠な基礎知識についてとりあげます。

GPUカード ドライバとCUDA Toolkitのインストール

まず始めに行うことはGPUを搭載したグラフィックボード(GPUカード)のデバイスドライバーをインストールすることです。
おおまかな手順は以下になりますが、詳細はカゴヤのWEBサイト上にあるオンラインマニュアルに記載されていますので、ご参照ください。

NVIDIAドライバーのダウンロード
公式ダウンロードページはこちら
https://www.nvidia.com/Download/index.aspx?lang=en-us

UbuntuでのGPUカードドライバーのインストール
カゴヤサーバーでのインストール手順はこちら

GPU は本来、画像処理用プロセッサであるため、汎用計算用途で使用するには GPGPU(General-purpose computing on graphics processing units)開発環境である「CUDA」が必要になります。 「CUDA」を使用するには、CUDA Toolkit をサーバーにインストールする必要があります。

CUDA Toolkit(11.0 RC)のダウンロードとインストール
公式ダウンロードページはこちら
https://developer.nvidia.com/cuda-downloads

GPUに対応したコンテナの準備

ここからDockerを使ってGPUをコンテナ化する作業に入っていきますので、先ずはコンテナが利用できる環境を構築します。
【環境】
OS:Ubuntu 16.04 LTS
GPU:Tesla P40

・Dockerインストール前の準備

ここでは、Community Edition (CE)をインスールします。

古いバージョンのDockerが入っている場合はアンインストールします。 なければ、スキップして次のステップに進んでください。

$ sudo apt-get -y remove docker docker-engine

aptをアップデートします。

$ sudo apt-get update

httpsでリポジトリを使えるようにするためにパッケージをインストールします。

$ sudo apt-get -y install
apt-transport-https
ca-certificates
curl
software-properties-common

公式GPGキーを追加します。

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

スクリプトを実行し、正しく登録されたら OK と表示されます。

Dockerリポジトリを追加し、登録が終わったらaptをアップデートします。

$ sudo add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs) 
stable"
$ sudo apt-get update

・Dockerのインストール

次のスクリプトを実行し、Dockerをインストールします。

$ sudo apt-get -y install docker-ce

・Dockerの動作確認

ubuntuのイメージをもとにDockerコンテナを作成し、実行します。作成したコンテナの中でhello-worldという文字を表示させます。

$ sudo docker container run ubuntu:latest /bin/echo "hello-world"

下記のように表示されればDockerは正常に動作しています。

Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete
fc878cd0a91c: Pull complete
6154df8ff988: Pull complete
fee5db0ff82f: Pull complete
Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest
hello-world

DockerコンテナからGPUを利用する

NVIDIA Container Toolkitのインストール

NVIDIA Container Toolkit を利用し、Dockerコンテナからサーバー上のGPUを指定します。--gpusを使い、GPU コンテナを作成します。

リポジトリをaptに登録し、ツールキットをインストールします。

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

$ sudo apt update && sudo apt install -y nvidia-container-toolkit
$ sudo systemctl restart docker

nvidia-container-cli infoコマンドで GPU が認識できていることを確認します。CUDAのバージョンやGPUのモデル情報が表示されます。

$ nvidia-container-cli info
NVRM version: 440.64.00
CUDA version: 10.2

Device Index: 0
Device Minor: 0
Model: Tesla P40
Brand: Tesla
GPU UUID: GPU-ccffd358-4ab2-0dab-10cf-78df33604be1
Bus Location: 00000000:03:00.0
Architecture: 6.1

Dockerコンテナを起動する

Docker コンテナ内でnvidia-smiコマンドを実行し、GPUを認識しているか確認します。

$ docker run --gpus all ubuntu nvidia-smi
Fri Jun 12 09:51:17 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.64.00 Driver Version: 440.64.00 CUDA Version: N/A |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla P40 Off | 00000000:03:00.0 Off | 0 |
| N/A 27C P8 10W / 250W | 10MiB / 22919MiB | 0% Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+


Docker コンテナ内からGPUを認識できていることが確認できました。

連載を通して構築する最終的なイメージ

今回、GPUコンテナが動作するところまで確認できました。次回以降はいろいろなフレームワークに対応したGPUコンテナの作成と利用方法について紹介します。下図のようなイメージの環境が出来上がります。

次回予告 第2回:TensorFlowとKerasによるディープラーニング

いよいよ次回から実際にGPU上でTensorFlowなどのメジャーなフレームワークを動かすためのコンテナの活用と課題の解決手順を解説していきます。先ずはTensorFlowとkerasによるディープラーニングモデル構築作業に取り掛かっていきます。学習済モデルの一部を学習し直して利用する転移学習を効果的に使えば、ゼロから学習させる場合よりも、少ないデータと短い時間で一定の精度を出すことが期待できます。