KNOWLEDGE - COLUMN ナレッジ - コラム

【エバンジェリスト・ボイス】Windows上のDockerでGPUを使おう

先端技術部
エバンジェリスト 黒住 好忠  

こんにちは。先端技術部、エバンジェリストの黒住です。

最近ではAIに関する記事や書籍も数多く出版され、実際のソースコードも豊富に存在しています。また、オープンソースで公開されているプロジェクトも膨大な数が存在しており、実際に試すことも可能です。 しかし、それぞれの動作環境は千差万別で、1つの環境で全てを動かすことは困難です。同じ開発言語を利用する環境であっても、ライブラリの組合せやバージョンによって、共存できないことも多々あります。

複数の環境を簡単に使い分けたい
このように、複数環境を使い分けたい場合に便利なのがDockerです。Dockerを使えば、同じPC上で複数の環境を簡単に切替えて利用できます。 必要になれば環境を作成し、不要になれば削除。Dockerはこのような操作を簡単に行えるので、コマンドを1つ実行するだけの些細な処理であっても、それ専用の環境を手軽に用意して実行できます。 Dockerではなく、クラウドを利用する手もありますが、クラウドはネットワークの通信速度の影響を受けたり、使い方を間違えば想定外の料金が発生したりする可能性もあるので、何でも手軽に試せる環境として使うにはは、ややハードルが高くなります。

このように、手軽に試せて便利なDockerですが、Docker(正確にはDocker Desktop for Windows)には「GPUが利用できない」という弱点がありました。特に、最近のAI開発ではGPUが必要不可欠なので、GPU未対応を理由にDocker運用をあきらめることも多々ありました。

しかし、最近になってDockerからGPUが利用できるようになりました。そこで今回は、Docker Desktop for WindowsでGPUを使う方法について紹介したいと思います。

※GPU処理においてはNVIDIA CUDAがデファクトスタンダートになっているため、ここではCUDAの利用を前提に話を進めさせていただきます。なお、CUDAを利用するためには、GeForceやTITANなどNVIDIAのグラフィックカードが必要になるので、あらかじめご了承ください。

GPUが使えるDocker環境の準備
最終的には下図のように、Windows 10上のDocker Desktop+WSL2で、各Docker Containerを動かす構成にします。

layers_417x344

なお、DockerがGPUに対応したとはいえ、2021年2月時点でWSL2からGPU(CUDA)を利用する機能は実験段階にあるため、WindowsとNVIDIA Driverについては開発者向けの先行版を利用する必要があります。先行版は十分なテストが行われておらず、予期せぬ不具合が発生する可能性もあるため、開発用端末など実験的な環境での使用に留めておくことをお勧めします。(おそらく数年後には、一般的な環境で、誰でも利用できる状態になっていると思われます)

参考までに、WSL2でUbuntuなどのディストリビューションを動かし、そのUbuntu上でLinux版のDocker-CEとNVIDIA Container Toolkitを使ってコンテナを動かす方法もありますが、Windows版のDocker Desktop for Windowsを利用した方が簡単です。また、私が試した限りでは、どちらの方法を使った場合でも、パフォーマンスに大きな違いは見られませんでした。

それでは、以下の手順で必要なソフトウェアを導入していきましょう!

1. Microsoft Windows Insider Program(Devチャンネル)への参加
WSL2からGPUを利用するために、Windows Insider ProgramのDevチャンネルで公開されているバージョンのWindowsを利用する必要があります。Devチャンネルに切り替えた後、Windows Updateから最新バージョンを適用してください。

2.NVIDIA Driver(Public Preview版)のインストール
WSL2からGPUを利用するため、「Windows側」に専用のNVIDIA Driver(Public Preview版)をインストールする必要があります。※外部サイト:NVIDIAのCUDA on WSLのページからドライバをダウンロードしてインストールしてください。なお、TITANを使用している場合はGeForce用のドライバを利用します。

3.WSL2の有効化
Windowsの機能で「Linux用Windowsサブシステム」を有効にして、WSL2が使えるようにし   す。機能を有効にした後、コマンドプロンプトなどで「wsl --set-default-version 2」と入力し、デフォルトでWSLのバージョン2が使われるようにしておきます。

4. Docker Desktop for Windowsのインストール
Docker Desktop 3.1.0以降のバージョンをインストールします。「Use the WSL 2 based engine」にチェックを入れ、WSL2エンジンが利用されるようにしてください。

以上で、GPUが利用できるDocker環境の準備が整いました。 参考までに、私が利用している主要なソフトウェア/ハードウェア環境は以下のようになります。
  ・ Windows 10 Pro Insider Preview Build 21322
  ・ Docker Desktop 3.1.0 (51484)
  ・ NVIDIA Driver 465.42 (Public Preview版)
  ・ TITAN RTX(グラフィックカード)


実際に使ってみよう
それでは、LinuxベースのCUDAを利用するコンテナが、Windows上のDockerで実際に動作するか試してみましょう。今回は、NVIDIAが公開している、CUDA SampleのNGCコンテナを利用します。

NVIDIA NGCカタログでは、CUDAを有効化したTensorFlowやPyTorchなどのコンテナも公開されているため、GPU対応の環境を簡単に構築できます。これらのコンテナはLinuxが前提となっているため、以前はLinuxマシン上でしか利用できませんでしたが、DockerやWSL2がGPUに対応した今日では時のパラメーターに--gpus allを加えるだけでGPUが利用できるようになります。簡単ですね。 なお、Dockerのデフォルトでは一部のリソースに制限があるため、NCCLを使う場合などは、必要に応じて--shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864なども指定し、利用するリソースを拡張してください。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
docker run --rm -it --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark -numbodies=512000
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

正常に動作していれば、以下のようにGPUが認識され、GPUを使って処理が行われます。

nbody_1472x832


docker-composeからの起動方法
ComposeからGPUを利用したい場合、少し注意点があります。Docker Desktop 3.1.0で導入されるdocker-composeのバージョンは少し古く、このバージョンはGPUに対応していません。そのため、現時点では、最新のdocker-composeをGitHub等から手動で入手し、差し替える必要があります。 docker-composeは、Ver1.28.0以降でGPUに対応しているので、※外部サイト:GitHubのReleaseページから、1.28以上のバージョンをダウンロードし、既存のdocker-compose.exeと差し替えてください。
docker-compose 1.28.0以上であれば、以下のようなdocker-compose.ymlでGPUが利用できるようになります。起動時にGPUに関連した特別なパラメータは必要なく、これまで通り「docker-compose up」で起動できます。詳細については、※外部サイト:Dockerのドキュメントを参照してください。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

version: '3.9'
services:
 cuda:
   image: nvcr.io/nvidia/k8s/cuda-sample:nbody
   command: nbody -gpu -benchmark -numbodies=512000

# リソースを拡張したい場合の指定(任意)
shm_size: 4gb
ulimits:
  memlock: -1
  stack: 67108864

# GPUを有効にする(docker-compose 1.28.0以上で対応)
deploy:
  resources:
    reservations:
      devices:
        - capabilities: [gpu]


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

注意点
GPUが利用できるようになり活用範囲が広がったのですが、現時点では注意すべきポイントもいくつか存在するので、以下で紹介します。

現時点では実験的な位置づけ
GPU対応は実験段階の機能であるため、開発者向けの特殊なWindowsやNVIDIA Driverのバージョンを利用する必要があります。通常業務など、安定した動作が求められる環境での利用は推奨されません。

パフォーマンスの最適化は行われていない
NVIDIA Driverなど、GPUが使えることを優先して開発されているため、パフォーマンスチューニングは行われていません。そのため現時点では十分なパフォーマンスが発揮できない場合があります。私が試した限りでは、TensorFlowのバッチサイズが少ないと、パフォーマンスが著しく低下し、CPUよりも処理速度が遅くなります。バッチサイズを増やすとパフォーマンスが改善し、Windows上で直接GPUを利用した場合に近い性能が出ました。上記以外にも細かい制約や既知の内容がいくつか存在するので、詳細は※外部サイト:NVIDIAのCUDA on WSLをご参照いただければと思います。


最後に
現時点では上記のような課題も残っていますが、それでもなお、Windows上のDockerからGPUが利用できる事に、大きな魅力やメリットがあります。個人的に、NGCコンテナをWindows上でそのまま動かせる点は、とても魅力的だと思います。近い将来、今ある課題も解消されていくと思いますので、興味のある人はぜひ試してみてくださいね!
それではまた、次のコラムでお会いしましょう。


参考情報、リンクなど
上記で取り上げたサイトや、NGCコンテナのリンクを以下にピックアップしています。必要に応じて、ご参照ください。

※以下全て外部リンク
  Microsoft Windows Insider Program
  Microsoft WSL ドキュメント
  Docker Desktop 公式サイト
  Docker Documentation
  docker-compose (GitHub Releaseページ)
  NVIDIA Drivers for CUDA on WSL
  NVIDIA NGC Catalog
    ・NGC Container - CUDA Samples
    ・NGC Container - TensorFlow
    ・NGC Container - PyTorch
    ・NGC Container - CUDA


当サイトの内容、テキスト、画像等の転載・転記・使用する場合は問い合わせよりご連絡下さい。

エバンジェリストによるコラムやセミナー情報、
IDグループからのお知らせなどをメルマガでお届けしています。

メルマガ登録ボタン

黒住 好忠

株式会社インフォメーション・ディベロプメント 先端技術部 テクニカルスペシャリスト

この執筆者の記事一覧

関連するナレッジ・コラム

地味に見えて優秀!マネージドプレフィックスリストでアドレス管理を効率化

DockerでJupyterLabの環境を作ろう

残された攻撃の痕跡を追え! ~Post-Exploitationで起きていること~