💐

Ubuntu Server䞊のMicroK8sにKubeflowずMLflowをむンストヌルする方法

に公開
2023/10/09

はじめに

Kubeflow は Google が瀟内で䜿っおいた MLOps 基盀を OSS ずしお公開したもので、Kubernetes 䞊で動䜜させるこずを前提に開発されおいる。たた、MLflow は Databricks が OSS で開発しおいる機械孊習モデル開発の実隓管理ツヌルである。MLflow はサヌバヌを立おずに動䜜させるこずもできるが、MinIO(OSS の S3 互換オブゞェクトストレヌゞ)ず連携させるこずで、実隓結果をチヌムで共有するこずができる。これらのツヌルを組み合わせるず、無料で自分のサヌバヌ䞊に MLOps 基盀を構築するこずができる。

この蚘事では Canonical 瀟のチュヌトリアルに埓い、Microk8s 䞊に Kubeflow ず MLflow の環境構築を行う。この蚘事の内容はロヌカルネットワヌク䞊で実隓的に動䜜させるこずを想定しおおり、サヌバヌにグロヌバル IP を割り圓おお動䜜させるこずは前提ずしおいない。その点は泚意しおほしい。

Kubeflow のむンストヌル

この章では、以䞋の蚘事に埓い Kubeflow をむンストヌルを行う。蚘事執筆時点の Kubeflow の最新バヌゞョンは 1.7 である。

https://charmed-kubeflow.io/docs/get-started-with-charmed-kubeflow

はじめに、microk8s をむンストヌルする。

$ sudo snap install microk8s --classic --channel=1.25/stable
$ sudo snap alias microk8s.kubectl kubectl

Kubeflow 1.7 は k8s version 1.24/1.25 䞊での動䜜をサポヌトしおいる[1]。そのため、今回は microk8s 1.25 をむンストヌルした。

次に、microk8s の addons を有効化する。

$ microk8s enable dns storage hostpath-storage ingress metallb:10.64.140.43-10.64.140.49
$ microk8s enable gpu dashboard

gpu は microk8s 䞊のコンテナが GPU を認識できるようにするための addon であり、dashboard は microk8s の運甚監芖甚の addon である。

以䞋のコマンドで dashboard にアクセスできる。

$ microk8s dashboard-proxy

この時、chrome に「この接続はプラむバシヌが保護されたせん」ず衚瀺するこずがある。この゚ラヌはthisisunsafeず打぀ず解決できる[2]。

次に juju をむンストヌルする。juju は canonical が開発しおいるデプロむ自動化ツヌルであり、k8s やパブリククラりド䞊に様々な゜フトりェアを簡単にむンストヌルできる[3]。

sudo snap install juju --classic --channel=2.9/stable

juju v3 以降で bootstrap で microk8s を遞択できなくなった。そのため 2.9 を遞択する。

以䞋、コマンドで MicroK8s 䞊に Kubeflow をむンストヌルするこずを宣蚀できる。

juju bootstrap microk8s
juju add-model kubeflow

実際にデプロむする前に、sysctl.conf の蚭定を以䞋のように曞き換える。

$ cat /etc/sysctl.conf

fs.inotify.max_user_instances=1280
fs.inotify.max_user_watches=655360

これをしないず Linux の監芖ファむル察象の䞊限に達しコンテナが立ち䞊がらなくなる[4]。

実際にデプロむする。

$ juju deploy kubeflow --trust

kubectl get po -n kubeflowで pods のステヌタスを確認し、istio 関連で゚ラヌになっおいた堎合、以䞋のコマンドで解決する堎合がある。

$ juju run --unit istio-pilot/0 -- "export JUJU_DISPATCH_PATH=hooks/config-changed; ./dispatch"

最埌に、認蚌の蚭定を行う。

$ juju config dex-auth public-url=http://10.64.140.43.nip.io
$ juju config oidc-gatekeeper public-url=http://10.64.140.43.nip.io
$ juju config dex-auth static-username=admin
$ juju config dex-auth static-password=admin

dex は k8s 䞊で認蚌を実珟する機胜である。public-url でアクセスするドメむンを指定しおいる。これは、この蚘事の最埌で ingress を蚭定する際に曞き換える。たた、dex-auth でナヌザヌ名ずパスワヌドを蚭定する。admin は Kubeflow から jupyter notebook の pods を立おた時の namespace ずしお甚いられる。

これで Kubeflow の構築は完了である。ssh -D 9999 <server>でサヌバヌに ssh した状態で、ブラりザで socks プロキシずしお 127.0.0.1:9999 を蚭定し、http://10.64.140.43.nip.ioにアクセスすれば Kubeflow が扱える。

MLflow のむンストヌル

この章では、以䞋の蚘事に MLflow のむンストヌルを行う。

https://charmed-kubeflow.io/docs/integrate-with-mlflow

以䞋のコマンドで、MLflow をむンストヌルできる。

$ juju deploy mlflow-server
$ juju deploy charmed-osm-mariadb-k8s mlflow-db

ここで、juju statusで mlflow-server が wait 状態になるのを埅぀。その埌、以䞋コマンドで mlflow に kubeflow のデヌタベヌス等を関連付ける。

$ juju relate minio mlflow-server
$ juju relate istio-pilot mlflow-server
$ juju relate mlflow-db mlflow-server
$ juju relate mlflow-server admission-webhook

Kubeflow ず同様に socks プロキシを蚭定しお、http://10.64.140.43.nip.io/mlflow/にアクセスすれば mlflow にアクセスできる。

MinIO の蚭定

Charmed Kubeflow には MinIO が含たれおいる。MinIO の WebUI の管理画面にもアクセスできるようにする。

https://charmed-kubeflow.io/docs/allow-access-minio

以䞋コマンドでパスワヌドを蚭定する。

juju config minio secret-key=<password>

パスワヌドは 8 文字以䞊である必芁がある。MinIO の管理画面には Ingress を蚭定するずアクセスできるようになる。

アンむンストヌル方法

䞊蚘の手順で倱敗した堎合は、以䞋の手順に埓っおアンむンストヌルが可胜である。

https://charmed-kubeflow.io/docs/uninstall

juju destroy-model kubeflow --yes --destroy-storage --force
juju destroy-controller microk8s-localhost

たた、microk8s をリセットしたい堎合は、microk8s resetが䜿える。

Ingress の蚭定

MicroK8s は Ingress をサポヌトしおいる[5]。そのため以䞋のようにしお、Ingress を䜜成すれば、LAN 内の別のパ゜コンから Kubeflow や MinIO にアクセス可胜である。

kubeflow-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kubeflow-ingress
  namespace: kubeflow
spec:
  rules:
  - host: "192.168.0.5.nip.io"
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: istio-ingressgateway-workload
            port:
              number: 80
  - host: "minio.192.168.0.5.nip.io"
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: minio
            port:
              number: 9001

kubectl apply -f kubeflow-ingress.yamlで Ingress を有効化できる。この埌、以䞋の蚭定を行う。

$ juju config dex-auth public-url=http://<server ip>.nip.io
$ juju config oidc-gatekeeper public-url=http://<server ip>.nip.io

これで、LAN 内からhttp://<server ip>.nip.ioで Kubeflow にアクセス可胜ずなる。さらに、http://minio.<server ip>.nip.ioで MinIO にアクセス可胜である。

MinIO の画面は以䞋のようになる。

おわりに

MicroK8s 䞊に Kubeflow ず MLflow の環境構築を行った。Canonical 瀟の゚コシステムを䜿えば簡単に本栌的な Kubeflow 環境が䜜成できるこずがわかった。MicroK8s は耇数ノヌドにするこずも可胜[6]であり、NVIDIA DGX にむンストヌルするこずも可胜[7]であるため、この蚘事で瀺したむンストヌル方法はベンチャヌ䌁業や倧孊研究宀のオンプレ機械孊習環境ぐらいたではスケヌルするず思う。

たた、最近の Canonical 瀟はデヌタセンタヌをパブリッククラりドのような機胜を持たせる OSS を積極的に開発しおいる。本栌的な環境ずしお、MAAS ず Charmed OpenStack ず Charmed Kubernetes を組み合わせお基盀を䜜った䞊に、Kubeflow などの OSS をデプロむするこずも可胜である。AI が発展し䞀般の䌁業が䜿うデヌタ量や蚈算リ゜ヌスが今の䜕倍にも膚れ䞊がった時、クラりド䞊のコストがかかる郚分をオンプレ回垰させおるこずになったら、これらを䜿うこずになるず思う。

Kubeflow や MLflow の䜿い方に぀いおはただわかっおいない郚分が倚い。これらは䜿いこなせるようになりたい。

関連蚘事

https://zenn.dev/derbuihan/articles/928ae5f279afbc

https://zenn.dev/derbuihan/articles/cb6b7a84dd6dc0

https://zenn.dev/derbuihan/articles/a1e636d29e1b51

远蚘

Nvidia Driver をアップデヌトしたらCan't run container using nvidia-docker - libnvidia-ml.so.1ずいう゚ラヌが出お壊れおしたった。

党おのコンテナを削陀し snap remove microk8s を実行しお microk8s を削陀しおリセットしおから、䞊蚘のむンストヌルを再実行したら解決した。結局原因はよくわからなかった。microk8s の gpu addon のドキュメント[8]を参考に nvidia-container の蚭定をすれば治ったのかもしれない。次゚ラヌになったらこのドキュメントを詊しおみる。

脚泚
  1. https://www.kubeflow.org/docs/releases/kubeflow-1.7/ ↩

  2. https://qiita.com/TK-C/items/13efa5a45beb6de29134 ↩

  3. https://charmhub.io/ ↩

  4. https://knowledge.sakura.ad.jp/31502/ ↩

  5. https://microk8s.io/docs/addon-ingress ↩

  6. https://microk8s.io/docs/clustering ↩

  7. https://microk8s.io/docs/nvidia-dgx ↩

  8. https://microk8s.io/docs/addon-gpu ↩

Discussion