MLOps Path

2.1.3 · блок 2

systemd: сервис под управлением ОС

systemd: сервис под управлением ОС

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

Запустить inference-сервис командой python app.py в терминале — нормально для разработки. В продакшене терминал закроется, SSH оборвётся, сервер перезагрузится — и сервис умрёт. systemd — менеджер служб в большинстве современных Linux-дистрибутивов. Он стартует сервис при загрузке, перезапускает при падении, собирает логи в journal.

Понимание systemd нужно MLE хотя бы на уровне: прочитать unit-файл, перезапустить сервис, посмотреть статус. На Kubernetes логика похожая (Deployment, liveness probe), но systemd — фундамент.

Основные идеи

Unit-файл — конфигурация службы. Располагается в /etc/systemd/system/scoring.service:


[Unit]
Description=ML Scoring Inference Service
After=network.target postgresql.service
Requires=network.target

[Service]
Type=simple
User=mlservice
WorkingDirectory=/opt/scoring-service
Environment=MODEL_PATH=/opt/models/fraud_v2.pkl
Environment=LOG_LEVEL=info
ExecStart=/opt/scoring-service/venv/bin/gunicorn app:app -b 0.0.0.0:8080
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Ключевые директивы:

Управление сервисом:


sudo systemctl daemon-reload          # после изменения unit-файла
sudo systemctl enable scoring.service   # автозапуск при boot
sudo systemctl start scoring.service
sudo systemctl status scoring.service
sudo systemctl restart scoring.service
sudo systemctl stop scoring.service

Healthcheck — проверка, что сервис *действительно* готов. systemd умеет:


[Service]
ExecStart=/opt/scoring-service/venv/bin/gunicorn app:app -b 0.0.0.0:8080
ExecStartPost=/opt/scoring-service/scripts/wait-for-health.sh

Скрипт wait-for-health.sh крутит curl на /health до успеха. В Kubernetes аналог — readinessProbe.

Отдельно приложение должно иметь endpoint /health, возвращающий 200, когда модель загружена.

SSH — способ удалённого доступа к серверу:


ssh user@hostname
ssh -i ~/.ssh/id_ed25519 deploy@ml-prod-01

Ключи в ~/.ssh/, пароли в продакшене часто отключены. После входа — systemctl status, journalctl, деплой новой версии.

Как это выглядит на практике

Деплой новой модели fraud_v3.pkl:

1. MLE копирует артефакт на сервер (scp или CI/CD pipeline).

2. Обновляет Environment=MODEL_PATH=... или symlink current → fraud_v3.pkl.

3. sudo systemctl restart scoring.service

4. curl http://localhost:8080/health{"status": "ok", "model_version": "fraud_v3"}

5. Запись в Confluence runbook: «rollback = symlink на fraud_v2 + restart».

Если сервис падает при старте (битый pickle), Restart=on-failure создаст loop — systemctl status покажет activating (auto-restart), в journalctl — traceback Python.

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

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

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