使用OpenVINO GenAI和LoRA适配器进行图像生成

描述

作者:

武卓 英特尔 AI 软件布道师

借助生成式 AI 模型(如 Stable Diffusion 和 FLUX.1),用户可以将平平无奇的文本提示词转换为令人惊艳的视觉效果。但如果你想生成更具风格化或定制化的图像,开源的基础模型可能无法满足你的所有需求。这时,LoRA(低秩自适应)就派上用场了。许多风格修改和增强功能现以 LoRA 的形式发布,作为基础模型的模块化附加组件。通过添加LoRA适配器,使得大家可以随心所欲、生成风格多变的个性化图像。

通过将 LoRA 集成到 OpenVINO GenAI 中,开发者可以一次加载多个 LoRA 适配器,并在运行推理时快速动态切换,无需重新编译基础模型。这使得用户能够以高效、可扩展的方式生成满足特定需求的、多样化、高质量的输出。现在,让我们深入了解具体步骤,借助 OpenVINO 将你的图像生成项目推向全新高度!

 

目录

克隆openvino.genai GitHub仓库

为AI模型转换安装相关依赖包

下载和转换AI模型及相应的分词器

选择单个或者多个LoRA 适配器来进行图像生成

用C++创建和运行LoRA图像生成示例

结论

第0步: 

问 OpenVINO GenAI 示例代码,体验 LoRA 适配器加持的文本生成图像功能

了解如何使用 OpenVINO GenAI 搭配 LoRA 进行文本生成图像的最简单方法,就是查看代码仓库中的示例源码。

以下是使用 LoRA 进行图像生成的 Python 示例脚本:

 

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('models_path')
    parser.add_argument('prompt')
    args, adapters = parser.parse_known_args()


    prompt = args.prompt


    device = "CPU"  # GPU, NPU can be used as well
    adapter_config = openvino_genai.AdapterConfig()


    # Multiple LoRA adapters applied simultaneously are supported, parse them all and corresponding alphas from cmd parameters:
    for i in range(int(len(adapters) / 2)):
        adapter = openvino_genai.Adapter(adapters[2 * i])
        alpha = float(adapters[2 * i + 1])
        adapter_config.add(adapter, alpha)


    # LoRA adapters passed to the constructor will be activated by default in next generates
    pipe = openvino_genai.Text2ImagePipeline(args.models_path, device, adapters=adapter_config)
    print("Generating image with LoRA adapters applied, resulting image will be in lora.bmp")
    image = pipe.generate(prompt,
                          generator=Generator(42),
                          width=512,
                          height=896,
                          num_inference_steps=20)


    image_write("lora.bmp", image)

 

你会发现,只需少量代码,就能将 LoRA 适配器(单个或多个)轻松融入 OpenVINO GenAI 的文本生成图像流程。运行 LoRA 图像生成脚本,就像这样简单:

 

python lora_text2image.py FLUX.1-dev/INT4 " albert einstein, yarn art style" pytorch_lora_weights.safetensors 1.0

 

其中pytorch_lora_weights.safetensors 就是我们选择的用于图像生成的LoRA 适配器。

Step 1: 克隆openvino.genai GitHub仓库

AI

从openvino.genai GitHub仓库克隆OpenVINO GenAI的开源代码。

Step 2:为AI模型转换安装相关依赖包

前往 文本生成图像(Text-to-Image)LoRA 示例:

 

openvino.genaisamplespythonimage_generation

 

在这个文件夹中,你可以找到关于示例的相关README.md 文件. 你也可以直接从 OpenVINO 下载页面访问该 README 文件。

现在,你需要准备一个 Python 虚拟环境,用于模型下载和转换。可以使用以下代码完成设置:

 

python -m venv venv_export
venv_exportScriptsactivate
pip install --upgrade-strategy eager -r ../../export-requirements.txt

 

Step 3:下载和转换AI模型及相应的分词器

为了生成图像,我们将使用 FLUX.1-dev模型,并且可以通过一条命令下载并转换为 OpenVINO IR 格式:

 

optimum-cli export openvino --model black-forest-labs/FLUX.1-dev --weight-format int4 --group-size 64 --ratio 1.0 FLUX.1-dev/INT4

 

如果由小伙伴不方便从HuggingFace的网站直接下载模型的,也可以先利用以下命令,从魔搭社区下载模型

 

modelscope download --model black-forest-labs/FLUX.1-dev

 

将模型保存在本地后,再次运行以下命令,

 

optimum-cli export openvino --model/FLUX.1-dev –task text-to-image --weight-format int4 --group-size 64 --ratio 1.0 FLUX.1-dev/INT4

 

完成模型的转换和导出。此外,OpenVINO 还支持其他适用于 LoRA 适配器的文本生成图像模型,完整列表请见此处。欢迎尝试不同模型,探索更多可能性!

过一会儿,转换完成后的模型就保留在了本地磁盘上,并准备好进行图像生成。如果不再需要转换(或优化)AI 模型,你可以删除 venv_export 文件夹,这些依赖包在 AI 推理的过程中并不需要。或者,你也可以直接从我们在HuggingFace这里或者魔搭社区这里的模型专区下载我们工程师已转换和量化的 FLUX.1 模型,跳过上述 第 2 步和第 3 步 的模型下载和转换步骤,直接从下方的推理步骤开始使用模型!

HuggingFace

https://huggingface.co/OpenVINO/FLUX.1-schnell-int4-ov

魔搭社区

https://modelscope.cn/models/OpenVINO/FLUX.1-schnell-int4-ov

Step 4: 选择单个或者多个LoRA 适配器来进行图像生成

首先,我建议你准备一个 Python 虚拟环境来运行 AI 推理。与用于模型下载和转换的环境不同,这里你只需要安装一个 Python 包 —— openvino.genai。

 

python -m venv venv
venvScriptsactivate
pip install -r ../../deployment-requirements.txt

 

 openvino_genai.AdapterConfig 用于在 openvino_genai.Text2ImagePipeline 中管理 LoRA 适配器。它可以用于添加、移除适配器,或调整它们的权重系数(Alpha)来实现风格融合。你可以在配置中加入一个或多个适配器,并通过 Alpha 系数进行混合,以生成更具风格化和创意的图像。目前,OpenVINO GenAI 支持以 Safetensors 格式保存的 LoRA 适配器。你可以使用 CivitAI 或 HuggingFace Hub 上的公开预训练适配器,或者自行训练适配器来满足个性化需求。

CivitAI

https://civitai.com/

HuggingFace Hub 

https://huggingface.co/models

以下是用于处理多个 LoRA 适配器的代码示例,

 

    adapter_config = openvino_genai.AdapterConfig()


    # Multiple LoRA adapters applied simultaneously are supported, parse them all and corresponding alphas from cmd parameters:
    for i in range(int(len(adapters) / 2)):
        adapter = openvino_genai.Adapter(adapters[2 * i])
        alpha = float(adapters[2 * i + 1])
        adapter_config.add(adapter, alpha)

 

将 LoRA 集成到 OpenVINO GenAI 的文本生成图像流程中,仅需一行代码,如下所示:

 

   # LoRA adapters passed to the constructor will be activated by default in next generates
    pipe = openvino_genai.Text2ImagePipeline(args.models_path, device, adapters=adapter_config)

 

选择单个LoRA适配器进行图像生成

 

python lora_text2image.py .FLUX.1-devINT4 "albert einstein" pytorch_lora_weights.safetensors 1.0

 

使用上述命令,你可以生成带有 “Yarn art” LoRA 风格的图像,并使用 INT4 量化的 FLUX.1-dev 模型,效果如下:

 

选择多个LoRA 适配器进行图像生成

当然,你还可以在一次推理中轻松使用多个 LoRA 适配器运行 Text2ImagePipeline。例如,使用以下命令,可以将 “浮世绘艺术(Ukiyo-e Art)” 风格与 “点绘风格(Point style)” 结合,并搭配转化和导出为OpenVINO 格式的SDXL-LCM模型(具体步骤参考这里)来生成图像:

 

python lora.py "./sdxl-lcm" "a cute cat in sunglasses" araminta_k_the_point.safetensors 0.8 "Ukiyo-e Art.safetensors" 0.6

 

生成的融合了多个LoRA风格的图像就如下图所示

 

OpenVINO GenAI 支持以 Safetensors 格式保存的 LoRA 适配器。你可以使用 CivitAI 或 HuggingFace Hub上的公开预训练适配器,或者自行训练 LoRA 适配器,以满足个性化需求。

请注意,在加载预训练的 LoRA 适配器之前,请确保它们与基础模型架构兼容。例如,如果你使用 SDXL 模型,则需要提供专为该模型类型训练的 LoRA 适配器。否则,例如使用 FLUX 训练的适配器,将无法正确集成到推理流水线中,也无法成功运行模型推理。

Step 5: 用C++创建和运行LoRA图像生成示例

尽管 Python 作为编程语言功能强大,且非常适合代码实验,但在许多情况下,C++ 更适用于桌面应用程序的开发。下面是用于 LoRA 图像生成 的 C++ 代码示例:

 

const std::string device = "CPU";  // GPU, NPU can be used as well


    ov::AdapterConfig adapter_config;
    // Multiple LoRA adapters applied simultaneously are supported, parse them all and corresponding alphas from cmd parameters:
    for(size_t i = 0; i < (argc - 3)/2; ++i) {
        ov::Adapter adapter(argv[3 + 2*i]);
        float alpha = std::atof(argv[3 + 2*i + 1]);
        adapter_config.add(adapter, alpha);
    }


    // LoRA adapters passed to the constructor will be activated by default in next generates
    ov::Text2ImagePipeline pipe(models_path, device, ov::adapters(adapter_config));


    std::cout << "Generating image with LoRA adapters applied, resulting image will be in lora.bmp
";
    ov::Tensor image = pipe.generate(prompt,
        ov::make_shared(42)),
        ov::width(512),
        ov::height(896),
        ov::num_inference_steps(20));
    imwrite("lora.bmp", image, true);

 

关于使用 C++ 构建 LoRA 文本生成图像 应用的详细指南,请查看此处。

小结

我们演示了如何使用 OpenVINO GenAI 通过文本提示词结合多个 LoRA 适配器 进行图像生成。借助提供的工具和代码,无论你偏好哪种编程语言,都能轻松上手。

你还可以通过 OpenVINO Notebook (https://github.com/openvinotoolkit/openvino_notebooks/tree/latest/notebooks/multilora-image-generation)体验 OpenVINO GenAI 的多 LoRA 适配器图像生成,运行效果如下:

 

欢迎尝试修改示例代码,并调整以下生成参数,探索更多可能性:

更改生成图像的宽度或高度

为同一提示词生成多张图片

调整推理步数,以优化生成质量和速度

调节引导尺度(Guidance Scale),影响生成结果的遵从度(了解更多详情)

(适用于 SD 1.x 和 2.x)当引导尺度 >1 时,添加 负向提示词 以优化生成效果

结合多个 LoRA 适配器,并调整混合系数,实现个性化风格融合

使用 OpenVINO GenAI,这一切都变得简单高效!快来试试吧!

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分