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がある程度やってくれるので開発、運用が楽になります。
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開発における技術サーベイ