Зачем это нужно
Запустить 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 `
Ключевые директивы:
After / Requires — зависимости (сеть, БД).
User — не запускать от root.
Environment — переменные окружения.
ExecStart — команда запуска.
Restart=on-failure — автоперезапуск при ненулевом exit code.
Управление сервисом:
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:
MLE копирует артефакт на сервер (scp или CI/CD pipeline).
Обновляет
Environment=MODEL_PATH=...или symlinkcurrent → fraud_v3.pkl.sudo systemctl restart scoring.servicecurl http://localhost:8080/health→{"status": "ok", "model_version": "fraud_v3"}Запись в Confluence runbook: «rollback = symlink на fraud_v2 + restart».
Если сервис падает при старте (битый pickle), Restart=on-failure создаст loop — systemctl status покажет activating (auto-restart), в journalctl — traceback Python.
Что сделать после занятия
Напишите unit-файл для учебного Flask/FastAPI приложения.
Добавьте endpoint
/healthв своё приложение.Потренируйтесь: start → status → restart → journalctl (на VM или WSL).