Azure Machine Learning での大規模機械学習 （①データ処理）

# はじめに
Azure Machine Learning において、大規模なデータセットでの機械学習を行う際の方法をまとめたいと思います。参考にしたリポジトリは以下です。

https://github.com/MicrosoftLearning/mslearn-deep-learning

※自学のための整理のため、不十分な点はご容赦ください。

## GPU でのデータ処理
GPU での大規模なデータ処理を行うために、[RAPIDS cuDF](https://docs.rapids.ai/api) が有効です。

### RAPIDS
RAPIDS は、NVIDIA によって作成された機械学習フレームワークです。 RAPIDS ライブラリは、次の用途に使用できます。

- データの読み込みと前処理
- 機械学習
- グラフ分析

### cuDA
cuDF は、 GPU における pandas 的なものと捉えると分かりやすいです。 pandas と同様に、cuDF はデータを読み込んで処理するための Python DataFrame のライブラリです。

Python において、最も一般的なデータ処理のライブラリは pandas だと思います。
ただし、大量のデータを処理する場合、pandas を使用して CPU にデータを読み込んで操作するのに時間がかかることがあります。 
これを回避するために、GPU を利用することが有効的です。cuDF ライブラリを使用して GPU を操作することが可能になります。

```Python: pandas
import pandas as pd

flight_data = pd.read_csv(csvfile)
```

```Python: cuDA
import cudf

flight_data = cudf.read_csv(csvfile)
```

pandas ライクな操作ももちろんサポートされています。以下は、2つの DataFrame をマージする操作です。
```Python: cuDA (Merge)
data = cudf.merge(flight_data, airports, left_on='Dest', right_on='iata_code', how='left')
data = cudf.merge(flight_data, airports, left_on='Origin', right_on='iata_code', how='left')
```

## Azure Machine Learning でのデータ処理
### Azure Machine Learning リソースの作成
以下のリンクの手順に従って、Azure Machine Learning リソースの作成をします。

https://microsoftlearning.github.io/mslearn-deep-learning/Instructions/00-set-up.html

作成するリソースは以下です。
- [Azure Machine Learning Workspace](https://learn.microsoft.com/ja-jp/azure/machine-learning/concept-workspace?view=azureml-api-2) 
- [Compute instances](https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-create-compute-instance?view=azureml-api-2)
- [Compute clusters](https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-create-attach-compute-cluster?view=azureml-api-2)

ちなみに、Compute instances は大規模データ処理のジョブを Compute clusters にsubmit したり、前準備用に利用します。

### データの前処理
まず、RAPIDS 用に Azure Machine Learning の [Environment](https://learn.microsoft.com/ja-jp/azure/machine-learning/concept-environments?view=azureml-api-2) を作成します。
Environment は Azure Machine Learning でモデルのトレーニングや推論をするための環境（Python パッケージ、環境変数、およびソフトウェア設定）を Docker イメージとして定義して、Workspace 内で簡単に使えるようにしてくれる機能です。

事前に用意されている Curated Environment もありますが、今回はDockerfile から新規で Environment を定義します。

```Dockerfile
FROM rapidsai/rapidsai:cuda11.4-runtime-ubuntu18.04-py3.9
RUN apt-get update \
&& apt-get install -y fuse \
&& source activate rapids \
&& pip install azureml-mlflow \
&& pip install azureml-dataprep
```
Environment を作成すると、上記のDockerfile の定義に従って自動でビルドしてくれます。

次に、Workspace で Notebooks を開き、前の手順で clone した `/users/your-user-name/mslearn-deep-learning/Allfiles/Labs/01-preprocess-data` 配下の `01-process-data.ipynb` を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532317/6438c9a0-c71c-1f64-999f-8b3e1d1291f5.png)

ノートブック内の `compute_target` を自身で作成した cluster に指定すれば、あとは用意されている `./script/preprocess-rapids.py` に従って cuDF のデータ処理が GPU 上で動作するはずです。
`./script/preprocess-rapids.py` の詳細については割愛しますが、CSV ファイルを読み込み、マージ、カラムのリネーム、マージ、ドロップ、処理後のデータを CSV ファイルとして保存と pandas の DataFrame と同様のコードの書き方で処理を定義できます。 GPU による並列処理は cuDF がバックエンドで良しなにやってくれるので開発者は特に意識をすることがなく、非常に簡単にコーディングをすることが可能です。

Azure Machine Learning でジョブを実行する際は、実行したいスクリプト、環境定義、実行環境（コンピューティングターゲット）を指定することで任意の組み合わせで自由に処理を実行することが可能です。

```Python: 01-process-data.ipynb（ジョブの定義）
from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory='script',
                      script='preprocess-rapids.py',
                      compute_target="<your-compute-cluster>",
                      environment=rapidsai_env,
                      docker_runtime_config=d_config)
```

```Python: 01-process-data.ipynb（ジョブの実行）
from azureml.core import Experiment

run = Experiment(ws,'preprocess-data').submit(src)
run.wait_for_completion(show_output=True)
```

ジョブを run すると [Compute] > [Compute Cluster] から実行しているジョブの状況を確認できます。キャプチャは１台での実行になっていますが、`Maximum number of nodes` で定義したノード数までは自動でスケーリングしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660892/e9192d67-5f36-2b9e-cfa0-b4b5c4ac1352.png)



### 処理結果の確認
[Jobs] > [実行したジョブ名] > [Outputs + logs] で出力結果（`processed_data.csv`）を確認することができます。ファイルパスをコピーしたり、Assets として登録したりしてモデルのトレーニングなど後続タスクで利用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532317/36ef32cf-f9bb-494e-d46b-5836f64555d0.png)

# まとめ
Azure Machine Learning で `RAPIDS cuDF` を利用した大規模データ処理を行う方法をまとめました。次回は PyTorch を使ってモデルをトレーニングする方法をまとめたいと思います。