MLOps Path

7.2.1 · блок 7

MLServer как runtime

MLServer как runtime

Зачем это нужно

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.

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).

Что сделать после занятия

Официальные материалы

Открыть интерактивную версию