- BrainTools - https://www.braintools.ru -

Бесплатная оценка погрешности и скрытая мощь SA-Solver в ComfyUI: почему адаптивный шаг проиграл, а стохастика победила

Введение

Каждый, кто заглядывал в выпадающий список сэмплеров в ComfyUI, видел десятки названий: euler, dpmpp_2m, uni_pc, sa_solver. Большинство пользователей переключают их вслепую, полагаясь на субъективные впечатления [1].

Между тем, за каждым сэмплером стоит строгая математика [2] численного интегрирования дифференциальных уравнений (ODE и SDE). Мы с соавтором Егором Юзвинским (который обеспечил проект вычислительными мощностями и участвовал в редактуре экспериментов) задались двумя вопросами:

  1. Можно ли в многошаговых схемах диффузии извлекать оценку локальной погрешности с нулевой стоимостью по NFE?

  2. Почему встроенная реализация SA-Solver в ComfyUI выдает отличную геометрию, но зажата в тиски захардкоженных параметров?

В этой статье мы разберем математику схемы «предиктор–корректор» Адамса, раскроем силу стохастики SA-Solver и честно покажем, почему красивые академические гипотезы (вроде адаптивного шага) с треском разбиваются о реалии продакшн-пайплайнов с высоким CFG.


1. Бесплатная погрешность: схема предиктора-корректора

Классический многошаговый метод Адамса–Башфорта–Моултона состоит из двух фаз:

  1. Предиктор (Adams–Bashforth): явный шаг экстраполяции состояния на основе накопленных производных за предыдущие шаги:

    hat{x}_{n+1}=x_n + h sum_{j=0}^{k-1} beta_j f(x_{n-j}, t_{n-j})

  2. Корректор (Adams–Moulton): неявное уточнение состояния с учетом производной в предсказанной точке:

    x_{n+1}=x_n + h left( beta^* f(hat{x}_{n+1}, t_{n+1}) + sum_{j=0}^{k-2} beta_j^* f(x_{n-j}, t_{n-j}) right)

В вычислительной математике норма разности между предсказанным и скорректированным значением:

tau_{n+1}=|x_{n+1} - hat{x}_{n+1}|

является асимптотически точной оценкой локальной погрешности усечения (Local Truncation Error).

В обычных задачах ради корректора приходится делать дополнительное вычисление функции f. Но в диффузионных моделях эта вычисленная производная всё равно потребуется на следующем шаге как история!

Это означает, что оценка локальной погрешности достается нам абсолютно бесплатно (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]

Изменить силу стохастики eta или границы окна через стандартные ноды было физически невозможно.

Мы реализовали ноду Adaptive SA Sampler, которая открывает eta и границы окна шума. При дефолтных параметрах (eta = 1.0, response = 0.0, окно 0.2–0.8) она побитово воспроизводит оригинальный sa_solver (максимальная разница: 0.000times 10^0).

Эксперимент: геометрия против микрорельефа

Мы провели замеры на модели Anima (Flow-Matching DiT), разрешение 768×1024, CFG 5.0, планировщик normal, бюджет всего 10 шагов (10 NFE):

  • Геометрия — RMS отклонение от 100-шагового эталона euler после 8× пулинга (чем ниже, тем точнее анатомия и крупные формы).

  • Текстура — RMS высокочастотного остатка (сошедшийся эталон SDE на 30 шагах дает 0.3335).

Сэмплер

Геометрия (меньше = лучше)

Текстура (микрорельеф)

Сокращение разрыва до 30 шагов

euler (ODE)

0.3677

0.1368

—

euler_ancestral (SDE без корректора)

0.4016

0.1318

—

sa_solver (базовый, eta=1.0)

0.3516

0.2244

0%

Adaptive SA Sampler (eta=1.4)

0.3865

0.2503

24%

Adaptive SA Sampler (eta=1.8)

0.4225

0.2885

59%

Adaptive SA Sampler (eta=2.0)

0.4541

0.2975

67% (артефакты)

Вывод: Благодаря корректору дрейфа стохастический sa_solver дает макро-геометрию лучше, чем детерминированный Euler при том же бюджете, сохраняя при этом на 64% больше микротекстуры.

Рабочий диапазон eta:

  • При росте eta с 1.0 до 1.4 мы получаем +0.74 единицы текстуры за единицу потерянной геометрии.

  • В диапазоне 1.4 → 1.8 коэффициент обмена достигает пика: 1.06. Закрывается 59% разрыва до 30-шагового рендера.

  • При eta > 1.8 наступает обвал курса (0.28): тонкие структуры (ресницы, жилки листьев) начинают разваливаться в шумы.

Оптимальный диапазон: eta = 1.6–1.8.


3. Честные отрицательные результаты (Что НЕ сработало)

В академических статьях редко пишут о неудачах, но в инженерной практике они экономят недели работы:

1. Адаптивный шаг уступил планировщику normal

Мы создали сэмплер с адаптивным шагом (apc_* в режиме budget), который перераспределял временную сетку шагов пропорционально локальной погрешности. Равномерную сетку он обошел с большим отрывом. Но когда мы сравнили его со стандартным эвристическим планировщиком ComfyUI normal… адаптивный сэмплер показал лишь 0.81–0.99× от его точности. Полиномиальные расписания учитывают скорость семантического схлопывания дисперсии латентов, чего не видит локальная ошибка [3] интегрирования 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.

Автор: YakovSava

Источник [4]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/37280

URLs in this post:

[1] впечатления: http://www.braintools.ru/article/2012

[2] математика: http://www.braintools.ru/article/7620

[3] ошибка: http://www.braintools.ru/article/4192

[4] Источник: https://habr.com/ru/articles/1097132/?utm_campaign=1097132&utm_source=habrahabr&utm_medium=rss

www.BrainTools.ru

Rambler's Top100