Зачем это нужно
MLServer — open-source inference server с единым REST/gRPC API (V2 Inference Protocol) для классических ML моделей: sklearn, XGBoost, LightGBM, ONNX. Это «тонкий» runtime: загрузить model settings, принимать tensor/JSON, возвращать predictions. В экосистеме курса MLServer — базовый кирпич под KServe и Seldon для tabular ML.
Понимание MLServer нужно до Helm deploy: что такое model-settings, как упаковать custom preprocessing, как health checks работают с load model.
Основные идеи
MLServer в стеке serving.
KServe InferenceService (orchestration) │ ▼ Pod: mlserver container ├── model-settings.json ├── model artifact (joblib, onnx, …) └── optional custom code (MLModel subclass)
V2 Inference Protocol. Стандарт ONNX Runtime / Triton / MLServer: endpoints /v2/health/live, /v2/health/ready, /v2/models/{name}/infer. KServe и mesh observability опираются на общие conventions.
model-settings.json (минимум):
{ "name": "churn", "implementation": "mlserver_sklearn.SKLearnModel", "parameters": { "uri": "./models/churn/v44/model.joblib", "version": "v44" } }
Implementations (built-in).
| Implementation | Формат модели |
|---|---|
mlserver_sklearn.SKLearnModel |
joblib/pickle |
mlserver_xgboost.XGBoostModel |
booster JSON/binary |
mlserver_lightgbm.LightGBMModel |
txt/model file |
mlserver_onnx.ONNXModel |
.onnx |
Custom MLModel (Python) — когда нужен preprocessing:
` from mlserver import MLModel, types
class ChurnModel(MLModel): async def load(self) -> bool: self._model = joblib.load(self.settings.parameters.uri) return True
async def predict(self, payload: types.InferenceRequest) -> types.InferenceResponse:
# decode inputs → predict → encode outputs
...
`
Concurrency model. Async FastAPI/uvicorn under the hood; для CPU models — parallel_workers в settings. GPU rarely for pure sklearn.
Environment isolation. Model dependencies в Docker image: requirements.txt pinned. Не «pip install на prod Pod».
Readiness vs liveness.
Liveness — process alive.
Readiness — model loaded, can accept traffic. MLServer ready после
load()— critical для large models.
Observability hooks. Prometheus metrics endpoint; integrate with module 5 RED metrics on /v2/models/churn/infer.
MLServer vs «Flask + pickle». Flask DIY — быстрый hack, нет standard protocol, слабый versioning, каждый проект unique. MLServer — repeatable platform pattern.
Как это выглядит на практике
Local test перед K8s:
` mlserver start .
curl infer example from MLServer docs
curl -s http://localhost:8080/v2/models/churn/infer -X POST
-H "Content-Type: application/json"
-d @samples/infer.json
`
Dockerfile sketch:
FROM docker.io/seldonio/mlserver:1.6.1-slim COPY models/ /models/ COPY model-settings.json /models/ ENV MLSERVER_MODELS_DIR=/models
Integration с Feast (block 6). Custom predict: get_online_features → vector → model.predict → response. Или preprocessing в upstream service.
Versioning. Subfolder models/churn/v44/; KServe storageUri or initContainer sync from MinIO. Traffic switch via InferenceService canary (7.5).
Что сделать после занятия
Опишите содержимое
model-settings.jsonдля sklearn модели capstone.Объясните, когда нужен custom MLModel вместо built-in implementation.
Выпишите 2 endpoint'а V2 protocol и их назначение.