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