Перейти к содержанию
Публикация AiManual

Fine-tuning Stable Diffusion на CPU Intel: практическое руководство

Fine-tuning Stable Diffusion на CPU Intel: настройка IPEX, oneCCL и gperftools, распределённое обучение на 224 ядрах за 5 минут и инференс менее 5 секунд через

Коротко

Что будет в материале

  1. 01

    Архитектура решения: кластер Intel Xeon Sapphire Rapids

  2. 02

    Настройка окружения для распределённого обучения

  3. 03

    Подготовка данных и техника textual inversion

  4. 04

    Запуск распределённого обучения через mpirun и Accelerate

Stable Diffusion обычно ассоциируется с GPU, но обучение и дообучение модели на CPU-серверах экономически оправдано в ряде сценариев. В этом руководстве показан полный цикл: настройка распределённого окружения на кластере из четырёх серверов Intel Xeon Sapphire Rapids с суммарно 224 ядрами, запуск textual inversion на пяти изображениях, обучение за 200 шагов за примерно 5 минут и последующая оптимизация модели через Optimum Intel и OpenVINO для инференса на одном CPU менее чем за 5 секунд.

Материал адресован ML-инженерам, data scientist и архитекторам решений, которые ищут практичную альтернативу GPU-инфраструктуре. Все команды и конфигурации воспроизводимы, а типичные ошибки распределённого обучения разобраны отдельно. Если вам нужен быстрый инференс Stable Diffusion на CPU без дообучения, смотрите разбор ускорения генерации с 32 до 5 секунд.

Архитектура решения: кластер Intel Xeon Sapphire Rapids

Экспериментальная база состоит из четырёх серверов Intel Xeon Sapphire Rapids. Суммарно доступно 224 физических ядра. Для распределённого обучения используется MPI, а обмен градиентами между узлами выполняет oneCCL.

Почему Intel Xeon Sapphire Rapids?

Sapphire Rapids поддерживает AVX-512 и Advanced Matrix Extensions (AMX). Это ускоряет матричные операции, критичные для обучения диффузионных моделей. По сравнению с предыдущими поколениями Xeon прирост на операциях int8 и bfloat16 достигает 60–65% в NLP-нагрузках, что подтверждается тестами на трансформерах. Для генеративных моделей эффект аналогичен: AMX снижает время вычислений в свёрточных и attention-слоях UNet.

Серверы этого класса дешевле в аренде и покупке, чем сопоставимые по памяти GPU-инстансы. Они универсальны: после обучения кластер можно использовать под инференс, обработку данных или классические серверные задачи.

Настройка окружения для распределённого обучения

Для воспроизведения эксперимента нужны Python 3.10+, PyTorch 2.x, Intel Extension for PyTorch (IPEX), oneCCL, gperftools и Accelerate. Каждый компонент решает конкретную задачу.

Установка Intel Extension for PyTorch (IPEX)

IPEX добавляет в PyTorch поддержку AMX, автоматическое смешивание точности bfloat16 и оптимизированные операции для Intel CPU. Установка через pip:

pip install intel-extension-for-pytorch

Активация выполняется импортом библиотеки до запуска обучения:

import intel_extension_for_pytorch as ipex

IPEX автоматически подхватывает доступные инструкции процессора и применяет каналы оптимизации для свёрток и матричных умножений.

Настройка oneCCL для коммуникации между узлами

oneCCL - библиотека коллективных коммуникаций Intel. Она отвечает за allreduce градиентов в распределённом режиме. Установка:

pip install oneccl-bind-pt

Для работы с MPI задайте переменные окружения:

export CCL_WORKER_COUNT=1
export CCL_ATL_TRANSPORT=ofi

Эти параметры включают транспорт поверх libfabric и ограничивают число потоков на процесс, что снижает накладные расходы на коммуникацию.

Оптимизация памяти с gperftools

gperftools заменяет стандартный аллокатор на tcmalloc. Это уменьшает фрагментацию памяти и ускоряет выделение блоков при обучении. Запуск с подменой аллокатора:

LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc.so accelerate launch train.py

На практике tcmalloc снижает пиковое потребление RAM на 10–15% и убирает деградацию скорости при длительных прогонах.

Подготовка данных и техника textual inversion

Textual inversion обучает новый токен в эмбеддинговом пространстве Stable Diffusion, не меняя веса UNet и текстового энкодера. Для адаптации модели под конкретный объект достаточно пяти изображений. Это делает метод быстрым и нетребовательным к данным.

Создание датасета из 5 изображений

Требования к снимкам: объект занимает не менее 70% кадра, фон однородный, ракурсы различаются. Структура папок:

data/
  object_01.jpg
  object_02.jpg
  object_03.jpg
  object_04.jpg
  object_05.jpg
  captions.txt

В captions.txt каждая строка описывает изображение с плейсхолдером нового токена, например:

a photo of <my_object> on a white background
a close-up of <my_object> from the left side

Изображения приводятся к разрешению 512×512 и нормализуются стандартным пайплайном Stable Diffusion.

Запуск распределённого обучения через mpirun и Accelerate

Обучение на 224 ядрах требует корректной конфигурации Accelerate и MPI. Сначала создайте файл конфигурации Accelerate:

compute_environment: LOCAL_MACHINE
distributed_type: MPI
num_processes: 224
machine_rank: 0
main_process_ip: null
main_process_port: null

Конфигурация Accelerate для CPU

Тип distributed_type: MPI указывает Accelerate использовать MPI-бэкенд. IPEX подключается автоматически при импорте. Количество процессов должно соответствовать числу физических ядер кластера.

Пример команды запуска

mpirun -np 224 -ppn 56 \
  accelerate launch train_textual_inversion.py \
  --pretrained_model_name_or_path="runwayml/stable-diffusion-v1-5" \
  --train_data_dir="data" \
  --learnable_property="object" \
  --placeholder_token="<my_object>" \
  --initializer_token="toy" \
  --resolution=512 \
  --train_batch_size=1 \
  --max_train_steps=200 \
  --learning_rate=5e-4 \
  --output_dir="sd-my-object"

Параметр -np задаёт общее число MPI-процессов, -ppn - процессов на узел. Обучение занимает 200 шагов, примерно 5 минут на этом кластере. Для сравнения, на одном CPU без распределения тот же прогон занял бы около 20 минут.

Оптимизация модели для быстрого инференса на CPU

Обученный эмбеддинг совместим с базовой моделью Stable Diffusion. Для ускорения генерации конвертируем модель в формат OpenVINO через Optimum Intel.

Конвертация в OpenVINO с помощью Optimum Intel

from optimum.intel import OVStableDiffusionPipeline

pipe = OVStableDiffusionPipeline.from_pretrained(
    "sd-my-object",
    export=True,
    compile=False
)
pipe.save_pretrained("sd-my-object-ov")

OpenVINO применяет статические формы и квантование, что снижает задержку и размер модели. Подробнее о методах ускорения Stable Diffusion на CPU читайте в руководстве по 8-битной квантизации и Token Merging.

Бенчмарк инференса на одном CPU

После конвертации генерация одного изображения 512×512 на одном сокете Sapphire Rapids занимает менее 5 секунд. Базовая PyTorch-модель без оптимизаций тратила на это 32 секунды. Выигрыш достигается за счёт OpenVINO, статических форм и bfloat16.

Типичные ошибки при распределённом обучении и их решение

При запуске на нескольких узлах возникают специфические проблемы. Ниже - частые случаи и способы их устранения.

Проблемы с MPI и oneCCL

Ошибка Address already in use появляется, когда порт для MPI-коммуникации занят. Решение - указать другой порт:

export MASTER_PORT=29501

Если oneCCL не находит транспорт, проверьте, что libfabric установлен и переменная CCL_ATL_TRANSPORT задана как ofi.

Низкая производительность обучения

Утилизация CPU ниже 80% обычно означает, что IPEX не активирован. Убедитесь, что импорт выполняется до создания модели. Второй фактор - слишком маленький batch size. Для textual inversion на 224 ядрах batch size 1 на процесс достаточен, но learning rate нужно подбирать под суммарный размер батча.

Утечки памяти при длительном обучении устраняются запуском с tcmalloc. Если проблема сохраняется, уменьшите число даталоадеров:

--dataloader_num_workers=0

Сравнение стоимости и производительности: CPU vs GPU

Аренда четырёх серверов Sapphire Rapids с 224 ядрами в облаке стоит в 2–3 раза дешевле, чем эквивалентный по памяти GPU-инстанс с A100. Для textual inversion производительность CPU-кластера достаточна: обучение занимает минуты, а не часы.

CPU-серверы универсальны. После обучения их можно использовать под инференс трансформеров, обработку данных или веб-нагрузки. GPU в этом смысле ограничен: вне ML-задач его утилизация падает. Практические замеры ускорения PyTorch-трансформеров на Sapphire Rapids с AMX и Optimum Intel приведены в отдельном тесте.

Для полного fine-tuning всех весов Stable Diffusion CPU-кластер из четырёх узлов будет слабоват: потребуется больше ядер или длительное время. Textual inversion и лёгкие адаптеры - оптимальная зона применения CPU.

Заключение: когда стоит использовать CPU для fine-tuning

CPU-кластер на Intel Xeon Sapphire Rapids справляется с textual inversion Stable Diffusion за 5 минут обучения и даёт инференс менее 5 секунд на одном CPU после оптимизации OpenVINO. Это практичный сценарий для команд, которые не хотят арендовать GPU под короткие задачи дообучения.

Подход применим, когда нужно адаптировать модель под конкретный объект или стиль на малом числе примеров. Для полного переобучения весов или работы с high-resolution генерацией потребуется GPU или более крупный CPU-кластер. Начните с textual inversion на доступном CPU-сервере и замерьте результат на своей задаче.

Подписаться на канал