☓NVIDIA GPU CloudをOracle Cloud Infrastructure上で利用してディープラーニングを行う
○NVIDIA GPU CloudをOracle Cloud Infrastructure上で利用してディープラーニングの環境をつくる
こんにちは id:dhigashi です。
日が空いてしまいましたが 9/13, 14 に開催された GTC Japan 2018 に Oracle 様にご招待頂き参加してきました。
GTC Japanとは
GTC Japan は、NVIDIA が主催する日本最大の AI 開発者カンファレンスです。
NVIDIA の GPU Technology Conference (GTC) は、コンピューティング分野で、最重要でかつ不可欠とされるトレーニング、貴重なインサイト、NVIDIA をはじめとする主要な組織の専門家とのネットワーキングが 1 枚のパスで体験できる大変貴重な場となっています。
という事で、ディープラーニング・AI にフォーカスした技術カンファレンスとなっています。
革ジャン CEO で有名なジェンスン・ファン氏による基調講演も行われていました。
2080Ti 欲しいですね。
GTC Japan 2018 - NVIDIA 創業者/CEO Jensen Huang 基調講演
Advantages of a Bare-Metal Cloud for GPU Workloads
Karan Batta 氏による、Oracle Cloud Infrastructure における GPU コンピューティングについてセッションがあり、GPU インスタンスと HPC アプリケーションによるデモが行われました。
従来、HPC やディープラーニングには高い計算能力が必要で高額の先行投資が必要でしたが、クラウドの GPU を利用する事で先行投資無しで必要な分だけ利用し、サービスの成長に合わせて拡張できるようになっているようです。
Oracle Cloud Infrastructure でも、これまで NVIDIA GPU をベアメタルインスタンスで提供していましたが、当イベントの少し前に VM インスタンスでも提供が開始されました。
これにより Tesla V100, P100 といった最新の GPU をより安価に利用することができるようになりました。
NVIDIA GPU Cloud
少し話が飛びますが NVIDIA は NVIDIA GPU Cloud (NGC) というサービスで、TensorFlow、PyTorch、MXNet、 caffe2 などのディープラーニングフレームワークや、 HPC アプリケーションなどの GPU に最適化されたソフトウェアを簡単に利用できる Docker コンテナイメージ (NGC コンテナイメージ) を提供しています。
このコンテナイメージを利用することで、ソフトウェアの環境構築の手間を削減し取り組みたい課題に集中する事ができます。
NGC は各パブリッククラウドで利用でき、先のセッションでも Oracle Cloud Infrastructure でのサポートが紹介されていました。
今回は NGC を利用し Oracle Cloud Infrastructure 上にディープラーニングの環境を作成してみたいと思います。
NGC の準備
NGC アカウントの作成
NGC のアカウントを持っていない場合は、まず Sign Up よりアカウントの作成を行います。
フォームを適切に埋め先に進めていきます。
NGC API Key の発行
ログインができたら API Key を発行します。
ログイン後の画面 (Registry) の右上の Get API Key を押下します。
次に Generate API Key を押下すると API Key が発行され、表示されます。
発行された API Key は次の工程で利用するので控えておいて下さい。
また、生成時のみしか表示されない為、紛失しないようにして下さい。
NGC with Oracle Cloud Infrastructure
NGC の準備ができましたので、実際に Oracle Cloud Infrastructure (OCI) 上で利用してみます。
OCI Compute で NGC を利用するためには二通りの方法があり、それぞれの方法で行ってみたいと思います。
- NGC 導入済みのイメージを利用する
- 自分で環境を構築する
NGC 導入済みのイメージを利用する
NVIDIA によって提供されている GPUに最適化された Compute イメージを利用してインスタンスを作成します。
現時点では以下のリージョンでイメージが提供されています。*1
リージョン | OCID |
---|---|
us-ashburn-1 | ocid1.image.oc1.iad.aaaaaaaaikn6ub6heefqxbe5fkiv4otbfe6ivza6y7di5khnkxkyvf2bkdta |
eu-frankfurt-1 | ocid1.image.oc1.eu-frankfurt-1.aaaaaaaauwuafl6uze6bnusphnn6y2mr5y7ajavx4kza7glyrqggxlnbo4zq |
これらのイメージはインスタンスシェイプに BM.GPU2.2
, BM.GPU3.8
を要求する為、インスタンス作成時に選択できる必要があります。
私の環境では後述するVMインスタンスも含めて GPU インスタンスのサービスリミットが 0 台だった為、サービスリミットの増加をリクエストする必要がありました。*2
インスタンスの作成が完了したら SSH で接続します。
$ ssh -i id_rsa ubuntu@xxx.xxx.xxx.xxx Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-116-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage Get cloud support with Ubuntu Advantage Cloud Guest: http://www.ubuntu.com/business/services/cloud 145 packages can be updated. 0 updates are security updates. *** System restart required *** The programs included with the Ubuntu system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details. Please enter your NGC APIkey to login to the NGC Registry:
NGC API Key の入力を求められるので、先程作成した API Key を指定します。
Please enter your NGC APIkey to login to the NGC Registry: < NGC API Key > Logging into the NGC Registry at nvcr.io.....Login Succeeded
NGC Registry へのログインに成功し、コンテナイメージを取得できるようになりました。
アプリケーションを実行してみる前に nvidia-smi
コマンドで GPU の情報を参照してみます。
ubuntu@ngc:~$ nvidia-smi Sun Sep 23 13:57:16 2018 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 387.26 Driver Version: 387.26 | |-------------------------------+----------------------+----------------------+ | 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 P100-SXM2... Off | 00000000:5E:00.0 Off | 0 | | N/A 40C P0 38W / 300W | 0MiB / 16276MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 1 Tesla P100-SXM2... Off | 00000000:86:00.0 Off | 0 | | N/A 38C P0 39W / 300W | 0MiB / 16276MiB | 2% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
今回起動時に指定した BM.GPU2.2
シェイプは NVIDIA Tesla P100 GPU が 2 つ利用できますので、正しく認識できています。
ではドキュメントの例にある PyTorch と TensorFlow による MNIST トレーニングを行ってみます。
PyTorch
nvcr.io/nvidia/pytorch
コンテナを起動し PyTorch の環境を作成します。
ubuntu@ngc:~$ nvidia-docker run --rm -it nvcr.io/nvidia/pytorch:17.10 ============= == PyTorch == ============= NVIDIA Release 17.10 (build 192702) Container image Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved. Copyright (c) 2016- Facebook, Inc (Adam Paszke) Copyright (c) 2014- Facebook, Inc (Soumith Chintala) Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert) Copyright (c) 2012-2014 Deepmind Technologies (Koray Kavukcuoglu) Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu) Copyright (c) 2011-2013 NYU (Clement Farabet) Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston) Copyright (c) 2006 Idiap Research Institute (Samy Bengio) Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz) All rights reserved. Various files include modifications (c) NVIDIA CORPORATION. All rights reserved. NVIDIA modifications are covered by the license terms that apply to the underlying project or file. NOTE: The SHMEM allocation limit is set to the default of 64MB. This may be insufficient for PyTorch. NVIDIA recommends the use of the following flags: nvidia-docker run --ipc=host ... root@6cb9cd401b8d:/workspace#
コンテナが起動できたら例の中にある MNIST のサンプルスクリプトを実行します。
root@6cb9cd401b8d:/workspace# cd /opt/pytorch/examples/mnist root@6cb9cd401b8d:/opt/pytorch/examples/mnist# python main.py Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz Downloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz Downloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz Processing... Done! Train Epoch: 1 [0/60000 (0%)] Loss: 2.390087 Train Epoch: 1 [640/60000 (1%)] Loss: 2.350225 略 Train Epoch: 10 [58880/60000 (98%)] Loss: 0.279642 Train Epoch: 10 [59520/60000 (99%)] Loss: 0.084955 Test set: Average loss: 0.0547, Accuracy: 9817/10000 (98%)
real 1m43.742s user 2m16.996s sys 0m51.156s
簡単な計測ですが 2 分弱で 10 エポックのトレーニングが完了できました。
TensorFlow
続いて nvcr.io/nvidia/tensorflow
コンテナを起動し TensorFlow の環境を作成します。
ubuntu@ngc2:~$ nvidia-docker run --rm -it nvcr.io/nvidia/tensorflow:17.10 ================ == TensorFlow == ================ NVIDIA Release 17.10 (build 192916) Container image Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved. Copyright 2017 The TensorFlow Authors. All rights reserved. Various files include modifications (c) NVIDIA CORPORATION. All rights reserved. NVIDIA modifications are covered by the license terms that apply to the underlying project or file. NOTE: The SHMEM allocation limit is set to the default of 64MB. This may be insufficient for TensorFlow. NVIDIA recommends the use of the following flags: nvidia-docker run --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 ... root@2a41b3085206:/workspace#
コンテナが起動できたら PyTorch の時と同様に、例の中にある MNIST のサンプルスクリプトを実行します。
root@2a41b3085206:/workspace# cd /opt/tensorflow/tensorflow/examples/tutorials/mnist root@2a41b3085206:/opt/tensorflow/tensorflow/examples/tutorials/mnist# python mnist_with_summaries.py Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes. Extracting /tmp/tensorflow/mnist/input_data/train-images-idx3-ubyte.gz Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes. Extracting /tmp/tensorflow/mnist/input_data/train-labels-idx1-ubyte.gz Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes. Extracting /tmp/tensorflow/mnist/input_data/t10k-images-idx3-ubyte.gz Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes. Extracting /tmp/tensorflow/mnist/input_data/t10k-labels-idx1-ubyte.gz 2018-09-23 15:48:11.841802: I tensorflow/core/common_runtime/gpu/gpu_device.cc:955] Found device 0 with properties: name: Tesla P100-SXM2-16GB major: 6 minor: 0 memoryClockRate (GHz) 1.4805 pciBusID 0000:5e:00.0 Total memory: 15.89GiB Free memory: 15.60GiB 2018-09-23 15:48:12.796144: W tensorflow/stream_executor/cuda/cuda_driver.cc:523] A non-primary context 0x334fff0 exists before initializing the StreamExecutor. We haven't verified StreamExecutor works w ith that. 2018-09-23 15:48:12.797110: I tensorflow/core/common_runtime/gpu/gpu_device.cc:955] Found device 1 with properties: name: Tesla P100-SXM2-16GB major: 6 minor: 0 memoryClockRate (GHz) 1.4805 pciBusID 0000:86:00.0 Total memory: 15.89GiB Free memory: 15.60GiB 2018-09-23 15:48:12.798950: I tensorflow/core/common_runtime/gpu/gpu_device.cc:976] DMA: 0 1 2018-09-23 15:48:12.798966: I tensorflow/core/common_runtime/gpu/gpu_device.cc:986] 0: Y Y 2018-09-23 15:48:12.798976: I tensorflow/core/common_runtime/gpu/gpu_device.cc:986] 1: Y Y 2018-09-23 15:48:12.798992: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla P100-SXM2-16GB, pci bus id: 0000:5e:00.0) 2018-09-23 15:48:12.799005: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:1) -> (device: 1, name: Tesla P100-SXM2-16GB, pci bus id: 0000:86:00.0) Accuracy at step 0: 0.0419 Accuracy at step 10: 0.7162 略 Accuracy at step 980: 0.9705 Accuracy at step 990: 0.9709 Adding run metadata for 999
real 1m8.769s user 1m42.140s sys 0m16.496s
1分ほどで 999 ステップのトレーニングが完了できました。
まとめ
以上のように NVIDIA によって提供されている Compute イメージを利用すると、簡単に NGC を利用できる事が分かりました。
但し、現在イメージでサポートされているインスタンスシェイプがベアメタルのみの為、使用目的によってはコストやスペックの面でアンマッチかもしれません。(スペックはモリモリですが、私の様な初学者などにとっては)
丁度 VM の GPU インスタンスが利用可能になったので、 次は VM インスタンスでより手軽に NGC を利用できるよう環境を構築してみたいと思います。
自分で環境を構築する
用意されたイメージを利用せず自分で環境を構築していきます。
NGC コンテナイメージは Pascal 世代以降の GPU で利用できるため、OCI で提供されている Tesla V100, P100 GPU で利用できる筈です。
今回は OS やインスタンスシェイプを以下の通り指定します。
項目 | 値 |
---|---|
OS | Canonical Ubuntu 16.04 *3 |
Shape | VM.GPU3.1 |
IMAGE VERSION | Gen2-GPU-2018.08.15-0 (latest) |
インスタンスの作成が完了したら SSH で接続して、nvidia-smi
コマンドで GPU の情報を参照してみます。
ubuntu@ngc:~$ nvidia-smi Tue Sep 25 02:02:33 2018 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 396.44 Driver Version: 396.44 | |-------------------------------+----------------------+----------------------+ | 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 V100-SXM2... Off | 00000000:00:04.0 Off | 0 | | N/A 40C P0 36W / 300W | 0MiB / 16160MiB | 4% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
既に GPU ドライバがインストールされており、NVIDIA Tesla V100 GPU x 1 を正しく認識できています。
ではまず、NGC コンテナを取り扱う為に Docker と nvidia-docker をインストールし、nvidia-docker
コマンドが実行できる事が確認します。
ubuntu@ngc:~$ nvidia-docker version NVIDIA Docker: 2.0.3 Client: Version: 18.06.1-ce API version: 1.38 Go version: go1.10.3 Git commit: e68fc7a Built: Tue Aug 21 17:24:56 2018 OS/Arch: linux/amd64 Experimental: false Server: Engine: Version: 18.06.1-ce API version: 1.38 (minimum version 1.12) Go version: go1.10.3 Git commit: e68fc7a Built: Tue Aug 21 17:23:21 2018 OS/Arch: linux/amd64 Experimental: false
尚、インストールの手順は省略しますが、以下を参考にインストールを行いました。
- About Docker CE | Docker Documentation
- Installation (version 2.0) · NVIDIA/nvidia-docker Wiki · GitHub
また、sudo
なしで docker
コマンドを実行できるよう、現行ユーザを docker グループに所属させています。
ubuntu@ngc:~$ sudo gpasswd -a $USER docker
コマンドが実行できる事を確認できたので nvidia-docker login
(docker login
) コマンドでレジストリにログインします。
ubuntu@ngc:~$ nvidia-docker login -u '$oauthtoken' --password-stdin nvcr.io <<< '< NGC API Key >'
以上で環境の構築ができましたので、また PyTorch と TensorFlow による MNIST トレーニングを行ってみます。
PyTorch
ubuntu@ngc:~$ nvidia-docker run --rm -ti nvcr.io/nvidia/pytorch:17.10 ============= == PyTorch == ============= NVIDIA Release 17.10 (build 192702) Container image Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved. Copyright (c) 2016- Facebook, Inc (Adam Paszke) Copyright (c) 2014- Facebook, Inc (Soumith Chintala) Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert) Copyright (c) 2012-2014 Deepmind Technologies (Koray Kavukcuoglu) Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu) Copyright (c) 2011-2013 NYU (Clement Farabet) Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston) Copyright (c) 2006 Idiap Research Institute (Samy Bengio) Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz) All rights reserved. Various files include modifications (c) NVIDIA CORPORATION. All rights reserved. NVIDIA modifications are covered by the license terms that apply to the underlying project or file. NOTE: The SHMEM allocation limit is set to the default of 64MB. This may be insufficient for PyTorch. NVIDIA recommends the use of the following flags: nvidia-docker run --ipc=host ... root@34492ac45c0c:/workspace# cd /opt/pytorch/examples/mnist root@34492ac45c0c:/opt/pytorch/examples/mnist# python main.py Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz Downloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz Downloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz Processing... Done! Train Epoch: 1 [0/60000 (0%)] Loss: 2.390087 Train Epoch: 1 [640/60000 (1%)] Loss: 2.350225 略 Train Epoch: 10 [58880/60000 (98%)] Loss: 0.269842 Train Epoch: 10 [59520/60000 (99%)] Loss: 0.088616 Test set: Average loss: 0.0535, Accuracy: 9816/10000 (98%)
real 3m6.605s user 4m16.816s sys 0m31.364s
3 分程度でトレーニングが完了しました。
TensorFlow
ubuntu@ngc:~$ nvidia-docker run --rm -it nvcr.io/nvidia/tensorflow:17.10 ================ == TensorFlow == ================ NVIDIA Release 17.10 (build 192916) Container image Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved. Copyright 2017 The TensorFlow Authors. All rights reserved. Various files include modifications (c) NVIDIA CORPORATION. All rights reserved. NVIDIA modifications are covered by the license terms that apply to the underlying project or file. NOTE: The SHMEM allocation limit is set to the default of 64MB. This may be insufficient for TensorFlow. NVIDIA recommends the use of the following flags: nvidia-docker run --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 ... root@74e5adc4273a:/workspace# cd /opt/tensorflow/tensorflow/examples/tutorials/mnist root@74e5adc4273a:/opt/tensorflow/tensorflow/examples/tutorials/mnist# python mnist_with_summaries.py Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes. Extracting /tmp/tensorflow/mnist/input_data/train-images-idx3-ubyte.gz Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes. Extracting /tmp/tensorflow/mnist/input_data/train-labels-idx1-ubyte.gz Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes. Extracting /tmp/tensorflow/mnist/input_data/t10k-images-idx3-ubyte.gz Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes. Extracting /tmp/tensorflow/mnist/input_data/t10k-labels-idx1-ubyte.gz 2018-09-25 03:04:58.067101: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:893] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2018-09-25 03:04:58.067485: I tensorflow/core/common_runtime/gpu/gpu_device.cc:955] Found device 0 with properties: name: Tesla V100-SXM2-16GB major: 7 minor: 0 memoryClockRate (GHz) 1.53 pciBusID 0000:00:04.0 Total memory: 15.78GiB Free memory: 15.37GiB 2018-09-25 03:04:58.067524: I tensorflow/core/common_runtime/gpu/gpu_device.cc:976] DMA: 0 2018-09-25 03:04:58.067535: I tensorflow/core/common_runtime/gpu/gpu_device.cc:986] 0: Y 2018-09-25 03:04:58.067551: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0000:00:04.0) Accuracy at step 0: 0.0971 Accuracy at step 10: 0.7185 略 Accuracy at step 980: 0.9678 Accuracy at step 990: 0.9665 Adding run metadata for 999
real 1m17.130s user 2m6.872s sys 0m8.228s
こちらも 1 分程度でトレーニングが完了しました。
まとめ
今回は、NGC を OCI Compute で提供されている GPU インスタンスで利用してみました。
提供済みのイメージを利用したり自身で NGC コンテナの動作環境を構築することで、PyTorch や TensorFlow といったソフトウェアの環境構築の手間を省いて利用だけに取り組めることが分かりました。
皆さんも是非 NGC とクラウドの GPU を利用して、ディープラーニングフレームワークや、 HPC アプリケーションを利用してみてはいかがでしょうか。
トライアルアカウントでのGPUインスタンスについて(未解決)
今回、GPU インスタンスを利用する為に SR でサービスリミットの増加リクエストを行う必要があり、支払い契約済みのアカウントとトライアルアカウントでそれぞれ申請を行った所、トライアルアカウントは通常の SR ではなく別の窓口から申請する必要があるようでした。
The VM and BM versions of our GPU processing is a limited resource that we reserve for our paid enterprise customers. It looks like your account is a 30 day Trial. If you could reach out to your Customer Success Manager for a use case on these items we could work on getting you a trial of these shapes.
トライアルアカウントでの申請方法は、分かり次第補足したいと思います。