Stable Diffusion 迁移和部署

news2024/11/23 7:27:45

文章目录

    • 1. 模型概述
    • 2. 模型架构
    • 3. 模型迁移流程
      • 3.1 前置准备
      • 3.2 CLIP text encoder
      • 3.3 VQ-VAE (fp16)
      • 3.4 Text conditioned unet
      • 3.5 创建pipeline
      • 3.6 web demo部署
    • 4. 效果展示
    • 5. 相关链接

此实验需要最新的sdk实现模型的迁移,最终在1684X上进行推理。

代码地址为:
http://219.142.246.77:65000/sharing/sgZNjWcYK

1. 模型概述

Stable Diffusion 是一个文本生成图像的模型,它是基于 Diffusion 模型的一个变体,Diffusion 模型是一个基于随机游走的生成模型,它可以生成高质量的图像。Stable Diffusion 模型在 Diffusion 模型的基础上,通过引入稳定性约束,使得生成的图像更加稳定,更加逼近真实图像。

2. 模型架构

Stable Diffusion 模型的架构如下图所示:
请添加图片描述

模型由3部分组成:

  1. CLIP text encoder: 处理文本的输入,得到语义特征
  2. Text conditioned unet: 通过逆扩散过程,得到图像的特征
  3. VQ-VAE : 通过Auto-Encoder的方式,得到图像的重构以及图像的latent space vector

3. 模型迁移流程

3.1 前置准备

  1. 安装必要的库 pip install diffusers==0.2.4 transformers scipy ftfy
from diffusers import StableDiffusionPipeline

# get your token at https://huggingface.co/settings/tokens
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=YOUR_TOKEN)

prompt = "a photograph of an astronaut riding a horse" #输入文本
image = pipe(prompt)["sample"][0] #得到生成的图片

由此可以从huggingface下载预训练模型

请添加图片描述

原始仓库提供了多个版本

请添加图片描述

下载的模型会在.cache里面

请添加图片描述

stable diffusion 模型由4个模型构成,需要迁移4个模型:

3.2 CLIP text encoder

可以直接使用官网上的onnx模型进行推理:

直接迁移 CLIP 中的 TextEncoder 模型。
需要注意的是: TextEncoder 模型的输入是一个文本token序列,token是从0开始的整数,对应在设置模型的描述时添加数据类型的声明。

转换脚本是:

python3 -m bmneto --model=./text_encoder.onnx \
                  --outdir="./" \
                  --target="BM1684" \
                  --shapes="1,77" \
                  --opt=1 \
                  --cmp=false \
                  --net_name="text_encoder" \
                  --descs="[0,int64,0,49409]"

3.3 VQ-VAE (fp16)

VAE decoder onnx 无法使用bmneto转换, 因此本次采用的是 PyTorch 的方式:

import torch
from diffusers import StableDiffusionPipeline

pipe = StableDiffusionPipeline.from_pretrained("/mnt/sdb/wangyang.zuo/.cache/huggingface/diffusers/CompVis--stable-diffusion-v1-4.main.7c3034b58f838791fc1c581d435c452ea80af274")

def fn(input_tensor): # 构造输入函数 
    with torch.no_grad():
        return pipe.vae.decode(input_tensor)
    
jitmodel = torch.jit.trace(fn, torch.rand(1,4,64,64))
jitmodel.save("vae_decoder.pt")

转换命令


export BMCOMPILER_LAYER_DTYPE_MODE=auto
export GLOG_v=4
export BMCOMPILER_STAT_ERR=1

python3 -m bmnetp   --model=./vae_decoder.pt \
                    --outdir="./" \
                    --target="BM1684" \
                    --shapes="1,4,64,64" \
                    --net_name="vae_decoder" \
                    --opt=2 \
                    --cmp=false 

encoder 也可以采用类似的方式进行转换。

3.4 Text conditioned unet

这个模型较大,得到的jit模型有3.4G,首先需要注意的是,模型是多输入,其输入顺序如源码所示:

请添加图片描述

通过构造输入,得到jit模型, 其中各个输入信息如下:

timestep 1
latent_model_input.shape
(2, 4, 64, 64)
text_embeddings.shape
(2, 77, 768)

通过调试可以指导timestep的初始值为999, 因此timestep 为 torch.tensor(999).

查看源码可以看到,
请添加图片描述

继续查看源码,发现只有这一处出现了boardcast_to算子, 而且是在网络前半部分出现的,只于timestamp有关,其作用时将timestemp的维度改为输入的batch维度. 因此,此算子可以抽离出来,将其转化为预处理, 因此修改源码为:

请添加图片描述

另外U-Net模型的输出是一个dict,我们将其修改为输出tensor

请添加图片描述

通过trace得到jit模型,转换命令如下:

export BMCOMPILER_LAYER_DTYPE_MODE=auto
export GLOG_v=4
export BMCOMPILER_STAT_ERR=1
import bmnetp
## compile fp32 model
bmnetp.compile(
  model = "./unet/unet_jit_remove_pickle_error.pt",        ## Necessary
  outdir = "./compilation5",                 ## Necessary
  target = "BM1684X",              ## Necessary
  shapes = [[2,4,64,64], [2], [2,77,768]],  ## Necessary
  net_name = "unet2",              ## Necessary
  opt = 0,                        
  dyn = False,                    
  cmp = True,                     ## optional, if not set, default equal to True
  enable_profile = False,           ## optional, if not set, default equal to False
  desc="[1,int64,0,100]", # 额外添加的参数  
)

3.5 创建pipeline

使用 sophon sail 加载模型创建pipeline。
通过 python3 demo_with_bmodel.py --prompt "portrait photo of a asia old warrior chief, tribal panther make up, blue on red, side profile, looking away, serious eyes, 50mm portrait photography, hard rim lighting photography–beta –ar 2:3 –beta –upbeta –upbeta, 4k" --num-inference-steps 32 进行测试。

可以得到如下图:

请添加图片描述

注意生成的图具有随机性,需要固定seed才能得到一摸一样的图。

3.6 web demo部署

运行 streamlit run demo_web.py 启动web服务,通过浏览器访问 http://localhost:8501 可以看到如下界面:

请添加图片描述

通过在输入框中输入文本描述,可以得到相应的图像,由于生成的图具有随机性,可能需要多次尝试才能得到一个比较好的结果。模型推理时间与输入文本长度无关,与 num_inference_steps 有关,其值越大,生成的图像越清晰,但是推理时间也越长。 注意根据diffusion原理,num_inference_steps不应太小,建议最少大于10.

4. 效果展示

请添加图片描述

5. 相关链接

样例开源仓库:https://github.com/sophon-ai-algo/examples

BM1684 BMNNSDK文档:https://developer.sophgo.com/site/index/document/6/all.html

编译工具用户开发手册: https://doc.sophgo.com/docs/2.7.0/docs_latest_release/nntc/html/index.html

量化工具用户开发手册:https://doc.sophgo.com/docs/2.7.0/docs_latest_release/calibration-tools/html/index.html

算能量化工具介绍及使用说明:https://www.bilibili.com/video/BV1DA4y1S75p?spm_id_from=333.999.0

官网视频教程:https://developer.sophgo.com/site/index/course/all/all.html

官网文档中心:https://developer.sophgo.com/site/index/document/all/all.html

官网下载中心:https://developer.sophgo.com/site/index/material/all/all.html

官网论坛:https://developer.sophgo.com/forum/view/43.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysqldumpslow和mysqldumpslow

mysqldumpslow 这是一款mysql自带的慢查询工具,个人使用下来发现,可以满足在很多慢日志中找到有问题的慢的sql,并且可以进行sql排序。属于一种短小精干的工具。 命令大概形式: slowlog是需要分析的日志 mysqldumpslow -s c -t 1…

rocketmq源码-consumer启动

前言 这篇笔记记录consumer启动的逻辑 consumer主要是负责去broker中拉取消息,然后将拉取到的消息,交给消费者去处理 consumer本质上也是一个netty客户端,所以,在启动的时候,和producer有很多相似的点,但是…

[ vulhub漏洞复现篇 ] struts2远程代码执行漏洞s2-052(CVE-2017-9805)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

[附源码]Node.js计算机毕业设计高校国防教育管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

基于java+springboot+mybatis+vue+mysql的结合疫情情况的婚恋系统

项目介绍 现实生活中,很多年轻人的社交圈实际上很狭窄,一方面,多元化的社交方式太少了,另一方面,都市人繁忙的生活又让他们很少有空闲去体验传统交友方式,而网络的快捷和多元化恰恰提供了一个好的交友起点…

Blazor组件自做十三: VideoPlayer 视频播放器

Video.js 是一个具有大量功能的流行的视频和音频 JavaScript 库,今天我们试试集成到 Blazor . Blazor VideoPlayer 视频播放器 组件 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VwxxYiKn-1671068849666)(null)] 示例 https://blazor.app1.es/v…

为什么现代企业的ERP系统必须具备CRM?

各行各业的企业都依赖ERP系统和客户关系管理 (CRM) 系统来简化业务运营。企业的销售和运营信息必须实时联系起来;否则,企业的客户活动在现代社会就会变得缓慢或没有效率。 以下业务对象通常被映射在用于销售的CRM系统和用于运营的ERP系统之间&#xff0…

【Processing】我给网友 “战场小包” 做了他的 “自画像”.

前言 突然疫情放开了,在掘金里认识的一个掘友(战场小包),突然今天找我。 :寻思啥事呢,原来找我做个自画像。 :行!没问题! :结果等半天(一晚上到今…

rocketmq源码-broker处理consumer拉取消息请求

前言 在前面consumer拉取消息的博客中,有说过,对于consumer,在拉取消息的时候,是需要指定code码的,在consumer去broker拉取消息的时候,指定的code码是:PULL_MESSAGE,所以这篇博客&a…

[附源码]Nodejs计算机毕业设计基于的婚恋系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

APISIX Ingress 如何支持自定义插件

摘要:本篇主要介绍了 Ingress 资源相关的语义,以及如何对 Ingress 资源进行能力的扩展。 作者:张晋涛,API7.ai 云原生技术专家,Apache APISIX PMC 成员,Apache APISIX Ingress Controller 项目维护者。 Ing…

基于C++ 实现简易图书管理系统【100010046】

图书管理系统 基于 C 实现简易图书管理系统 该项目是在学习完 C 语言后,独立完成设计开发的简易图书管理系统 设计的基本要求 基本完成对图书系统的设计,包含基本的功能,无界面设计。 要有明显的分类,对不同的进入者有不同的…

机器学习算法原理归纳总结:回归、聚类、支持向量、推荐、降维与神经网络

机器学习算法原理归纳总结:回归、聚类、支持向量、推荐、降维与神经网络 本文重点参考:唐宇迪博士的课程PPT [特别鸣谢] 完整版资料下载:机器学习算法原理详解代码实战 1.回归算法 2.逻辑回归 3.决策树 决策树实际上是根据样本的特征个数对样…

汇编语言第二章:寄存器

2. 寄存器 寄存器进行信息的存储,对于汇编程序员来说,CPU 中的主要部件是寄存器。8086CPU 有 14 个寄存器,这些寄存器分别是: AX BX CX DX SI DI SP BP IP CS SS DS ES PSW通用寄存器 8086所有的寄存器都是 16 位的&#xff0c…

Android Rust JNI系列教程(二) 创建第一个Rust JNI项目

前言 提到JNI,大家都会想到C,C.不过如今rust又给我们增加了一个选项,借助rust的jni库(https://github.com/jni-rs/jni-rs),我们可以很方便的使Android与rust交互.从本章起,我们将逐步地了解使用rust实现一些经典的jni方法. 创建Rust项目 创建工程 在命令行输入命令: cargo…

超算/先进计算的发展与应用是什么?

经过近十年的快速发展,我国在超算领域的实力已达到世界先进水平。1993年,我国第一台高性能计算机“曙光一号并行机”研制成功,打破了国外IT巨头对我国超算技术的垄断。 自此,我国不断加快超级计算机研制步伐。从全球超级计算机TO…

精华推荐 | 【MySQL技术专题】「主从同步架构」全面详细透析MySQL的三种主从复制(Replication)机制的原理和实战开发(原理+实战)

前提概要 随着应用业务数据不断的增大,应用的响应速度不断下降,在检测过程中我们不难发现大多数的请求都是查询操作。此时,我们可以将数据库扩展成主从复制模式,将读操作和写操作分离开来,多台数据库分摊请求&#xff…

NEUQACM双周赛(三)

目录7-1 打字(C)题目描述:输入格式:输出格式:输入样例1:输出样例1:输入样例2:输出样例2:解题思路:7-2 分香肠(C,最大公约数)题目描述:输入格式:输出格式:输入样例:输出样例:解题思路…

节能降耗 | AIRIOT智慧电力综合管理解决方案

电力技术的发展推动各行各业的生产力,与此同时,企业中高能耗设备的应用以及输配电过程中的电能损耗,也在一定程度上加剧了电能供应压力。以工业制造业为例,企业的管理水平、能耗结构、生产组织方式都关系到能源的有效利用率&#…

电子招投标系统nodejs+vue+elementui

前端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install产生) 这文件夹就是在创建完项目后,cd到项目目录执行npm install后生成的文件夹,下载了项目需要的依赖项。 2、packag…