見出し画像

KubernetesとKubeflowを活用したMLOpsの実現

Text by 技術本部 Furuike

DXソリューション開発部アドバンストテクノロジー課に所属している古池です。以前はKubernetesとKubeflowを使用したMLOps基盤の環境構築に携わっていました。

近年、機械学習の実運用が進む中で、MLOps(Machine Learning Operations)への注目が高まっています。
MLOpsとは、機械学習モデルの開発から運用までのライフサイクル全体を効率化・自動化するための手法であり、DevOpsの機械学習版のようなものです。
ここでは、MLOpsの実現に欠かせないKubernetesの基本的なメリットを解説した上で、Kubernetesを基盤としたMLOpsプラットフォーム「Kubeflow」の概要と活用方法を紹介します。


Kubernetesとは

Kubernetesは、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するオープンソースのシステムです。

Kubernetesはweb開発等にも用いられ、以下のような特徴があります。

・サービスディスカバリーと負荷分散
Kubernetesは、DNS名または独自のIPアドレスを使ってコンテナを公開することができます。コンテナへのトラフィックが多い場合は、Kubernetesは負荷分散し、ネットワークトラフィックを振り分けることができるため、デプロイが安定します。
・ストレージ オーケストレーション
Kubernetesは、ローカルストレージやパブリッククラウドプロバイダーなど、選択したストレージシステムを自動でマウントすることができます。
・自動化されたロールアウトとロールバック
Kubernetesを使うとデプロイしたコンテナのあるべき状態を記述することができ、制御されたスピードで実際の状態をあるべき状態に変更することができます。例えば、アプリケーションのデプロイのために、新しいコンテナの作成や既存コンテナの削除、新しいコンテナにあらゆるリソースを適用する作業を、Kubernetesで自動化できます。
・自動ビンパッキング
コンテナ化されたタスクを実行するノードのクラスターをKubernetesへ提供します。各コンテナがどれくらいCPUやメモリー(RAM)を必要とするのかをKubernetesに宣言することができます。Kubernetesはコンテナをノードにあわせて調整することができ、リソースを最大限に活用してくれます。
・自己修復
Kubernetesは、処理が失敗したコンテナを再起動し、コンテナを入れ替え、定義したヘルスチェックに応答しないコンテナを強制終了します。処理の準備ができるまでは、クライアントに通知しません。
・機密情報と構成管理
Kubernetesは、パスワードやOAuthトークン、SSHキーなどの機密の情報を保持し、管理することができます。機密情報をデプロイし、コンテナイメージを再作成することなくアプリケーションの構成情報を更新することができます。スタック構成の中で機密情報を晒してしまうこともありません。

出典:https://kubernetes.io/ja/docs/concepts/overview/

面倒な部分はKubernetesがある程度やってくれるので開発、運用が楽になります。

Kubeflowの概要

Kubeflowとは、機械学習ワークフローの開発、実行、管理を行うためのオープンソースプラットフォームのことで、機械学習のライフサイクル全体をカバーする様々なコンポーネントを提供しています。

主なコンポーネントは以下の通りです。
- Kubeflow Pipelines: 機械学習ワークフローをパイプラインとして定義し、実行する
- Katib: ハイパーパラメータチューニングを自動化する
- TFJob/PyTorchJob: TensorFlowやPyTorchの分散学習を管理する
- KFServing: 学習済みモデルのデプロイとサービング
- Notebooks: JupyterLabなどのノートブック環境を提供
- Metadata: 実験の管理とトラッキング

これらのコンポーネントを組み合わせることで、データの前処理から学習、評価、デプロイまでの一連の機械学習ワークフローを自動化できます。
特にKubeflow Pipelinesは、コンテナ化されたコンポーネントをパイプラインとして連携させ、複数のスクリプトをボタン一つで動かせるようにすることで属人化を避けることができる点が特徴です。
パイプラインはPythonのDSLまたはYAMLで定義でき、UIからも管理・実行できます。

KubeflowはKubernetes上で動作するため、以下のようなメリットがあります。
●スケーラビリティ: 必要に応じて機械学習ワークロードを自動でスケールできる
●ポータビリティ: オンプレミスやマルチクラウド環境への移行が容易
●障害耐性: ノードやPodの障害時に自動で復旧し稼働を継続
●豊富なエコシステム: Kubernetesの幅広いツールやサービスと連携可能

Kubeflow環境構築実践

それでは実際にkubeflow環境を最小構成で構築してみます。

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

https://github.com/kubeflow/manifests

1. Kubernetesクラスタの構築

 1.1 前提条件

- 1台のUbuntu 22.04 LTSマシン
- dockerはinstall済み
- swapはoff

 1.2 kubeadm、kubelet、kubectlのインストール

以下の手順を全てのマシンで実行します。

- リポジトリの更新

sudo apt update
sudo apt-get install -y apt-transport-https ca-certificates curl

- GPGキーの追加

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.25/deb/Release.key | 
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

- Kubernetesリポジトリの追加

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg]
 https://pkgs.k8s.io/core:/stable:/v1.25/deb/ /' | sudo tee
 /etc/apt/sources.list.d/kubernetes.list

- kubeadm、kubelet、kubectlのインストール

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

 1.3 コントロールプレーンノードの初期化

- iptablesのパラメータ編集

cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

- iptablesのパラメータ編集

sysctl --system

- 1台のマシンをコントロールプレーンノードとして選択し、以下のコマンドを実行します。

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=1.25.0

- 以下エラーが出る場合はcontainerdを適切にインストール・設定できていない可能性があります。

[ERROR CRI]: container runtime is not running: output: time="2024-03-
10T08:58:33Z" level=fatal msg="validate service connection: validate CRI v1
 runtime API for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc
 error: code = Unimplemented desc = unknown service
 runtime.v1.RuntimeService"
, error: exit status 1

 - この場合は以下のコマンドを実行し再度コントロールプレーンノードの初期化を行います。

# containerdのインストール
sudo apt-get update
sudo apt-get install -y containerd
# containerd設定ファイルの生成
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 場合によってはcontainerd.sockの権限を変える必要があります。
# containerdの再起動
sudo systemctl restart containerd

- 初期化が完了したら、以下のコマンドを実行してkubectlを使用できるようにします。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

 1.4 CNIプラグインのインストール

- コントロールプレーンノードで、以下のコマンドを実行してflannelをインストールします。

kubectl apply -f https://raw.githubusercontent.com/flannel-
io/flannel/master/Documentation/kube-flannel.yml 

以上で、Kubernetesクラスタの構築は完了です。

 2. Kubeflowのインストール

 2.1 Kubeflowマニフェストのクローン

- コントロールプレーンノードで、以下のコマンドを実行してKubeflowのマニフェストをクローンします。

git clone https://github.com/kubeflow/manifests.git -b v1.7.0

 2.2 Kubeflowのインストール

- kustomizeのインストールをします。

https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv5.0.0/kustomize_v5.0.0_linux_amd64.tar.gz

tar -zxvf kustomize_v5.0.0_linux_amd64.tar.gz
sudo mv kustomize /usr/local/bin/kustomize
export PATH=/usr/local/bin:$PATH

- Kubeflow 1.7をインストールするために、以下のコマンドを実行します。

cd manifests
while ! kustomize build example | awk '!/well-defined/' | kubectl apply -f -; do
 echo "Retrying to apply resources"; sleep 10; done

インストールが完了するまで数分かかります。以下のコマンドでステータスを確認できます。

kubectl get pods -n kubeflow

全てのPodが"Running"になればインストール完了です。

 2.3 Kubeflowダッシュボードへのアクセス

- インストールが完了したら、以下のコマンドを実行してKubeflowダッシュボードにアクセスするためのポート転送を設定します。

kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80

Webブラウザで`http://localhost:8080`にアクセスすると、Kubeflowダッシュボードが表示されます。

以上で、KubernetesクラスタへのKubeflow 1.7のインストールは完了です。
これで機械学習ワークフローの開発・実行・管理を行うことができるようになりました。

まとめ

本記事では、KubernetesとKubeflowについて解説と環境構築手順を記載しました。
KubernetestとKubeflowを利用することで、機械学習ワークフローの自動化、分散処理、モデルのデプロイ、実験管理などに適用することで、機械学習の開発から運用までを効率化することができます。


■ 第5回 AI開発における技術サーベイ