- BrainTools - https://www.braintools.ru -
Каждый, кто заглядывал в выпадающий список сэмплеров в ComfyUI, видел десятки названий: euler, dpmpp_2m, uni_pc, sa_solver. Большинство пользователей переключают их вслепую, полагаясь на субъективные впечатления [1].
Между тем, за каждым сэмплером стоит строгая математика [2] численного интегрирования дифференциальных уравнений (ODE и SDE). Мы с соавтором Егором Юзвинским (который обеспечил проект вычислительными мощностями и участвовал в редактуре экспериментов) задались двумя вопросами:
Можно ли в многошаговых схемах диффузии извлекать оценку локальной погрешности с нулевой стоимостью по NFE?
Почему встроенная реализация SA-Solver в ComfyUI выдает отличную геометрию, но зажата в тиски захардкоженных параметров?
В этой статье мы разберем математику схемы «предиктор–корректор» Адамса, раскроем силу стохастики SA-Solver и честно покажем, почему красивые академические гипотезы (вроде адаптивного шага) с треском разбиваются о реалии продакшн-пайплайнов с высоким CFG.
Классический многошаговый метод Адамса–Башфорта–Моултона состоит из двух фаз:
Предиктор (Adams–Bashforth): явный шаг экстраполяции состояния на основе накопленных производных за предыдущие шаги:
Корректор (Adams–Moulton): неявное уточнение состояния с учетом производной в предсказанной точке:
В вычислительной математике норма разности между предсказанным и скорректированным значением:
является асимптотически точной оценкой локальной погрешности усечения (Local Truncation Error).
В обычных задачах ради корректора приходится делать дополнительное вычисление функции . Но в диффузионных моделях эта вычисленная производная всё равно потребуется на следующем шаге как история!
Это означает, что оценка локальной погрешности достается нам абсолютно бесплатно (0 дополнительных вызовов нейросети, 0 NFE).
Мы вывели эту оценку наружу в ноде Trajectory Probe, которая сохраняет траектории, нормы производных, кривизну и погрешность прямо в .safetensors.
В ядре 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% больше микротекстуры.
При росте с 1.0 до 1.4 мы получаем +0.74 единицы текстуры за единицу потерянной геометрии.
В диапазоне 1.4 → 1.8 коэффициент обмена достигает пика: 1.06. Закрывается 59% разрыва до 30-шагового рендера.
При наступает обвал курса (0.28): тонкие структуры (ресницы, жилки листьев) начинают разваливаться в шумы.
Оптимальный диапазон: eta = 1.6–1.8.
В академических статьях редко пишут о неудачах, но в инженерной практике они экономят недели работы:
Мы создали сэмплер с адаптивным шагом (apc_* в режиме budget), который перераспределял временную сетку шагов пропорционально локальной погрешности. Равномерную сетку он обошел с большим отрывом. Но когда мы сравнили его со стандартным эвристическим планировщиком ComfyUI normal… адаптивный сэмплер показал лишь 0.81–0.99× от его точности. Полиномиальные расписания учитывают скорость семантического схлопывания дисперсии латентов, чего не видит локальная ошибка [3] интегрирования ODE.
Сдвиг окна шума с 0.2–0.8 на 0.1–0.9 ухудшил геометрию на 20% и дал ровно ноль дополнительной текстуры (0.2244 → 0.2225). Шум на высоких сигмах полностью вымывается последующим интегрированием, а на низких сигмах сети просто не хватает оставшихся шагов, чтобы распутать его в детали.
При CFG 1.0 методы 4-го порядка бьют Euler в 1.30–1.52 раза. Но на рабочих значениях CFG 5.0 выигрыш падает до 1.01–1.04×, а при CFG 8.0 исчезает вовсе. Ошибка усечения просто тонет в шуме вектора классификаторной экстраполяции.
Во время профилирования выяснилось, что многие сэмплеры в 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
Нажмите здесь для печати.