イントロダクション
機械学習は、現代世界ではますます強力になり、広く普及してきています。最先端の科学からコンピュータゲーム、さらには自動運転車から食品生産まで、あらゆる場所で利用されています。しかし、機械学習は計算量の多いプロセスであり、特にモデルの初期訓練段階では、合理的な時間で訓練を完了するために高価な GPU ハードウェアを必要とすることがほとんどです。この高額なハードウェア・コストとクラウド・コンピューティングの利用可能性の増加により、機械学習ユーザの多くは、コストを削減し、最新かつ最も強力なハードウェアを利用するために、ワークフローをクラウドに移行しています。
本チュートリアルでは、既存の機械学習モデルを Microsoft Azure クラウドプラットフォーム上の仮想マシンに移植する事を行います。具体的には、パーソナライズされたレコメンデーションを提供できるように、シングル GPU を用いて、小規模な映画レコメンデーションモデルをトレーニングさせます。このトレーニングを実行するための総コストは、現在 Azure 上で利用可能なシングル GPU インスタンスのいずれかを使用して 5 ドル以下に抑えるようにします。
本チュートリアルで行う方法が、Azure 上で ML トレーニングを実行する唯一の方法というわけではありません。 例えば、マイクロソフトは Azure 機械学習(ML)製品も提供しており、これは一般的に使用されている ML アプリケーションを迅速に展開できるように設計されています。しかし、ここで使用するアプローチは、ユーザがソフトウェア環境のあらゆる側面を完全に制御できるため、最も柔軟性が高く、既存の ML ワークフローを Azure に移植する最速の方法であると考えられます。
必要条件
本チュートリアルを行うためには、以下が必要です。
- https://github.com/numericalalgorithmsgroup/MLFirstSteps_Azure にある git リポジトリからのチュートリアルファイルのコピー
そして以下のいずれかが必要です。
- 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 プラットフォームに既存の機械学習ワークフローをデプロイする際に必要な手順が理解できます。このようなワークフローの主な手順は次のとおりです。
- 適切な仮想マシンインスタンスを作成し、SSH で接続する
- 機械学習フレームワークのインストール - 例えば Docker を使って
- モデルとデータの準備
- トレーニングの実行
- 結果のダウンロード
- 使用後の資源の片付け
その他の情報
クラウド上で実行することで、マシンの種類や価格設定のオプションの面で多くの柔軟性を得ることができます。本格的に 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 とクラウドのコンサルティングとサービスをご覧ください。