반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- gitops
- MLflow
- Continuous Deployment
- opentelemetry
- serving
- Kubernetes 인증
- Argo
- Pulumi
- Litmus
- Kubernetes
- blue/green
- keda
- opensearch
- mlops
- knative
- Kopf
- Model Serving
- tekton
- CANARY
- CI/CD
- 오퍼레이터
- 카오스 엔지니어링
- nginx ingress
- operator
- Kubeflow
- argocd
- eBPF
- seldon core
- xdp
- kubernetes operator
Archives
- Today
- Total
Kubernetes 이야기
MLflow Serving 본문
반응형
Model Serving에 대해서는 다음의 글을 참고한다.
https://kmaster.tistory.com/158
https://kmaster.tistory.com/166
mlflow에서도 Serving 기능을 제공한다. 이에 대해 알아보자.
https://mlflow.org/docs/latest/tutorials-and-examples/tutorial.html 예제 소스를 사용하여 Serving을 수행해 보자.
# mlflow models serve -m ./mlruns/0/<runid>/artifacts/model -p <port>
여기서 port는 모델 api를 수신받을 수 있는 임의의 port를 지정하면 된다.
# mlflow models serve -m ./mlartifacts/0/9927ff56416742b485440b7a8f83add7/artifacts/model -p 3000 --no-conda
INFO mlflow.models.flavor_backend_registry: Selected backend for flavor 'python_function'
INFO mlflow.pyfunc.backend: === Running command 'waitress-serve --host=127.0.0.1 --port=3000 --ident=mlflow mlflow.pyfunc.scoring_server.wsgi:app'
INFO:waitress:Serving on http://127.0.0.1:3000
--no-conda는 현재 로컬 환경에서 실행중이어서 준 옵션이다.
로그에 보이듯이 현재 http://127.0.0.1:3000 번으로 api 서버가 기동중인것을 볼 수 있다. 이제 http://127.0.0.1:3000 포트에 /invocations post를 사용하여 모델에 대한 결과를 추출할 수 있다.
호출 예제)
curl http://127.0.0.1:5000/invocations -H 'Content-Type:
application/json' -d '{ "dataframe_records": [{"a":1, "b":2},
{"a":3, "b":4}, {"a":5, "b":6}] }'
예제처럼 한번 3000번에 호출해 보자.
# curl http://127.0.0.1:3000/invocations -H 'Content-Type: application/json' -d '{"dataframe_records": [{"a":1, "b":2}]}'
{"error_code": "INTERNAL_ERROR", "message": "Model is missing inputs ['fixed acidity', 'volatile acidity', 'citric acid', 'residual sugar', 'chlorides', 'free sulfur dioxide', 'total sulfur dioxide', 'density', 'pH', 'sulphates', 'alcohol']. Note that there were extra inputs: ['b', 'a']"}
위와 같이 input 데이터가 잘못되었다는 메시지를 볼 수 있다. 모델에 맞는 input값을 넣어보자.
# curl -X POST -H "Content-Type:application/json" --data '{"dataframe_split": {"columns":["fixed acidity", "volatile acidity", "citric acid", "residual sugar", "chlorides", "free sulfur dioxide", "total sulfur dioxide", "density", "pH", "sulphates", "alcohol"],"data":[[6.2, 0.66, 0.48, 1.2, 0.029, 29, 75, 0.98, 3.33, 0.39, 12.8]]}}' http://127.0.0.1:3000/invocations
{"predictions": [5.724767311136927]}
이제 정상적을 예측값을 확인할 수 있다.
s3에 저장되어 있는 모델을 Serving하는 경우에는 다음과 같이 실행한다.
# export MLFLOW_S3_ENDPOINT_URL=http://minio-server:9000
# export MLFLOW_S3_IGNORE_TLS=true
# export AWS_ACCESS_KEY_ID=id
# export AWS_SECRET_ACCESS_KEY=key
# mlflow models serve -m s3://mlflow/0/c420e2b248a643d29bfedb22ee492e93/artifacts/model --host 0.0.0.0 -p 3000 --no-conda
2023/09/09 12:18:16 INFO mlflow.models.flavor_backend_registry: Selected backend for flavor 'python_function'
2023/09/09 12:18:16 INFO mlflow.pyfunc.backend: === Running command 'exec gunicorn --timeout=60 -b 0.0.0.0:3000 -w 1 ${GUNICORN_CMD_ARGS} -- mlflow.pyfunc.scoring_server.wsgi:app'
반응형
'Kubernetes > MLOps' 카테고리의 다른 글
Ollama and Chainlit으로 Langchain과 RAG 구현하기 (0) | 2023.12.30 |
---|---|
Kafka를 사용하여 실시간 데이터 파이프라인 구축 (1) | 2023.12.11 |
mlflow (0) | 2023.09.09 |
dvc (0) | 2023.09.08 |
KServe, Seldon Core, BentoML 비교 (0) | 2023.04.03 |
Comments