Azure Machine Learning（Azure ML）とAzure NetApp Files (ANF) で実現する機械学習基盤 環境構築編

**はじめに**
---------------------------------------

こんにちは。jiangと申します。
皆さん、Azure Machine LearningにAzure NetApp Files をマウントできること知っておられますか？

既にAzure Machine Learningを使って、ML/DLワークロードに興味があって利用している方も多いと思いますが、もっと高性能なストレージを利用したいと思っている方も多くいらっしゃるかと想像しています。

今回は、意外に知られていない、Azure Machine LearningにAzure NetApp Files をマウントして、最適なML/DL基盤を構築できることをお伝えします。
どうぞ、宜しくお願いします！

* * *
**Azure Machine Learning (Azure ML) とは**　
---------------------------------------
Azure Machine Learning (以下 Azure ML)とはAzureのサービスの一つで、Azureで機械学習モデルを構築、運用できるプラットフォームです。
Azure上でノートブック（Python）を用いたモデル構築だけでなく、データを投入するだけで自動的に最適なモデル・パラメータ探索を行ってくれるAutoMLやGUIベースでパイプラインを構築できるデザイナー機能もあり、幅広いユーザにとって活用場面のあるサービスです。
<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/54129ea8-675a-d65d-d18e-5c901b88918b.png">

* * *
**Azure NetApp Files (ANF) とは**　
---------------------------------------
Azure NetApp Files (以下 ANF)とはAzureのフルマネージドのPaaS型ストレージサービスです。
設定と管理は、Azureコンソールに統合されており、Azureネイティブサービスとして提供されています。またONTAP（NetApp社のストレージ専用OS）ならではの、大容量ファイルの格納性、アクセス高速性、SnapshotやSnapRestore,Cloneを利用したデータ保護性においてそれぞれ優位性があります。
<img width="100" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/c097e341-7819-4f84-a796-5e68190dd7b9.png>

* * *
**Azure MLとANFを組み合わせると何がうれしいのか？**　
---------------------------------------
* Azure MLのノートブックインスタンスにANFのNFSボリュームをマウントすることで、大容量のデータセットに対応できます。
* 高速なストレージアクセスを提供することでAIの分析処理に必要な時間を短縮できます。
* SnapshotおよびClone技術により、データセットのコピー操作やバージョン管理が容易になります。

まとめますと、データサイエンティストが課題や悩みを解決できる、より便利で効率的な機械学習基盤を利用することができます。（以下は、イメージ図です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/08f20226-8f6e-53f9-cba1-ff7bb1351fed.png)

* * *
**やってみた（概要説明）**　
---------------------------------------
以下内容をやってみました！
①. Azure MLおよびANFの作成および環境構築を実施
②. ANFをAzure ML StudioのNotebookインスタンスにマウントし、高速、大容量のストレージ環境を提供
③. ANFのSnapshot/Clone機能でデータセットの複製やSnapshotによるバージョニングを可能に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/22ce6660-5cbd-78b8-c738-4de592457f61.png)

* * *
**作業準備**
---------------------------------------
GUIからも構築可能ですが、作業効率化の観点から、今回はなるべくCloud Shellを使って進めたいと思います。
実際の出力画面を記載しておりますが、スペースの都合上、一部省力をしております。またコマンド内容も皆様の環境におきまして、必要な部分はご調整をいただければと思いますので、予めご留意いただけると幸いです。

***Azure クラウド シェルと拡張機能***
* Microsoft Azure Web インターフェイスにログインし、Cloud Shell を開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/37e9125e-5ee6-ffd7-57e5-da800b04c13d.png)

* Cloud Shell にログインします
  コマンド：az login
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/20c95aeb-03db-c200-ae08-fe53f53fe183.png)

* サインインするには、Web ブラウザーを使用してページ https://microsoft.com/devicelogin を開き、コード「セキュアコード」を入力して認証します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/908483f9-4c45-981b-bfdc-03933290b5ef.png)
* 続行をクリックして、進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/0f80d9bc-378e-a4f7-d98c-21737eb38b9f.png)
* サインインに成功したので、このページを閉じて、Cloud Shellに戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/40307334-17ec-d24e-5411-963eb4708bf7.png)
* Cloud Shell から ANF と Azure ML をプロビジョニングするには、次の CLI 拡張機能をインストールする必要があります。
コマンド： az extension add --name ml
コマンド： az provider register --namespace Microsoft.NetApp --wait
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/29ee0cde-ec0d-9415-1ee9-eb3201770368.png)

* * *
**変数設定**
---------------------------------------
構築に必要となる設定変数を以下のように定義します。
皆様の環境で構築される際は、設定値をご調整ください。

		# リソース グループ名
		rg='aml-anf-test' 
		location='japaneast' 
		
		# VNET
		vnet_name='vnet' 
		vnet_address_range='10.16.0.0/16' 
		vnet_aml_subnet='10.0.1.0/24' 
		vnet_anf_subnet='10.0.2.0 /24' 
		
		# AML
		workspace_name='aml-anf' 
		
		# ANF
		anf_name=anf 
		pool_name=pool1

* * *
**①. Azure MLおよびANFの作成および環境構築を実施**
---------------------------------------
* * *
**サービスのプロビジョニング**
* 変数を決定したら、必要なサービスとネットワークをプロビジョニングする必要があります。まず、リソース グループを作成し、作業環境の既定値を定義します。
コマンド： az group create -n （リソースグループ名）  -l （ロケーション名）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/fc6a2234-8ae1-04e8-dd9a-dd7cbf8a5598.png)

* デフォルトのリソースグループ、ワークスペース、ロケーションを設定します。
コマンド：az configure --defaults group=（リソースグループ名） workspace=（ワークスペース名） location=（ロケーション名）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/4120ac45-f466-cc88-b9ba-6012e930c1ac.png)

* 続いて、VNet とサブネットを作成します。
コマンド：az network vnet create -n （vnet名） --address-prefix （対象のネットワークアドレス）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/acabcaee-2ccd-c19b-e35e-b8ba7f42090d.png)

コマンド：az network vnet subnet create --vnet-name （vnet名） -n （AMLサブネット名）--address-prefixes （対象のネットワークアドレス）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/bb4fcf9b-473c-c584-1f3b-4f44d54e430b.png)

コマンド：az network vnet subnet create --vnet-name （vnet名） -n （ANFサブネット名） --address-prefixes （対象のネットワークアドレス） --delegations "Microsoft.NetApp/volumes"

:::note info
Azure NetApp Files サブネットは、Azure Machine Learning スタジオ サブネットとは別にする必要があり、Azure NetApp Files に明示的に委任(delegations)する必要があります。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/da49148d-0257-ac43-0558-fc53b416c6df.png)

* 次に、Azure Machine Learning ワークスペースをプロビジョニングします。
コマンド：az ml workspace create --name （ワークスペース名）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/31e58ead-7997-0129-7a3f-c83a861da1dd.png)

* ANF アカウント、容量プール、およびボリュームをそれぞれ作成します。
（ANFアカウント）
コマンド：az netappfiles account create --name （anfアカウント名）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/c1cbdf98-e5d2-943f-c640-bfefbaed3d98.png)

（容量プール）
コマンド：az netappfiles pool create --account-name (anfアカウント名) --name （プール名） --size 4 --service-level standard
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/97010245-1c5f-91a6-7a0b-83a0a9934096.png)

（ボリューム）
コマンド：az netappfiles volume create --account-name (anf名) --pool-name （pool名） --name vol1 --service-level standard --usage-threshold 4096 --file-path "vol1" --vnet （vnet名） --subnet （anfdサブネット名） --protocol-types NFSv3 --allowed-clients (amlサブネットアドレス) --rule-index 1 --unix-read-write true
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/0ab29b29-d489-75a5-b34a-70d230f66401.png)

:::note info
本例では、サイズを4TiB、サービスレベルをStandardとして、選択していますが、適切なサービスレベルに応じてご選択をお願いします。
:::

* * *
**②. ANFをAzure ML StudioのNotebookインスタンスにマウントし、高速、大容量のストレージ環境を提供**
---------------------------------------

* コンピュート インスタンスのプロビジョニング
Azure Machine Learning スタジオを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/8280e1d4-f163-7d16-54da-f5f70a5cf13d.png)

「コンピューティング」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/4369f9ed-df8f-f38d-c613-09c1a3c83ecd.png)

[コンピューティング インスタンス]、[+ 新規] を選択します 。
コンピューティング インスタンスに任意の名前を付けます。この記事ではこれを「ANFTestCompute」と呼び、仮想マシンのサイズを選択します。このデモでは、最も安価なインスタンスで十分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/d214eb8d-c8c0-5f88-b127-02ee00c9147f.png)

:::note info
「作成」はまだクリックせず、「次へ: 詳細設定」を選択します！！
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/20d6d85c-0e41-2d52-677c-f5367f8a7699.png)

「詳細設定」タブで、「仮想ネットワークを有効にする」を有効にし、先ほど作成した VNet を選択します。記事に従った場合、VNet は「vnet (aml-anf-test)」、サブネット「aml」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/2daf690f-be85-0a6f-25cf-886e0463a809.png)
 
コンピューティング インスタンスのプロビジョニングには数分かかります。インスタンスの「状態」が「実行中」に切り替わるまで待ちます。

* コンピュート インスタンスのANFマウント

最初に「アプリケーション」の下の「コンピュートインスタンス」タブで、「ターミナル」をクリックしてコンピュートインスタンスに接続して、nfs-common をインストールする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/826683d2-c5fa-df73-3d99-80b0714af215.png)

コマンド：sudo apt install nfs-common -y
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/800761a3-72c9-b7e2-f8bf-701b5876a41d.png)

新しいフォルダを作成し、Azure NetApp Files ボリュームをマウントします。
コマンド：mkdir data
コマンド：sudo mount -t nfs -o rw,hard,rsize=65536,wsize=65536,vers=3,tcp （パス名：本例では10.0.2.4:/vol1） /data
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/c96cc57d-987d-7f53-40c4-1e4505d8fb6e.png)

:::note info
左側に「データ」フォルダがまだ表示されていない場合は、「更新」ボタンをクリックしてください。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/830d8360-5c9b-67c5-57a7-7628465d2232.png)
* Notebook からANFにアクセスする

新しい Jupyter/Azure Machine Learning スタジオ ノートブックを作成します。左側の「プラスボタン」をクリックして、[新規ファイルを作成」​​を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/aa3de2cd-4313-7fdb-37df-414c9930bd4d.png)

このドキュメントでは、ノートブックを「ANFNotebook」として、「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/24c4a426-aa9c-af40-b87c-575e67a6527c.png)
Notebook から ANFボリューム上のファイルにアクセスし、それに基づいてモデルを構築できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/38699044-2b9b-5478-5ff0-35e913f83157.png)

* * *
**③. ANFのSnapshot/Clone機能でデータセットの複製やSnapshotによるバージョニングを可能に**
---------------------------------------
スナップショットは、データ サイエンス タスクにとって貴重なツールです。
NetApp DataOps Toolkit は、残念ながら現時点でANFをサポートしていません。
本構成でスナップショットを利用する場合は、以下の方法が可能です。

1. GUIを使用 
2. Azure Cloud Shellを使用 
3. REST APIを使用
4. Pythonを使用

この記事では、2.のAzure Cloud Shell を使用してスナップショットを作成および復元します。

* Azure Cloud Shell を使用してスナップショットを作成する
コマンド：az netappfiles snapshot create --account-name （anfアカウント名） --resource-group （リソースグループ名）--pool-name （プール名） --volume-name （ボリューム名）--name （スナップショットボリューム名）
このコマンドでは、NetApp アカウント名、リソース グループ、容量プール名、スナップショットを作成するボリュームの名前、およびスナップショットの名前を指定する必要があります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/0893feb6-92a1-bb1a-2bc5-6c2a6acd2eef.png)

Azureコンソールからも取得できていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/3a72db0e-a7c2-c98b-276f-6bbc3c9dd6ab.png)

* Azure Cloud Shell を使用したスナップショットのリストア

スナップショットを復元する場合、次の 3 つのオプションがあります。

1. スナップショットからボリュームを戻す
2. スナップショットを新しいボリュームに復元する
3. スナップショットからの単一ファイルの復元
 
この例では、2 番目のオプションを選択します。これは、選択したスナップショットに基づいて新しい名前の新しいボリュームが作成され、ボリュームデータがこのボリュームに自動的に復元されることを意味します。 

コマンド：az netappfiles volume create --vnet （vnet名） --subnet （サブネット名）--account-name （anfアカウント名） --usage-threshold 100 --pool-name （プール名） --resource-group （リソースグループ名） --snapshot-id （snapshot作成時に表示されたID） --name （新しいボリューム名） --file-path vol（ファイルパス） --service-level （サービスレベル）--protocol-types NFSv3  --allowed-clients （対象ネットワークアドレス）--rule-index 1 --unix-read-write true

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/9e696c3a-cc07-7ac7-a6da-eec70922b677.png)
Azureコンソールからも取得できていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602265/c34136ef-e456-f1a0-c2e3-a85961e84df9.png)

* * *
**まとめ**
---------------------------------------
この記事では、高アクセス性、高機能なANFをAzure MLで使用する方法について、ご説明しました。Azure MLの機能性向上に貢献できるソリューションになりますので、是非積極的にご利用をご検討ください。
今後もAzure ML on ANF を利用したAI/ML ワークロードをご紹介でれきばと考えております。
最後まで、読んでいただき、ありがとうございました！！

* * *
**ご紹介（AWS SageMaker on AWS）**
---------------------------------------
本記事では、AzureML on ANFのご紹介でしたが、AWSでも同様にAI/MLサービスとNetAppストレージサービスの組み合わせソリューションがございますので、以下にてご紹介させていただきます。
こちらも是非、ご参照いただければ幸いです。
* [Amazon SageMakerとAmazon FSx for NetApp ONTAPで実現する機械学習基盤 第1回](https://qiita.com/Yoshinori_Tsukioka/items/e02537feb8008db46a99)
* [Amazon SageMakerとAmazon FSx for NetApp ONTAPで実現する機械学習基盤 第2回](https://qiita.com/Yoshinori_Tsukioka/items/0bdb5162f2ee25c82f32)
* [Amazon SageMakerとAmazon FSx for NetApp ONTAPで実現する機械学習基盤 第3回](https://qiita.com/Yoshinori_Tsukioka/items/2b6070a235b67634a2db)
* [Amazon SageMakerとAmazon FSx for NetApp ONTAPで実現する機械学習基盤 第4回](https://qiita.com/Yoshinori_Tsukioka/items/9016dd5c31293d76dd35)

* * *
**主な参照先**
---------------------------------------
* [Azure NetApp Files を使用したソリューション アーキテクチャ](https://learn.microsoft.com/ja-jp/azure/azure-netapp-files/azure-netapp-files-solution-architectures#azure-kubernetes-services-and-kubernetes)

* [Azure Machine Learning](https://azure.microsoft.com/ja-jp/products/machine-learning/)

* [High-performance storage for AI Model Training tasks using Azure ML studio with Azure NetApp Files](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)