У веб‑интерфей­сов к диф­фузи­онным ней­рон­кам вро­де Stable Diffusion есть огромная мас­са парамет­ров, движ­ков и пол­зунков, меняя зна­чения которых мож­но добить­ся изме­нения кар­тинки при про­чих рав­ных усло­виях. Сегод­ня погово­рим о выборе сем­пле­ров и шедуле­ров.

При­нято счи­тать, что если выбор сем­пле­ра (а тем более — шедуле­ра) и вли­яет на резуль­тат генера­ции, то, во‑пер­вых, вли­яние это минималь­но, а во‑вто­рых, дос­таточ­ное количес­тво шагов нивели­рует и без того неболь­шую раз­ницу меж­ду финаль­ными изоб­ражени­ями. Это глу­бочай­шее заб­лужде­ние, что я и намерен про­демонс­три­ровать в сегод­няшней статье.

Семплер и шедулер: что это такое

В кон­тек­сте генера­тив­ного ИИ, осо­бен­но при работе с диф­фузи­онны­ми моделя­ми, тер­мины sampler и scheduler игра­ют клю­чевую роль в про­цес­се генера­ции изоб­ражений.

Как соз­дать скуль­пту­ру? Взять глы­бу мра­мора и отсечь все лиш­нее. Имен­но по это­му прин­ципу работа­ют диф­фузи­онные модели искусс­твен­ного интеллек­та, к которым отно­сит­ся и семей­ство Stable Diffusion. Глы­бой мра­мора здесь выс­тупа­ет сге­нери­рован­ный моделью шум, а инс­тру­мен­том, который отсе­кает лиш­нее, — сем­плер. Таким обра­зом, вмес­то соз­дания изоб­ражения с нуля кар­тинка пос­тепен­но вос­ста­нав­лива­ется из шума, а сем­плер опре­деля­ет, как имен­но будет про­исхо­дить этот про­цесс.

Сем­пле­ры управля­ют тем, как на каж­дом шаге генера­ции выбира­ется и кор­ректи­рует­ся шумовое рас­пре­деле­ние. Раз­ные сем­пле­ры дают раз­личные резуль­таты. Гру­бо говоря, из полена мож­но вырубить Бурати­но как ста­мес­кой, так и топором; резуль­тат будет отли­чать­ся.

Ка­кие‑то сем­пле­ры опти­мизи­рова­ны на ско­рость (условный «топор») и могут быс­трее вос­ста­нав­ливать изоб­ражение (быс­трее кон­верги­ровать) — как пра­вило, в ущерб качес­тву кар­тинки или раз­нооб­разию резуль­татов. Дру­гие могут давать более детали­зиро­ван­ные («ста­мес­ка») или, наобо­рот, упро­щен­ные изоб­ражения. Какие‑то сем­пле­ры тре­буют мень­шего чис­ла шагов (но каж­дый шаг занима­ет боль­ше вре­мени), а какие‑то — боль­шего, но изме­нения кар­тинки на каж­дом шаге диф­фузии будут не столь велики.

Для некото­рых видов сем­пле­ров уве­личе­ние чис­ла шагов при­ведет в ито­ге к очень похожим резуль­татам, для дру­гих резуль­тат будет разитель­но отли­чать­ся. Имен­но по этой при­чине рекомен­дации вро­де «исполь­зуйте 20–30 шагов» лишены смыс­ла, если не ука­зан сем­плер, для которо­го рекомен­дует­ся это чис­ло шагов.

Сем­пле­ры быва­ют схо­дящи­еся (кон­верген­тные) и нес­ходящи­еся. При исполь­зовании схо­дяще­гося сем­пле­ра кар­тинки, сге­нери­рован­ные с опре­делен­ным чис­лом шагов, перес­тают отли­чать­ся от изоб­ражений, сге­нери­рован­ных с теми же нас­трой­ками, но боль­шим чис­лом шагов. Нес­ходящи­еся сем­пле­ры будут про­дол­жать выдавать вари­ации изоб­ражений при исполь­зовании сколь угод­но боль­шого чис­ла шагов. Свои осо­бен­ности при­мене­ния есть у обо­их типов сем­пле­ров.

Ше­дулер (scheduler) — это механизм, ответс­твен­ный за динами­чес­кое изме­нение ряда парамет­ров на каж­дом шаге генера­ции. Он опре­деля­ет, как на каж­дом шаге изме­няют­ся такие парамет­ры, как уро­вень шума или шаг обу­чения. В каком‑то смыс­ле мож­но ска­зать, что шедулер зада­ет ритм генера­ции (гру­бо говоря, «спер­ва работа­ем топором, потом берем ста­мес­ку, пос­тепен­но умень­шая ее раз­мер»), но это было бы силь­ным упро­щени­ем.

Те­перь перей­дем к кон­крет­ным типам сем­пле­ров.

Все иллюс­тра­ции сге­нери­рова­ны моделью tangbohuKalosXl_vx в раз­решении 1024 на 1024 с пос­леду­ющим удво­ением раз­решения в Hires Fix. Исполь­зовал­ся фик­сирован­ный сид 4001446319, CFG = 7. Тек­сто­вый зап­рос:

simple watercolor painting of a child girl wearing a hanfu dress playing with a kitten, with pagoda and foggy mountains in distant background

Для тес­тирова­ния сем­пле­ров исполь­зовал­ся фик­сирован­ный шедулер Align Your Steps (AYS). Тес­тирова­ние раз­личных шедуле­ров про­води­лось с фик­сирован­ным сем­пле­ром Эйле­ра. Целью тес­тирова­ния была демонс­тра­ция того, как выб­ранный сем­плер и шедулер может вли­ять не толь­ко на ком­позицию, но и на стиль изоб­ражения.

Семплеры

Устаревшие семплеры

Сем­пле­ры, в наз­вании которых есть DDIM, DDPM и PLMS, появи­лись на ран­ней ста­дии раз­вития генера­тив­ных моделей; DDIM и PLMS вош­ли еще в репози­торий Latent Diffusion. Поль­зовать­ся ими сей­час бес­смыс­ленно: так, для кон­верген­ции с исполь­зовани­ем сем­пле­ра DDIM тре­бует­ся поряд­ка тысячи шагов, а у DDPM и PLMS нет каких‑либо зри­мых пре­иму­ществ перед более прос­тыми (и нам­ного более быс­тры­ми) сем­пле­рами из чис­ла опи­сан­ных ниже.

info

Ес­ли ты решишь поэк­спе­римен­тировать с DDIM, то исполь­зуй его в связ­ке с сем­пле­ром под наз­вани­ем ddim_uniform или DDIM (зависит от исполь­зуемо­го веб‑интерфей­са).

Боль­шая часть сов­ремен­ных сем­пле­ров (и ряд шедуле­ров — в час­тнос­ти, Karras) были опи­саны в репози­тории k-diffusion, опуб­ликован­ном Катери­ной Кро­усон (crowsonkb). О них мы погово­рим более под­робно.

Обычные дифференциальные уравнения: семплеры класса ODE

Здесь все прос­то: эти сем­пле­ры все­го лишь реша­ют сис­тему диф­ферен­циаль­ных урав­нений. Самый извес­тный из них — сем­плер, исполь­зующий метод Эйле­ра (Euler), раз­работан­ный в... 1768 году, задол­го до воз­никно­вения компь­юте­ров. Если ты инте­ресу­ешь­ся матема­тикой, то фор­мулы мож­но под­смот­реть в Ви­кипе­дии.

Ме­тод Эйле­ра счи­тает­ся прос­тей­шим из дос­тупных алго­рит­мов. Он не самый быс­трый, не самый точ­ный и не самый кре­атив­ный, но выда­ет ста­биль­ный резуль­тат, и его под­держи­вает боль­шинс­тво моделей, вклю­чая Flux.

К клас­су ODE, кро­ме метода Эйле­ра, отно­сят­ся Heun — более точ­ная, но более мед­ленная вер­сия алго­рит­ма — и LMS (Linear multi-step method), который так­же теоре­тичес­ки может выдавать более точ­ный резуль­тат.

Об­рати вни­мание, нас­коль­ко резуль­тат работы Heun напоми­нает резуль­таты Euler.

Все эти сем­пле­ры отно­сят­ся к схо­дящим­ся (кон­верген­тным); изоб­ражения, сге­нери­рован­ные с чис­лом шагов, пре­выша­ющим опре­делен­ный порог, будут прак­тичес­ки неот­личимы, поэто­му даль­нейшее уве­личе­ние чис­ла шагов для это­го клас­са алго­рит­мов лишено смыс­ла.

Семплеры класса ancestral

Вы­ше я при­вел скрин­шот, на котором перечис­лены дос­тупные в WebUI ReForge сем­пле­ры. Обра­ти вни­мание: наз­вания некото­рых из них закан­чива­ются на «a» (как, нап­ример, выб­ранный на скрин­шоте сем­плер Эйле­ра — клас­сичес­кий вари­ант, который под­держи­вает боль­шинс­тво моделей).

Та­кие сем­пле­ры добав­ляют сто­хас­тичес­кий (слу­чай­ный) эле­мент на каж­дом шаге генера­ции. Каж­дый сле­дующий шаг в генера­ции изоб­ражения добав­ляет неболь­шое количес­тво слу­чай­ного шума, что поз­воля­ет как раз­нооб­разить резуль­тат, так и улуч­шить точ­ность. Наз­вание про­исхо­дит от тер­мина ancestral sampling («нас­леду­емый сем­плинг»), где каж­дое сле­дующее сос­тояние «нас­леду­ется» от пре­дыду­щего с добав­лени­ем шума.

Лег­ко заметить, что сем­пле­ры это­го клас­са не явля­ются схо­дящи­мися (кон­верген­тны­ми). Уве­личе­ние чис­ла шагов с опре­делен­ного момен­та не при­водит к улуч­шению кар­тинки, а лишь изме­няет мел­кие детали. С этим попыта­лись спра­вить­ся раз­работ­чики сем­пле­ров клас­са SDE.

DPM, DPM++ и их производные

Сем­пле­ры клас­сов DPM (Diffusion Probabilistic Model solver) и DPM++ (улуч­шенная вер­сия DPM) были раз­работа­ны для повыше­ния качес­тва и детали­зации изоб­ражений за мень­шее количес­тво шагов. В базовой вер­сии DPM (без плю­сов) про­цесс диф­фузии раз­бит на мно­жес­тво мел­ких шагов, что обес­печива­ет высокую точ­ность генера­ции за счет высоко­го количес­тва ите­раций. DPM++ исполь­зует методы более высоко­го поряд­ка, что поз­воля­ет сво­дить изоб­ражение с мень­шим количес­твом шагов без ухуд­шения резуль­татов.

Рас­шифро­вать наз­вания сем­пле­ров прос­то (понять — слож­нее). Так, наз­вание DPM++ 3M SDE рас­шифро­выва­ется сле­дующим обра­зом:

DPM++ 2S a рас­шифро­выва­ется так:

Ес­ли срав­нивать раз­ные вари­анты DPM++ меж­ду собой, то ста­нет замет­но, что DPM++ SDE работа­ет вдвое мед­леннее, чем DPM++ 2M SDE или DPM++ 3M SDE, но и тре­бует вдвое мень­шего чис­ла шагов для схож­дения кар­тинки. Дос­тоинс­тво это или недос­таток — зависит от сце­нария исполь­зования. В боль­шинс­тве генера­ций, исполь­зующих повыше­ние раз­решения методом Hires Fix и пос­леду­ющую детали­зацию в ADetailer/uddetailer, удоб­нее исполь­зовать более быс­трые и корот­кие шаги (DPM++ 3M SDE).

Сем­пле­ры DPM++ дают более детали­зиро­ван­ное по срав­нению с Euler и Euler a изоб­ражение. Это каса­ется как тек­стур (нап­ример, тек­стур тка­ни и кожи), так и мно­жес­тва мел­ких деталей. Такая детали­зация может работать как в плюс, так и в минус. Сем­пле­ры DPM++ рекомен­дуют исполь­зовать при генера­ции рез­ких фоторе­алис­тичных изоб­ражений, в то вре­мя как Euler луч­ше под­ходит для генера­ции более «мяг­ких» фотог­рафий, а так­же изоб­ражений в сти­ле 3D, 2,5D и ани­ме.

При­мер: работа сем­пле­ра треть­его поряд­ка DPM++ 3M SDE в срав­нении с DPM++ 2S a.

SDE: щепотка случайности

Сем­пле­ры, в наз­вании которых есть SDE, осно­ваны на сто­хас­тичес­ких диф­ферен­циаль­ных урав­нени­ях (SDE). Алго­рит­мы SDE добав­ляют шум на каж­дом шаге генера­ции, но, в отли­чие от сем­пле­ров ancestral, этот шум не пол­ностью слу­чай­ный, а вычис­ляет­ся на осно­ве сис­темы урав­нений.

Та­ким обра­зом, сем­пле­ры мож­но условно раз­делить по типу шума, добав­ляемо­го на каж­дом шаге генера­ции. Схо­дящи­еся (кон­верген­тные) сем­пле­ры шум не добав­ляют. Сем­пле­ры клас­са ancestral вво­дят слу­чай­ный шум на каж­дом шаге генера­ции. В сем­пле­рах SDE шум псев­дослу­чай­ный; он опре­деля­ется диф­ферен­циаль­ными урав­нени­ями, что дела­ет генера­цию более пред­ска­зуемой по срав­нению с сем­пле­рами ancestral, но менее пред­ска­зуемой по срав­нению с кон­верген­тны­ми сем­пле­рами.

На прак­тике сем­пле­ры клас­са SDE не явля­ются кон­верген­тны­ми; изме­нение чис­ла шагов при про­чих рав­ных усло­виях может серь­езно изме­нить ком­позицию ито­гово­го изоб­ражения. Пос­мотри, как меня­ется кар­тинка, сге­нери­рован­ная сем­пле­ром DPM++ SDE с 40 и 80 шагами (все осталь­ные парамет­ры иден­тичны).

Прак­тичес­кий вывод: если кар­тинка, сге­нери­рован­ная одним из таких сем­пле­ров, тебя в целом устра­ивает, но есть какие‑то мел­кие огре­хи, поп­робуй нем­ного уве­личить или умень­шить чис­ло шагов. Зачас­тую ты получишь похожую кар­тинку, но уже без дефек­та.

Специализированные семплеры

С появ­лени­ем тех­нологий уско­рен­ной генера­ции — таких как LCM, Turbo, Lightning, Hyper, Flash, TCD, DMD2 — воз­никла необ­ходимость в спе­циали­зиро­ван­ных сем­пле­рах. С обыч­ными нас­трой­ками такие модели могут не работать вооб­ще или работать некор­рек­тно. Так, модель LCM тре­бует исполь­зовать одно­имен­ный сем­плер, модели Turbo про­екти­рова­лись для работы с одно­имен­ным шедуле­ром, тех­нология Lightning пред­полага­ет исполь­зование шедуле­ра SGM Uniform. Более сов­ремен­ные вер­сии уско­рен­ных моделей, как пра­вило, не тре­буют исполь­зования спе­цифи­чес­ких ком­бинаций сем­пле­ра и шедуле­ра.

Впро­чем, раз­работ­чики ремик­сов уже научи­лись час­тично обхо­дить огра­ниче­ния, и даже такие модели ста­ло воз­можным исполь­зовать с при­выч­ными ком­бинаци­ями сем­пле­ра и шедуле­ра.

Особ­няком сто­ят некото­рые спе­циали­зиро­ван­ные модели. Так, модель CosXL, которая в рам­ках архи­тек­туры SDXL пред­лага­ет рас­ширен­ный динами­чес­кий диапа­зон и глу­бокий чер­ный цвет, тре­бует исполь­зовать Cosine-Continuous EDM VPred (в WebUI ReForge под­клю­чает­ся авто­мати­чес­ки при заг­рузке модели CosXL; в Comfy нуж­но доус­тановить ноду ModelSamplingContinuousEDM), а модель Playground 2.5 тре­бует безаль­тер­натив­ного исполь­зования EDM (под­держи­вает­ся на сегод­ня толь­ко в Comfy/SwarmUI). Эти вещи не отно­сят­ся к стан­дар­тно­му выбору сем­пле­ра и шедуле­ра; вмес­то это­го в новой вер­сии WebUI Forge нуж­но исполь­зовать рас­ширение Advanced Model Sampling.

Лучшее — враг хорошего?

Но­вые сем­пле­ры и шедуле­ры появ­ляют­ся пос­тоян­но. Их раз­работ­чики реша­ют самые раз­ные задачи. В чис­ле улуч­шений могут быть как повышен­ная ско­рость генера­ции (на самом деле — генера­ция кар­тинки за мень­шее чис­ло шагов, но вов­се не обя­затель­но за мень­шее вре­мя), так и более точ­ный резуль­тат с мень­шим количес­твом бра­ка (такое обе­щали раз­работ­чики шедуле­ра Align Your Steps; о нем мы еще погово­рим в соот­ветс­тву­ющем раз­деле).

Нас­коль­ко это работа­ет в дей­стви­тель­нос­ти? По‑раз­ному. Так, раз­работ­чики сем­пле­ра UniPC обе­щали мно­го полез­ных вещей, но про­вер­ку реаль­ностью алго­ритм не про­шел: он дос­тупен и под­держи­вает­ся в боль­шинс­тве моделей, но резуль­таты, хоть они и отли­чают­ся от работы дру­гих алго­рит­мов, нель­зя с уве­рен­ностью наз­вать «луч­шими».

Сем­плер Restart, инте­рес­ный тем, что с опре­делен­ной пери­одич­ностью «отка­тыва­ет» генера­цию на нес­коль­ко шагов назад, дол­жен был исправ­лять неболь­шие огре­хи отри­сов­ки мел­ких деталей. По ско­рос­ти работы этот сем­плер похож на DPM++ SDE, по точ­ности резуль­тата, пожалуй, его пре­вос­ходит, пред­лагая при этом мак­сималь­но высокую в срав­нении с семей­ством DPM++ детали­зацию.

Restart — уни­вер­саль­ный сем­плер; его мож­но исполь­зовать для соз­дания как фоторе­алис­тичных, так и рисован­ных изоб­ражений. Его при­мене­ние в ADetailer может поз­волить испра­вить мел­кие дефек­ты изоб­ражения, которые в недос­таточ­ной сте­пени кор­ректи­руют­ся дру­гими сем­пле­рами.

Чрез­вычай­но инте­рес­ны вари­ации метода Эйле­ра — сем­пле­ры Euler Smea Dy и Euler Negative.

Сем­пле­ры, в наз­вании которых есть сло­во Negative, в про­цес­се генера­ции изоб­ражения учи­тыва­ют отри­цатель­ные зна­чения гра­диен­тов, что в теории поз­воля­ет улуч­шить качес­тво конеч­ного изоб­ражения.

Ни­же — при­мер генера­ции Euler Negative (шедулер AYS). Обра­ти вни­мание на стиль изоб­ражения; он замет­но отли­чает­ся от работы всех дру­гих сем­пле­ров.

Уни­каль­ную нишу занима­ет сем­плер Euler Smea Dy, исполь­зующий геомет­ричес­кие методы навига­ции в трех­мерном прос­транс­тве для приб­лижения к исходно­му изоб­ражению. Осо­бен­ность это­го сем­пле­ра в том, что он может зна­читель­но умень­шать струк­турные иска­жения и проб­лемы с конеч­ностя­ми (да‑да, всё те же мно­гос­тра­даль­ные паль­цы рук). Увы, пол­ностью решить проб­лему с руками в рам­ках архи­тек­туры SDXL пока не уда­лось никому, но этот сем­плер дей­стви­тель­но улуч­шает качес­тво про­рисов­ки рук по срав­нению с ана­лога­ми.

В то же вре­мя — и это лег­ко чита­ется меж­ду строк даже в «рек­ламном прос­пекте» раз­работ­чиков — эти улуч­шения дос­тига­ются за счет более плав­ных линий и гра­диен­тов, упро­щения кар­тинки и сни­жения мик­рокон­трас­та. Если исполь­зовать Euler Smea Dy для генера­ции фоторе­алис­тично­го изоб­ражения, то акцент будет сдви­нут мак­сималь­но в сто­рону фотог­рафии с софт‑эффектом. А вот ани­ме этот сем­плер рису­ет отлично: плав­ные линии и гра­диен­ты — это в целом имен­но то, что надо. Таким обра­зом, я могу рекомен­довать этот сем­плер для сле­дующих целей:

В про­цес­се тес­тирова­ния я обна­ружил инте­рес­ную осо­бен­ность сем­пле­ров клас­са Dy (в час­тнос­ти, Euler Smea Dy). Они, сог­ласно докумен­тации, работа­ют, делая выбор­ку на понижен­ном раз­решении (то есть раз­мер кар­тинки «втис­кива­ется» в «зону ком­форта» модели). Поэто­му сем­плер Euler Smea Dy мож­но исполь­зовать для получе­ния изоб­ражения в более высоком по срав­нению со стан­дартом раз­решении. Мне уда­лось добить­ся ста­биль­но высоко­го качес­тва генера­ции в раз­решении 1024 на 1536 точек, что доволь­но далеко за пре­дела­ми стан­дар­тных воз­можнос­тей SDXL. Прав­да, при даль­нейшем повыше­нии раз­решения фун­кци­ей Hires.fix (нап­ример, в 1,4 раза) трюк уже не работа­ет, и в качес­тве Hires sampling method теперь нуж­но уста­новить обыч­ный Euler. С исполь­зовани­ем этой ком­бинации (Euler Smea Dy для генера­ции и Euler для повыше­ния раз­решения) на выходе — деталь­ная и чис­тая кар­тинка.

Об­рати вни­мание: Euler Smea Dy отно­сит­ся к агрессив­ным сем­пле­рам. При его исполь­зовании в Hires Fix и ADetailer тебе, воз­можно, при­дет­ся серь­езно сни­зить зна­чение Denoise; в про­тив­ном слу­чае могут про­явить­ся нежела­тель­ные мутации.

Ни­же — при­мер Euler Smea Dy. Обра­ти вни­мание, нас­коль­ко про­ще ста­ла кар­тинка.

А вот срав­нение (из ре­пози­тория).

www

Под­робнее об этих сем­пле­рах — в ре­пози­тории Koishi-Star.

Шедулеры

По­мимо сем­пле­ра, ты можешь выб­рать и шедулер. Зна­чение Automatic озна­чает выбор наибо­лее под­ходяще­го (про­писан­ного в фай­ле sd_samplers_kdiffusion.py) шедуле­ра для кон­крет­ного сем­пле­ра. Так, для сем­пле­ров DPM++ 2M, DPM++ SDE, DPM++ 2M SDE, DPM++ 2S a, DPM2, Restart опти­маль­ным счи­тает­ся шедулер Karras; для DPM++ 3M SDE — Exponential. Для осталь­ных сем­пле­ров (Euler, Euler a, LCM и так далее) шедулер по умол­чанию не про­писан и широкой пуб­лике не­известен; веро­ятно, исполь­зует­ся Uniform.

Uniform: отправная точка

При исполь­зовании шедуле­ра Uniform плот­ность шагов деной­зин­га (обратной диф­фузии) рав­номер­на по всей вре­мен­ной шка­ле генера­ции. Каж­дый шаг деной­зин­га получа­ет оди­нако­вый вес, и про­цесс генера­ции шума или его уда­ления на каж­дом шаге про­исхо­дит с пос­тоян­ной ско­ростью, без уче­та динами­ки изме­нения деталей изоб­ражения.

Uniform — самый прос­той метод; в боль­шинс­тве слу­чаев аль­тер­натив­ные шедуле­ры его пре­вос­ходят. Если ты все же решишь его исполь­зовать, то в WebUI он дос­тупен с обоз­начени­ем Normal.

Ва­риация это­го шедуле­ра — SGM Uniform (Stochastic Gradient Method, сто­хас­тичес­кий метод гра­диен­тно­го спус­ка). В час­тнос­ти, поль­зовате­ли сооб­щают, что сем­плер Euler в ком­бинации с шедуле­ром SGM Uniform и DPM++ 2M SGM Uniform луч­ше все­го работа­ет с моделью SD3 Medium.

На­конец, зак­рою этот раз­дел опи­сани­ем шедуле­ра Simple. Его соз­дал раз­работ­чик ComfyUI в качес­тве раз­вле­чения. Он хотел добить­ся прос­тей­шего решения, при котором сох­ранялась бы работос­пособ­ность. В этом сем­пле­ре плот­ность шагов зависит исклю­читель­но от номера шага.

Karras

Ше­дулер Karras — один из пер­вых алго­рит­мов, исполь­зующих нелиней­ное рас­пре­деле­ние шагов. Это поз­волило опти­мизи­ровать про­цесс генера­ции изоб­ражений: улуч­шить качес­тво кар­тинки и умень­шить количес­тво тре­буемых для ее генера­ции шагов. Имен­но этот шедулер стал стан­дартом де‑фак­то бла­года­ря отсутс­твию ярко выражен­ных осо­бен­ностей. Он хорошо работа­ет со сред­ним чис­лом шагов и отлично — с боль­шим (как мы пом­ним, дос­таточ­ность чис­ла шагов опре­деля­ется в пер­вую оче­редь сем­пле­ром).

Экспоненциальный шедулер

В работе Fast Sampling of Diffusion Models with Exponential Integrator опи­сано исполь­зование экспо­нен­циаль­ного шедуле­ра. В экспо­нен­циаль­ном шедуле­ре плот­ность шагов рас­пре­деля­ется по экспо­нен­те и каж­дая сле­дующая ите­рация экспо­нен­циаль­но умень­шает величи­ну шага: в начале про­цес­са шаги изме­няют­ся очень быс­тро, но по мере прод­вижения изме­нение плот­ности шагов замед­ляет­ся.

В шедуле­ре Polyexponential ком­биниру­ется нес­коль­ко экспо­нен­циаль­ных фун­кций для получе­ния раз­ных про­филей изме­нения шагов. Exponential про­ще — с фик­сирован­ной экспо­нен­циаль­ной ско­ростью умень­шения шагов; Polyexponential потен­циаль­но может быть более точ­ным.

Ше­дуле­ры Karras и Exponential выда­ют похожий резуль­тат. Изна­чаль­но исполь­зовать Karras пред­полага­лось с сем­пле­рами семей­ства DPM++, за исклю­чени­ем DPM++ 3M SDE, для которо­го пред­лагал­ся шедулер Exponential. Сей­час же у нас есть воз­можность исполь­зовать любые шедуле­ры в связ­ке с любыми сем­пле­рами, даже самыми ста­рыми, чем мы и вос­поль­зуем­ся.

Ни­же — срав­нение генера­ции Euler a шедуле­ром Karras и Exponential.

Align Your Steps

Ме­тод был пред­ложен раз­работ­чиками Nvidia в июле 2024 года. В опуб­ликован­ном ис­сле­дова­нии при­водят­ся мно­гочис­ленные срав­нения работы шедуле­ра на раз­ных моделях. Раз­работ­чики говорят о луч­шем качес­тве кар­тинки и более точ­ной детали­зации при мень­шем чис­ле шагов генера­ции в срав­нении с дру­гими шедуле­рами.

На прак­тике наб­люда­ются ста­тис­тичес­ки зна­чимые улуч­шения в качес­тве кар­тинки (то есть необя­затель­но в этом кон­крет­ном изоб­ражении — но при генера­ции пач­ки из десяти штук с этим шедуле­ром количес­тво бра­ка, как пра­вило, будет мень­ше). Наибо­лее явно пре­иму­щес­тва AYS про­явля­ются на неболь­шом чис­ле шагов (до 40 шагов при исполь­зовании сем­пле­ра Euler). Даль­нейшее уве­личе­ние чис­ла шагов нивели­рует пре­иму­щес­тва метода. Тем не менее его мож­но рекомен­довать в качес­тве опции по умол­чанию, если исполь­зуемая модель не тре­бует иных нас­тро­ек.

info

При исполь­зовании Align Your Steps рекомен­дует­ся вклю­чить опцию Skip Early CFG (в WebUI она называ­ется Ignore negative prompt during early sampling), что улуч­шает качес­тво генера­ции. Дос­таточ­но про­пус­тить CFG толь­ко на пер­вом шаге, уста­новив зна­чение пол­зунка в 0,05 (или дру­гое зна­чение в зависи­мос­ти от чис­ла шагов).

При­меров здесь не будет: все изоб­ражения в этой статье (за исклю­чени­ем тех, на которых демонс­три­руют­ся раз­личия меж­ду шедуле­рами) сге­нери­рова­ны с исполь­зовани­ем AYS.

Beta

Beta — еще один инно­ваци­онный шедулер, пред­став­ленный в июле 2024 года ко­рей­ски­ми раз­работ­чиками. Если прак­тичес­ки все тра­дици­онные шедуле­ры исполь­зуют более круп­ные шаги в начале генера­ции с пос­леду­ющим умень­шени­ем шага (умень­шение шагов как раз и опи­сыва­ется той или иной матема­тичес­кой фун­кци­ей), то в методе Beta при­меня­ется дру­гой спо­соб рас­пре­деле­ния плот­ности шагов.

По заяв­лению раз­работ­чиков, наибо­лее важ­ны ран­ние (круп­ные детали) и поз­дние (мел­кие, высоко­час­тотные детали) эта­пы генера­ции изоб­ражения. Соот­ветс­твен­но, шедулер Beta фокуси­рует вычис­литель­ные ресур­сы на пер­вых и пос­ледних шагах, что дол­жно, с одной сто­роны, сти­мули­ровать более точ­ное сле­дова­ние зап­росу (ран­ние эта­пы, общая ком­позиция и круп­ные детали), а с дру­гой — умень­шить вли­яние типич­ных для Stable Diffusion проб­лем с мел­кими деталя­ми (прес­ловутые паль­цы рук).

Та­ким обра­зом, шедулер Beta не пред­назна­чен для уско­рения генера­ции, но хорошо работа­ет при отно­ситель­но боль­шом чис­ле шагов.

Об­рати вни­мание: Beta — чрез­вычай­но агрессив­ный шедулер. При его исполь­зовании в Hires Fix и ADetailer тебе необ­ходимо серь­езно сни­зить зна­чения Denoise, а луч­ше — не исполь­зовать Beta в этих сце­нари­ях вов­се (бла­го в обо­их слу­чаях мож­но сво­бод­но ука­зать аль­тер­натив­ную связ­ку сем­пле­ра и шедуле­ра).

Beta хорошо под­ходит к клас­сичес­ким сем­пле­рам. Вот при­мер работы Beta сов­мес­тно с сем­пле­ром Euler a.

Ес­ли же ты попыта­ешь­ся исполь­зовать связ­ку из агрессив­ного сем­пле­ра и агрессив­ного шедуле­ра Beta, резуль­тат будет неп­ред­ска­зуем. Может получить­ся как очень инте­рес­ное изоб­ражение, так и брак.

Срав­ни резуль­тат с сем­пле­ром Euler Negative. В пер­вом слу­чае шедулер Karras, во вто­ром — Beta.

В общем, Beta — очень необыч­ный шедулер. Его обя­затель­но сто­ит поп­робовать, при­чем не один раз, на раз­ных моделях и раз­личных видах изоб­ражений.

Шпаргалка

Статья была длин­ная, а сло­восо­чета­ния «мно­гос­тупен­чатый метод треть­его поряд­ка диф­фузи­онно­го веро­ятнос­тно­го модели­рова­ния» и «поли­экспо­нен­циаль­ный про­филь изме­нения плот­ности шагов» спо­соб­ны нап­рочь отклю­чить мозг довер­чивого читате­ля. Поэто­му здесь — крат­кая выжим­ка.

Важ­но: ты можешь выб­рать любую ком­бинацию из сем­пле­ра и шедуле­ра. Ста­рые сем­пле­ры прек­расно работа­ют с сов­ремен­ными шедуле­рами.

Сем­пле­ры:

Ше­дуле­ры:

Дополнительные подробности

Хо­роших ста­тей по сем­пле­рам и шедуле­рам на рус­ском язы­ке мне най­ти не уда­лось, но на англий­ском их дос­таточ­но. Мое вни­мание прив­лекли две:

Так­же рекомен­дую гля­нуть тред на «Ред­дите»: Ever wondered what those cryptic sampler names like «DPM++ 2s a Karras» actually mean? Look no further.

В этих стать­ях дает­ся теоре­тичес­кая база с при­мера­ми. К сожале­нию, в них рас­смот­рены толь­ко клас­сичес­кие вари­анты алго­рит­мов; нет ни новых шедуле­ров (Align Your Steps, Beta, Exponential, SGMUniform), ни новых сем­пле­ров (CFG++, ODE, Euler Dy, Euler Negative, Euler Smea Dy). Тем не менее эти статьи важ­ны, так как дают базовое пред­став­ление о том, какие быва­ют вари­анты.