Diffusers(https://huggingface.co/docs/diffusers/index)Это расширенная предварительно обученная библиотека моделей диффузии.,Используется для генерации изображений, аудио и даже трехмерных структур молекул. Он предоставляет простой в использовании и легко настраиваемый модульный набор инструментов для вывода и обучения.
Хотя Stable Diffusion WebUI также очень эффективен для создания высококачественных изображений, специалистам по данным и инженерам по машинному обучению часто требуется больший контроль. Библиотека Diffusers удовлетворяет эту потребность, позволяя пользователям настраивать модели и предлагать создавать изображения в соответствии с конкретными потребностями Python. В основном это работает для моделей, размещенных на HuggingFace, но для моделей, поддерживающих Stable Diffusion WebUI на сайте C, требуются некоторые специфические приемы.
В этой статье в основном описывается, как использовать диффузоры для вызова контрольной точки и лоры в модели диффузии SD в civitai.
Рекомендуется приобрести сервер графического процессора у Tencent Cloud Server Singapore. Подробный процесс покупки читайте в моей предыдущей статье.
yum install -y git
adduser sd (Создать учетную запись SD)
passwd sd (Создать пароль)
usermod -aG wheel sd (Увеличьте разрешения sudo)
su - sd (Переключиться на пользователя SD)
git clone https://github.com/huggingface/diffusers.git
wget https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-x86_64.sh
sh Anaconda3-2023.03-Linux-x86_64.sh
После завершения установки выполните команду «bash», перезагрузите терминал bash и убедитесь, что команда conda доступна.
conda create -n sd python=3.10.6
pip install diffusers
pip install transformers
pip install torch
pip install matplotlib
pip install numpy
pip install omegaconf
pip install accelerate
mkdir model
cd model
Загрузите большие модели dreamlikePhotoreal20_dreamlikePhotoreal20.safetensors и lora airfryer.safetensors (эту лору я обучил) в каталог ~/model пользователя sd.
В каталоге ~/model выполните следующую команду в командной строке, чтобы преобразовать модель контрольной точки стабильной диффузии в модель, которую можно использовать в диффузорах.
python ~/diffusers/scripts/convert_original_stable_diffusion_to_diffusers.py --checkpoint_path dreamlikePhotoreal20_dreamlikePhotoreal20.safetensors --dump_path dreamlikePhotoreal20/ --from_safetensors
в,
--checkpoint_path Путь к контрольной точке, которую необходимо преобразовать.
--original_config_file Файл конфигурации YAML, соответствующий исходной архитектуре.
--num_in_channels Введите количество каналов. Если «Нет», количество входных каналов будет определено автоматически.
--scheduler_type Тип используемого планировщика. Должно быть одно из «pndm», «lms», «ddim», «euler», «euler-ancestral», «dpm».
--pipeline_type Тип трубы. Одними из них являются «FrozenOpenCLIPEmbedder», «FrozenCLIPEmbedder», «PaintByExample». Если «Нет», тип трубы будет определен автоматически.
--image_size Размер изображения, используемый при обучении модели. Для стабильной Diffusion v1.X и стабильная версия Siffusion v2 База, пожалуйста, используйте 512. Для стабильной Diffusion v2, пожалуйста, используйте 768.
--prediction_type Тип прогноза, используемый при обучении модели. Для стабильной Diffusion v1.X и стабильная версия Diffusion v2 База, пожалуйста, используйте «эпсилон». Для стабильной Diffusion v2, используйте «v_prediction».
--extract_ema Работает только на контрольных точках с весами как EMA, так и не EMA. Следует ли извлекать веса EMA. По умолчанию — ложь. Добавьте --extract_ema для извлечения весов EMA. Веса EMA часто используются для создания изображений более высокого качества для вывода. Веса, не относящиеся к EMA, часто используются для продолжения точной настройки.
--upcast_attention Следует ли всегда выполнять преобразование внимания с повышением частоты. Это необходимо при запуске Stable Diffusion 2.1.
--from_safetensors Если --checkpoint_path имеет формат Safetensors, то для загрузки контрольной точки вместо PyTorch используются безопасные тензоры.
--to_safetensors Хранить ли трубы в формате Safetensors.
--dump_path Путь к выходной модели.
--device Используемое устройство (например, процессор, cuda:0, cuda:1 и т. д.).
--stable_unclip Установите, если это стабильная модель unCLIP. Один из них — «txt2img» или «img2img».
--stable_unclip_prior Если это стабильный unCLIP txt2imgМодель,Пожалуйста, установите. Выберите перед использованием. Если для --stable_unclip установлено значение txt2img,Выбор по умолчаниюkarloаприори(https://huggingface.co/kakaobrain/karlo-v1-alpha/tree/main/prior)。
--clip_stats_path Путь к файлу статистики клипа. Требуется только в том случае, если model.params.noise_aug_config.params.clip_stats_path указан в конфигурации стабильной модели unclip.
--controlnet Установите флаг, если это контрольная точка сети управления.
--half Сохраняйте веса с половинной точностью.
--vae_path Установить путь, концентратор ID, чтобы избежать повторного преобразования преобразованного VAE.
--pipeline_class_name Укажите имя класса канала.
Подробности см.: https://github.com/huggingface/diffusers/blob/main/scripts/convert_original_stable_diffusion_to_diffusers.py
После завершения преобразования модели контрольной точки нам все еще может потребоваться использовать lora для выполнения преобразования lora.
python ~/diffusers/scripts/convert_lora_safetensor_to_diffusers.py --base_model_path dreamlike-art/dreamlike-photoreal-2.0 --checkpoint_path ./airfryer.safetensors --dump_path ./airfryer
в,
--base_model_path Путь к базовой модели в формате диффузоров.
--checkpoint_path Путь к контрольной точке для преобразования.
--dump_path Путь к выходной модели.
--lora_prefix_unet Префикс для весов UNet в защитных тензорах.
--lora_prefix_text_encoder Префикс для весов кодировщика текста в защитных тензорах.
--alpha W = W0 + alpha * deltaW Коэффициент слияния в .
--to_safetensors Хранить ли трубы в формате Safetensors.
--device Используемое устройство (например, процессор, cuda:0, cuda:1 и т. д.).
Подробности см.: https://github.com/huggingface/diffusers/blob/main/scripts/convert_lora_safetensor_to_diffusers.py
Здесь необходимо объяснить, что --alpha — очень важный параметр. Значение по умолчанию — 0,75. Если это значение установлено слишком большим, его будет легко переназначить.
Вот мой пример.
Случай, когда альфа равна 0,75.
Когда альфа равна 1,5
Когда альфа равна 0,5
Завершите вывод, используя следующий фрагмент кода
from diffusers import (
StableDiffusionPipeline,
PNDMScheduler,
LMSDiscreteScheduler,
DDIMScheduler,
EulerDiscreteScheduler,
EulerAncestralDiscreteScheduler,
DPMSolverMultistepScheduler,
UniPCMultistepScheduler,
)
def make_scheduler(name, config):
return {
"PNDM": PNDMScheduler.from_config(config),
"KLMS": LMSDiscreteScheduler.from_config(config),
"DDIM": DDIMScheduler.from_config(config),
"K_EULER": EulerDiscreteScheduler.from_config(config),
"K_EULER_ANCESTRAL": EulerAncestralDiscreteScheduler.from_config(config),
"DPMSolverMultistep": DPMSolverMultistepScheduler.from_config(config),
"UniPCM": UniPCMultistepScheduler.from_config(config),
}[name]
model_id = "./airfryer";
pipe = StableDiffusionPipeline.from_pretrained(
model_id,
torch_dtype=torch.float16,
safety_checker=None,
cache_dir="diffusers-cache",
local_files_only=False).to("cuda");
generator = torch.Generator("cuda").manual_seed(seed)
pipe.scheduler = make_scheduler(scheduler, self.pipe.scheduler.config)
seed = 9527
generator = torch.Generator("cuda").manual_seed(seed)
# generate image
output = pipe(
prompt="",
negative_prompt="",
guidance_scale=guidance_scale,
num_inference_steps=num_inference_steps,
generator=generator,
eta=0.5
)
for i, sample in enumerate(output.images):
output_path = f"/tmp/out-{seed}-{i}.png"
sample.save(output_path)