Checkpoints & Debugging — как находить последний доказуемо корректный этап
Большой workflow нельзя диагностировать по финальной картинке. Надёжная отладка строится как лестница checkpoints: после каждого смыслового модуля должен существовать наблюдаемый результат, позволяющий доказать, где именно pipeline перестал быть корректным.
Последний правильный preview задаёт следующую проверку
Если этап N корректен, не возвращайся к prompt: проверяй соединение и параметры этапа N+1.
Если модуль нельзя наблюдать отдельно, его трудно отлаживать
PreviewImage, MaskPreview, comparer, text/json preview и save probes — это не декоративные элементы. Они создают observability: возможность проверить состояние данных до того, как они смешались со следующей системой.
Чем длиннее цепочка без checkpoint, тем больше потенциальных причин одной и той же финальной ошибки.
Главный вопрос отладки: где последний правильный результат?
Не начинай с вопроса «почему финал плохой?». Начинай с конца и двигайся upstream до последнего checkpoint, который выглядит и структурно ведёт себя правильно.
Следующий после него stage становится первым подозреваемым. Так search space сокращается с сотен нод до одной ветки.
Разным типам данных нужны разные probes
| Data | Checkpoint | Что проверяем |
|---|---|---|
| IMAGE | PreviewImage / comparer | pixels, composition, color, geometry |
| MASK | MaskPreview | silhouette, polarity, holes, bounds |
| BBOX / JSON | text/json preview | coordinates, count, labels |
| STRING | text preview | собранный prompt / control text |
| LATENT | обычно decode-only debug path | визуальный результат после VAE Decode |
| OUTPUT FILE | SaveImage + actual file check | действительно ли delivery path сработал |
Проверять нужно в порядке зависимостей
Для ошибки включай минимальный набор модулей
BASE CONFIG должен позволять выключить всё, что не требуется для воспроизведения проблемы. Если тестируется SAM2 mask, не нужно одновременно считать main FLUX и upscale.
Минимальный runtime ускоряет iteration и снижает вероятность, что побочный branch скрывает настоящий источник проблемы.
Сначала классифицируй ошибку, потом меняй параметры
| Класс | Примеры | Первое действие |
|---|---|---|
| Dependency | missing node / model / loader | Проверить manifest и paths |
| Type contract | IMAGE vs LATENT / missing CONDITIONING | Проверить socket types |
| Spatial contract | mask shift / bbox mismatch | Проверить W×H и coordinate space |
| Batch contract | index out of bounds / cardinality mismatch | Проверить batch counts |
| Routing | не тот source / ветка не влияет | Проверить selector + bypass |
| Generation quality | анатомия / материал / prompt mismatch | Только после технического preflight менять AI parameters |
Не лечить topology параметрами генерации
Если маска смещена из-за resize, изменение denoise не поможет. Если selector выбрал другой source, prompt не исправит маршрут. Если CLIP input отсутствует, CFG не имеет значения.
Production debugging начинается с architecture/data contracts и только после этого переходит к generation tuning.
Для повторяемой диагностики сохраняй состояние теста
- Какой input использован.
- Какие modules включены в BASE CONFIG.
- Effective selector values.
- Seed и sampling parameters.
- Размеры и batch на проблемном участке.
- Последний корректный checkpoint.
- Точный error message / node ID.
Практика: сломать ветку специально и локализовать ошибку
Возьми небольшой standalone workflow с тремя checkpoints. Осознанно измени один contract — например, selector source или mask size. Не исправляй сразу. Пройди debug ladder и зафиксируй, на каком checkpoint впервые появляется расхождение.
Критерий готовности
Ученик освоил debugging, когда может назвать последний корректный stage и класс ошибки до того, как начинает менять prompt или sampler.