# stablediffusion_mlu **Repository Path**: xiaoqi25478/stablediffusion_mlu ## Basic Information - **Project Name**: stablediffusion_mlu - **Description**: stablediffusion_mlu - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2023-07-17 - **Last Updated**: 2024-08-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # StableDiffusion_PyTorch ![readme_1.png](data/images/readme_1.png) ![readme_2.png](data/images/readme_2.png) MagicMind是面向寒武纪MLU的推理加速引擎。MagicMind能将AI框架(Tensorflow,PyTorch,ONNX 等)训练好的算法模型转换成MagicMind统一计算图表示,并提供端到端的模型优化、代码生成以及推理业务部署能力。本sample探讨如何使用将StableDiffusion网络的PyTorch模型转换为MagicMind模型,进而部署在寒武纪MLU板卡上。 ## 目录 - [StableDiffusion\_PyTorch](#stablediffusion_pytorch) - [目录](#目录) - [1.模型概述](#1模型概述) - [2.前提条件](#2前提条件) - [3.快速使用](#3快速使用) - [3.1 环境准备](#31-环境准备) - [3.2 下载仓库](#32-下载仓库) - [3.3 准备数据集和模型](#33-准备数据集和模型) - [3.4 编译 MagicMind 模型](#34-编译-magicmind-模型) - [3.5 执行推理](#35-执行推理) - [3.6 一键运行](#36-一键运行) - [4.高级说明](#4高级说明) - [4.1gen\_model 代码解释](#41gen_model-代码解释) - [4.2 infer\_python 高级说明](#42-infer_python-高级说明) - [5.效果展示](#5效果展示) - [6.免责声明](#6免责声明) ## 1.模型概述 - 本例使用的StableDiffusion实现代码来自github开源项目https://github.com/Stability-AI/stablediffusion.git 下面将展示如何将该项目中PyTorch实现的StableDiffusion模型转换为 MagicMind 的模型。 - StableDiffuison模型包含三个主要模块,UNet,AutoEncoderKL和CLIPEmbedder,目前仓库支持选择将UNet或者AutoEncoderKL使用MagicMind引擎来推理(暂不支持CLIPEmbedder),其余模块则使用寒武纪PyTorch来推理。通过use_mm_net,use_mm_ae,use_mm_clip控制是(true)否(false)使用。 ## 2.前提条件 - Linux 常见操作系统版本(如 Ubuntu16.04,Ubuntu18.04,CentOS7.x 等),安装 docker(>=v18.00.0)应用程序; - 服务器装配好寒武纪 300 系列及以上的智能加速卡,并安装好驱动(>=v4.20.6); - 若不具备以上软硬件条件,可前往寒武纪开发者社区申请试用; ## 3.快速使用 ### 3.1 环境准备 若基于寒武纪云平台环境可跳过该环节。否则需运行以下步骤: 1.请前往[寒武纪开发者社区](https://developer.cambricon.com/)下载 MagicMind(version >= 1.5.0)镜像,名字如下: magicmind_version_os.tar.gz, 例如 magicmind_1.0.1-1_ubuntu18.04.tar.gz 2.加载: ```bash docker load -i magicmind_version_os.tar.gz ``` 3.运行: ```bash docker run -it --shm_size 10G --name=dockername \ --network=host --cap-add=sys_ptrace \ -v /your/host/path/MagicMind:/MagicMind \ -v /usr/bin/cnmon:/usr/bin/cnmon \ --device=/dev/cambricon_dev0:/dev/cambricon_dev0 --device=/dev/cambricon_ctl \ -w /MagicMind/ magicmind_version_image_name:tag_name /bin/bash ``` ### 3.2 下载仓库 ```bash # 下载仓库 git clone https://gitee.com/xiaoqi25478/stablediffusion_mlu.git cd stablediffusion_mlu ``` 在开始运行代码前需要先检查 env.sh 里的环境变量,并且执行以下命令: ```bash source env.sh ``` ### 3.3 准备数据集和模型 - 下载数据集和模型 ```bash cd ${PROJ_ROOT_PATH}/export_model use_mm_unet=true use_mm_ae=true use_mm_clip=false bash run.sh ${use_mm_unet} ${use_mm_ae} ${use_mm_clip} ``` ### 3.4 编译 MagicMind 模型 ```bash precision=force_float16 dynamic_shape=false batch_size=4 use_mm_unet=true use_mm_ae=true use_mm_clip=false magicmind_model=${MODEL_PATH}/stablediffusion_pytorch_model_${precision}_${dynamic_shape} cd ${PROJ_ROOT_PATH}/gen_model bash run.sh ${magicmind_model} ${precision} ${batch_size} ${dynamic_shape} ${use_mm_unet} ${use_mm_ae} ${use_mm_clip} ``` ### 3.5 执行推理 infer_python ```bash cd ${PROJ_ROOT_PATH}/infer_python use_mm_unet=true use_mm_ae=true use_mm_clip=false magicmind_model=${MODEL_PATH}/stablediffusion_pytorch_model_${precision}_${dynamic_shape} bash run.sh ${magicmind_model} ${batch_size} ${use_mm_unet} ${use_mm_ae} ${use_mm_clip} 4 128 ``` 结果: ``` |--------------|-----------------| | Module | Average Latency | |--------------|-----------------| | CLIP | 0.02915746 s | | UNet | 22.57916540 s | | VAE | 0.53234990 s | |--------------|-----------------| | Pipeline | 23.14067276 s | |--------------|-----------------| ``` ### 3.6 一键运行 以上 3.3~3.5 的步骤也可以通过在仓库根目录下运行bash run.sh来实现一键执行 ## 4.高级说明 ### 4.1 gen_model 代码解释 本仓库使用寒武纪MagicMind推理引擎自带的Onnx_build工具来将StableDiffusion Onnx模型转换为StableDiffusion MagicMind 模型,转换脚本见gen_model/run.sh ### 4.2 infer_python 高级说明 本模型推理代码支持复用StableDiffusion框架,在StableDiffusion加入对magicmind backend的支持,代码见export_model/magicmind.patch。 本例通过调用StableDiffusion源码下scripts/txt2img.py来完成模型推理和精度计算 txt2img.py参数说明: txt2img.py参数说明: - from-file: prompt文件 - ckpt:torch预训练权重文件 - eval: config stablediffusion模型配置文件 - device : 运行设备选择 默认mlu - mm_model: MagicMind推理模型 - n_samples: batch_size - repeat:对输入prompt的重复推理次数,默认为1 run.sh参数说明: - precision : 目前仅支持force_float32和force_float16,vae在使用MM作为后端时,使用fp32可能存在精度问题。 - dynamic_shape : 是否可变,支持true和false,在可变情况性能会有所降低。 - batch_size : 因显存问题370X4仅支持bs=1;370S4上无法运行;590M9可支持bs=12。 - use_mm_unet : unet是否使用mm作为后端,支持true和false。 - use_mm_ae : vae是否使用mm作为后端,支持true和false。 - use_mm_clip : clip是否使用mm作为后端,因未适配clip使用mm,仅支持false。 - compute_score : 是否计算clip_score,支持true和false。当计算全数据集clip_score时需要较长时间等待。 - test_num: 推理测试的prompt数量 ## 5.效果展示 通过3.6一键运行脚本测得StableDiffusio在128条prompt下的部分生成图片如下所示,完整全部图片见data/images下。 - prompt **"protein"** ![image](data/images/00005.png) - prompt **"a capybara"** ![image](data/images/00066.png) - prompt **"a panda"** ![image](data/images/00083.png) ## 6.免责声明 您明确了解并同意,以下链接中的软件、数据或者模型由第三方提供并负责维护。在以下链接中出现的任何第三方的名称、商标、标识、产品或服务并不构成明示或暗示与该第三方或其软件、数据或模型的相关背书、担保或推荐行为。您进一步了解并同意,使用任何第三方软件、数据或者模型,包括您提供的任何信息或个人数据(不论是有意或无意地),应受相关使用条款、许可协议、隐私政策或其他此类协议的约束。因此,使用链接中的软件、数据或者模型可能导致的所有风险将由您自行承担。 - v2-1_512-ema-pruned.ckpt模型下载链接: https://huggingface.co/stabilityai/stable-diffusion-2-1-base/resolve/main/v2-1_512-ema-pruned.ckpt - open_clip_pytorch_model.bin模型下载链接: https://huggingface.co/laion/CLIP-ViT-H-14-laion2B-s32B-b79K/resolve/main/open_clip_pytorch_model.bin - 数据集下载链接: https://raw.githubusercontent.com/google-research/parti/main/PartiPrompts.tsv