数据缓存系列分享(三):通过 StableDiffusion 扩展插件实现网红爆款文字光影图

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
简介: 在文章《23秒完成从零开始搭建StableDiffusion》中我们详细讲解了通过ECI的数据缓存快速搭建StableDiffusion应用,用户通过模型网站选择好自己需要的模型,然后创建ECI数据缓存,即可快速部署自己的StableDiffusion应用。本文将基于StableDiffusion + 扩展插件 ControlNet 来完成实现网红爆款文字光影图

背景

最近网上流行各种文字光影图,即在图片中非常巧妙的融入一些自定义的文字,非常炫酷,本来将分享如何通过StableDiffusion + 扩展插件的方式量产这种类型的图片。

StableDiffusion 扩展插件

在文章 23秒完成从零开始搭建StableDiffusion 中我们详细讲解了通过ECI的数据缓存快速搭建StableDiffusion应用,用户通过模型网站选择好自己需要的模型,然后创建ECI数据缓存,即可快速部署自己的StableDiffusion应用。

其实StableDiffusion的应用还支持扩展插件的方式来丰富绘图功能:

cdcbf3e1-4add-499e-82f4-b19cfe1a8584.png

前面提到的这些网络上流传的炫酷的文字图都是基于StableDiffusion + 扩展插件 ControlNet来完成的。

ECI提供的StableDiffusion标准镜像已经集成了ControlNet插件,用户无需再手动通过webui安装、下载新模型、重启应用等复杂流程,直接可以开箱即用。

StableDiffusion 模型选择

StableDiffusion模型与StableDiffusion应用是解耦的,可以自由选择任何标准的绘图模型。本文继续使用前文中使用的模型,即 hanafuusen2001/BeautyProMix,其他绘图模型也可以,比如比较常用的模型有:

casque/beautifulRealistic_v60

XpucT/Deliberate

Lykon/DreamShaper

cyberdelia/CyberRealistic

hanafuusen2001/ReVAnimated

digiplay/MeinaMix_v11

等,更多模型可以在 https://huggingface.co/https://civitai.com/ 上了解。

ControlNet 模型选择

同样,ControlNet模型与ControlNet 也是解耦的,本样例的光影文字效果会选择用模型 ioclab/ioc-controlnet



准备模型

分别创建前面提到的两个模型缓存,移步控制台

hanafuusen2001/BeautyProMix:(前文已经创建过,可以无需创建)

bucket: huggingFace-model

bucket path: /models/huggingface-model/hanafuusen2001/BeautyProMix

repoId: hanafuusen2001/BeautyProMix

repoSource: HuggingFace/Model

a0edffe3-e3dd-430e-9975-a1c1e08d5f20.png

ioclab/ioc-controlnet:

bucket: huggingFace-model

bucket path: /models/huggingface-model/ioclab/ioc-controlnet

repoId: ioclab/ioc-controlnet

repoSource: HuggingFace/Model

06326c28-ba61-4e5c-aaa3-5d66f23a860b.png



更多关于数据缓存的介绍可以参考:

openAPI:https://help.aliyun.com/document_detail/2391452.html

k8s AP:https://help.aliyun.com/document_detail/2412299.html

部署ECI

1、使用ECI已经制作好的镜像:registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion:1.0.1

2、hanafuusen2001/BeautyProMix 模型挂载到/stable-diffusion-webui/models/Stable-diffusion/目录,ioclab/ioc-controlnet 模型挂载到/stable-diffusion-webui/extensions/sd-webui-controlnet/models/目录,如果想替换成其他模型也只需挂载进对应的目录即可。

k8s api 参考:

{
"metadata": {
"annotations": {
"k8s.aliyun.com/eci-image-cache": "true",
"k8s.aliyun.com/eci-with-eip": "true",
"k8s.aliyun.com/eci-use-specs": "ecs.gn7i-c8g1.2xlarge",
"k8s.aliyun.com/eci-data-cache-bucket": "huggingFace-model",
        },
"name": "sd-webui",
"namespace": "default"    },
"spec": {
"containers": [
            {
"args": [
"-c",
"python3 launch.py --listen --skip-torch-cuda-test --port 8888 --no-half"                ],
"command": [
"/bin/sh"                ],
"image": "registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion:1.0.1",
"imagePullPolicy": "IfNotPresent",
"name": "sd-webui",
"resources": {
"requests": {
"nvidia.com/gpu": "1"                    }
                },
"volumeMounts": [
                    {
"mountPath": "/stable-diffusion-webui/models/Stable-diffusion/",
"name": "model"                    },
                    {
"mountPath": "/stable-diffusion-webui/extensions/sd-webui-controlnet/models/",
"name": "model2"                    }
                ]
            }
        ],
"restartPolicy": "Never",
"volumes": [
            {
"hostPath": {
"path": "/models/huggingFace-model/hanafuusen2001/BeautyProMix"                },
"name": "model"            },
            {
"hostPath": {
"path": "/models/huggingFace-model/ioclab/ioc-controlnet"                },
"name": "model2"            }
        ]
    }

阿里云openAPI 参考:

publicclassEciApi {
privateCreateContainerGroupResponsecreateEci() throwsClientException {
CreateContainerGroupRequestrequest=newCreateContainerGroupRequest();
request.setRegionId(RG);
request.setSecurityGroupId(getSg());
request.setVSwitchId(getVsw());
request.setContainerGroupName("sd-webui");
request.setInstanceType("ecs.gn7i-c8g1.2xlarge");
request.setAutoCreateEip(true);
request.setDataCacheBucket("huggingFace-model");
CreateContainerGroupRequest.Containercontainer=newCreateContainerGroupRequest.Container();
container.setName("sd-webui");
container.setImage("registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion:1.0.1");
container.setGpu(1);
container.setCommands(Arrays.asList("/bin/sh"));
container.setArgs(Arrays.asList("-c", "python3 launch.py --listen --skip-torch-cuda-test --port 8888 --no-half"));
CreateContainerGroupRequest.Container.VolumeMountvolumeMount=newCreateContainerGroupRequest.Container.VolumeMount();
volumeMount.setName("model");
volumeMount.setMountPath("/stable-diffusion-webui/models/Stable-diffusion/");
CreateContainerGroupRequest.Container.VolumeMountvolumeMount2=newCreateContainerGroupRequest.Container.VolumeMount();
volumeMount2.setName("model2");
volumeMount2.setMountPath("/stable-diffusion-webui/extensions/sd-webui-controlnet/models/");
container.setVolumeMounts(Arrays.asList(volumeMount, volumeMount2));
request.setContainers(Arrays.asList(container));
CreateContainerGroupRequest.Volumevolume=newCreateContainerGroupRequest.Volume();
volume.setName("model");
volume.setType("HostPathVolume");
volume.setHostPathVolumePath("/models/huggingFace-model/hanafuusen2001/BeautyProMix");
CreateContainerGroupRequest.Volumevolume2=newCreateContainerGroupRequest.Volume();
volume2.setName("model2");
volume2.setType("HostPathVolume");
volume2.setHostPathVolumePath("/models/huggingFace-model/ioclab/ioc-controlnet");
request.setVolumes(Arrays.asList(volume, volume2));
returnPopHelper.getAcsResponse(client, request);
    }
}

SDK版本

<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-eci --><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-eci</artifactId><version>1.4.4</version></dependency>


控制台参考:

进入ECI售卖页

1、选择gpu规格

ecs.gn7i-c8g1.2xlarge

1f4d738a-5346-4413-8109-11e16ee51c77.png



2、选择stable-diffusion容器镜像

容器配置 -> 选择容器镜像 -> 常用镜像->stable-diffusion

如果是非杭州地域,直接填入镜像,效果是一样的。

registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion

版本:1.0.1

371ac612-8bb6-4d70-a7c3-38017f85022c.png

3、分别挂载两个模型缓存进容器

fb6ca570-fd08-48b7-99c0-9ebd28a966cd.png


4、打开公网(如果通过公网地址访问webui)

ce7ee247-92af-4509-adfb-06637c6bb73f.png


通过ip:8888就可以访问webui了

668c9290-5257-4fbc-bce5-e708cd07ce22.png

可以看到扩展插件已经自动安装好了,可以直接使用。


测试

1、选择img2img

2、正向咒语、反向咒语用法基本不变,根据自己的需求描述

3、上传文字照片(黑底白字)

da697b07-6f2f-44c0-a394-1a0d6fd52a60.png

点击展开下面的ControlNet

fb2d3b94-bba5-4d8a-8464-1922a0f28bf2.png

然后就可以生成图了:

01ac3d26-e986-4082-9d67-81ecbef3f6b8.png



基本参数说明:

Control Weight:ControlNet影响的比重。

Starting Control Step:ControlNet介入的时间,越早介入绘画自由发挥的空间就越小,文字就越明显。

Ending Control Step:ControlNet介入结束时间,结束越早融合的就越好,但也可能文字不明显。

CFG Scale:值越大创作空间越大,搭配Denoising strength使用。

Denoising strength:值越小CFG Scale的影响就越小,越接近原图。

基本没有经验值,不同的图和不同的光影搭配效果差异很大,根据实际出图结果可以自行根据需求进行微调。

其他样例

d571a7df-2b21-4305-954d-a35813e7a19d.pngd571a7df-2b21-4305-954d-a35813e7a19d.png

0092e7e2-2579-4d61-af63-03eea8dc4818.png0092e7e2-2579-4d61-af63-03eea8dc4818.png
3f5e40ed-271f-42dc-b6e8-21d21d585275.png
3f5e40ed-271f-42dc-b6e8-21d21d585275.png

9d3b4c8d-f883-4c45-ad66-7b13b615effc.png9d3b4c8d-f883-4c45-ad66-7b13b615effc.png

a2564904-0181-42bf-b187-3bb2028ad8ff.pnga2564904-0181-42bf-b187-3bb2028ad8ff.png

8d96336a-0909-4c15-aca1-711ff919c056.png


附录

数据缓存系列分享(一):打开大模型应用的另一种方式

数据缓存系列分享(二):23秒完成从零开始搭建StableDiffusion

数据缓存系列分享(三):通过 StableDiffusion 扩展插件实现网红爆款文字光影图

数据缓存系列分享(四):开源大语言模型通义千问快速体验

数据缓存系列分享(五):零代码搭建妙鸭相机

数据缓存系列分享(六):通义千问Qwen-14B大模型快速体验

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
6天前
|
存储 缓存 安全
Go 简单设计和实现可扩展、高性能的泛型本地缓存
本文将会探讨如何极简设计并实现一个可扩展、高性能的本地缓存。支持多样化的缓存策略,例如 最近最少使用(LRU)等。
73 0
Go 简单设计和实现可扩展、高性能的泛型本地缓存
|
6天前
|
存储 缓存 分布式计算
亿级数据如何分钟级别写入缓存?
亿级数据如何分钟级别写入缓存?
32 0
|
6天前
|
缓存 JavaScript
vue使用localStorage缓存数据
vue使用localStorage缓存数据
|
6天前
|
缓存 NoSQL 算法
17- 数据库有1000万数据 ,Redis只能缓存20w数据, 如何保证Redis中的数据都是热点数据 ?
保证Redis中的20w数据为热点数据,可以通过设置Redis的LFU(Least Frequently Used)淘汰策略。这样,当数据库有1000万数据而Redis仅能缓存20w时,LFU会自动移除使用频率最低的项,确保缓存中的数据是最常使用的。
68 8
|
1天前
|
消息中间件 缓存 监控
中间件如果缓存中存在所需的数据(缓存命中)
【5月更文挑战第12天】中间件如果缓存中存在所需的数据(缓存命中)
21 3
|
1天前
|
存储 缓存 监控
|
5天前
|
存储 缓存 JavaScript
vue中缓存页面数据(刷新不丢失)
vue中缓存页面数据(刷新不丢失)
|
6天前
|
存储 缓存 NoSQL
数据缓存,可以尝试用RocksDB了
`shigen`,一个专注于Java、Python、Vue和Shell的博主,探讨了为何在学习阿里云DRM产品时选择RocksDB而非Redis或Guava。RocksDB是一个高速、可配置的存储系统,适用于Flash和HDFS,支持数据压缩。与Redis相比,RocksDB在高速存储和灵活性上更具优势。在尝试使用RocksDB与SpringBoot集成时遇到问题,目前尚未解决。他还对比了RocksDB、Redis和Guava Cache的特性,强调RocksDB适合大规模、高性能场景,而Redis适合内存存储和实时性需求。
17 0
数据缓存,可以尝试用RocksDB了
|
6天前
|
XML 存储 缓存
Spring缓存是如何实现的?如何扩展使其支持过期删除功能?
总之,Spring的缓存抽象提供了一种方便的方式来实现缓存功能,并且可以与各种缓存提供商集成以支持不同的过期策略。您可以根据项目的具体需求选择适合的方式来配置和扩展Spring缓存功能。
19 0