Azure OpenAI開発のためのkubeflowのインストール


# Kubeflowとは
Kubeflow は、機械学習（ML）のワークフローを単純化し、Kubernetes上での運用を容易にするオープンソースのプラットフォーム。 KubeflowはGoogleによって開発され、多くのエンドツーエンドの機械学習ワークフローを網羅的に管理し、スケーリングを簡単に行うことが出来る。

AWS SageMakerやGCP Vertex AIなどの便利なマネージドの機械学習基盤があるが、OSSのマイ機械学習基盤というところ。ただし常時利用のためのリソースはそれなりに必要であるため運用負担はあるが、それなりの人数での企業向け用途としては使い勝手がよい。githubコミュニティも活況で年に１～２回程度の頻度でバージョンアップリリースされている。

https://www.kubeflow.org/

# MLOps
Machine Learning Operations。機械学習モデルの開発と運用を統合し、それを効果的に管理し、ビジネスの価値を最大化するための手法。

MLOpsはDevOps（開発と運用の統合）と機械学習を組み合わせたもので、機械学習のライフサイクル全体をシームレスに管理する。

MLOpsの主な目標と活動：
1. **モデルの開発**: データ収集、前処理、特徴量エンジニアリング、モデリング、バリデーションなど。
2. **モデルのデプロイ**: モデルをプロダクション環境に移行させ、使用可能にするプロセス。
3. **モデルのモニタリングと維持**: データドリフトやモデルの性能の監視などを行う。
4. **モデルの再トレーニング**: データが新しくなると、新たにトレーニングを行いモデルを再デプロイする。
5. **モデルのバージョニング**: モデルの固有のバージョンを作成および管理すること。

以上の目的を達成することで、MLOpsは機械学習のモデルを迅速に製品化し、ビジネス価値を最大化するのに役立つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/0f7a68d7-0061-946b-0d3d-feab7b9fce29.png)

出典 MLOps: 機械学習における継続的デリバリーと自動化のパイプライン(Google Cloudアーキテクチャセンター)
https://cloud.google.com/architecture/mlops-continuous-delivery-and-automation-pipelines-in-machine-learning?hl=ja#mlops_level_1_ml_pipeline_automation

# LLMにおいて
将来的にはLLMの学習プロセスを管理してAPI提供基盤として使う予定。
現状はKubernetes上でJupyterやCodeServerを稼働してLLMのAPI実行を試すツールとして利用している。
AWS、GCP、AzureなどどのパブリッククラウドにおいてもマネージドKubernetesがある（EKS、GKE、AKS）ため、どの環境においてもインストールさえすれば同様に使えるのが便利。デメリットは（要員の）学習・運用コスト。


# インストール
Azure OpenAIメインのコンテキストにおいて、Azure(AKS)でのインストール方法を記載する。他でもだいたい同じ。ただしGoogleはネイティブ対応（そもそもGoogle発祥）なので少し手順は異なるが、公式のマニュアルどおりに行えばほぼ迷うことなく導入できると思う。

## Azure(AKS)
ディストリビューション版KubeflowのKubeflow on Azureはv1.7リリース時には整備が遅れており、manifestページに記載のバニラインストールを参考にしている。

https://github.com/kubeflow/manifests

※ただし2023/9/23に更新の最新Docではv1.7に対応したAzure版がリリース済みの模様。（Azure OpenAIの活況に伴ってリクエストが増えたためか。）
https://www.kubeflow.org/docs/started/installing-kubeflow/#packaged-distributions-of-kubeflow
https://azure.github.io/kubeflow-aks/main/docs/deployment-options/vanilla-installation/


### 手順
Azure Cloud Shellを起動

グループ作成
```bash
$ az group create -n [GroupName] -l [Region]
```

k8sの利用可能バージョンを確認
```bash
$ az aks get-versions --location  [Region]
{
  "values": [
    {
      "capabilities": {
        "supportPlan": [
          "KubernetesOfficial"
        ]
      },
      "isPreview": true,
      "patchVersions": {
        "1.28.0": {
          "upgrades": []
        }
      },
      "version": "1.28"
    },
    {
      "capabilities": {
        "supportPlan": [
          "KubernetesOfficial",
          "AKSLongTermSupport"
        ]
      },
      "isPreview": null,
      "patchVersions": {
        "1.27.1": {
          "upgrades": [
            "1.27.3"
          ]
        },
        "1.27.3": {
          "upgrades": []
        }
      },
      "version": "1.27"
    },
    {
      "capabilities": {
        "supportPlan": [
          "KubernetesOfficial"
        ]
      },
      "isPreview": null,
      "patchVersions": {
        "1.26.3": {
          "upgrades": [
            "1.27.3",
            "1.27.1",
            "1.26.6"
          ]
        },
        "1.26.6": {
          "upgrades": [
            "1.27.3",
            "1.27.1"
          ]
        }
      },
      "version": "1.26"
    },
    {
      "capabilities": {
        "supportPlan": [
          "KubernetesOfficial"
        ]
      },
      "isPreview": null,
      "patchVersions": {
        "1.25.11": {
          "upgrades": [
            "1.26.6",
            "1.26.3"
          ]
        },
        "1.25.6": {
          "upgrades": [
            "1.25.11",
            "1.26.6",
            "1.26.3"
          ]
        }
      },
      "version": "1.25"
    }
  ]
}
```

クラスタ作成
```bash
$ az aks create -g [GroupName] -n [ClusterName] -s Standard_D4s_v3 -c 2 -l [Region] --generate-ssh-keys --kubernetes-version 1.27.3

# クレデンシャル取得
$ az aks get-credentials -n [ClusterName] -g [GroupName]

# クラスタノード起動確認
$ kubectl get node
```
k8s関連ツールのインストール
```
# kfctl
$ wget https://github.com/kubeflow/kfctl/releases/download/v1.2.0/kfctl_v1.2.0-0-gbc038f9_linux.tar.gz
$ tar xzvf kfctl_v1.2.0-0-gbc038f9_linux.tar.gz 
$ chmod +x ./kfctl

# kustomize
$ wget https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv5.0.1/kustomize_v5.0.1_linux_amd64.tar.gz
$ tar xzvf kustomize_v5.0.1_linux_amd64.tar.gz 

# パス設定
$ mkdir bin
$ cp kfctl bin/kfctl
$ cp kustomize bin/kustomize 
$ export PATH=$PATH:"$HOME/bin/"
$ kfctl version
  kfctl v1.2.0-0-gbc038f9
$ kustomize version
v5.0.1
```

kubeflowインストール
```
$ mkdir kf17
$ cd kf17
$ git clone https://github.com/kubeflow/manifests.git -b v1.7.0
$ cd manifests/
$ kustomize build example > kf17.yml
$ while ! kubectl apply -f kf17.yml; do sleep 10; done

# インストール後のPod起動確認
$ kubectl get pods --all-namespaces
```


外部アクセスの設定
クラスタ外部からブラウザアクセスさせたいため、SVC typeをLoadBalancerに変更する。（Azureのロードバランサーが作成される。）またアクセス制限したい場合は、loadBalancerSourceRangesにて接続元IPを制限することもできる。
```
$ kubectl edit svc/istio-ingressgateway -n istio-system
  sessionAffinity: None
  type: NodePort   #←クラスタ外からアクセスしたいためLoadBalancerに変更

$ kubectl get svc -n istio-system
NAME                    TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                                                                      AGE
authservice             ClusterIP      10.0.129.248   <none>          8080/TCP                                                                     202d
cluster-local-gateway   ClusterIP      10.0.123.206   <none>          15020/TCP,80/TCP                                                             202d
istio-ingressgateway    LoadBalancer   10.0.252.167   [LBのExternalIP]   15021:30746/TCP,80:30629/TCP,443:31348/TCP,31400:32184/TCP,15443:32612/TCP   202d
istiod                  ClusterIP      10.0.12.183    <none>          15010/TCP,15012/TCP,443/TCP,15014/TCP                                        202d
knative-local-gateway   ClusterIP      10.0.191.70    <none>          80/TCP                                                                       202d
```

ブラウザアクセス
https://[LBのExternalIP]/
にてダッシュボードアクセスが可能となっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/c9d1f0fe-70aa-a7f5-f00d-6fad9a23d88a.png)

ダッシュボード（ログイン後）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/336e9655-02e4-400d-262b-7bab425125eb.png)

NotebooksよりJupyterやVSCode、RStudioのpodを作成できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/7a20c800-4401-efcb-b2a4-21ba073b00e9.png)


簡易検証はJupyter上でLangchainを使って、本格的なコーディングはVScodeで行っている。
VScodeの拡張プラグインでGenieをAzure OpenAI利用で使えるため捗る。※
Notebookとは別でTensorboardも仮想ボリューム渡しで使えるため、Embeddingの近傍可視化などの用途でも使えると思ってる。（←やってはいない）
OSS-LLMの学習パイプラインを構築し、KserveでAPIエンドポイントを作成して利用予定。

※と言っても仕事上での話で、個人ではmacのDockerクライアント上で直接Jupyter、CodeServerのコンテナ動かしてる。


# その他できること
- 機械学習エコシステムを利用できる。（パイプライン、サービング、ハイパーパラメータチューニング、特徴量ストア等）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/8884b6c8-12fd-2786-2f6f-a545306d7720.png)