07 · Serving-платформа7.1–7.7 · Runtime и оркестраторы7.2.1сложный

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.

  • 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 и их назначение.

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