Kubernetes 이야기

MLflow Serving 본문

Kubernetes/MLOps

MLflow Serving

kmaster 2023. 9. 9. 12:51
반응형

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