AI Platform Pipelinesを触ってみる

# AI Platform Pipelinesとは
Kubeflow pipelinesを、GCP上に簡単にセットアップしてくれるGCPサービス。

## Kubeflow Pipelinesとは
Kubeflowは、機械学習にまつわるワークフロー（前処理、モデルビルド、デプロイなど）をKubernetes上で管理するための一連のソフトウェア。

Kubeflow PipelinesはKubeflowが提供するコンポーネントの一つで、機械学習にまつわるジョブの流れ（パイプライン）を管理する。

### TFXとの関係
* TFX Pipelinesのオーケストレーターの一つのオプションとしても利用できるらしい 
  * https://www.tensorflow.org/tfx/guide/kubeflow?hl=ja）
* 元々は、TFX PipelinesをKubernetesで簡単に動かすためのGoogle内部ツールだったらしい
  * https://en.wikipedia.org/wiki/Kubeflow
* 他のオーケストレーターとしてはApache beam, airflowがある。

## パイプラインの構成
パイプラインは、複数のコンポーネントのDAGから成る。
![](https://cloud.google.com/ai-hub/docs/images/kubeflow-pipeline.svg)

_[出典は公式ドキュメント](https://cloud.google.com/ai-platform/pipelines/docs/introduction)_

コンポーネントは、

- コンテナイメージ
- インプットパラメータ
- アウトプット

から成る。

![](https://cloud.google.com/ai-hub/docs/images/kubeflow-component.svg)

_[出典は公式ドキュメント](https://cloud.google.com/ai-platform/pipelines/docs/introduction)_

# Getting Started!
## 環境構築
[公式ドキュメント](https://cloud.google.com/ai-platform/pipelines/docs/getting-started)の通りに実施。

### インストールされたコンポーネント
```
$ kubectl get deploy
NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
cache-deployer-deployment         1/1     1            1           10m
cache-server                      1/1     1            1           10m
metadata-envoy                    1/1     1            1           10m
metadata-grpc-deployment          1/1     1            1           10m
metadata-writer                   1/1     1            1           9m59s
minio                             1/1     1            1           9m59s
ml-pipeline                       1/1     1            1           10m
ml-pipeline-persistenceagent      1/1     1            1           10m
ml-pipeline-scheduledworkflow     1/1     1            1           10m
ml-pipeline-ui                    1/1     1            1           10m
ml-pipeline-viewer-crd            1/1     1            1           10m
ml-pipeline-visualizationserver   1/1     1            1           10m
mysql                             1/1     1            1           9m59s
proxy-agent                       1/1     1            1           10m
workflow-controller               1/1     1            1           10m

$ kubectl get cm
NAME                            DATA   AGE
cache-configmap                 4      10m
gcp-default-config              3      10m
inverse-proxy-config            3      10m
metadata-grpc-configmap         2      10m
metadata-mysql-configmap        3      10m
workflow-controller-configmap   1      10m

$ kubectl get crd
NAME                                           CREATED AT
applications.app.k8s.io                        2020-05-31T05:19:02Z
backendconfigs.cloud.google.com                2020-05-31T05:19:12Z
capacityrequests.internal.autoscaling.k8s.io   2020-05-31T05:18:57Z
managedcertificates.networking.gke.io          2020-05-31T05:19:05Z
releaserollbacks.app.gke.io                    2020-05-31T05:19:03Z
releasetracks.app.gke.io                       2020-05-31T05:19:02Z
scalingpolicies.scalingpolicy.kope.io          2020-05-31T05:18:59Z
scheduledworkflows.kubeflow.org                2020-05-31T05:23:14Z
storagestates.migration.k8s.io                 2020-05-31T05:19:07Z
storageversionmigrations.migration.k8s.io      2020-05-31T05:19:06Z
updateinfos.nodemanagement.gke.io              2020-05-31T05:19:09Z
viewers.kubeflow.org                           2020-05-31T05:23:14Z
workflows.argoproj.io                          2020-05-31T05:23:14Z
```

非常に多くのコンポーネントがインストールされています。手動でのインストールは大変そうですね・・・。

実際、Kubeflowの公式インストール手順は多くのステップがあります。クラウドの恩恵を感じます。
https://www.kubeflow.org/docs/gke/deploy/

argo workflowsがインストールされており、kubeflow pipelinesのジョブはargoのジョブとして実際には起動されているようです。

## サンプルジョブを動かす
いくつかのサンプルが用意されています。ドキュメントの通り、「[Tutorial] Data passing in python components」を動かします。

ビューからは、パイプラインの状況やログ、IN/OUTなどを確認できます。リトライやジョブ介ジューリグもあり、ジョブフローとして一通りのものは揃っており、完成度は高そうに感じます。単純にairflowの代替としての利用もありえるのではないかなと思いました。

あとはスケジュール実行ジョブの設定を、airflowのように一覧でみられるビューがあればなお良さそう。

![job view](https://dev-to-uploads.s3.amazonaws.com/i/gz7b06hhi54jk1ljrt9y.png)

### サンプルジョブの中身を拝見
動かすだけではつまらないので、サンプルジョブの[ソースコード](https://github.com/kubeflow/pipelines/blob/9c16e12ba01962668b15fc19efa69b5ba78f618d/samples/tutorials/Data%20passing%20in%20python%20components/Data%20passing%20in%20python%20components%20-%20Files.py)を見てみます。

* [kfp](https://www.kubeflow.org/docs/pipelines/sdk/sdk-overview/)というPythonライブラリを利用して作られている。
* 具体的には、[kfp.func_to_container_op](https://www.kubeflow.org/docs/pipelines/sdk/sdk-overview/)というデコレータを利用して、関数をKubeflow pipelinesのコンポーネントとして登録している
* 上記を[kfp.compiler.Compiler.compile](https://www.kubeflow.org/docs/pipelines/sdk/sdk-overview/#sdk-packages)することで、これらのPythonコードをkubeflowで実行可能なyamlに変換している。
  * Pythonコードはyamlの中にベタガキにする、Dockerイメージとしてまとめる、のオプションがある
* DAGの依存関係については、パラメータの受け渡しから自動的に算出されてるぽいので、airflowのようにマニュアルに管理しなくて良いのがよさそう
* 今回のサンプルはkfpだけで完結していますが、tfxを使ってDAGを定義することもできるようです。機械学習モデルを作成するための様々な便利ライブラリが用意されているので、実運用ではtfxを多く利用することになりそうと感じました。
  * https://github.com/kubeflow/pipelines/blob/9c16e12ba01962668b15fc19efa69b5ba78f618d/samples/core/iris/iris.py

# まとめ
一旦はここまで。argo workflowsの力もあってか、ジョブフローエンジンとしての完成度がとても高く感じました。また、使いやすそうなSDKも良い。kubeflowのその他様々なコンポーネントとどのくらいシームレスに繋がれるのか確認してみたいと思います。