В этой статье я хочу рассказать об опыте контейнеризации с использованием видеокарты Radeon от AMD. В качестве примера возьмём ComfyUI и поместим его в контейнер. А в конце, для демонстрации успешной работы, создадим видео в стиле аниме.

Всё нижеизложенное протестировано на AMD Radeon RX 7900 XTX.

ROCm от AMD

В октябре 2023 года AMD занялась поддержкой PyTorch для своих видеокарт. Платформа ROCm от AMD — это аналог CUDA от Nvidia, которая обеспечивает ускорение массовых параллельных вычислений. Плюсом AMD является то, что код ROCm открыт и их видеокарты, как правило, дешевле, чем у Nvidia. Но к существенным недостаткам AMD можно отнести то, что сообщество программистов, использующих видеокарты Radeon, меньше, чем GeForce, что приводит к трудностям поиска решений возникающих проблем.

Для возможности подключения видеокаты к контейнеру необходим ROCm. Поэтому набор программ для Ubuntu будет состоять из git, make, docker и ROCm. ОС и первые три программы всем хорошо известны, разбирать их установку здесь не будем, а ROCm можно установить по инструкции.

Краткая инструкция установки ROCm
sudo apt update
sudo apt install "linux-headers-$(uname -r)" "linux-modules-extra-$(uname -r)"
sudo usermod -a -G render,video $LOGNAME
wget https://repo.radeon.com/amdgpu-install/6.1.2/ubuntu/jammy/amdgpu-install_6.1.60102-1_all.deb
sudo apt install ./amdgpu-install_6.1.60102-1_all.deb

# При ошибке необходимо выполнить:
sudo chown -Rv _apt:root /var/cache/apt/archives/partial/
sudo chmod -Rv 700 /var/cache/apt/archives/partial/

sudo apt update
sudo apt install amdgpu-dkms rocm

Контейнеризация

Для контейнеризации AMD предлагает создавать пользовательские образы на основе исполняемого файла build.sh. Этот файл собирает образы из Dockerfile по переданным параметрам. Собранный образ служит основой для помещения в контейнер любого проекта.

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

Код базового образа
# https://github.com/ROCm/ROCm-docker/blob/master/dev/Dockerfile-ubuntu-22.04-complete
# https://github.com/microsoft/onnxruntime/blob/main/tools/ci_build/github/pai/rocm-ci-pipeline-env.Dockerfile
FROM ubuntu:22.04

ARG ROCM_VERSION=6.1.3
ARG AMDGPU_VERSION=${ROCM_VERSION}
ARG APT_PREF='Package: *\nPin: release o=repo.radeon.com\nPin-Priority: 600'
RUN echo "$APT_PREF" > /etc/apt/preferences.d/rocm-pin-600

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update && apt-get install -y \
    libopenblas-dev \
    ninja-build \
    build-essential \
    pkg-config \
    curl \
    wget \
    git \
    make

RUN curl -sL https://repo.radeon.com/rocm/rocm.gpg.key | apt-key add - && \
    printf "deb [arch=amd64] https://repo.radeon.com/rocm/apt/$ROCM_VERSION/ jammy main" | tee /etc/apt/sources.list.d/rocm.list && \
    printf "deb [arch=amd64] https://repo.radeon.com/amdgpu/$AMDGPU_VERSION/ubuntu jammy main" | tee /etc/apt/sources.list.d/amdgpu.list
RUN apt-get update && apt-get install -y \
    rocm-dev \
    rocm-libs

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Install Conda
ENV PATH /opt/miniconda/bin:${PATH}
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh --no-check-certificate && /bin/bash ~/miniconda.sh -b -p /opt/miniconda && \
    conda init bash && \
    conda config --set auto_activate_base false && \
    conda update --all && \
    rm ~/miniconda.sh && conda clean -ya
ENV PYTHON_VERSION=3.11
RUN conda install python=${PYTHON_VERSION} pip

# https://github.com/comfyanonymous/ComfyUI/issues/3698
ENV TORCH_BLAS_PREFER_HIPBLASLT=0
RUN pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/rocm6.1

RUN pip install transformers \
    peft \
    sentencepiece \
    scipy \
    protobuf --extra-index-url https://download.pytorch.org/whl/nightly/rocm6.1

# https://github.com/agrocylo/bitsandbytes-rocm
# or
# https://github.com/arlo-phoenix/bitsandbytes-rocm-5.6
ENV PYTORCH_ROCM_ARCH=gfx900,gfx906,gfx908,gfx90a,gfx1030,gfx1100,gfx1101,gfx940,gfx941,gfx942
ENV BITSANDBYTES_VERSION=62353b0200b8557026c176e74ac48b84b953a854
RUN git clone https://github.com/arlo-phoenix/bitsandbytes-rocm-5.6 /bitsandbytes && \
    cd /bitsandbytes && \
    git checkout ${BITSANDBYTES_VERSION} && \
    make hip ROCM_TARGET=${PYTORCH_ROCM_ARCH} ROCM_HOME=/opt/rocm/ && \
    pip install . --extra-index-url https://download.pytorch.org/whl/nightly/rocm6.1

На основе базового образа, ComfyUI можно поместить в контейнер следующим образом
FROM hardandheavy/transformers-rocm:2.1.0

EXPOSE 80

# To upgrade to the higher version, you need to wait for the problem to be resolved
# https://github.com/abetlen/llama-cpp-python/issues/1481
ENV LLAMA_CPP_PYTHON_VERSION=0.2.56
ENV DAMDGPU_TARGETS=gfx900;gfx906;gfx908;gfx90a;gfx1030;gfx1100;gfx1101;gfx940;gfx941;gfx942
RUN CMAKE_ARGS="-DLLAMA_HIPBLAS=ON -DCMAKE_C_COMPILER=/opt/rocm/llvm/bin/clang -DCMAKE_CXX_COMPILER=/opt/rocm/llvm/bin/clang++ -DAMDGPU_TARGETS=${DAMDGPU_TARGETS}" pip install llama-cpp-python==${LLAMA_CPP_PYTHON_VERSION}

WORKDIR /app
COPY ./docker/Makefile ./Makefile

CMD make run
  • Первой строкой загружается базовый образ hardandheavy/transformers-rocm, в котором уже содержатся необходимые пакеты для ComfyUI;

  • С 5 по 9 строки устанавливается llama-cpp-python (строки с 5 по 6). Этот пакет необходим для работы различных расширений ComfyUI;

  • 12-й строкой копируется набор команд для загрузки и запуска ComfyUI.

Код Makefile следует читать с 14-й строки. Вначале идёт подготовка окружения: копирование репозитория и установка пакетов ComfyUI. А затем переход в каталог программы и её запуск.

COMFYUI_CHECK_SEED_FILE = /check/comfyui-check-seed-file
MANAGER_CHECK_SEED_FILE = /check/manager-check-seed-file

init:
	if [ ! -f $(COMFYUI_CHECK_SEED_FILE) ]; then \
		git clone https://github.com/comfyanonymous/ComfyUI /comfyui && \
		cd /comfyui && \
		pip install -r requirements.txt && \
		touch $(COMFYUI_CHECK_SEED_FILE); fi
	if [ ! -f $(MANAGER_CHECK_SEED_FILE) ]; then \
		git clone https://github.com/ltdrdata/ComfyUI-Manager /comfyui/custom_nodes/ComfyUI-Manager && \
		touch $(MANAGER_CHECK_SEED_FILE); fi

run: init
	cd /comfyui && \
	python main.py --listen 0.0.0.0 --port 80

Запуск ComfyUI

После сборки ComfyUI, запуск проекта можно осуществить тремя строками:

git clone https://github.com/HardAndHeavy/comfyui-rocm-docker
cd comfyui-rocm-docker
make run

При первом запуске будет происходить длительный процесс инициализации. Когда этот процесс завершится, ComfyUI станет доступен по адресу http://localhost.

Создание аниме

Для создания аниме на основе видео воспользуемся статьёй Unsampling for AnimateDiff/Hotshot - An Inner-Reflections Guide и комментарием от Catz, который перечислил необходимые ресурсы для работы. А для удобства чтения статьи текст будет продублирован как краткий перевод с небольшой адаптацией под наш созданный образ.

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

Перейдя в ComfyUI, необходимо нажать кнопку «Load» и загрузить файл настройки anime.json. После загрузки на экране будет отображена настроенная связь множества узлов. Некоторые узлы будут отмечены красным цветом, так как для них отсутствуют необходимые расширения. Чтобы исправить это, необходимо нажать кнопку «Manager», затем — «Install Missing Custom Nodes» и, отметив все расширения, нажать «Install». После установки программа предложит перезагрузиться, для чего нужно нажать «Restart». А после обновить страницу, нажав «F5».

Важно заметить, что ComfyUI для данного образа может устареть, и обновленные расширения для него будут несовместимыми. Поэтому необходимо обновить ComfyUI, нажав кнопку «Manager», а затем «Update ComfyUI».

Перед копированием ресурсов для узлов необходимо предоставить доступ к каталогу data, так как контейнер запускался от имени пользователя root. Для этого нужно выполнить команду sudo chmod -R 777 ./data.

Необходимые ресурсы:

Для узла «LoadVideo» выбираем видеофайл original.mp4. Устанавливаем «framerate» на четверть от исходного значения, чтобы получить быстрый результат. А для первоначальной проверки результата установим «imagers_limit» равным 5 кадрам. Для генерации всех кадров «imagers_limit» необходимо установить равным 0.

Для узла «Video Combine» устанавливаем «frame_rate» равным частоте кадров из узла «LoadVideo». В нашем случае это 15, т. е. 60 кадров из оригинального видео разделить на «framerate».

Для узла положительного Promt («CLIPTextEncodeSDXL» зелёного цвета) отредактируем текст вверху и внизу одинаково. В нашем случае текст будет таким: «masterpiece, smooth color, 1 boy, dark hair, simple background, white shirt, blue trousers, barefoot, anime style, stairs, green grass».

После всех настроек мы готовы к созданию аниме. Нажимаем «Queue Promt» и получаем аниме из видео (файл anime.mp4).

Для каждого конкретного видео (узел «LoadVideo») и модели (узел «Load Checkpoint») необходимо настраивать позитивный и негативный промт. Негативный промт требует подстройки реже. Также полезным будет попробовать изменить:

  • «strength» и «end_percent» для узла «Apply Advanced ControlNet»;

  • «resolution» для «Realistic Lineart»;

  • «cfg» для «SamplerCustom».

В завершении попробуем поменять предложенные выше параметры, и результатом будет ещё пара примеров:

Анимация в стиле оригами

Загружаем файл настройки angle.json.

Необходимые ресурсы:

Для узла положительного промта вводим текст: «((masterpiece, best quality)), Origami young man, folding sculpture, wearing white origami shirt, blue origami jeans, dark origami hair, origami barefoot, depth of field, detailed, sharp, 8k resolution, very detailed, cinematic lighting, trending on artstation, hyperdetailed, stairs, green grass».

На выходе получаем видео в стиле оригами (файл angle.mp4).

Идея с оригами взята из видео AnimateDiff Tutorial.

Аниме от Studio Ghibli

Загружаем файл настройки cartoon.json.

Для узла положительного промта вводим текст: «anime key visual, 70s Art, stylized by Studio Ghibli, Shinji Aramaki, 1 boy, dark hair, simple background, white shirt, blue trousers, barefoot, anime style, stairs, green grass»

На выходе получаем видео в стиле аниме от Studio Ghibli (файл cartoon.mp4).

На этом всё. Благодарю всех за внимание! Желаю раскрыть все ваши творческие идеи с ComfyUI и, конечно, использовать больше контейнеризации!

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


  1. Shannon
    13.07.2024 03:35
    +4

    Тем, кто хочет получить ускорение на AMD видеокартах на Windows, ищите версии софта использующие ZLUDA - это транслятор CUDA запросов в Windows версию ROCm.

    Просто для тех, кто ищет способ получить аппаратное ускорение для нейросетей на GPU AMD на Windows. С докером это не работает.


  1. foxyrus
    13.07.2024 03:35
    +2

    \s Спасибо за Rutube


    1. jarkevithwlad
      13.07.2024 03:35

      я вообще в роуминге сижу, смотрю что 6 сек длительность, думаю сомнительно, но ок, нажимаю плей и 2 рекламы по 15 сек...


    1. Soloist Автор
      13.07.2024 03:35
      +1

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


  1. sami777
    13.07.2024 03:35

    Спасибо, рекламу посмотрел!