GPUインスタンスでディープラーニング - Oracle Cloud Infrastructureアドバンスド

Version 16

    目次に戻る : チュートリアル : Oracle Cloud Infrastructure を使ってみよう

     

    2018/11/5 アップデート :
    現在、GPUインスタンスの利用要望が殺到しているため、一時的に無償トライアル環境でのGPU利用を制限させて頂いています。

    そのためこのチュートリアルの手順を実施するには、2018年11月現在商用のOCI契約が必要になります。

     

    Oracle Cloud Infrastructure では、NVIDIA Tesla アーキテクチャーのGPUが搭載されたインスタンス(仮想マシン、ベアメタルサーバー)が利用できます。クラウド上なので、最新の NVIDIA Tesla V100 のような高価でパワフルなGPUも 1時間あたり270円からという低価格で使えるので、大規模なディープラーニングのトレーニングといった作業の環境として最適です。

    また、Tensorflow、Caffe2、PyTorch、Chainerなど各種のディープラーニングフレームワークに対応したイメージが用意されているため、好きなモデルを簡単にトレーニングすることができます。

     

    このチュートリアルでは、実際にOCIのGPUインスタンス上にディープラーニングのトレーニング環境を作成し、サンプルのトレーニング処理を実際に動かします。

     

    所要時間 : 作業約30分

     

    前提条件 :

    1. 有効な Oracle Cloud Infrastructure の商用環境(無料トライアルでは現在一時的にGPUが使えなくなっています) と、管理権限を持つユーザーアカウントがあること
    2. 初級編 - Oracle Cloud Infrastructure を使ってみよう の内容をひととおり理解していること

     

    注意 : チュートリアル内の画面ショットについては Oracle Cloud Infrastructure の現在のコンソール画面と異なっている場合があります

     

    1. テナンシーでGPUインスタンスが作成できるようにする

    OCIのテナンシーは、初期状態ではGPUインスタンスのサービス・リミットが「0」に設定されているため、そのままではGPUインスタンスは作成できません。サービス・リミットの拡張を申請して、インスタンスが作成できるようにする必要があります。

     

    1-1. GPUが使えるリージョンが有効になっていることを確認する

    このドキュメントの作成時点(2018年10月)では、GPUインスタンスは us-ashburn-1 (米国東海岸)と、uk-london-1(英国) の2つのリージョンでのみ利用することができます。

    まずは、手元のテナンシーで上記のうちどちらかが有効になっていることを確認します。

     

    1. OCIコンソールのメニューから AdministrationTenancy Details を選択します

    2. 遷移したテナンシー詳細画面の左下の Resources メニューから Regions を選択します

    3. Regions フィールドの中で、us-ashburn-1 または eu-frankfurt-1 のいずれかまたは両方がアクティブで、Rのアイコンが緑色であることを確認します
      WS000392.JPG
      上記のようにアイコンが緑色であれば、そのリージョンは有効です。

    4. もし us-ashburn-1eu-frankfurt-1 いずれも有効でない場合は、どちらか任意のリージョンの中にある Subscribe To This Region ボタンを押して、そのリージョンを有効化してください

      リージョンの有効化には1分程度かかります。リージョンが有効になり、アイコンが緑色になったあと、実際に使用するには一度ブラウザのリロードを行う必要があります。

     

    1-2. サービス・リミットの情報を確認する

    現在のテナンシーで、実際にGPUインスタンスのサービス・リミットがいくつに設定されているかを確認します。

     

    1. OCIコンソールのメニューから AdministrationTenancy Details を選択します

    2. 遷移したテナンシー詳細画面の左下の Resources メニューから Service Limits を選択します

    3. Service Limits フィールドの中の Compute の左にある + マークのボタンを押します
    4. 適切なリージョンを選択します。画面右上のリージョン選択ボタンを使って、リージョン us-ashburn-1 または eu-frankfurt-1 を選択します。
      WS000393.JPG

    5. Service Limits の中の Compute フィールドの中を参照し、GPUという名前のつくインスタンスのLimitの数を確認します。
      ドキュメント執筆時点(2018年10月)では、GPUが利用できるインスタンスのシェイプには以下のものがあります。

      シェイプ名インスタンスの種別GPUGPUカード数CPUコア数(OCPU)メモリ1時間あたり定価
      VM.GPU2.1仮想マシンNVIDIA Tesra P100 (Pascal)112104GB153円
      BM.GPU2.2ベアメタルサーバーNVIDIA Tesra P100 (Pascal)228192GB306円
      VM.GPU3.1仮想マシンNVIDIA Tesra V100 (Volta)1690GB270円
      VM.GPU3.2仮想マシンNVIDIA Tesra V100 (Volta)212180GB540円
      VM.GPU3.4仮想マシンNVIDIA Tesra V100 (Volta)424360GB1,080円
      BM.GPU3.8ベアメタルサーバーNVIDIA Tesra V100 (Volta)852768GB2,160円
      利用できる最新のシェイプについては、英語版の最新マニュアルのCompute Shapesの項 をご参照ください。

      例えば、以下の例では、BM.GPU2.2 というシェイプが、AD1 (一番左の列)で1インスタンス作成できるようになっています。
      WS000394.JPG
      もしどこのリージョンにもGPUインスタンスのサービス・リミットが0の場合は、Oracle Cloud Support からサービス・リクエストを上げて、サービス・リミットの制限を緩和する必要があります。

      サービス・リクエストには以下の情報が必要になりますので、これらの情報を準備してリクエストを上げてください。
      • サポートID(CSI)と、oracle.comのアカウント(ID,パスワード)
      • 緩和を依頼したいテナンシーのOCID
      • GPUインスタンスを使いたいリージョン
      • 使いたいGPUインスタンスのシェイプ
      • 使いたいインスタンス数

     

    Oracle Cloud Supportの利用方法がわからない場合は、以下のドキュメントを参考に作業を実施してください

    Oracle Cloud Support ご利用ガイド ユーザー登録・管理(PDF)

    Oracle Cloud Support ご利用ガイド SR作成・管理(PDF)

     

    2. NVIDIA GPU Cloud (NGC) のアカウントを作成する

    作成したインスタンスには、NVIDIAのGPUカードを利用するためのドライバーなどは予め組み込まれていますが、その上で動くソフトウェアやディープラーニングのフレームワーク等は未設定なので、ユーザーが自分で環境を整える必要があります。この作業は慣れた人でもなければなかなか手間のかかる作業で、バージョンの整合性なども考えながらセットアップするのは一苦労になります。

    しかし、OracleのGPUインスタンス用のシェイプには、NVIDIA社が提供する NVIDIA GPU Cloud というディープラーニングの各種フレームワークやドライバーがプリインストールされたDockerコンテナーを利用するための仕組みが組み込まれているため、これを利用することで誰でも簡単にディープラーニングのための環境を作成することができます。

    NGCを利用するには無料のアカウント登録が必要です。サインアップページから作成することができますので、説明に従ってアカウント作成を完了してください。

     

    WS000395.JPG

     

     

    3. NGCにアクセスしてAPIキーを発行する

    NGCは、クラウド上のDockerリポジトリのようなもので、作成したOCIのインスタンスの中からインターネット越しにアクセスして、Dockerイメージをプルできるのですが、その際にアクセスするためのAPIキーが必要になりますので、NGCのページからそれを発行します。

     

    1. ログインページからNGCにログインします

    2. 右上の Get API Key という緑のボタンをクリックします
      WS000396.JPG

    3. 次の画面で、右上の Generate API Key ボタンをクリックします
      WS000397.JPG

    4. 確認メッセージのあと、Confirm ボタンを押すと、APIキーが生成されて画面下部に表示されます。
      この鍵はのちほど使用しますので、コピーして控えておいてください。この鍵は一度だけしか表示されません。
      WS000398.JPG

     

    4. GPUインスタンスを作成する

    いよいよGPUインスタンスを作成していきます。通常のインスタンス作成とほぼ同じですが、ポイントはNGCに最適化されたイメージを利用するところです。このイメージはGUIのドロップダウンリストからでは選択できないので、OCIDを直接指定して作成します。

     

    1. OCIコンソールの画面右上のリージョン選択ボタンから、GPUを使いたいリージョン(us-ashburn-1、eu-frankfurt-1など) を選択します。

    2. そのリージョンに PLUS RELATED RESOURCES オプション付きでVCNを一つ作成します。既存のものを利用してもOKです。

    3. メニューから Compute → Instances を選択し、Create Instance ボタンを押してインスタンスの作成ウィザードを起動します

    4. 立ち上がってきた Create Instance ウィンドウに以下の情報を入力し、Create Instance ボタンを押します
      • NAME - 任意の名前
      • AVAILABILITY DOMAIN - ステップ1 でサービス・リミットでインスタンスが作成できることを確認したADを選択
      • BOOT VOLUME - IMAGE OCID を選択
      • IMAGE OCID - リージョンに応じて以下の文字列をペースト
        • us-ashburn-1の場合 : ocid1.image.oc1.iad.aaaaaaaaikn6ub6heefqxbe5fkiv4otbfe6ivza6y7di5khnkxkyvf2bkdta
        • eu-frankfurt-1の場合 : ocid1.image.oc1.eu-frankfurt-1.aaaaaaaauwuafl6uze6bnusphnn6y2mr5y7ajavx4kza7glyrqggxlnbo4zq
      • SHAPE TYPE - ステップ1 でサービス・リミットでインスタンスが作成できることを確認したシェイプの種別を選択
      • SHAPE - ステップ1 でサービス・リミットでインスタンスが作成できることを確認したシェイプを選択
      • IMAGE VERSION - イメージ名に「NGC」という名前が入っている最新のイメージ(例 : Oracle-NGC-Deep-Learning-Image-2018.03.23-0) を選択
      • SSH KEYS - 任意の鍵ペアの公開鍵をアップロード
      • VIRTUAL CLOUD NETWORK - 作成済みのVCNを選択
      • SUBNET - 任意のパブリック・サブネットを選択
      • ASSIGN PUBLIC IP ADDRESS - チェックを付ける(デフォルトのまま)

     

     

    5. GPUインスタンスにアクセスしてディープラーニングを実行する

    インスタンスの作成が完了したら、アクセスして実際に環境を作成していきます。

     

    1. 作成したGPUインスタンスにsshでアクセスします。
      NGCに最適されたインスタンスのOSはubuntuで作られており、アクセスユーザーは ubuntu です。

    2. アクセスすると、最初にこのように NGCへのアクセスのためのAPIキーが聞かれるので、先程生成したAPIキーをペーストし、ENTER キーを押します。

      Please enter your NGC APIkey to login to the NGC Registry:

    3. NGCへのログインが成功すると、以下のようなメッセージが表示されます

      Logging into the NGC Registry at nvcr.io.....Login Succeeded

    4. 以下のコマンドで、GPUが正しく認識されているかどうかを確認します
      $ nvidia-smi
      +-----------------------------------------------------------------------------+
      | 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   38C    P0    37W / 300W |      0MiB / 16276MiB |      0%      Default |
      +-------------------------------+----------------------+----------------------+
      |   1  Tesla P100-SXM2...  Off  | 00000000:86:00.0 Off |                    0 |
      | N/A   30C    P0    38W / 300W |      0MiB / 16276MiB |      3%      Default |
      +-------------------------------+----------------------+----------------------+

      +-----------------------------------------------------------------------------+
      | Processes:                                                       GPU Memory |
      |  GPU       PID   Type   Process name                             Usage      |
      |=============================================================================|
      |  No running processes found                                                 |
      +-----------------------------------------------------------------------------+
      今回は BM.GPU2.2 のインスタンスを作成したので、Tesla P100 SXM2 が2枚見えていることがわかります。

    5. では、実際にトレーニングを実行してみます。今回は定番のPyTorchを実行してみます。
      以下のコマンドを入力し、NGCからPyTorchの実行環境がセットアップされたコンテナをプルします。
      $ docker pull nvcr.io/nvidia/pytorch:17.10
      17.10: Pulling from nvidia/pytorch
      f5c64a3438f6: Pulling fs layer
      51899d335aae: Pulling fs layer
      6ff2b7de3c13: Pulling fs layer
      ...(以下略)
    6. コンテナのダウンロードが完了したら、実行してみます。
      $ 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.
      ...(以下略)
      コンテナが実行され、そのコンテナの中にシェルが遷移します。

    7. コンテナの中には、MNISTの手書き文字認識のトレーニングを行うサンプルスクリプトが入っていますので、そちらを実行してみます。

      root@3ac2a29813e9:/workspace# cd /opt/pytorch/examples/mnist && python main.py

      トレーニングが実行されます。BM.GPU2.2インスタンスだと10エポック分がだいたい1分弱くらいで完了するようです。



    8. もうひとつ、TensorFlowのトレーニングも実行してみます。exit でDockerのシェルを抜けたあと、以下のコマンドを実行してTensorFlowのコンテナをプルし、実行します。

      $ nvidia-docker run --rm -it nvcr.io/nvidia/tensorflow:17.10

    9. 以下のコマンドで、やはりサンプルとして収録されているMNISTのトレーニングを実行します
      # cd /opt/tensorflow/tensorflow/examples/tutorials/mnist && python mnist_with_summaries.py

    こちらも1分弱で完了します。

     

     

    これで、このチュートリアルは完了です。OCIのマシンイメージとNGCのDockerイメージを利用することで、最新のGPUを利用したディープラーニングの環境を簡単に構築することができます。

     

    今後のステップ

    OCIのマニュアル には、トレーニングのためのデータストアとしてGPUインスタンスにブロック・ボリュームアタッチする方法や、ファイル・ストレージをNFS経由で利用する方法について書かれています。また、NGCのドキュメント には、その他のディープラーニングのフレームワークを利用する方法や、nvidia-docker の起動オプション(例えばホストマシンのディレクトリをdockerコンテナの中からマウントする方法など)についての説明などがありますので、こちらもあわせてご確認ください。

     

    目次に戻る : チュートリアル : Oracle Cloud Infrastructure を使ってみよう