Введение

Поскольку я люблю высокую степень контроля, всякие дискорд/телеграм чаты меня устроить не могли. Разве что получить первый опыт. Ну как же без inpaint…

Следующий шаг – Colab. Довольно много можно нагенерировать в рамках бесплатных лимитов. При использовании ноутбука (.ipynb) с Automatic1111 контроль практически полный. Разве что мелкие неприятности (не открывался posex - ну поставил openpose-editor, разве что canvas-zoom не победил). А уж с подключением shared диска для работы с одной установкой с разных аккаунтов и вообще красота. И все-таки хотелось попробовать «полностью свое».

Поскольку мне это не для работы по 8 часов день, компьютера нет (карту воткнуть некуда), но есть ноутбук с поддержкой Thunderbolt 3, стал смотреть в сторону внешних боксов типа AORUS. Однако подержанные, в основном, были с 10-11GB видеопамяти, что достаточно для генерации, но не очень для обучения.  Даже для Vicuna 13B может не хватить (рекомендуют 12GB). Что-то более приличное уже слишком дорого, чтобы простаивать (обычно все-таки попроще карточки достаточно), и все равно может не хватить для редких серьезных потребностей.

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

В общем, стал смотреть, как бы запуститься в облаке в режиме «оплаты за использование».

Варианты

Одним из основных требований было использование spot instance, чтобы выполнение было подешевле, поэтому «готовые» скрипты не очень устраивали. Хотелось запустить инстанс именно такой, какой нужен, и самому в нем все настроить. Платить за готовый образ из маркетплейса тоже не интересно.

Причем предпочтительно (хотя и не обязательно) – Windows [10], ибо меньше заморочек с драйверами, есть прекрасныая portable сборка…

В AWS цены вроде норм.

g4ad.xlarge (4vCPU, 16GB RAM) spot примерно $0.15 в час. Правда AMD Radeon Pro V520 GPUs, что для Stable Diffusion потребует танцев.

g4dn.xlarge (тоже 4/16), но уже NVIDIA T4 GPUs – совсем другое дело. Правда уже $0.20 в час (спот, конечно).

При этом использование Windows server стоит дополнительных денег. А чтобы Windows 10 со своей лицензией установить нужно сначала локально собрать VHD, залить в AWS. В общем, не тривиально. Хотя если кому надо, описание есть.

Стал смотреть в Azure. Там для запуска Windows 10 уже все готово. И можно подтвердить, что лицензия своя (у меня и правда есть). Поэтому остановился на NC4as_T4_v3 (4 vCPU, 28GB RAM, тоже Tesla T4). $0.15/час на споте.

Установка

Совсем детально описывать не буду, приведу скриншоты для ориентира и укажу на основные моменты.

Тип

Availability zone
Availability zone

Сразу скажу – это не лучший вариант. При таком выборе Availability options (по умолчанию) действительно можно найти зону (в данном случае 3) с дешевыми инстансами. Причем глядя на view pricing history можно увидеть, что в Западной Европе существенно дороже:

Сравнение цен
Сравнение цен

Однако в таком случае ваш IP адрес будет Standard. Зарезервированный. И за него будут брать деньги, когда виртуалка выключена (примерно $2.5 в месяц).

Лучше указать, что отказоустойчивость не требуется:

No redundancy
No redundancy

Задать пароль админстратору.

Порты 80 и 443 я открыл на случай публикации веб интерфейса SD для себя, возможно с LetsEncrypt. А так же открыл SSH. Позже объясню задумку.

Диск

Когда виртуалка будет выключена, придется оплачивать дисковое пространство. А оно у данного типа немалое – 128GB (на портале нельзя выбрать, вроде при запуске через Terraform можно уменьшить). Поэтому диск я выбрал HDD. Он обойдется примерно в $6 в месяц. И я бы не сказал, что он сильно тормозит. Перезагрузка тоже чрезвычайно быстрая. У меня ноут на NVMe дольше загружается (там, правда, много всего установлено)

Standard HDD
Standard HDD

Впрочем, можно и SSD выбрать. Тогда примерно $10 в месяц выйдет.

Сеть

Сетевой интерфейс
Сетевой интерфейс

Публичный адрес лучше явно создать (Create New) и указать Basic, Dynamic

Расширения

Нам нужно установить драйвера для Tesla T4. Укажем это сразу же (Select an extension to install):

И тут сюрприз. Про GPU только AMD.

Только AMD
Только AMD

Нужно нажать Load more, и появится NVIDIA

Разумеется, можно было сразу NVIDIA набрать. Страница была бы пустой, после Load more появилось бы искомое.

Возможно стоит еще и SSH добавить. По крайней мере я планирую вместо публикации веб-интерфейса наружу прокинуть туда туннель через SSH по сертификату, чтобы браузер локально работал (как с Colab). С ноутбука будет обращение на 127.0.0.1:7860, а в реальности через SSH-туннель уходить в виртуалку. Хотя, конечно, можно и по RDP сидеть, не выставляя Web наружу совсем.

Подтверждаем, что все хорошо

И ждем, пока все установится, включая драйвера.

После создания

Нужно кое-что настроить. Поскольку мы хотим сэкономить на IP, при каждом запуске нам будет выдаваться новый. Значит подключаться удобнее по DNS имени. Жмем Not configured в DNS Name.

Настроим DNS
Настроим DNS

И указываем желаемое имя для DNS (у меня sda1111). Потом Save

Теперь видим DNS имя sda1111.germanywestcentral.cloudapp.azure.com, по которому можем подключаться по RDP (т.е. сохраним в RDP клиенте и будем подключаться одним кликом), хотя при каждом запуске IP будет новым.

На скриншоте чуть выше в IP address management была только опция Static (дорогая, из-за «отказоучстойчивости» в самом начале конфигурации).

Если же было выбрано «без отказоустойчивости», будет выбор Dynamic. Он и нужен.

Виртуалка при этом должна быть остановлена. Т.е. это можно сделать и позже (если забыли на этапе создания).

Если что-то не будет получаться, можно вообще удалить публичный IP и создать новый. Только сначала его нужно «отвязать» (dissociate). А потом новый правильно созданный associate обратно.

Важный момент

Даже после Shutdown изнури виртуалки (остановлен Windows) ресурсы остаются выделенными (allocated), и Azure берет деньги, как будто вируталка работает. Нужно не забывать ей делать Stop (deallocate).

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

Ну и чтобы закончить на этом с интерфейсом Azure, сразу покажу на будущее. Вдруг одной Nvidia Tesla T4 не хватит для чего-то супер-большого. На выключенной виртуалке можно сделать resize до NC64as_T4_v3 аж с четырмя Теслами.

В винде

Проверяем драйвера

NVIDIA Control Panel есть. Уже хорошо.

Device Manager:

Есть наша Tesla T4. Правда это отдельный адаптер, мы-то сейчас работаем через Microsoft Remote Display Adapter. Может быть поэтому я не вижу GPU:

Возможно надо активировать что-то подобное, но я не разбирался.

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

Смотрим, что покажет родная NVIDIA утилита (перетащил nvidia-smi в cmd)

Как в Colab :) Tesla T4, 16GB VRAM.
CUDA 11.4, можно обновить до 12 версии.

Если кому интересно, dxdiag:

Ставим Stable Diffusion

Воспользуюсь удобной portable сборкой https://github.com/serpotapov/stable-diffusion-portable

Посмотреть про нее можно тут: https://www.youtube.com/watch?v=jepK6ufemMw. И вообще крайне рекомендую этот канал и автора.

C github
C github

Скачиваю одним файлом zip-архив по ссылке из п.1

Раскрываю архив, кладу в корень, переименовываю папку для своего удобства просто в sd.

Запускаю webui-user-first-run. Стартует довольно длительный процесс.

В это время скачиваю первую модель (без этого не запустится). В п.4 есть ссылка на Deliberate – то, что надо.

Как только в моей папке sd появится models\Stable-diffusion, кладу эту модель туда. Также можно пока скачать VAE и прочее, но это все можно и потом. Для запуска достаточно модели.

Пока все устанавливается, дописываю --theme dark в основной запускательный файл webui-user.bat (тоже не обязательно)

По завершении установки может появиться ошибка

Это не страшно. Главное, что не про «не найден GPU»

Просто закрываем это окно, стартуем, как положено, webui-user.bat  и ждем ссылки на web-интерфейс

Может даже браузер сам откроется.

Для доступа снаружи есть разные варианты. Например, в том видео Хачатура, что я приводил, описано. Есть расширения в т.ч. для SSL. Я планирую через SSH туннель.

Пока просто «изнутри RDP».

Первые генерации могут быть медленными. В консоли видно, что система что-то докачивает.

В итоге получаем получаем почти 7 итераций в секунду. В Colab у меня обычно 2.5-3.5 it/sec

Также запустил генерацию 512x512, Euler a, Sampling steps 20, Batch Count 24. Было выполнено за 90 секунд.

24 count * 20 steps / 90 sec - так и получается 5 с чем-то. По ощущениям реально быстрее Колаба.

Что в итоге по стоимости?

Рассмотрим использование «по часу в день». День-другой пропустим, в выходные побольше посидим, условно 30 часов в месяц. У меня даже меньше времени на SD уйдет. Ну т.е. в первое время может и так же, а потом явно уменьшится.

30 часов в месяц * $0.15 = $4.5 – за время работы виртуалки.

Диск S10 128GB в месяц стоит $5.89.

Работа диска: «We charge $0.0005 per 10,000 transactions for Standard HDDs». Не готов оценить, не знаю, насколько интенсивно SD дергает диск. Даже медленный выбранный мной HDD, даже в пиках был загружен слабо, и по ощущением задержки вовсе не в диске. Так что вряд ли будет  чего-то существенного стоить.

В принципе есть еще вариант – к виртуалкам данного типа прилагается «эфемерный диск». Временный, только на время текущего запуска. Возможно будет иметь смысл что-то интенсивно дисковое сначала копировать на него и дергать оттуда, а не только своп и временную директорию туда направить. Хотя при оперативной памяти 28GB (существенно больше, чем у аналогичного инстанса в AWS), думаю, все достаточно хорошо кешируется.

Иными словами, около $11 в месяц для «поизучать, побаловаться». Поскольку буквально за час поднимается, можно вообще поднять только «на время отпуска».

Для профессионального использования «8  часов в день в помощь фотошопу» это дороговато. Хотя $5.89+22дня*8ч*$0.15 = $33 в месяц - фактически стоимость видеокарты за 3 года. С учетом динамично меняющихся обстоятельств, требований к мобильности, тоже может быть вариантом попробовать и решить, насколько нужна своя карта, какой производитеьности, с каким количеством памяти…

По идее и пара-тройка человек может одновременно через Web работать с одной такой виртуалкой (если не для видео много кадров подряд генерируем). По крайней мере я запускал из разных браузеров одновременно, и норм (просто задержка, пока в другой сессии генерируется). Если бы им можно было output директорию сделать каждому свою (добавив в название IP адрес, к примеру), вообще было бы здорово. Ну типа Stable Diffusion общий, а Web UI у каждого свой, со своими настройками. Может даже у одно Automatic, а у другого Comfy, к примеру.

Вопросы

Очень интересует вопрос, как делится видеокарта между приложениями. Допустим, у меня запущен Stable Diffusion, но ничего в это время не генерируется. Могу я запустить что-то еще? Условную LLaMA/Alpaca/Vicuna?

Ну типа идет генерация картинки – текстовые запросы ждут. Идет генерация текста – ждут картинки. Или SD захватывает карту монопольно и постоянно держит в памяти видеокарты модели и все такое?

Я видел что-то вроде разделения на несколько кусочков «GKE’s GPU time-sharing feature allows you to partition a single NVIDIA A100 GPU into up to seven instances» и по времени «You can configure time-sharing GPUs on any NVIDIA GPU on GKE including the A100». Первый вариант «вместо одной мощной карты получить несколько маленьких»  не особо мне интересен. А со вторым непонятно, как все-таки с загружаемыми текстурами, моделями и прочим в случае частого переключения контекстов. И требуется ли поддержка со стороны софта (надо же понять, что ранее загруженные в видеопамять текстуры кто-то грохнул).

API Remoting производительностью не радует (Performance ranges from 86% to as low as 12% of native performance in applications that issue a large number of drawing calls per frame).

В общем, буду рад услышать ваши соображения.

Комментарии (14)


  1. WondeRu
    16.04.2023 12:19

    Сделаете terraform для этого и цены не будет вашему решению)


    1. Antra Автор
      16.04.2023 12:19

      Тут баланс: красота vs массовость.

      Terraform и провизионер для установки всего - красиво и правильно. Но "порог вхождения" в решение увеличивается.

      Через Azure CLI - проще для массовости, как мне кажется.

      Хотя да, вы правы, на майские постараюсь перенести маскимально на Terraform. Заодно разберусь, как пошерстить по регионам в поисках минимальной спотовой цены. Никогда такого не делал.

      А, еще забыл - из России ведь Terraform сейчас без VPN не работает? Тупо провайдера не скачает, насколько я помню.


  1. dimitr_a
    16.04.2023 12:19
    +4

    Причем предпочтительно (хотя и не обязательно) – Windows [10], ибо меньше заморочек с драйверами …

    Вы уверены, что выбор инстанса с Windows для целей обучения это нормальная идея?

    У меня тоже была проблемы с драйверами при подключением внешней видекарты к ноутбуку под Linux, но она успешно решилась после обновления БИОС и после этого больше никаких проблем не замечал.

    И хотя обновить БИОС видеокарты можно было только под Виндой, но в облаках, как правило, проблем с драйверами к предлагаемому железу не бывает. Просто под Windows могут встретиться более серьеные ограничения в работе, но уже у самих проектов, которые планируются для последующей тренировки.


    1. Antra Автор
      16.04.2023 12:19

      Я исходил из того, что это проще. Запустить Portable под Win 10 сможет каждый. А вот с линукс условному дизайнеру будет посложнее. Да и с драйверами NVIDIA, CUDA, вот это вот все, раньше под винду было с ними проще, чем даже под Ubuntu. Может сейчас исправилось, конечно.

      И я данную идею предложил для облегчения "попробовать". Думаете, для продуктива тоже может быть кому-то интересно?

      Возможно, со всяким LLama/Alpaca/Vicuna действительно поразбираюсь на линуксе...


      1. dimitr_a
        16.04.2023 12:19
        +1

        Ну с этой точки зрения наверно вы правы. Удобнее пользоваться тем, что лучше знаешь.


  1. rsashka
    16.04.2023 12:19

    Для генерации достаточно и десктопной карты (или даже обычного RAM и CPU) и для этого отдельный инстанс покупать смысла не имеет, так как он будет большую часть времени простаивать (конечно, если это не для корпоративного использования).

    Хотя хозяин-барин, даже поиграться можно в облаках. Опыт он все равно в прок пойдет.


    1. Antra Автор
      16.04.2023 12:19
      +1

      Верно. Большую часть времени виртуалка выключена, стартует только когда нужна. Поэтому и обращаю внимание на выбор динамического публичного IP, не требующего денег, когда виртуалка остановлена, предлагаю выбрать HDD, чтобы минимально платить за место.

      А в отсутствие графической карты - ну не знаю. Моя первая попытка была - на рабочем ESXi в Ubuntu вируталку кучу Xeon ядер выделить. И каждая картинка генерировалась по пол минуты. Как это на ноуте без графического ускорителя будет - боюсь представить.


  1. roman_orlov
    16.04.2023 12:19
    +1

    Так то, что вы описали в статье, это же только генерация, а не тренировка?


    1. Antra Автор
      16.04.2023 12:19
      +1

      Ну как сказать. Если говорить про Stable Diffusion, то в нем уже встроен режим тренировки. Hypernet вполне можно через Train сделать даже безо всяких Dreambooth. Позволю себе опять сослаться на этот канал.

      LoRA на той же машинке установить и запустить тоже получится.


  1. mm3
    16.04.2023 12:19
    +2

    Насколько я понял в момент загрузки модель парсится, конвертируется (в зависимости от формата) и грузится в видео память (а это не моментальная операция на размерах в десятки гигабайт) и потом используется во время запросов. При параллельном запуске видятся два сценария либо вторая модель частично или полностью вытесняет первую, либо загрузка завершается с OOM.
    Хотя эксперименты показывают что text-generation-webui занимает видео память сразу и не освобождает, а stable-diffusion-webui занимает видеопамять на момент генерации и потом освобождает, всю или частично сказать сложно.


    1. Antra Автор
      16.04.2023 12:19

      Насколько я понял в момент загрузки модель парсится, конвертируется (в зависимости от формата) и грузится в видео память (а это не моментальная операция на размерах в десятки гигабайт) и потом используется во время запросов.

      Очень похоже на то. Первая генерация всегда идет долго. "Прогревается" :)

      В принципе если иметь условно SD и LLaMA одновременно запущенные, меня вполне устроило бы, если бы SD работало быстро, потом "отдыхает без запросов". Запрос к LLaMA убирает из видеопамяти модель и грузит свою... Через какое-то время, когда придет запрос на генерацию картинки (от меня же, переключившегося на другой вид деятельности), она загрузит модель в видеопамять заново.

      Эдакий "автоматический стоп неиспользуемого, когда видеокарта понадобилась другому" - лучше, чем "завершил работу с SD - останови, даже если через час он опять понадобится".

      Ну это я так. Пока не созревшие мысли вслух. Не бизнес-задача.


      1. mm3
        16.04.2023 12:19

        Первая генерация всегда идет долго. "Прогревается" :)

        Я сужу по stable-diffusion-webui и заметил следующее: Если поглядывать в консоль то можно заметить как при первой генерации догружаются из интернета необходимые библиотеки, дополнительные модели и всякое разное непонятное, но видимо необходимое, что влияет на время первой генерации.
        При этом модель грузится с диска (или интернета у кого как) в оперативку (или даже в видеопамять так как там можно заметить небольшой скачок) на момент старта или выбора модели. А в момент генерации видеопамять скорее всего забивается промежуточными результатами так как объём явно зависит от заданного размера картинки.


  1. geleos27
    16.04.2023 12:19
    +1

    Для запуска сетей в облаке есть SkyPilot, возможно получится немного переработать ваше исполнение для еще более экономичного использования.
    Он-же вероятно сможет решить ваш вопрос с переключением между SD / GPT


    1. Antra Автор
      16.04.2023 12:19

      О, спасибо за наводку! Интересно выглядит