Kubeflow๋ Kubernetes ์์์ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ(MLOps)์ ๊ด๋ฆฌํ ์ ์๋๋ก ๋๋ ์คํ์์ค ํ๋ซํผ์ ๋๋ค. Kubeflow๋ ๋ชจ๋ธ ํ์ต, ์คํ, ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋, ๋ฐฐํฌ๊น์ง ๋จธ์ ๋ฌ๋ ํ์ดํ๋ผ์ธ์ ๋ชจ๋ ๋จ๊ณ์์ ์๋ํ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ, ํจ์จ์ ์ธ MLOps ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ Kubeflow์ ์ฃผ์ ๊ธฐ๋ฅ๊ณผ ๊ฐ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ MLOps ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋จ๊ณ๋ณ๋ก ์ค๋ช ํฉ๋๋ค.
๋ชฉ์ฐจ
- Kubeflow ๊ฐ์
- Kubeflow ์ค์น
- Kubeflow์ ์ฃผ์ ๊ตฌ์ฑ ์์
- ํ์ดํ๋ผ์ธ ์์ฑ ๋ฐ ์คํ
- ๋ชจ๋ธ ๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌ
- Kubeflow์ ์ฅ๋จ์
1. Kubeflow ๊ฐ์
Kubeflow๋ ๋จธ์ ๋ฌ๋ ์ํฌํ๋ก์ฐ์ ๋ชจ๋ ๋จ๊ณ๋ฅผ Kubernetes ์์์ ๊ด๋ฆฌํ ์ ์๊ฒ ๋๋ ํ๋ ์์ํฌ๋ก, ์ฃผ์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๋ํ๋ ๋จธ์ ๋ฌ๋ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ: ๋ชจ๋ธ ํ์ต, ํ๊ฐ, ๋ฐฐํฌ๊น์ง ํ์ดํ๋ผ์ธ์ ์ ์ํ์ฌ ๋ฐ๋ณต ์์ ์ ์๋ํ.
- ํ์ฅ์ฑ: Kubernetes ํด๋ฌ์คํฐ์ ํ์ฅ์ฑ์ ํ์ฉํด ํ์ต ๋ฐ ๋ฐฐํฌ ์์ ์ ํจ์จ์ ์ผ๋ก ํ์ฅ.
- ๋ค์ํ ๋จธ์ ๋ฌ๋ ๋๊ตฌ ํตํฉ: Jupyter Notebook, TensorFlow Serving, PyTorch, XGBoost, Katib ๋ฑ ์ฌ๋ฌ ํด์ ์ง์ํ์ฌ ๋ค์ํ ํ์ต ๋ฐ ์์ธก ํ๊ฒฝ ์ ๊ณต.
2. Kubeflow ์ค์น
Kubeflow๋ฅผ ์ค์นํ๋ ค๋ฉด, Kubernetes ํด๋ฌ์คํฐ๊ฐ ์ด๋ฏธ ๊ตฌ์ฑ๋์ด ์์ด์ผ ํฉ๋๋ค. Kubernetes๋ ์จํ๋ ๋ฏธ์ค ๋๋ ํด๋ผ์ฐ๋ ํ๊ฒฝ ๋ชจ๋์ ์ค์นํ ์ ์์ต๋๋ค.
2.1 ์ค์น ์ค๋น
Kubeflow ์ค์น ์ , ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๊ฐ ์ค๋น๋์ด ์์ด์ผ ํ๋ฉฐ, ๋ค์ ์ค์น ์ต์ ์ค ํ๋๋ฅผ ์ ํํ ์ ์์ต๋๋ค:
- Kfctl ์ค์น: Kubeflow ์ค์ ํ์ผ(
kfctl_k8s_istio.yaml
)์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ์ค์น. - MiniKF: ๊ฐํธํ๊ฒ Kubeflow์ JupyterHub ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์๋ ๊ฐ์๋จธ์ ๋ฐฐํฌ ์ต์ .
- MicroK8s: ๋ก์ปฌ Kubernetes ํ๊ฒฝ์์ Kubeflow๋ฅผ ์ฝ๊ฒ ์ค์นํ๊ณ ํ ์คํธํ๋ ๋ฐฉ๋ฒ.
2.2 ์ค์น ๋จ๊ณ
์ค์น ๊ณผ์ ์ Kubeflow์ ๊ณต์ ๋ฌธ์์ ์์ธํ ๋์ ์์ผ๋ฉฐ, ๊ฐ๋จํ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
kfctl
CLI ๋ค์ด๋ก๋ ๋ฐ ์ค์ .- ์ค์น ํ์ผ(
kfctl_k8s_istio.yaml
)์ ๋ค์ด๋ก๋ํ๊ณ , Kubeflow๋ฅผ ๋ฐฐํฌํ ๋๋ ํ ๋ฆฌ ์ค์ . kfctl apply
๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ Kubeflow ์ค์น.
์ค์น ํ, kubectl get all -n kubeflow
๋ช
๋ น์ด๋ก ํด๋ฌ์คํฐ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
3. Kubeflow์ ์ฃผ์ ๊ตฌ์ฑ ์์
Kubeflow๋ MLOps ํ์ดํ๋ผ์ธ์ ์ํ ๋ค์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋๋ Kubeflow์ ํต์ฌ ๊ตฌ์ฑ ์์์ ๋๋ค.
3.1 Jupyter Notebooks
Kubeflow๋ Kubernetes ํ๊ฒฝ์์ Jupyter Notebook์ ์ฝ๊ฒ ์คํํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ํ์, ๋ชจ๋ธ ํ์ต, ์คํ ๋ฑ์ ์ด๊ธฐ ์์ ์ ์ํํ๊ธฐ ์ข์ต๋๋ค.
- Notebook ์๋ฒ ์์ฑ: Kubeflow ๋์๋ณด๋์์
Notebook Servers
๋ฉ๋ด๋ฅผ ํตํด ์ Notebook ์๋ฒ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. - ๋ฆฌ์์ค ํ ๋น: GPU, ๋ฉ๋ชจ๋ฆฌ, CPU ๋ฑ ํ์ํ ๋ฆฌ์์ค๋ฅผ ์ง์ ํ์ฌ ์ต์ ์ ํ๊ฒฝ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
3.2 Kubeflow Pipelines
Kubeflow Pipelines๋ ๋จธ์ ๋ฌ๋ ํ์ดํ๋ผ์ธ์ ๋ชจ๋ ๋จ๊ณ๋ฅผ ์ ์ํ๊ณ , ์คํ ๋ฐ ๋ชจ๋ํฐ๋งํ๋ ํต์ฌ ๊ตฌ์ฑ ์์์ ๋๋ค.
- ํ์ดํ๋ผ์ธ ์์ฑ: Python SDK ๋๋ YAML ํ์ผ์ ํตํด ํ์ดํ๋ผ์ธ ๋จ๊ณ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
- ์คํ: ๊ฐ ํ์ดํ๋ผ์ธ ์คํ์ ํตํด ์คํ์ ๋ฐ๋ณตํ์ฌ ์ต์ ์ ๋ชจ๋ธ์ ์ฐพ์ ์ ์์ต๋๋ค.
- ๋ชจ๋ธ ์ถ์ : ํ์ดํ๋ผ์ธ์ ๊ฐ ๋จ๊ณ์์ ํ์ดํผํ๋ผ๋ฏธํฐ์ ๋ชจ๋ธ ์ฑ๋ฅ์ ๊ธฐ๋กํ์ฌ ์ถ์ ํ ์ ์์ต๋๋ค.
ํ์ดํ๋ผ์ธ ์์
์๋ ์ฝ๋๋ ํ์ต ๋ฐ ํ๊ฐ ๋จ๊ณ๋ฅผ ํฌํจํ ๊ฐ๋จํ ํ์ดํ๋ผ์ธ ์์์ ๋๋ค.
from kfp import dsl
@dsl.pipeline(
name='My Training Pipeline',
description='A sample pipeline to demonstrate Kubeflow Pipelines'
)
def my_pipeline():
train_op = dsl.ContainerOp(
name='train',
image='my-training-image', # ํ๋ จ์ฉ Docker ์ด๋ฏธ์ง
arguments=['--train', '/mnt/data']
)
evaluate_op = dsl.ContainerOp(
name='evaluate',
image='my-evaluation-image', # ํ๊ฐ์ฉ Docker ์ด๋ฏธ์ง
arguments=['--evaluate', '/mnt/data'],
).after(train_op)
3.3 Katib (ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋)
Katib๋ ๋ชจ๋ธ ํ์ต ์ ํ์ดํผํ๋ผ๋ฏธํฐ ์ต์ ํ๋ฅผ ์๋์ผ๋ก ์ํํ๋ ๋๊ตฌ์ ๋๋ค. ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ณตํ๋ฉฐ, ์ต์ ์ ํ์ดํผํ๋ผ๋ฏธํฐ ๊ฐ์ ์ฐพ์ ์ฑ๋ฅ์ ๊ทน๋ํํ ์ ์์ต๋๋ค.
- Katib ์คํ ์์ฑ: ํ์ต์ ํ์ํ ํ์ดํผํ๋ผ๋ฏธํฐ ๋ฒ์์ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ํ์ฌ Katib ์คํ์ ์์ฑํ ์ ์์ต๋๋ค.
- ์๋ํ๋ ์ต์ ํ: ๋ค์ํ ํ๋ผ๋ฏธํฐ ์กฐํฉ์ ์ํํ๊ณ , ์ต์ ์ ์กฐํฉ์ ์๋์ผ๋ก ํ์ํฉ๋๋ค.
3.4 KFServing (๋ชจ๋ธ ๋ฐฐํฌ)
Kubeflow์์ ๋ชจ๋ธ์ ๋ฐฐํฌํ๋ ๋ฐ๋ KFServing์ ์ฌ์ฉํฉ๋๋ค. KFServing์ ์์ธก์ ์ํด ํ์ต๋ ๋ชจ๋ธ์ ๋ค์ํ ๋ฒ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ํธ๋ํฝ์ ๋ถ๋ฐฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ๋ชจ๋ธ ์๋น์ค ์์ฑ: ํ์ต๋ ๋ชจ๋ธ์ KFServing์ ํตํด ์๋น์ค๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค.
- ๋ฒ์ ๊ด๋ฆฌ: ๋ชจ๋ธ์ ์๋ก์ด ๋ฒ์ ์ ๋ฐฐํฌํ๊ณ , ์ค์๊ฐ ํธ๋ํฝ์ ์ผ๋ถ๋ฅผ ์๋ก์ด ๋ฒ์ ์ผ๋ก ์ ํํ์ฌ ์ฑ๋ฅ์ ํ๊ฐํ ์ ์์ต๋๋ค.
- Auto-scaling: ํธ๋ํฝ์ ๋ณํ์ ๋ฐ๋ผ ์๋์ผ๋ก ํ์ฅํ๊ฑฐ๋ ์ถ์ํ ์ ์์ต๋๋ค.
4. ํ์ดํ๋ผ์ธ ์์ฑ ๋ฐ ์คํ
Kubeflow Pipelines์์ ํ์ดํ๋ผ์ธ์ ์์ฑํ๊ณ ์คํ์ ์ํํ์ฌ ๋ชจ๋ธ ํ์ต ๋ฐ ๊ฒ์ฆ ๊ณผ์ ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
4.1 ํ์ดํ๋ผ์ธ ์ ์
Kubeflow Pipelines๋ ๊ฐ ๋จ๊ณ๋ฅผ ๋ ๋ฆฝ์ ์ธ Container Operation์ผ๋ก ์ ์ํ๋ฉฐ, ๊ฐ ๋จ๊ณ๋ ์๋ก ์์กด ๊ด๊ณ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
- Python SDK ์ฌ์ฉ: ํ์ดํ๋ผ์ธ์ Python ์ฝ๋๋ก ์ ์ํ๊ณ
@dsl.pipeline
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ Kubeflow์ ๋ฑ๋กํ ์ ์์ต๋๋ค. - ๋จ๊ณ๋ณ ๋ ๋ฆฝ์ฑ: ๊ฐ ๋จ๊ณ๋ ๊ฐ๋ณ์ ์ธ ์ปจํ ์ด๋๋ก ์คํ๋์ด ๋ ๋ฆฝ์ ์ด๋ฉฐ, ์ฌ์ฌ์ฉ ๋ฐ ๋ณ๋ ฌ ์คํ์ด ๊ฐ๋ฅํฉ๋๋ค.
4.2 ์คํ ๋ฐ ๊ฒฐ๊ณผ ๋ถ์
- ์คํ ๋ฐ๋ณต: ์ฌ๋ฌ ํ์ดํ๋ผ์ธ ์คํ์ ํตํด ๋ชจ๋ธ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ , ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํ ์ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ ์๊ฐํ: Kubeflow UI์์ ํ์ดํ๋ผ์ธ์ ๊ฐ ๋จ๊ณ์ ์ฑ๋ฅ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ด ์ง๊ด์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ํ ์ ์์ต๋๋ค.
5. ๋ชจ๋ธ ๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌ
๋ชจ๋ธ ํ์ต ํ KFServing์ ์ฌ์ฉํ์ฌ ํ์ต๋ ๋ชจ๋ธ์ ๋ฐฐํฌํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
5.1 ์ค์๊ฐ ์์ธก API ์์ฑ
KFServing์ ๋ชจ๋ธ์ ์ค์๊ฐ ์์ธก API๋ก ์ฝ๊ฒ ๋ฐฐํฌํ ์ ์์ต๋๋ค. ๋ฐฐํฌ๋ ๋ชจ๋ธ์ REST API ํํ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๋ฉฐ, ์ค์๊ฐ ๋๋ ๋ฐฐ์น ์์ธก์ ์ํํ ์ ์์ต๋๋ค.
apiVersion: serving.kubeflow.org/v1alpha2
kind: InferenceService
metadata:
name: my-model
spec:
default:
predictor:
tensorflow:
storageUri: "gs://my-bucket/model"
5.2 ๋ชจ๋ธ ๋ชจ๋ํฐ๋ง ๋ฐ ์ค์ผ์ผ๋ง
- Auto-scaling ์ค์ : ์์ธก ์์ฒญ์ ๋ฐ๋ผ ๋ชจ๋ธ ์๋ฒ๊ฐ ์๋์ผ๋ก ํ์ฅํ๊ฑฐ๋ ์ถ์ํ ์ ์๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ๋ชจ๋ธ์ด ์์๋๋ก ์๋ํ๋์ง ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ฉฐ, ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
6. Kubeflow์ ์ฅ๋จ์
์ฅ์
- ๊ฐ๋ ฅํ ์๋ํ: ๋ชจ๋ธ ํ์ต, ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋, ๋ฐฐํฌ ๋ฑ ๋ค์ํ ์์ ์ ์๋ํํ์ฌ ํจ์จ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
- ์ ์ฐํ ํ์ฅ์ฑ: Kubernetes ๊ธฐ๋ฐ์ด๋ฏ๋ก ๋ฆฌ์์ค ํ์ฅ๊ณผ ํด๋ฌ์คํฐ ๊ด๋ฆฌ๋ฅผ ์ ์ฐํ๊ฒ ์ํํ ์ ์์ต๋๋ค.
- ์ง๊ด์ ์ธ UI: Kubeflow๋ ์น UI๋ฅผ ํตํด ํ์ดํ๋ผ์ธ ๊ด๋ฆฌ, ์คํ ๊ฒฐ๊ณผ ํ์ธ, ๋ฐฐํฌ ์ํ ๋ชจ๋ํฐ๋ง ๋ฑ์ ํ๋์ ํ์ธํ ์ ์์ด ๊ด๋ฆฌ๊ฐ ์ฉ์ดํฉ๋๋ค.
๋จ์
- ์ค์น์ ์ด๊ธฐ ์ค์ ์ ๋ณต์ก์ฑ: Kubeflow๋ ์ค์น๊ฐ ๋ณต์กํ๊ณ ๋ง์ ๋ฆฌ์์ค๋ฅผ ํ์๋ก ํ๋ฉฐ, Kubernetes์ ๋คํธ์ํฌ ์ค์ ์ ๋ํ ๋์ ์ดํด๊ฐ ์๊ตฌ๋ฉ๋๋ค.
- ๋ฆฌ์์ค ์ฌ์ฉ๋: Kubeflow๋ Kubernetes ํด๋ฌ์คํฐ ๋ด์์ ๋ง์ ๋ฉ๋ชจ๋ฆฌ์ CPU ์์์ ์ฌ์ฉํ๋ฏ๋ก, ๋ฆฌ์์ค๊ฐ ๋ถ์กฑํ ํ๊ฒฝ์์๋ ์ฌ์ฉ์ ์ ํ์ด ์์ ์ ์์ต๋๋ค.
- ํ์ต ๊ณก์ : ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง ๊ทธ๋งํผ ์ค์ ํ ์์๋ ๋ง์, ์ต์ํด์ง๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
๊ฒฐ๋ก
Kubeflow๋ ๋๊ท๋ชจ ๋จธ์ ๋ฌ๋ ์ํฌํ๋ก์ฐ๋ฅผ ๊ด๋ฆฌํ๊ณ , MLOps ํ์ดํ๋ผ์ธ์ ์๋ํํ๋ฉฐ, ๋ชจ๋ธ ๋ฐฐํฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ๋๋ ๊ฐ๋ ฅํ ํ๋ซํผ์ ๋๋ค. ํนํ Kubeflow๋ Kubernetes์ ํจ๊ป ์ฌ์ฉํจ์ผ๋ก์จ, ์จํ๋ ๋ฏธ์ค ํ๊ฒฝ๊ณผ ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ๋ชจ๋ ํ์ฅ์ฑ๊ณผ ์ ์ฐ์ฑ์ ๊ฐ์ถ MLOps ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
Kubeflow๋ฅผ ํ์ฉํ MLOps์ ์ฃผ์ ์ฅ์ ์์ฝ:
- ์๋ํ๋ ํ์ดํ๋ผ์ธ ๊ด๋ฆฌ: ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ, ๋ชจ๋ธ ํ์ต, ํ๊ฐ, ๋ฐฐํฌ ๋ฑ์ ์ํฌํ๋ก์ฐ๋ฅผ ํ๋์ ํ์ดํ๋ผ์ธ์ผ๋ก ์ ์ํ๊ณ ์๋ํ.
- ํ์ฅ์ฑ ๋ฐ ์ ์ฐ์ฑ: Kubernetes์ ํ์ฅ์ฑ์ ํ์ฉํด ๋ฆฌ์์ค๋ฅผ ์ ๋์ ์ผ๋ก ํ ๋นํ๊ณ , ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ๋ชจ๋ธ ํ์ต์ ์ฒ๋ฆฌ.
- ๋ชจ๋ธ ์ถ์ ๊ณผ ๋ฒ์ ๊ด๋ฆฌ: ๊ฐ ์คํ๊ณผ ๋ชจ๋ธ์ ์ถ์ ํ๊ณ ๋ฒ์ ์ ๊ด๋ฆฌํ์ฌ ์ฌํ ๊ฐ๋ฅํ ๋จธ์ ๋ฌ๋์ ๊ฐ๋ฅํ๊ฒ ํจ.
- ํ์ดํผํ๋ผ๋ฏธํฐ ์ต์ ํ ๋ฐ ์ค์๊ฐ ์์ธก ์ ๊ณต: Katib์ ํ์ฉํ ์ต์ ํ์ KFServing์ ํตํ ์์ธก API ์ ๊ณต์ผ๋ก ์ค์๊ฐ ์๋น์ค ๊ฐ๋ฅ.
Kubeflow๋ ํนํ ๋๊ท๋ชจ ๋ชจ๋ธ ํ์ต๊ณผ ๋ฐฐํฌ๊ฐ ํ์ํ ๊ธฐ์ ํ๊ฒฝ์ ์ ํฉํ๋ฉฐ, Kubernetes์์ ์ฐ๋์ ํตํด ์ ์ฐํ ํ์ฅ์ด ๊ฐ๋ฅํฉ๋๋ค. ๊ธฐ ์ค์น์ ์ฌ์ฉ๋ฒ์ ์ตํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ง๋ง, ์ฅ๊ธฐ์ ์ผ๋ก๋ ๋งค์ฐ ๊ฐ๋ ฅํ MLOps ๋๊ตฌ๋ก ์๋ฆฌ ์ก์ ์ ์์ต๋๋ค.