Бесплатная оценка погрешности и скрытая мощь SA-Solver в ComfyUI: почему адаптивный шаг проиграл, а стохастика победила
Каждый, кто заглядывал в выпадающий список сэмплеров в ComfyUI, видел десятки названий: euler, dpmpp_2m, uni_pc, sa_solver. Большинство пользователей переключают их вслепую, полагаясь на субъективные впечатления.
Между тем, за каждым сэмплером стоит строгая математика численного интегрирования дифференциальных уравнений (ODE и SDE). Мы с соавтором Егором Юзвинским (который обеспечил проект вычислительными мощностями и участвовал в редактуре экспериментов) задались двумя вопросами:
Можно ли в многошаговых схемах диффузии извлекать оценку локальной погрешности с нулевой стоимостью по NFE?
Почему встроенная реализация SA-Solver в ComfyUI выдает отличную геометрию, но зажата в тиски захардкоженных параметров?
В этой статье мы разберем математику схемы «предиктор–корректор» Адамса, раскроем силу стохастики SA-Solver и честно покажем, почему красивые академические гипотезы (вроде адаптивного шага) с треском разбиваются о реалии продакшн-пайплайнов с высоким CFG.
1. Бесплатная погрешность: схема предиктора-корректора
Классический многошаговый метод Адамса–Башфорта–Моултона состоит из двух фаз:
Предиктор (Adams–Bashforth): явный шаг экстраполяции состояния на основе накопленных производных за предыдущие шаги:
Корректор (Adams–Moulton): неявное уточнение состояния с учетом производной в предсказанной точке:
В вычислительной математике норма разности между предсказанным и скорректированным значением:
является асимптотически точной оценкой локальной погрешности усечения (Local Truncation Error).
В обычных задачах ради корректора приходится делать дополнительное вычисление функции . Но в диффузионных моделях эта вычисленная производная всё равно потребуется на следующем шаге как история!
Это означает, что оценка локальной погрешности достается нам абсолютно бесплатно (0 дополнительных вызовов нейросети, 0 NFE).
Мы вывели эту оценку наружу в ноде Trajectory Probe, которая сохраняет траектории, нормы производных, кривизну и погрешность прямо в .safetensors.
2. Главная практическая находка: вызволение SA-Solver
В ядре ComfyUI уже присутствует сэмплер sa_solver (Xue et al., NeurIPS 2023). Его ключевая особенность: он применяет предиктор-корректор Адамса только к слагаемому дрейфа (drift), а диффузионную часть рассчитывает отдельно, укладываясь ровно в 1 NFE на шаг.
Однако в ComfyUI он вызывается так:
# Внутренности ComfyUI:
tau_func = None # Сила стохастики жестко зашита на eta = 1.0 в окне [0.2, 0.8]
Изменить силу стохастики или границы окна через стандартные ноды было физически невозможно.
Мы реализовали ноду Adaptive SA Sampler, которая открывает и границы окна шума. При дефолтных параметрах (eta = 1.0, response = 0.0, окно 0.2–0.8) она побитово воспроизводит оригинальный sa_solver (максимальная разница: ).
Эксперимент: геометрия против микрорельефа
Мы провели замеры на модели Anima (Flow-Matching DiT), разрешение 768×1024, CFG 5.0, планировщик normal, бюджет всего 10 шагов (10 NFE):
Геометрия — RMS отклонение от 100-шагового эталона
eulerпосле 8× пулинга (чем ниже, тем точнее анатомия и крупные формы).Текстура — RMS высокочастотного остатка (сошедшийся эталон SDE на 30 шагах дает
0.3335).
Сэмплер | Геометрия (меньше = лучше) | Текстура (микрорельеф) | Сокращение разрыва до 30 шагов |
|---|---|---|---|
| 0.3677 | 0.1368 | — |
| 0.4016 | 0.1318 | — |
| 0.3516 | 0.2244 | 0% |
| 0.3865 | 0.2503 | 24% |
| 0.4225 | 0.2885 | 59% |
| 0.4541 | 0.2975 | 67% (артефакты) |
Вывод: Благодаря корректору дрейфа стохастический sa_solver дает макро-геометрию лучше, чем детерминированный Euler при том же бюджете, сохраняя при этом на 64% больше микротекстуры.
Рабочий диапазон eta:
При росте с 1.0 до 1.4 мы получаем +0.74 единицы текстуры за единицу потерянной геометрии.
В диапазоне 1.4 → 1.8 коэффициент обмена достигает пика: 1.06. Закрывается 59% разрыва до 30-шагового рендера.
При
наступает обвал курса (0.28): тонкие структуры (ресницы, жилки листьев) начинают разваливаться в шумы.
Оптимальный диапазон: eta = 1.6–1.8.
3. Честные отрицательные результаты (Что НЕ сработало)
В академических статьях редко пишут о неудачах, но в инженерной практике они экономят недели работы:
1. Адаптивный шаг уступил планировщику normal
Мы создали сэмплер с адаптивным шагом (apc_* в режиме budget), который перераспределял временную сетку шагов пропорционально локальной погрешности. Равномерную сетку он обошел с большим отрывом. Но когда мы сравнили его со стандартным эвристическим планировщиком ComfyUI normal… адаптивный сэмплер показал лишь 0.81–0.99× от его точности. Полиномиальные расписания учитывают скорость семантического схлопывания дисперсии латентов, чего не видит локальная ошибка интегрирования ODE.
2. Окно шума расширять бессмысленно
Сдвиг окна шума с 0.2–0.8 на 0.1–0.9 ухудшил геометрию на 20% и дал ровно ноль дополнительной текстуры (0.2244 → 0.2225). Шум на высоких сигмах полностью вымывается последующим интегрированием, а на низких сигмах сети просто не хватает оставшихся шагов, чтобы распутать его в детали.
3. Высокие порядки бесполезны при высоком CFG
При CFG 1.0 методы 4-го порядка бьют Euler в 1.30–1.52 раза. Но на рабочих значениях CFG 5.0 выигрыш падает до 1.01–1.04×, а при CFG 8.0 исчезает вовсе. Ошибка усечения просто тонет в шуме вектора классификаторной экстраполяции.
4. Реальный NFE популярных сэмплеров
Во время профилирования выяснилось, что многие сэмплеры в ComfyUI расходуют совсем не то количество шагов, на которое рассчитывают пользователи. Вот реальные замеры NFE на шаг:
Честные 1.0 NFE:
sa_solver,euler_ancestral,res_multistep_ancestral,dpmpp_3m_sde,er_sde,deis.1.9 NFE (почти вдвое дороже):
heun,seeds_2,dpmpp_sde.3.0 – 6.0 NFE:
res_3s_ode(3.0),dpm_adaptive(3.0),res_5s_ode(5.0),res_6s_ode(6.0).Ловушка для Flow-Matching:
uni_pcжестко зашит на VP/eps (noise / sqrt(1 + sigma²)). На моделях вроде Flux или Anima он выдает колоссальную ошибку (6.86 против 0.63 у Euler).
Как попробовать
Репозиторий оформлен как стандартный custom node:
cd ComfyUI/custom_nodes/
git clone https://github.com/YakovSava/adaptive-step-samplers.git
Никаких сторонних библиотек — только штатные torch, numpy и safetensors.
Для генерации используйте ноду Adaptive SA Sampler со следующими параметрами:
eta: 1.6–1.8;response: 0.0;stochastic_start: 0.2;stochastic_end: 0.8;Планировщик:
normal.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.