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

简介: 通过文章 数据缓存系列分享(一):打开大模型应用的另一种方式 我们了解ECI数据缓在使用体验、性能等方面相比于NAS、OSS存储方式的优劣。本文将继续结合实际场景 StableDiffusion 应用讲解数据缓存在大模型方面所带来的极致体验。值得一提的是,即便是对于没有任何准备、零算法基础、零大模型背景知识的开发者也可以轻松地通过ECI API在短短的23秒的时间内就可以搭建一个完整的StableDiffusion应用。

前言

通过文章 数据缓存系列分享(一):打开大模型应用的另一种方式 我们了解了ECI的数据缓在使用体验、性能等方面相比于NAS、OSS存储方式的优劣。本文将继续结合实际场景 StableDiffusion 应用讲解数据缓存在大模型应用弹性场景所带来的加速效果。值得一提的是,即便是对于没有任何准备、零算法基础、零大模型背景知识的开发者也可以轻松地通过ECI openAPI在短短的23秒的时间内就可以搭建一个完整的StableDiffusion应用。

第一步:创建模型缓存(422ms)

我们使用的模型是 stabilityai/stable-diffusion-2-1模型文件总大约为40GB,也可以选择其他的模型或者版本。

截屏2023-11-24 下午10.39.04.png

repoSource:HuggingFace/Model

repoId: stabilityai/stable-diffusion-2-1

然后通过 数据缓存控制台 直接创建,也可以通过k8s CRD或者阿里云openapi,本样例就直接控制台的方式演示。考虑到huggingface目前网络的稳定性,可以选择香港创建,缓存支持跨地域拷贝。

全部创建参数如下:

截屏2023-11-24 下午5.58.33.png

更多API参数说明可以参考:https://help.aliyun.com/document_detail/2412236.html

k8s用户可以参考文档:https://help.aliyun.com/document_detail/2412299.html

后端制作时间统计:

ef3fb8d8-9681-4ab1-bfae-3b8a6cd0bdbc.png

后端只用了179ms的时间就缓存完成了,加上同步的API请求耗时243ms,这个大模型的缓存合计422ms制作完成。


第二步:准备运行环境(0s)

容器场景就是镜像制作,需要包含stable-diffusion运行所需的环境,比如cuda、transformers库,以及其他的基础依赖等。

ECI已经构建了一个能够运行大多数模型的稳定的环境:

gpu通用版:registry.cn-hangzhou.aliyuncs.com/eci_open/ubuntu:cuda11.7.1-cudnn8-ubuntu20.04

cpu通用版:registry.cn-hangzhou.aliyuncs.com/eci_open/ubuntu:hf-ubuntu20.04

gpu stable-diffusion版:registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion:1.0.0

如果应用没有特殊依赖可以直接使用,该步剩余内容可以直接跳过

构建镜像的完整的Dockerfile如下:

FROM nvidia/cuda:11.7.1-cudnn8-runtime-ubuntu20.04
LABEL maintainer="Alibaba Cloud Serverless Container"RUN apt update && \
    apt install -y bash \
                   vim \
                   build-essential \
                   git \
                   git-lfs \
                   curl \
                   ca-certificates \
                   libsndfile1-dev \
                   libgl1 \
                   python3.8 \
                   python3-pip \
                   python3.8-venv && \
    rm -rf /var/lib/apt/lists
# make sure to use venvRUN python3 -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"RUN mkdir -p /workspace/pic/
WORKDIR /workspace
COPY http-server.py http-server.py
RUN python3 -m pip install --no-cache-dir --upgrade pip && \
    python3 -m pip install --no-cache-dir \
        torch \
        torchvision \
        torchaudio \
        invisible_watermark && \
    python3 -m pip install --no-cache-dir \
        accelerate \
        datasets \
        hf-doc-builder \
        huggingface-hub \
        Jinja2 \
        librosa \
        numpy \
        scipy \
        tensorboard \
        transformers \
        omegaconf \
        pytorch-lightning \
        xformers \
        safetensors \
        diffusers
CMD ["/bin/bash"]

因为这个运行环境依赖部分都比较通用,所以ECI直接做成了公共base镜像并做了公共缓存,所有用户都无需自己制作和拉取。

其中会用到的http服务脚本如下:

importsysimportosimporthashlibimporttorchfromdiffusersimportStableDiffusionPipeline, DPMSolverMultistepSchedulerfromhttp.serverimportBaseHTTPRequestHandlerfromhttp.serverimportHTTPServerfromurllibimportparsefromurllib.parseimporturlparse, parse_qsMODEL_DIR_NEV="MODEL_DIR"APP_PORT_ENV="APP_PORT"deftext2image(input) :
model_id=os.getenv(MODEL_DIR_NEV, default="/data/model/")
pipe=StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
pipe.scheduler=DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
pipe=pipe.to("cuda")
image=pipe(input).images[0]
name="/workspace/pic/"+hashlib.md5(input.encode('utf8')).hexdigest() +".png"image.save(name)
returnnameclassGetHandler(BaseHTTPRequestHandler):
defdo_GET(self):
query=parse_qs(urlparse(self.path).query)
# 获取参数值input=query.get('input')[0]
print("get user input:%s, try generate image"%input)
picName=text2image(input)
# 构造响应self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(bytes("<html><head><title>Stable Diffusion</title></head>", "utf-8"))
self.wfile.write(bytes("<body><p>Success generate image:%s</p>"%picName, "utf-8"))
self.wfile.write(bytes("</body></html>", "utf-8"))

注:

1、应用端口号默认为8888,以及模型存放目录默认为/data/model/,用户可以通过容器的env进行自定义。


第三步:应用部署(22s)

部署到ECI(GPU通用版)

准备好了环境就可以直接部署应用了,主要包含容器运行所需的资源创建、GPU驱动安装、大模型缓存的加载等。本样例继续以控制台操作参考。

选择GPU规格

截屏2023-11-24 下午11.09.49.png

选择推理镜像

所有地域都可以直接指定:registry.cn-hangzhou.aliyuncs.com/eci_open/ubuntu

镜像版本:cuda11.7.1-cudnn8-ubuntu20.04

启动命令:启动http server的脚本

截屏2023-11-24 下午11.09.58.png


选择模型缓存

选择刚刚创建好的模型缓存,将模型挂载进容器的/data/model/目录

截屏2023-11-24 下午11.10.23.png

开放公网访问(如果需要)

截屏2023-11-27 上午10.16.22.png

注:

1、比较重要的几个参数:推理所需要的容器镜像、挂载模型缓存、以及GPU规格提升推理速度。

2、该版本应用是GPU版,CPU也支持,只需要使用ECI提供的CPU环境镜像即可,其他的没有区别,应用启动会比GPU版本快很多,但是推理会非常慢。

3、如果使用公网ip访问应用,需要检查安全组规格是否放开8888端口。

应用启动端到端耗时22s:

3eca66d5-7e9b-4585-94b7-bad328f05141.png

至此,应用依赖的所有资源都已经ready,http服务完成启动。


第四步:测试

http://localhost:8888/?input=__________________________________________

输入(文本)

输出(图片)

A clear crystal sphere is suspended on the calm sea surface, reflecting the sky at sunset,super detailed, artistic, 8K wallpaper, HDR,high quality

00054-519685.png

A photo of a barbie girl in a barbie world, smile,the whole body photograph, super detailed, artistic, 8K wallpaper, HDR,high quality,brown long hair

00069-578579.png

A lake beside a high mountain, at dusk, artistic, high quality,HDR

00047-6596454.png

A photo of clear natural scenery with high snow capped mountains, green grasslands, river, sheep herds,artistic, high quality, HDR

00011-8948634.png

An oil painting in the style of Van Gogh, shot at dusk in autumn in the Netherlands, in the picture there are farmland, blue sky, and children playing, two boys and two girls

038cdab123e900ae45a2c1c8b37e3724.png

A painting is more than the sum of its parts. A cow by itself is just a cow. A meadow by itself is just grass, flowers. And the sun peeking through the trees is just a beam of light. But you put them all together and it can be magic

c21656aee1ab56bf08886ea303b19e33.png

注:

本应用生成的图片默认都在/workspace/pic/目录,如果想要支持浏览器直接查看,可以开启http服务,例如:

python3 -m http.server 9999 --directory /workspace/pic/ &,然后就可以在浏览器http://localhost:9999直接查看了。


扩展

stable-diffusion优秀的模型非常之多,我们想要的模型基本都能找到,而且很多都可以直接使用或者试用,比如 https://huggingface.co/https://openai.wiki/lora-model-part-3.htmlhttps://civitai.com/

截屏2023-08-03 下午4.53.03.png

如果觉得前面http请求方式体验不是很好,ECI也提供了打包好的支持webui的公共镜像:

registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion:1.0.0,已经全地域做了缓存,可以直接使用。

本样例选择了一个亚洲人像绘画比较精致的模型hanafuusen2001/BeautyProMix来展示通过模型缓存搭建SD webUI。

创建模型缓存

模型缓存创建流程和步骤1基本相同:

截屏2023-11-27 上午10.12.14.png

部署SD webUI(控制台方式)

创建好模型缓存后就可以用步骤2相同的流程启动应用。

选择GPU规格

ecs.gn7i-c8g1.2xlarge

截屏2023-11-27 上午10.15.21.png

选择SD标准镜像

镜像仓库:registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion

镜像版本:1.0.0

应用启动命令已经内置无需设置

截屏2023-11-27 上午10.25.57.png

选择SD模型缓存

将前面创建好的SD模型挂载进容器的目录/stable-diffusion-webui/models/Stable-diffusion/

截屏2023-11-27 上午10.16.08.png

开放公网访问(如果需要)

截屏2023-11-27 上午10.16.22.png

部署SD webUI(k8s api方式)

本样例还提供了完整的k8s pod创建参数参考:

{
"metadata": {
"annotations": {
"k8s.aliyun.com/eci-image-cache": "true",
"k8s.aliyun.com/eci-use-specs": "ecs.gn7i-c8g1.2xlarge",
"k8s.aliyun.com/eci-data-cache-bucket": "huggingFace-model"        },
"name": "stable-diffusion",
"namespace": "default"    },
"spec": {
"containers": [
            {
"image": "registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion:1.0.0",
"imagePullPolicy": "IfNotPresent",
"name": "stable-diffusion",
"resources": {
"requests": {
"nvidia.com/gpu": "1"                    }
                },
"volumeMounts": [
                    {
"mountPath": "/stable-diffusion-webui/models/Stable-diffusion/",
"name": "model"                    }
                ]
            }
        ],
"restartPolicy": "Never",
"volumes": [
            {
"hostPath": {
"path": "/models/huggingFace/hanafuusen2001/BeautyProMix/"                },
"name": "model"            }
        ]
    }
}

注:

1、该镜像对于stable-diffusion模型是通用的,只需将创建好的任意模型缓存挂载进/stable-diffusion-webui/models/Stable-diffusion/目录即可使用不同的模型。

2、如果使用公网ip访问webUI,需要检查安全组规格是否放开8888端口。


通过ip:8888就可以访问stable-diffusion的web界面,操作起来更直观:

截屏2023-08-03 下午5.32.41.png

00000-2.png00054-3712145407.png

这是我用这个模型画的几幅画,细节处理的很好。


总结

ECI数据缓存在大模型场景主打的就是启动快,正如上一篇文章所提到的,借助数据缓存把大模型从应用镜像里剥离出来后,应用部署也敏捷了很多。目前的数据缓存可以很好的解决一些通用的模型仓库,比如huggingface、modelscope等,模型加载加速的问题,而针对已有的NAS、OSS等存储的模型源,除了ECI的数据缓存,还可以选择开源的Fluid加速方式。

大模型应用启动快还可以带来什么?最显而易见的就是成本的下降和弹性的提升。如果部署一个应用耗时非常久,流程非常冗长,开发者会选择持有资源来部署,牺牲弹性,付出更多的成本。

ECI不是专业的模型平台,关于模型调优和应用给不了更多的建议,但是作为IaaS服务,就是让开发者更好地集成云的基础能力,解决大模型应用部署,尤其是Serverless化后所遇到的挑战。ECI已经能把一个大模型的应用冷启动时间压缩到20s的级别,而且还在持续优化GPU应用的启动以及大模型的极速加载,ECI的目标就是让大模型应用也能在阿里云上弹起来。


QA

1、模型缓存制作失败,提示网络不通或者模型不存在?

如果是在非香港地域以及海外地域,huggingface网络很不稳定,缓存失败的概率很高,建议更换地域缓存,然后走缓存拷贝流程。

截屏2023-11-27 上午11.05.12.png

2、缓存制作卡了很久

对于常用的模型,或者使用过的公共模型都会有预热缓存,缓存会比较快,如果卡了很久,点击制作任务检查下日志是否正常拉取模型中。如果是,说明该缓存是第一次使用,耐心等待。

截屏2023-11-27 上午10.47.02.png

3、缓存制作卡了很久,最后还是失败了

模型缓存默认空间只有20GB,如果是非常大的模型,需要根据模型大小设置缓存空空间。

4、通过公网访问不通

检查下容器的状态或者日志,看是否正常启动。然后检查下安全组规格是否放开这个端口。

5、可以使用其他的模型吗?

可以。模型缓存是通用的,任何模型源的模型都可以支持缓存,不限于样例使用的这些模型。

6、出图报错,错误日志提示OOM

更换更大的规格,显存过小或者图片过大会容易OOM。


附录

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

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

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

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

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

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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
493 1
|
7月前
|
Web App开发 存储 缓存
如何精准清除特定类型或标签的缓存数据?
如何精准清除特定类型或标签的缓存数据?
575 57
|
9月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
6月前
|
存储 缓存 监控
一次缓存引发的文件系统数据不一致问题排查与深度解析
本文详述了一次由自研分布式文件系统客户端 EFC 的缓存架构更新所引发的严重数据不一致问题的完整排查过程。
一次缓存引发的文件系统数据不一致问题排查与深度解析
|
9月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
300 32
|
11月前
|
机器学习/深度学习 人工智能 缓存
MHA2MLA:0.3%数据微调!复旦团队开源推理加速神器,KV缓存狂降96.87%
MHA2MLA是复旦大学、华东师范大学、上海AI Lab等机构联合推出的数据高效微调方法,通过引入多头潜在注意力机制(MLA),显著优化基于Transformer的LLM推理效率,降低推理成本。
423 1
MHA2MLA:0.3%数据微调!复旦团队开源推理加速神器,KV缓存狂降96.87%
|
缓存 监控 前端开发
处理页面缓存中数据不一致的问题
【10月更文挑战第9天】
500 122
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
281 5
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
消息中间件 缓存 NoSQL
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
306 2

热门文章

最新文章