본문으로 건너뛰기
버전: 1.0

5. Model from MLflow

Model from MLflow

이번 페이지에서는 MLflow Component에서 저장된 모델을 이용해 API를 생성하는 방법에 대해서 알아보겠습니다.

Secret

initContainer가 minio에 접근해서 모델을 다운로드받으려면 credentials가 필요합니다. minio에 접근하기 위한 credentials는 다음과 같습니다.

apiVersion: v1
type: Opaque
kind: Secret
metadata:
name: seldon-init-container-secret
namespace: kubeflow-user-example-com
data:
AWS_ACCESS_KEY_ID: bWluaW8K=
AWS_SECRET_ACCESS_KEY: bWluaW8xMjM=
AWS_ENDPOINT_URL: aHR0cDovL21pbmlvLm1ha2luYXJvY2tzLmFp
USE_SSL: ZmFsc2U=

AWS_ACCESS_KEY_ID 의 입력값은 minio입니다. 다만 secret의 입력값은 인코딩된 값이여야 되기 때문에 실제로 입력되는 값은 다음을 수행후 나오는 값이어야 합니다.

data에 입력되어야 하는 값들은 다음과 같습니다.

인코딩은 다음 명령어를 통해서 할 수 있습니다.

echo -n minio | base64

그러면 다음과 같은 값이 출력됩니다.

bWluaW8=

인코딩을 전체 값에 대해서 진행하면 다음과 같이 됩니다.

  • AWS_ACCESS_KEY_ID: bWluaW8=
  • AWS_SECRET_ACCESS_KEY: bWluaW8xMjM=
  • AWS_ENDPOINT_URL: aHR0cDovL21pbmlvLXNlcnZpY2Uua3ViZWZsb3cuc3ZjOjkwMDA=
  • USE_SSL: ZmFsc2U=

다음 명령어를 통해 secret을 생성할 수 있는 yaml파일을 생성합니다.

cat <<EOF > seldon-init-container-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: seldon-init-container-secret
namespace: kubeflow-user-example-com
type: Opaque
data:
AWS_ACCESS_KEY_ID: bWluaW8=
AWS_SECRET_ACCESS_KEY: bWluaW8xMjM=
AWS_ENDPOINT_URL: aHR0cDovL21pbmlvLXNlcnZpY2Uua3ViZWZsb3cuc3ZjOjkwMDA=
USE_SSL: ZmFsc2U=
EOF

다음 명령어를 통해 secret을 생성합니다.

kubectl apply -f seldon-init-container-secret.yaml

정상적으로 수행되면 다음과 같이 출력됩니다.

secret/seldon-init-container-secret created

Seldon Core yaml

이제 Seldon Core를 생성하는 yaml파일을 작성합니다.

apiVersion: machinelearning.seldon.io/v1
kind: SeldonDeployment
metadata:
name: seldon-example
namespace: kubeflow-user-example-com
spec:
name: model
predictors:
- name: model

componentSpecs:
- spec:
volumes:
- name: model-provision-location
emptyDir: {}

initContainers:
- name: model-initializer
image: gcr.io/kfserving/storage-initializer:v0.4.0
args:
- "s3://mlflow/mlflow/artifacts/0/74ba8e33994144f599e50b3be176cdb0/artifacts/svc"
- "/mnt/models"
volumeMounts:
- mountPath: /mnt/models
name: model-provision-location
envFrom:
- secretRef:
name: seldon-init-container-secret

containers:
- name: model
image: ghcr.io/mlops-for-all/mlflowserver
volumeMounts:
- mountPath: /mnt/models
name: model-provision-location
readOnly: true
securityContext:
privileged: true
runAsUser: 0
runAsGroup: 0

graph:
name: model
type: MODEL
parameters:
- name: model_uri
type: STRING
value: "/mnt/models"
children: []

이 전에 작성한 Seldon Fields와 달라진 점은 크게 두 부분입니다. initContainer에 envFrom 필드가 추가되었으며 args의 주소가 s3://mlflow/mlflow/artifacts/0/74ba8e33994144f599e50b3be176cdb0/artifacts/svc 로 바뀌었습니다.

args

앞서 args의 첫번째 array는 우리가 다운로드받을 모델의 경로라고 했습니다.
그럼 mlflow에 저장된 모델의 경로는 어떻게 알 수 있을까요?

다시 mlflow에 들어가서 run을 클릭하고 모델을 누르면 다음과 같이 확인할 수 있습니다.

seldon-mlflow-0.png

이렇게 확인된 경로를 입력하면 됩니다.

envFrom

minio에 접근해서 모델을 다운로드 받는 데 필요한 환경변수를 입력해주는 과정입니다. 앞서 만든 seldon-init-container-secret를 이용합니다.

API 생성

우선 위에서 정의한 스펙을 yaml 파일로 생성하겠습니다.

apiVersion: machinelearning.seldon.io/v1
kind: SeldonDeployment
metadata:
name: seldon-example
namespace: kubeflow-user-example-com
spec:
name: model
predictors:
- name: model

componentSpecs:
- spec:
volumes:
- name: model-provision-location
emptyDir: {}

initContainers:
- name: model-initializer
image: gcr.io/kfserving/storage-initializer:v0.4.0
args:
- "s3://mlflow/mlflow/artifacts/0/74ba8e33994144f599e50b3be176cdb0/artifacts/svc"
- "/mnt/models"
volumeMounts:
- mountPath: /mnt/models
name: model-provision-location
envFrom:
- secretRef:
name: seldon-init-container-secret

containers:
- name: model
image: ghcr.io/mlops-for-all/mlflowserver
volumeMounts:
- mountPath: /mnt/models
name: model-provision-location
readOnly: true
securityContext:
privileged: true
runAsUser: 0
runAsGroup: 0

graph:
name: model
type: MODEL
parameters:
- name: model_uri
type: STRING
value: "/mnt/models"
- name: xtype
type: STRING
value: "dataframe"
children: []
EOF

seldon pod을 생성합니다.

kubectl apply -f seldon-mlflow.yaml

정상적으로 수행되면 다음과 같이 출력됩니다.

seldondeployment.machinelearning.seldon.io/seldon-example created

이제 pod이 정상적으로 뜰 때까지 기다립니다.

kubectl get po -n kubeflow-user-example-com | grep seldon

다음과 비슷하게 출력되면 정상적으로 API를 생성했습니다.

seldon-example-model-0-model-5c949bd894-c5f28      3/3     Running     0          69s

CLI를 이용해 생성된 API에는 다음 request를 통해 실행을 확인할 수 있습니다.

curl -X POST http://$NODE_IP:$NODE_PORT/seldon/seldon-deploy/sklearn/api/v1.0/predictions \
-H 'Content-Type: application/json' \
-d '{
"data": {
"ndarray": [
[
143.0,
0.0,
30.0,
30.0
]
],
"names": [
"sepal length (cm)",
"sepal width (cm)",
"petal length (cm)",
"petal width (cm)"
]
}
}'

정상적으로 실행될 경우 다음과 같은 결과를 받을 수 있습니다.

{"data":{"names":[],"ndarray":["Virginica"]},"meta":{"requestPath":{"model":"ghcr.io/mlops-for-all/mlflowserver:e141f57"}}}