Ограничения запуска SD WebUI для Google Colab
Что случилось
С 21 апреля Google Colab запретил использование удалённых пользовательских интерфейсов. Таким образом, если вы будете пытаться использовать Stable Diffusion через Colab, вы рискуете получить бан своей учетной записи.
В соответствии с комментарием от представителей коллаба, причиной этого запрета послужила высокая нагрузка на сервера гугла, создаваемая пользователями WebUi, и ограничения будут применяться только к нему.
Как ограничения работают на практике
Актуальность
Данная информация актуальна на состояние 8 июня 2023 года. Вполне вероятно, что гугл, в будущем, будет менять механику работы фильтров, если число пользователе WebUI превысит определённую отметку.
На текущий момент, гугл никак не ограничивает запуск WebUI. Единственным достоверно-известным нововведением касательно StableDiffusion, введённым после изменения лицензионного соглашения, было добавление модалки со следующим содержанием, при случае, если вы пытаетесь запускать ноды, как-либо связанные с WebUI:
По сути, вас будут предупреждать о том, что, исполняя код в текущей ячейке коллаба, вы, возможно, нарушаете условия использования и ваш инстанс коллаба может быть приостановлен. При нажатии на "Continue anyway" код будет исполнен без каких-либо блокировок.
Что под капотом фильтра
Нет возможности достоверно выяснить, осуществляет ли гугл какой-либо мониторинг на тему запуска WebUI со стороны бекенда. Однако, со стороны фронтенда за фильтрацию осуществляет следующий код, расположенный в файле external_polymer_binary.js
.
Открыть картинку в полном размере
Отформатированный список фильтров:
Существуют гипотеза, что, в случае игнорирования предупреждения, выданного данной модалкой, фронтенд посылает дополнительные логи, говорящие о том, что пользователь запускает "запрещённый" код. У автора данной заметки не вышло подтвердить это или опровергнуть. Вот что удалось выяснить:
- Коллаб не использует вебсокеты, а, значит, кроме HTTP-запросов нет другого механизма передать информацию о нарушениях
- Коллаб не посылает дополнительные запросы при игнорировании модалки
- Коллаб посылает большое количество данных вместе с каждым запросом, так что есть ненулевая вероятность того, что эта информация может передаваться в каком-то из HTTP-запросов при запуске ноды
- Не удалось найти в коде каких-либо свидетельств того, что прокликивание "Continue Anyway" в модалке как-либо влияет на дальнейшую логику
Необходимо учитывать то, что любой из вышеупомянутых пунктов может стать ложным в любой момент при последующих обновлениях фронтенда для коллаба. В связи с этим, желательно не допускать прокликивания "Continue Anyway" в данной модалке.
Способы отключения модалки
Маскировка упоминаний WebUI в коде колаба
Фильтр проверяет текст программы на наличие определённых строк, таких как stable-diffusion-webui
. Для обхода фильтра достаточно разбить подобные строки на несколько отдельных строк, либо закодировать их. Всё, что вам нужно - это добиться того, чтобы ни одна строка из фильтра не встречалась в тексте программы целиком:
https://colab.research.google.com/drive/163drleqYf41Gsy9UsAWQrolS-O9J7Dn4?usp=sharing - в этом коллабе вы можете убедиться, что такой примитивный приём отключает фильтры.
Список всех строк, которые фильтр пытается найти в настоящий момент:
Кроме простого сложения строк, вот ещё пара вариантов, как их можно замаскировать:
- Грузить строки из внешнего источника (raw-файлы с pastebin/github)
- Закодировать строки в base64 и декодировать их в моменты, когда это необходимо
Юзерскрипт для отключения фильтров на стороне фронтенда
https://rentry.org/sd_collab_filter_bypass - юзерскрипт для отключения фильтра SD со стороны фронта
https://colab.research.google.com/drive/163drleqYf41Gsy9UsAWQrolS-O9J7Dn4?usp=sharing - коллаб для теста фильтров
Приведённый выше юзерскрипт осуществляет следующие манипуляции:
- На любой странице колаба он перехватывает скачивание файла
external_polymer_binary.js
- При скачивании данного файла он модифицирует его таким образом, чтобы обнулить секцию фильтров:
- Модифицированный файл подключается на страницу
Инструкция для хлебушков
Юзерскрипт - это программа, написанная на языке JavaScript, хранящаяся на компьютере пользователя и подключаемая браузером на определенных страницах.
При подключении к странице юзерскрипт выполняется так же, как и обычный javascript код, присланый сервером. У юзерскрипта есть доступ к DOM-дереву страницы, в контексте которой он выполняется, а, так же, у него есть доступ к localStorage и прочим HTML5 API.
Опасность юзерскриптов
Поскольку юзерскрипты могут осуществлять любые манипуляции на затронутых ими страницах, следует убедиться, что юзер-скрипты, которые вы устанавливаете, являются безопасными:
- Убедитесь, что скрипт разрешён к выполнению только на страницах колаба. Если в
@match/@include
секции скрипта есть что-то помимоhttps://colab.research.google.com/*
, то это повод насторожиться - Убедитесь, что скрипт не осуществляет какие-либо запросы на сторонние ресурсы. В контексте задачи отключения фильтра это было бы излишним
- Если скрипт поддерживает обновление посредством определения секции
@updateURL
, рекомендуется осуществлять проверку вышеупомянутых двух пунктов после каждого обновления (сами обновления осуществляются вручную)
Из хороших новостей - скрипт для обхода фильтра совсем короткий, так что не должно быть проблемой осуществить проверку, если у вас есть минимальные навыки программирования.
Как установить юзерскрипт для отключения фильтров коллаба на стороне фронтенда:
- Поставь расширение Tampermonkey для своего браузера
- Нажми на иконку расширения и выбери "Create a new script"
- Скопируй и вставь в редактор тело юзерскрипта и сохрани изменения (нажми
Ctrl + S
) - Готово
Если ты всё сделал правильно, то при переходе на страницу Dashboard, ты увидишь скрипт "SD Colab Filter Bypass"
в списке:
При переходе на страницу колаба и при клике на иконку расширения, ты должен увидеть данный скрипт в списке запущенных:
Чтобы убедиться в корректной работе скрипта, попробуй запустить верхнюю ноду в данном коллабе. Эта нода влючает в себя все слова-триггеры для фильтров. Если ты всё сделал правильно (и логика работы скрипта не поломалось с очередным обновлением фронтенда колаба), то программа должна выполниться без предупреждения о том, что вы выполняете запрещённый код.