Deploy MLFlow lên Kubeflow cluster sử dụng Helm
2022-05-06 17:26:00

Kubeflow là một open-source ML platform với rất nhiều tính năng có sẵn. Tuy nhiên, tuỳ vào các bài toán cụ thể của công ty mà phát sinh nhu cầu deploy thêm các công cụ khác, ví dụ MLFlow và Seldon Core, .v.v.

Bài blog này sẽ hướng dẫn mọi người sử dụng Helm để deploy MLFlow lên cluster kubeflow.

1. Helm là gì?

Helm là một công cụ cho phép install, upgrade, rollback và remove một ứng dụng trên nền tàng k8s một cách dễ dàng. Helm chart là tập hợp các file YAML template và config cần thiết để cài đặt ứng dụng.

2. Deploy MLFlow sử dụng helm

Helm chart cho MLFlow sẽ bao gồm các file sau, trong đó folder templates bao gồm các YAML file cho các k8s resource của ứng dụng:

1
2
3
4
5
6
7
8
9
10
.
├── Chart.yaml: thông tin về chart, ví dụ: tên chart, description, maintainers, ...
├── docker
│ └── Dockerfile: để build image cho mlflow service
├── templates
│ ├── _helpers.tpl: định nghĩa các template helpers (xem thêm tại reference [1])
│ ├── deployment.yaml
│ ├── secret.yaml
│ └── service.yaml
└── values.yaml: chứa các giá trị để điền vào các file YAML template

Để cài đặt MLFlow chỉ cần sử dụng command sau:

1
helm upgrade --install mlflow -f values.yaml .

Để gỡ cài đặt

1
helm uninstall mlflow

Một số command hữu ích khác:

  • rollback về version nào đó, ví dụ bên dưới là rollback về mlflow version 6
    1
    helm rollback mlflow 6
  • kiểm tra các ứng dụng đã deploy bằng helm (còn gọi là release)
    1
    helm ls

3. Quản lý nhiều helm charts với helmfile

Khi chúng ta có nhiều helm charts thì làm sao để thiết kế CI/CD tự động install/upgrade các ứng dụng mỗi khi có thay đổi ở các YAML file? Helmfile giúp đơn giản hoá công việc này với command như sau:

1
helmfile -e nonprod apply

Command trên sẽ install/upgrade tất cả các ứng dụng định nghĩa trong helmfile.yaml. Argument -e nonprod được sử dụng để chỉ định apply cho môi trường nonprod (hay còn gọi là môi trường dev).

Cấu trúc của một repo với helmfile và nhiều helm charts có thể thiết kế như sau, trong đó mỗi một folder trong contrib (ví dụ folder mlflow) sẽ là helm chart của 1 ứng dụng.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.
├── contrib
│ └── mlflow
│ ├── Chart.yaml
│ ├── docker
│ │ └── Dockerfile
│ └── templates
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── secret.yaml
│ └── service.yaml
├── deploy.sh
├── helmfile.yaml
└── values
├── nonprod
│ └── values.yaml
└── prod
└── values.yaml

helmfile.yaml của MLFlow sẽ như sau, trong đó có 2 folder config là nonprod và prod tương ứng với 2 môi trường để deploy MLFlow. Config định nghĩa trong backendStore sẽ ghi đè lên config mặc định (file values.yaml) ở mỗi môi trường.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
releases:
- name: mlflow
namespace: mlflow
chart: ./contrib/mlflow
values:
- ./values/mlflow/{{ .Environment.Name }}/values.yaml
- backendStore:
mysql:
username: {{ requiredEnv "mlflow_mysql_username" }}
password: {{ requiredEnv "mlflow_mysql_password" }}
host: {{ requiredEnv "mlflow_mysql_host" }}
port: {{ requiredEnv "mlflow_mysql_port" }}
database: {{ requiredEnv "mlflow_mysql_database" }}

environments:
nonprod:
prod:

Source code

https://github.com/quan-dang/deploy-mlflow

References

[1] https://stackoverflow.com/questions/46719082/helm-helpers-tpl-calling-defined-templates-in-other-template-definitions
[2] https://helm.sh/
[3] https://github.com/dlabsai/mlflow-for-gcp
[4] https://github.com/roboll/helmfile

Prev
2022-05-06 17:26:00
Next