Stable Diffusion如何实现API切换模型

这篇具有很好参考价值的文章主要介绍了Stable Diffusion如何实现API切换模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

研究过Stable Diffusion接口文档的小伙伴们肯定知道,文档中并没有提供模型参数,那么如何实现api切换模型呢?

我们先来看原先的sd-webui的代码,找到模型接收请求参数的中心代码,然后自己修改源码,将这些请求参数传递到这段中心函数中去。

StableDiffusionProcessingTxt2Img

首要咱们来看最重要的txt2img的代码,中心的类便是modules.processing中的StableDiffusionProcessingTxt2Img类,它的init函数接纳以下的参数:

def __init__(self, enable_hr: bool = False, denoising_strength: float = 0.75, firstphase_width: int = 0, firstphase_height: int = 0, hr_scale: float = 2.0, hr_upscaler: str = None, hr_second_pass_steps: int = 0, hr_resize_x: int = 0, hr_resize_y: int = 0, **kwargs)

代码中的缩写hr代表的便是webui中的Hires.fix,相关的参数对应的是webui中的这些选项:

Stable Diffusion如何实现API切换模型,aigc,stable diffusion

接下来,能够看到还有很多其他的参数没有看到,其实这些参数都是在StableDiffusionProcessingTxt2Img的父类:StableDiffusionProcessing类的init中指定的:

def __init__(self, sd_model=None, outpath_samples=None, outpath_grids=None, prompt: str = "", styles: List[str] = None, seed: int = -1, subseed: int = -1, subseed_strength: float = 0, seed_resize_from_h: int = -1, seed_resize_from_w: int = -1, seed_enable_extras: bool = True, sampler_name: str = None, batch_size: int = 1, n_iter: int = 1, steps: int = 50, cfg_scale: float = 7.0, width: int = 512, height: int = 512, restore_faces: bool = False, tiling: bool = False, do_not_save_samples: bool = False, do_not_save_grid: bool = False, extra_generation_params: Dict[Any, Any] = None, overlay_images: Any = None, negative_prompt: str = None, eta: float = None, do_not_reload_embeddings: bool = False, denoising_strength: float = 0, ddim_discretize: str = None, s_churn: float = 0.0, s_tmax: float = None, s_tmin: float = 0.0, s_noise: float = 1.0, override_settings: Dict[str, Any] = None, override_settings_restore_afterwards: bool = True, sampler_index: int = None, script_args: list = None):
    self.outpath_samples: str = outpath_samples # 生成的图片的保存路径,和下面的do_not_save_samples配合运用
    self.outpath_grids: str = outpath_grids
    self.prompt: str = prompt # 正向提示词
    self.prompt_for_display: str = None
    self.negative_prompt: str = (negative_prompt or "") # 反向提示词
    self.styles: list = styles or []
    self.seed: int = seed # 种子,-1表明运用随机种子
    self.sampler_name: str = sampler_name # 采样方法,比方"DPM++ SDE Karras"
    self.batch_size: int = batch_size # 每批生成的数量?
    self.n_iter: int = n_iter
    self.steps: int = steps # UI中的sampling steps
    self.cfg_scale: float = cfg_scale # UI中的CFG Scale,提示词相关性
    self.width: int = width # 生成图像的宽度
    self.height: int = height # 生成图像的高度
    self.restore_faces: bool = restore_faces # 是否运用面部修正
    self.tiling: bool = tiling # 是否运用可平铺(tilling)
    self.do_not_save_samples: bool = do_not_save_samples


咱们对应UI界面来看这些参数的意义,父类中有一些参数不是在txt2img中用到的,我就忽略了

api接口中模型是如何加载的

我们来看modules/api/api.pytext2imgapi代码:

def text2imgapi(self, txt2imgreq: models.StableDiffusionTxt2ImgProcessingAPI):
        ......
        with self.queue_lock:
            p = StableDiffusionProcessingTxt2Img(sd_model=shared.sd_model, **args)
            ......
            return models.TextToImageResponse(images=b64images, parameters=vars(txt2imgreq), info=processed.js())


从代码中可以看出加载的模型是从shared.sd_model获取的,但是这样加载的模型不是用户维度而是全局的,当我们api传过来的模型与当前模型不一样的时候,我们就需要重新加载模型,那么就需要直接调用modules/sd_models.py中的reload_model_weights(sd_model=None, info=None)函数,咱们只需传入info参数就行,用info参数来指定咱们想要加载的模型,而在这个函数中,会自动判断咱们想要加载的模型和当前模型是否相同,相同的话就不加载。

从函数签名很难看出来info字段是一个什么样的参数,经过我对代码的研究,我发现info其实便是下面这个类:

class CheckpointInfo:
    def __init__(self, filename):
        self.filename = filename
        abspath = os.path.abspath(filename)
        if shared.cmd_opts.ckpt_dir is not None and abspath.startswith(shared.cmd_opts.ckpt_dir):
            name = abspath.replace(shared.cmd_opts.ckpt_dir, '')
        elif abspath.startswith(model_path):
            name = abspath.replace(model_path, '')
        else:
            name = os.path.basename(filename)
        if name.startswith("\\") or name.startswith("/"):
            name = name[1:]
        self.name = name
        self.name_for_extra = os.path.splitext(os.path.basename(filename))[0]
        self.model_name = os.path.splitext(name.replace("/", "_").replace("\\", "_"))[0]
        self.hash = model_hash(filename)
        self.sha256 = hashes.sha256_from_cache(self.filename, "checkpoint/" + name)
        self.shorthash = self.sha256[0:10] if self.sha256 else None
        self.title = name if self.shorthash is None else f'{name} [{self.shorthash}]'
        self.ids = [self.hash, self.model_name, self.title, name, f'{name} [{self.hash}]'] + ([self.shorthash, self.sha256, f'{self.name} [{self.shorthash}]'] if self.shorthash else [])

init里的一大串其实都不用管,咱们只需求指定filename就行了。所以用如下的示例代码就能够手动从头加载一个指定的模型:

from modules import sd_models
checkpoint_info = sd_models.CheckpointInfo("模型的全路径名称")
sd_models.reload_model_weights(info=checkpoint_info)

看完这里,我们就可以直接修改源码了:

1.修改 modules/api/models.py中的StableDiffusionTxt2ImgProcessingAPI增加模型名称

StableDiffusionTxt2ImgProcessingAPI = PydanticModelGenerator(
    "StableDiffusionProcessingTxt2Img",
    StableDiffusionProcessingTxt2Img,
    [
        {"key": "sampler_index", "type": str, "default": "Euler"},
        {"key": "script_name", "type": str, "default": None},
        {"key": "script_args", "type": list, "default": []},
        {"key": "send_images", "type": bool, "default": True},
        {"key": "save_images", "type": bool, "default": False},
        {"key": "alwayson_scripts", "type": dict, "default": {}},
        {"key": "model_name", "type": str, "default": None},
    ]
).generate_model()

2.修改modules/processing.py中的StableDiffusionProcessingTxt2Img,增加模型名称接收:

def __init__(self, enable_hr: bool = False, denoising_strength: float = 0.75, firstphase_width: int = 0, firstphase_height: int = 0, hr_scale: float = 2.0, hr_upscaler: str = None, hr_second_pass_steps: int = 0, hr_resize_x: int = 0, hr_resize_y: int = 0, hr_sampler_name: str = None, hr_prompt: str = '', hr_negative_prompt: str = '',model_name: str=None, **kwargs):

3.修改modules/api/api.py中text2imgapi代码:

def text2imgapi(self, txt2imgreq: models.StableDiffusionTxt2ImgProcessingAPI):
        ......
        model_name=txt2imgreq.model_name       
        if model_name is None:
            raise HTTPException(status_code=404, detail="model_name not found")
        ......
        with self.queue_lock:
            checkpoint_info = sd_models.CheckpointInfo(os.path.join(models_path,'Stable-diffusion',model_name))
            sd_models.reload_model_weights(info=checkpoint_info)
            p = StableDiffusionProcessingTxt2Img(sd_model=shared.sd_model, **args)
            ......

    到此,我们就完成了文生图api接口切换模型了,同理,我们也可对图生图api增加模型切换。下篇我们将会介绍如何增加任务id及通过任务id查询任务进度。扫码体验绘画小程序:

  Stable Diffusion如何实现API切换模型,aigc,stable diffusion文章来源地址https://www.toymoban.com/news/detail-671803.html

到了这里,关于Stable Diffusion如何实现API切换模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【小白】一文读懂AIGC模型之Stable Diffusion模型

      Stable Diffusion(SD)模型是一种基于Latent Diffusion Models(LDMs)的生成式模型,总共有1B左右的参数量,可以用于文生图、图生图、等任务中。   文生图任务是将文本输入到SD模型中,输出符合文本描述的图片;图生图任务是在输入文本的基础上,再输入一张图片,模型根

    2024年04月25日
    浏览(37)
  • Stable Diffusion:一种新型的深度学习AIGC模型

    潜在扩散模型 | AIGC| Diffusion Model  图片感知压缩 | GAN | Stable Diffusion 随着生成型AI技术的能力提升,越来越多的注意力放在了通过AI模型提升研发效率上。业内比较火的AI模型有很多,比如画图神器Midjourney、用途多样的Stable Diffusion,以及OpenAI此前刚刚迭代的DALL-E 2。 对于研发

    2024年02月09日
    浏览(64)
  • AIGC:如何使用Stable Diffusion生图

    使用文字Prompt,正向和反向词的添加来生成图片,通过对应参数调节和添加更多的Prompt来让AI更清晰的感知我们想要的场景图片、 添加更多的Prompt之间 使用英文,分隔。 提示词使用英文,完全不需要语法 这里有个通用的正反向咒语,在生成图片时可以使用的到,为了使我们生

    2024年02月09日
    浏览(41)
  • 【AIGC】Stable Diffusion原理快速上手,模型结构、关键组件、训练预测方式

    在这篇博客中,将会用机器学习入门级描述,来介绍Stable Diffusion的关键原理。目前,网络上的使用教程非常多,本篇中不会介绍如何部署、使用或者微调SD模型。也会尽量精简语言,无公式推导,旨在理解思想。让有机器学习基础的朋友,可以快速了解SD模型的重要部分。如

    2024年02月08日
    浏览(64)
  • AI图像(AIGC for PIC)大模型实战|Stable Diffusion

    AI GC text to pic 图像生成模型  目前随着AIGC模型的火爆,AI内容创作远超人类创造水平和能力,极大了提升了创作空间。 为此我们要接触新鲜事物,用于尝试新技术。 那针对目前火爆的AImodel我们开始进行学习,尝试本地化部署,生成自己的模型。 先感性的认识下模型的基础知

    2023年04月24日
    浏览(38)
  • AIGC - Stable Diffusion 的 AWPortrait 1.1 模型与 Prompts 设置

    欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131565908 AWPortrait 1.1 网址:https://www.liblibai.com/modelinfo/721fa2d298b262d7c08f0337ebfe58f8 介绍:AWPortrait1.1的创作过程其实是思考真实人像和AI生成影像视觉上的区别是什么的过程,希望AWPortrait能够在

    2024年02月13日
    浏览(73)
  • 修改 Stable Diffusion 使 api 接口增加模型参数

     参考:https://zhuanlan.zhihu.com/p/644545784 1、修改 modules/api/models.py 中的 StableDiffusionTxt2ImgProcessingAPI 增加模型名称  2、修改 modules/api/api.py 中 text2imgapi 代码:  3、修改 modules/processing.py 中的 StableDiffusionProcessingTxt2Img ,增加模型名称接收

    2024年02月06日
    浏览(38)
  • 【AIGC】如何在Windows/Linux上部署stable diffusion

    GPU环境安装:NVIDIA驱动和cuda(注意版本,建议安装cuda11.7,方便后续使用xformer) 配置git环境 git拉取stable diffusion项目 配置python虚拟环境 安装GPU版torch 安装虚拟环境依赖包:项目本身的requirement及子项目依赖 下载模型文件 启动stable diffusion 独立显卡:最低配置4GB显存,基本配

    2024年04月23日
    浏览(35)
  • 完整指南:如何使用 Stable Diffusion API

    Stable Diffusion 是一个先进的深度学习模型,用于创造和修改图像。这个模型能够基于文本描述来生成图像,让机器理解和实现用户的创意。使用这项技术的关键在于掌握其 API,通过编程来操控图像生成的过程。 在探索 Stable Diffusion API 的世界前,需要把握以下基本概念: API(

    2024年04月09日
    浏览(65)
  • 如何将Stable diffusion转换为 TensorFlow-Lite 模型,实现iPhone和Android使用

    在不久的将来,元宇宙将创造一个十亿美元级的市场,几乎所有的大型跨国公司和有远见的初创公司都在努力利用这个市场。NFT 将成为元宇宙中不可避免的一部分。您是否听说过最著名的机器学习算法之一,用于创建数字艺术品或 NFT 的 Stable Diffusion? 在本文中,我将向您介

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包