Microsoft Azureで機械学習トレーニング(低コスト)を行うチュートリアル

原文:A Low-Cost Introduction to Machine Learning Training on Microsoft Azure Published 03/09/2020 By Phil Tooley

イントロダクション

機械学習は、現代世界ではますます強力になり、広く普及してきています。最先端の科学からコンピュータゲーム、さらには自動運転車から食品生産まで、あらゆる場所で利用されています。しかし、機械学習は計算量の多いプロセスであり、特にモデルの初期訓練段階では、合理的な時間で訓練を完了するために高価なGPUハードウェアを必要とすることがほとんどです。この高額なハードウェア・コストとクラウド・コンピューティングの利用可能性の増加により、機械学習ユーザの多くは、コストを削減し、最新かつ最も強力なハードウェアを利用するために、ワークフローをクラウドに移行しています。

本チュートリアルでは、既存の機械学習モデルを Microsoft Azure クラウドプラットフォーム上の仮想マシンに移植する事を行います。具体的には、パーソナライズされたレコメンデーションを提供できるように、シングルGPUを用いて、小規模な映画レコメンデーションモデルをトレーニングさせます。このトレーニングを実行するための総コストは、現在Azure上で利用可能なシングルGPUインスタンスのいずれかを使用して5ドル以下に抑えるようにします。

本チュートリアルで行う方法が、Azure上でMLトレーニングを実行する唯一の方法というわけではありません。 例えば、マイクロソフトはAzure 機械学習(ML)製品も提供しており、これは一般的に使用されているMLアプリケーションを迅速に展開できるように設計されています。しかし、ここで使用するアプローチは、ユーザがソフトウェア環境のあらゆる側面を完全に制御できるため、最も柔軟性が高く、既存のMLワークフローをAzureに移植する最速の方法であると考えられます。

必要条件

本チュートリアルを行うためには、以下が必要です。

そして以下のいずれかが必要です。

  • git、ssh、およびAzure CLIがインストールされ、有効なアカウントにログインしたシステム。Windowsを使用している場合、LinuxのWindowsサブシステムはこれに適しています。
  •  もしくは
  • Azure Cloud Shellのアクティブセッション

適切なExampleを選択する

多くの機械学習モデルは訓練に大量の高価な計算時間を必要としますが、数分のCPUやGPU時間を使って、はるかに小さなデータセットから意味のある結果を得ることができるモデルもあります。そのようなモデルの1つがニューラル協調フィルタリング(NCF)で、ユーザーのインタラクションや評価データからレコメンデーションモデルを生成するために使用することができます。これにより、数分ですべてのステップをインタラクティブに作業することが可能になり、わずか数ドルのクラウドコストで済むようになります。

GroupLensのMovieLens-25Mデータセットを使用してNCFモデルを学習します。このデータセットには、16万2,000人のユーザーからの6万2,000本の映画の2,500万件の評価と、データセット内の映画のジャンルと特徴を特徴づけるタグゲノムデータが含まれています。結果として得られたモデルは、「もしあなたが映画Xを好きならば、あなたはおそらく映画Yも好きになるだろう」という形でレコメンデーションを提供するために使用することができます。

このチュートリアルで使用したNCFの実装は、GitHubのNVidia Deep Learning Examplesリポジトリから、最新のMovieLens-25Mデータセットを使用するように少し修正して更新したものを使用しています。

AzureのGPU VMクォータ

GPU対応のVMはAzureで公開されていますが、作成する前に割り当てをリクエストする必要がある場合があります。VMのNCv2ファミリのクォータがない場合、チュートリアルの例は実行できず、クォータを超えたというメッセージが表示されます。

デフォルトでは、このチュートリアルでは、SouthCentralUS Azureリージョンで実行することを想定しているため、このリージョンのNCv2ファミリーに少なくとも6つのvCPUの割り当てをリクエストする必要があります。これを行うには、Azureポータルにアクセスし、サブスクリプション領域に移動してサブスクリプションを開き、サイドバーから[使用量+クォータ]を選択します。このペインから、[リクエストの増加]ボタンを使用して追加の割り当てをリクエストできます。詳細なガイドについては、Microsoftのドキュメントページを参照してください。

クイックスタート:スクリプト化されたVMのセットアップとトレーニング

トレーニングプロセスの全体は、Azure CLIと標準のLinuxツールを使用してスクリプト化することができます。これを行うためのスクリプトの例は、deploy_and_run_training.shとして提供されています。

このスクリプトは、以下に示すすべてのコマンドを実行してVMインスタンスを作成し、トレーニングを実行します。カスタムスクリプトのVM拡張機能を使って、dockerのインストールとイメージのビルドを管理します。

例を実行するには、まず、Azure CLIにログインしていることを確認してから、deploy_and_run_training.shスクリプトを編集して、個人のsshキーを提供する必要があります - これは、トレーニング用のVMにログインするためにスクリプトを許可するために必要です。そして、VMインスタンスをセットアップし、トレーニングを実行し、結果をダウンロードし、VMインスタンスを削除するスクリプトを実行することができます。スクリプトが完了すると、最終的に訓練された重み、ユーザの1人の最終的な予測値、訓練ログが作業ディレクトリ内のそれぞれmodel.pth、predictions.csv、training.logという名前のファイルにダウンロードされているはずです。

注: スクリプトは使用後にすべてのリソースをクリーンアップしようとしますが、何かがうまくいかなかった場合に厄介な - そして高価な - 不意打ちを避けるために、Azure ポータルでこれを手動でチェックすることを強くお勧めします。

トレーニングインスタンスの設定

MovieLensデータセットのNCFモデルは、単一のGPU(P100またはV100)で数分で学習できるほど小さいので、まず、単一のVMインスタンスをセットアップし、モデルを学習するために使用できるPyTorchを使用してdockerコンテナをデプロイします。使用したインスタンスタイプは "Standard_NC6s_v2 "で、NVidia P100が1つ含まれていますが、NVidia P100またはV100があれば、どのようなインスタンスタイプを使用しても構いません。

以下のセットアップコマンドはすべて deploy_and_run_training.sh スクリプトに含まれています。

まず、VMとその関連資料を保持するためのリソースグループを新たに作成します。これにより、使用していたリソースが不要になったときに簡単に管理したり、削除したりすることができるようになります。

このチュートリアルでは、角括弧(<>)内の値は、ユーザー固有の名前やオプションの選択を表しており、コマンドを実行する際には適切な値に置き換えてください。

$ az group create --name <rg_name> --location SouthCentralUS

注: 別の場所を使用することもできますが、NCv2 VM が利用可能な場所であることを確認してください。(https://azure.microsoft.com/en-us/global-infrastructure/services/ を使用して可用性を確認してください)。

そして、このリソースグループにVMインスタンスを作成します。

$ az vm create \
  --resource-group <rg_name> \
  --name <vm_name> \
  --size Standard_NC6s_v2 \
  --image OpenLogic:CentOS-HPC:7_7-gen2:7.7.2020042001 \
  --ssh-key-value <sshkey> \
  --admin-username <admin_user>

その後、GPUドライバの拡張機能をインストールする必要があります。

$ az vm extension set \
  --resource-group <rg_name> \
  --vm-name <vm_name> \
  --name NvidiaGpuDriverLinux \
  --publisher Microsoft.HpcCompute

注意: 現在、この拡張機能は完了したと報告した後もアクションを実行し続けます。次のステップに進む前に、追加のパッケージをインストールしたり再起動したりするために、インスタンスを最大 10 分間待つ必要があるかもしれません。

これが完了したら、ssh を使用してインスタンスに接続します。インスタンスのパブリックIPアドレスを見つけるには、以下を使用します。

$ az vm list-ip-addresses --name <vm_name>

チュートリアルのリポジトリのコピーを取得する

VMインスタンスにログインしたら、チュートリアルリポジトリのローカルコピーを取得する必要があります。 /mnt/resource:にマウントされているインスタンスのローカルSSDでこれを行います

$ sudo mkdir /mnt/resource/work
$ sudo chown -R $USER /mnt/resource/work
$ cd /mnt/resource/work
$ git clone https://github.com/numericalalgorithmsgroup/MLFirstSteps_Azure
$ cd MLFirstSteps_Azure

MLFirstSteps_Azureディレクトリには、このチュートリアルを完了するために必要なすべての資料が含まれています。 ncfモデルとトレーニングスクリプトは、このリポジトリのncfサブディレクトリにあります。 このディレクトリは、次の手順でDockerコンテナーにマウントされます。

Dockerのインストールとイメージの構築

インスタンスにログインしたら、NVidiaランタイムを使ってdockerをインストールする必要があります。VMにはCentOSイメージを使用しているので、以下のようにyumを使用します。

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

$ sudo yum install -y yum-utils

$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum-config-manager --add-repo https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo

$ sudo yum install -y \
  docker-ce \
  docker-ce-cli \
  containerd.io \
  nvidia-container-toolkit \
  nvidia-container-runtime

重要な注意: yum が「ロックを待っています」というメッセージが表示されることがあります。これは、バックグラウンドで azure 拡張機能がまだ実行されている場合に発生する可能性があります。

Azure VM OSイメージに十分な空き容量がないため、コンテナーデータを格納するために別のディレクトリを使用するようにDockerに指示することも必要です。

$ sudo mkdir -p /mnt/resource/docker
$ sudo mkdir -p /etc/docker

$ sudo tee /etc/docker/daemon.json <<-EOF >/dev/null
{
    "data-root": "/mnt/resource/docker",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
EOF

最後に、ユーザー名をdockerグループに追加して、dockerサービスを再起動します。

$ sudo gpasswd -a $USER docker

$ sudo systemctl restart docker

ユーザー権限の変更を有効にするには、sshセッションを終了して再度ログインする必要があります。

ログインしなおしたら、リポジトリで提供されているDockerfileを使ってイメージを構築します。

$ cd /mnt/resource/work/MLFirstSteps_Azure
$ docker build --rm -t pytorch_docker . -f Dockerfile

トレーニングの実行

トレーニングを実行するには、まずdockerコンテナを起動し、コンテナ内の/workとしてトレーニングスクリプトのディレクトリをマウントする必要があります。

$ cd /mnt/resource/work/MLFirstSteps_Azure
$ docker run --runtime=nvidia \
    -v /mnt/resource/work/MLFirstSteps_Azure/:/work \
    --rm \
    --name="container_name" \
    --shm-size=10g \
    --ulimit memlock=-1 \
    --ulimit stack=67108864 \
    --ipc=host \
    --network=host \
    -t \
    -i pytorch_docker \
    bash

学習を実行する前の最後のステップは、データセットをダウンロードして準備することです。これはprepare_dataset.shスクリプトを使って行います。

$ cd /work/ncf
$ ./prepare_dataset.sh

最後に、トレーニングを実行します。DeepLearningExamplesリポジトリのreadmeには、訓練に渡すことができる様々なオプションの詳細が記載されています。この例では、0.979の精度が達成されるまでトレーニングを実行します。

$ python -m torch.distributed.launch \
  --nproc_per_node=1 \
  --use_env ncf.py \
  --data /data/cache/ml-25m \
  --checkpoint_dir /work \
  --threshold 0.979

推論:おすすめの映画

モデルをトレーニングしたので、これを使用して追加の映画を推奨できます。 ユーザーと映画のペアごとに、モデルは0〜1の予測ユーザー評価を提供します。 ユーザーによって評価されていない最も高い予測の映画は、そのユーザーへの推奨として使用できます。

$ python userinference.py /work/model.pth /data/ml-25m/movies.csv --output-dir /work

スクリプトは、レーティングの降順でソートされた予測値を predictions.csv ファイルに出力します。

デフォルトでは、スクリプトはデータセット内のすべての映画について、最も高いユーザーID番号の予測レーティングを生成します。

結果をローカルマシンにダウンロードする

結果は ssh セキュアコピーでコピーできます。これを行うには、ローカルマシンから scp を使用します。

$ scp <vm_ip>:/mnt/resource/work/MLFirstSteps_Azure/model.pth .
$ scp <vm_ip>:/mnt/resource/work/MLFirstSteps_Azure/first_steps_example/predictions.csv . 

使用後のインスタンスの削除

必要以上のリソースに対する請求を避けるためには、使用後にVMインスタンスと関連するリソースを削除することが重要です。

チュートリアルリソース専用のリソースグループを作成した場合、グループ全体を一括で削除することができます。

$ az group delete --name <rg_name>

あるいは、他のリソースを保持して VM インスタンスだけを削除したい場合は、az vm delete コマンドを使用します。

$ az vm delete --resource-group <rg_name> --name <vm_name>

いずれにしても、Azureポータルを見て、予想していたものがすべて削除されていることを確認してください。

結論と追加情報源

このチュートリアルの完了により、Dockerコンテナーを使用して、Azureプラットフォームに既存の機械学習ワークフローをデプロイする際に必要な手順が理解できます。 このようなワークフローの主な手順は次のとおりです。

  1. 適切な仮想マシンインスタンスを作成し、SSHで接続する
  2. 機械学習フレームワークのインストール - 例えばDockerを使って
  3. モデルとデータの準備
  4. トレーニングの実行
  5. 結果のダウンロード
  6. 使用後の資源の片付け

その他の情報

クラウド上で実行することで、マシンの種類や価格設定のオプションの面で多くの柔軟性を得ることができます。本格的にMLをクラウドにデプロイしようと考えている場合には、いくつかの追加事項を考慮する必要があります。

スポット価格

デフォルトでは、AzureのVMは "Pay as you go" の料金設定になっています。これにより、停止するまでVMへのアクセスが保証されますが、Azure上の計算に支払うには最も高価な方法です。

作業が中断される可能性がある場合や、作業が完了しないリスクを冒してまで作業を行いたい場合は、代わりにスポット価格を利用することができます。これにより、未使用のコンピュート容量を大幅な割引価格(通常80〜90%)で購入することができますが、ワークロードはいつでも削除される可能性があります。

スポット価格を利用するには、VMを作成する際にAzure cliに --priority Spotオプションを渡します。

```shell
$ az vm create \
  --resource-group  \
  --name  \
  --priority Spot \
  --size Standard_NC6s_v2 \
  --image OpenLogic:CentOS-HPC:7_7-gen2:7.7.2020042001 \
  --ssh-key-value  \
  --admin-username 
```

異なるインスタンスタイプ

Azureプラットフォームは、さまざまな種類と数のGPUが利用可能なさまざまなGPUインスタンスを提供します。 このチュートリアルでは、単一のNVidia P100で「Standard_NC6s_v2」VMタイプを使用しましたが、V100を装備したVMまたは複数のGPUを備えたVMでこのトレーニングを実行することもできます。 これを行うには、az vm createを呼び出すときに、要求されたVMサイズを変更するだけです。 たとえば、Standard_NC6s_v2よりも高いコストでより高速な結果を得るには、2つのP100 GPUを搭載したStandard_NC12s_v2インスタンスを使用できます。 そして、トレーニング時に両方のGPUを利用するには、トレーニングの起動時に2の値を--nproc-per-nodeに渡します。

クラウドHPC移行サービス

NAGはクラウドHPC移行サービスHPCコンサルティングを提供しており、組織がクラウドとHPCのために数値計算アプリケーションを最適化するのを支援します。HPCに関するベンダーにとらわれない公平なアドバイスとNAGがクラウドへの移行をどのように支援できるかについては、HPCとクラウドのコンサルティングとサービスをご覧ください。

関連情報
MENU
Privacy Policy  /  Trademarks