У яблока на картинке идеальный характер. Красное, с упрямым листиком, лежит в нужном углу и, кажется, знает себе цену. Вы повторяете запрос — и на столе его троюродный брат. Тоже яблоко, но уже с намерением открыть консалтинговую фирму. Свет другой, листик другой, деревянный стол словно сменил хозяина.

Хочется вернуть именно удачное начало, а потом уже что-нибудь менять. Для этого в генерации изображений существует число seed. Сегодня разберём, что оно делает, почему повторное использование одного объекта может дать новый результат и какие сведения стоит сохранить с картинкой. Устанавливать библиотеку и запускать новую платную генерацию для этого разбора не нужно.

После потопа Девкалион и Пирра из книги Куна бросают камни за спину — так земля снова заселяется людьми. Каждый бросок приносит нового человека. У нас задача почти обратная: вернуть удачное яблоко на прежнее место. Для этого нужно разобраться, откуда начинается следующая попытка.

Сначала сохраним понравившуюся попытку

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

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

Если поля нет, так и отметьте: «seed не показан». Сервисы по-разному дают доступ к настройкам. Мы объясняем механизм на открытой библиотеке Diffusers, где он виден в коде; чужую кнопку наугад искать не потребуется.

В папке останутся картинка, её промпт и доступные параметры. Через неделю файл «финал_хороший_точно.png» не придётся допрашивать с лампой в лицо: при каких обстоятельствах он появился и кто ещё присутствовал при рождении яблока.

Число запускает последовательность

При такой генерации изображение начинается с шумовых значений. Модель постепенно превращает заготовку в картинку по запросу. Seed помогает задать начало работы генератора случайных чисел, который даёт эти значения. Более подробно сам путь от шума до изображения разобран в статье о диффузионных моделях.

Представьте ленту в маленьком заводном театре. Задали начальное число — поставили механизм к началу пьесы. Взяли значения для картинки — лента сдвинулась. Следующая порция лежит уже дальше. Чтобы снова поднять занавес в прежнем месте, придётся вернуть механизм назад.

В инструкции Diffusers о воспроизводимости для этого используется Generator. Это программный объект: он хранит текущее состояние генерации случайных значений. В изображение передают сам объект, который меняется по мере использования, а не просто число на бумажке.

Один Generator после первого вызова переходит к новому состоянию; второй вызов начинается уже оттуда

Схема состояний: тот же объект продолжает последовательность после уже использованных значений.

Поэтому «я же не менял генератор» ещё не означает возврата к началу. Механизм тот же, лента сдвинулась. Имя переменной осталось на месте, а состояние внутри объекта уже другое.

Чтобы начать снова с того же места, генератор заново инициализируют тем же seed либо сбрасывают его к этому началу. В официальном примере начальное число равно нулю. Это обычное выбранное значение; особого таланта рисовать яблоки у нуля нет.

Две похожие команды означают разную работу

Первый вариант: создать генератор один раз, затем несколько раз подряд попросить картинку. Его состояние будет расходоваться. Второй: перед каждой попыткой заново задавать то же начальное число и сохранять остальные условия.

Это важно, когда вы меняете деталь запроса. Допустим, хотите добавить яблоку тень, а новая попытка одновременно переставила его в другой угол. Без сохранённого начала трудно разделить изменения условий. Если вернуться к прежнему старту и поменять только запрос, хотя бы одна причина различий останется под вашим управлением.

Второй путь позволяет сравнивать попытки от одного старта. Именно поэтому в повторяющемся примере Diffusers инициализация находится внутри цикла: перед каждым вызовом снова выполняется torch.manual_seed(0). Ниже — схема действий обычными словами, а не программа для запуска:

Продолжение:
задать начало → получить первую картинку → получить следующую
                                      состояние уже изменилось

Повтор старта:
задать начало → получить картинку
задать то же начало заново → получить картинку при тех же условиях

Для повтора перед каждым вызовом заново задают то же начало; остальные условия сохраняют

Повторный старт и продолжение последовательности — разные действия. Схема не изображает результаты проведённого нами испытания.

Если вы работаете в готовом интерфейсе, детали управления зависят от него: где-то значение вводится перед запуском, где-то можно повторить попытку из истории. Помощнику лучше назвать именно вашу программу и дать текст её справки. Тогда он сможет объяснить, какое действие соответствует возврату к прежнему началу.

Что ещё нужно оставить прежним

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

Ещё один предмет — scheduler, способ вести изображение по шагам преобразования. В интерфейсах рядом могут встречаться названия sampler и scheduler; для сохранения попытки перепишите показанные названия и связанные настройки. В документации Diffusers scheduler определяет, как обновлять промежуточный результат на очередном шаге. Другая настройка этого пути меняет условия опыта даже при знакомом начальном числе.

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

Не требуется заранее выучить эти названия. Для первой картинки полезнее заметка «взял настройки из такой-то попытки», чем рассказ о внутренностях видеокарты по памяти. Если какой-то пункт неизвестен, оставьте его неизвестным и найдите в справке или сохранённой конфигурации позже.

Пример для тех, кто работает в Diffusers

Открыть техническую карточку из документации

Возьмём текущий пример Diffusers. В нём используется модель Qwen/Qwen-Image и запрос о красном яблоке на деревянном столе. Число шагов в этом конкретном примере — четыре. Оно показывает устройство примера, а не рекомендацию для любой модели и любой картинки.

Разбор можно записать в такую карточку. Она заполнена по опубликованному коду; результат запуска мы не измеряли.

Что сохраняем Что видно в примере Что это даёт для повтора
Модель Qwen/Qwen-Image Понятно, какой набор модели указан
Точная ревизия модели и версии библиотек В примере явно не закреплены Для строгого повтора их надо сохранить при своём запуске
Промпт a red apple on a wooden table Сохраняем без пересказа
Начальное число 0, заново перед каждым вызовом Возвращаем Generator к началу
Размер Явно не задан При своей попытке записываем фактическую ширину и высоту
Scheduler Берётся из конфигурации загруженного процесса Сохраняем его класс и параметры из своей конфигурации
Число шагов 4 Сохраняем именно выбранное значение
Вычисления bfloat16; в приведённой строке выбран cuda Отмечаем устройство и точность отдельно от seed

У карточки есть полезное свойство: она показывает и известное, и пропущенное. Модель с тем же названием могла загрузиться из обновлённой версии, а размер без явного указания зависит от настроек выбранного процесса. В собственной попытке эти сведения стоит сохранить вместе с результатом. По короткому опубликованному примеру их задним числом не восстановить.

Рядом с карточкой оставьте ссылку на сам пример и дату чтения. Документация меняется, поэтому текст «делал как на сайте» слишком быстро теряет адрес. Для собственной удачной попытки лучший адрес — её запись в истории и сохранённый файл с настройками. Если работаете с разработчиком, передайте ему эту запись: так он увидит исходные условия и сам уточнит недостающие пункты среды.

Пусть ИИ соберёт заметку из ваших сведений

Для этого можно открыть DeepSeek и передать текст настроек своей попытки. Если он пока незнаком, начните с названия генератора. Помощник будет спрашивать по одному пункту, который действительно требуется уточнить.

Помоги сохранить рецепт понравившейся картинки.
Я дам точный промпт и доступные настройки из истории генерации.
Сначала узнай, какой программой я пользуюсь.
Собери короткую карточку: модель и версия, промпт, размер,
sampler/scheduler, число шагов, seed и способ его повторного задания,
среда запуска и другие реально указанные настройки.
Ничего не подставляй по догадке. Неизвестное отметь словами.
Если непонятно, где посмотреть нужное значение, объясни один шаг:
что открыть, что скопировать и какой результат я должен увидеть.
Жди моего ответа. Если у тебя есть поиск, сверяй действия
с официальной справкой; иначе попроси дать нужный её фрагмент.
Не обещай, что можешь сам увидеть мой экран или историю.

Сверьте карточку с исходными настройками. Помощник не должен превращать «модель неизвестна» в уверенный популярный вариант. Уберите и новое прилагательное, которое он случайно вставил в сохранённый промпт: рецепт должен хранить тот текст, с которым вы работали.

Рядом с сохранённым яблоком лежит его рецепт: запрос, модель, настройки и начальное число

Для повторной работы сохраняют картинку вместе с рецептом. Число seed — один из его пунктов.

Теперь можно выбрать следующий маленький опыт: сравнить две попытки при прежних условиях или поменять одну вещь, например текст запроса. Во втором случае seed оставляют тем же, чтобы удержать одну из частей опыта. Сохраните оба результата и напишите рядом, что изменили. Тогда папка превратится в понятную историю решений, а не в ряд яблок, которым вы больше не можете объяснить происхождение.

Частые вопросы

Есть ли удачное число, которое всегда рисует красивее?

Seed в нейросети задаёт стартовую последовательность, а красоту вы оцениваете по полученной картинке и своей задаче. Число от понравившегося варианта полезно сохранить как часть именно этого рецепта.

Почему я ввёл то же число, а яблоко всё равно другое?

Сначала сравните модель, её версию, точный промпт, размеры и параметры преобразования. Если это программный запуск, проверьте, вернули ли Generator к началу перед новой попыткой, и не изменилась ли среда. Так вопрос распадается на конкретные различия.

Можно этим числом сохранить лицо человека во всех сценах?

Одно начальное число не задаёт отдельное правило сохранения лица при разных запросах и условиях. Для задачи узнаваемого персонажа нужно выбирать подходящий способ работы с исходным изображением. Наш рецепт помогает повторять условия генерации и разбирать изменения между попытками.

Чем это отличается от температуры текстовой модели?

Здесь мы разбираем начальное состояние генератора случайных значений при создании картинки. Температура относится к другой настройке — выбору продолжения у текстовой модели. Два названия не заменяют друг друга.

Что делать, если мне нужен только один красивый результат?

Сохраните сам файл и запрос. Если хочется ещё поработать с идеей, пригодится способ описать задачу для ИИ: какой предмет нужен, что в текущем варианте нравится и что хотите поменять. Полный рецепт поможет, когда решите вернуться к условиям удачной попытки.

Положите заметку рядом с картинкой. У яблока появятся адрес в истории, текст запроса и известные условия появления. Вы сможете вернуться к исходной попытке, сравнить следующую и продолжить свою идею. А его троюродный брат пусть пока открывает фирму в другой папке.