Иерархическая диагностика ошибок обучения ML-моделей с ограниченным LLM-арбитражем, OOF-стэкингом и split-conformal абстенцией.
Project description
ml_diag
ml_diag — библиотека автоматизированной диагностики ошибок обучения ML-моделей по метаданным экспериментов и кривым обучения.
Имя на PyPI:
ml-train-diag(pip install ml-train-diag).
Имя для импорта в Python:ml_diag(from ml_diag import ...).
Быстрый старт — 30 секунд
pip install ml-train-diag
from ml_diag import diagnose
result = diagnose("runs/my_exp") # папка с meta.json + history.csv
print(result.label) # 'overfitting'
print(result.confidence) # 0.84
for rec in result.recommendations:
print(rec["action_name"], "—", rec["rationale"])
result.save("results/cases/my_exp") # полный отчёт на диск
Пакет идёт с предобученным каскадом из коробки — никаких отдельных артефактов скачивать не нужно.
Альтернативный вариант — передать meta и history напрямую:
import pandas as pd
from ml_diag import diagnose
history = pd.DataFrame({
"epoch": range(20),
"train_loss": [...],
"val_loss": [...],
"train_acc": [...],
"val_acc": [...],
})
meta = {"run_id": "exp_001", "dataset_name": "cifar10", "model_name": "resnet18",
"framework": "pytorch", "optimizer": "adam", "learning_rate": 1e-3,
"batch_size": 64, "epochs_planned": 20, "seed": 42}
result = diagnose(meta=meta, history=history)
Или собрать run_dir через RunLogger прямо в цикле обучения:
from ml_diag import RunLogger, diagnose
with RunLogger(output_dir="runs/exp_001", meta={...}) as log:
for epoch in range(num_epochs):
log.log_epoch(epoch=epoch, train_loss=..., val_loss=...,
train_acc=..., val_acc=..., lr=...)
log.finalize(status="completed")
result = diagnose("runs/exp_001")
Что возвращает diagnose()
Объект Diagnosis со следующими полями:
| Поле | Тип | Что внутри |
|---|---|---|
label |
str |
Один из 6 классов диагностики |
confidence |
float |
Вероятность в [0, 1] |
alternatives |
list[(str, float)] |
Топ-K альтернативных гипотез |
class_probabilities |
dict[str, float] |
Полное распределение вероятностей |
summary |
str |
Короткое резюме |
explanation |
str |
Развёрнутый разбор |
symptoms |
list[str] |
Конкретные наблюдения из evidence |
recommendations |
list[dict] |
Корректирующие действия из allowlist |
warnings |
list[str] |
Например, «LLM-бэкенд недоступен» |
evidence |
dict |
Структурированное свидетельство |
Методы: result.to_dict(), result.save(out_dir) — записывает 9 файлов отчёта (diagnosis.json, evidence.md, interpretation.md, curves.png, ...).
Диагностические классы
healthyoverfittingunderfittingleakagelabel_noiseinstability
Основные возможности
- извлечение признаков из
meta.jsonиhistory.csv; - плоский (flat) бейзлайн для прямой многоклассовой классификации;
- иерархический каскад Stage 1 / Stage 2 / Stage 3;
- LLM-арбитраж на подмножестве несогласия моделей;
- ограничение выхода LLM-арбитра (hard-snap к одному из двух кандидатов);
- интерпретация результата на основе structured evidence;
- белый список (allowlist) корректирующих действий;
- слой абстенции на основе split-conformal калибровки;
- CLI для обучения, оценки и диагностики;
- Streamlit-демо для визуальной проверки одного запуска;
- поддержка диагностики внешних логированных запусков.
Структура проекта
| Компонент | Назначение |
|---|---|
scenarios/ |
инвентаризация и проверка сценариев |
models/ |
плоский бейзлайн и иерархический каскад |
diagnosis/ |
гибридные резолверы, стэкинг, арбитраж |
evaluation/ |
метрики, сравнение моделей, отчёты |
interpretation/ |
шаблонная и LLM-интерпретация |
actions/ |
белый список корректирующих действий |
logging_sdk/ |
логирование внешних запусков |
ui/ |
Streamlit-демо |
scripts/ |
CLI-команды для запуска пайплайна |
Установка
Из PyPI:
pip install ml-train-diag
С опциональными зависимостями:
pip install "ml-train-diag[ui]" # Streamlit-демо
pip install "ml-train-diag[llm]" # Groq LLM backend
pip install "ml-train-diag[ui,llm]" # всё вместе
Для разработки (включая CLI-скрипты, тесты, линтеры) — клонировать репозиторий:
git clone https://github.com/brewerkka/ml-diag.git
cd ml-diag
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev,ui,llm]"
LLM-интерпретация (опционально)
По умолчанию diagnose() использует детерминированный template-бэкенд — никаких LLM-вызовов, ключей и сетевых обращений. Текст рекомендаций собирается из шаблонов на основе диагноза и evidence.
Если хотите более развёрнутую интерпретацию через LLM, доступны два бэкенда:
Groq Cloud (бесплатный тариф доступен):
pip install "ml-train-diag[llm]"
export GROQ_API_KEY=gsk_... # получить на console.groq.com
result = diagnose(run_dir, backend="auto") # пробует groq → ollama → template
# или
result = diagnose(run_dir, backend="groq")
Ollama (локально, бесплатно):
ollama serve # запустить сервер
ollama pull qwen2.5:7b-instruct
result = diagnose(run_dir, backend="ollama")
Если LLM-бэкенд недоступен (нет ключа, нет SDK, нет сети) — система молча откатывается на template и помещает причину в result.warnings.
Формат входных данных
Один запуск должен содержать:
run_dir/
meta.json
history.csv
meta.json содержит параметры запуска и служебную информацию.
history.csv содержит значения метрик и функции потерь по эпохам.
CLI и Streamlit-демо
CLI-скрипты (scripts/) и Streamlit-интерфейс (ui/app.py) не входят в PyPI-дистрибутив пакета — они доступны только при установке из git-репозитория. Все примеры команд ниже подразумевают именно такую установку.
Диагностика одного запуска
python scripts/run_full_case.py \
--run-dir runs/exp_001 \
--artifacts results/hierarchical/real_8ds_n5_multi \
--backend template
Результат сохраняется в:
results/cases/<run_id>/
diagnosis.json
evidence.json
evidence.md
interpretation.json
interpretation.md
recommendations.json
case_summary.json
case_summary.md
Обучение каскада на корпусе
NAME=real_8ds_n5_multi
CORPUS=data/corpus/$NAME
python scripts/run_hierarchical_train.py \
--corpus $CORPUS \
--out-dir results/hierarchical/$NAME
Оценочный pipeline
bash scripts/run_all.sh
python scripts/aggregate_results.py \
--results-dir results \
--out-md results/aggregate_summary.md \
--out-json results/aggregate_summary.json
Streamlit-демо
streamlit run ui/app.py
Интерфейс поддерживает два режима:
- диагностика запуска из корпуса;
- диагностика внешнего запуска в формате
meta.json+history.csv.
Инварианты проекта
- LLM не является самостоятельным диагностом.
- LLM-арбитр выбирает только между предсказаниями плоского бейзлайна и каскада.
- Корректирующие действия выбираются только из белого списка.
- При недоступности LLM используется шаблонный бэкенд.
- Корпус не изменяется во время диагностики.
- Все основные артефакты сохраняются в версионированном формате.
- OOF-протокол проверяется runtime-assertion на отсутствие утечки.
Статус
- реализован плоский бейзлайн;
- реализован иерархический каскад;
- реализован гибридный резолвер;
- реализован LLM-арбитраж с hard-snap;
- реализован слой интерпретации;
- реализован белый список корректирующих действий;
- реализовано Streamlit-демо;
- реализован SDK для логирования внешних запусков;
- реализованы CLI-скрипты для обучения, оценки и диагностики.
Примечание
Проект реализован в рамках выпускной квалификационной работы Милены Пивоваровой, НИУ ВШЭ.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ml_train_diag-0.1.0.tar.gz.
File metadata
- Download URL: ml_train_diag-0.1.0.tar.gz
- Upload date:
- Size: 545.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f825fdf893748dbeb1543985f0e0c8f12a2b77dbf4e395b93f386d8324ecd65
|
|
| MD5 |
179bb5a5486e2b31a0b93094480aea65
|
|
| BLAKE2b-256 |
e3606d061f3bff6d4ef8471e6a7b7ebc1acc7dda2d34657ede4741c810c99373
|
File details
Details for the file ml_train_diag-0.1.0-py3-none-any.whl.
File metadata
- Download URL: ml_train_diag-0.1.0-py3-none-any.whl
- Upload date:
- Size: 575.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc0a2fdbb4d54df373c526268d49ee1acd9c2c8427085d9deca45a0e3c4f100c
|
|
| MD5 |
5ab8f21add3e5141426a3a875a42af54
|
|
| BLAKE2b-256 |
b3df05aab2303fe5958b4a9d5fe435584b0d83c3f7fe8590b18fe26d709c3cd6
|