【腾讯云HAI域探秘】搭建一个永不宕机的本地SD文本生成图像应用--喂饭级高性能应用HAI部署stable diffusion webui 一键文生图

news2024/11/25 9:46:25

目录

  • 一、高性能应用服务HAI产品 + Stable Diffusion Webui部署思路
  • 二、一键启动Stable Diffusion WebUI 推理
  • 三、使用 HAI JupyterLab连接 进行 StableDiffusion API 的部署
  • 四、使用本地IDE实现私服Web端一键文生图
  • 五、使用腾讯云Cloud Studio 快速云上开发
  • 六、高性能应用服务HAI使用感受
  • 最后

在这里插入图片描述本次有幸受邀作为新品先锋体验官参加了【腾讯云HAI域探秘】活动,沉浸式体验高性能应用服务HAI产品 + Stable Diffusion WebUI部署。

一、高性能应用服务HAI产品 + Stable Diffusion Webui部署思路

腾讯云高性能应用服务(Hyper Application Inventor, HAI),是一款面向AI、科学计算的GPU应用服务产品,为开发者量身打造的澎湃算力平台。基于腾讯云GPU云服务器底层算力,提供即插即用的高性能云服务,无需复杂配置,便可享受即开即用的GPU云服务体验。我们的实验思路主要如下:

  1. 体验高性能应用服务HAI启动 StableDiffusionWebUI 进行文生图模型推理;
  2. 使用高性能应用服务HA的JupyterLab连接进行 StableDiffusion API 的部署;
  3. 使用本地IDE调用 StableDiffusion API 的前端Web页面,实现私服一键文生图;
  4. 使用腾讯Cloud Studio 快速开发调用 StableDiffusion API 的前端Web页面;

在这里插入图片描述

二、一键启动Stable Diffusion WebUI 推理

打开高性能应用服务HAI,申请到体验资格后,在控制台点击新建,选择AI模型,选择Stable Diffusion,地域任意选择,算力方案选择基础型,然后为实例取个名称如:stable_diffusion_test,硬盘默认50GB,点击购买。

在这里插入图片描述
等待创建完成后,点击算力连接,点击stable_diffusion_webui,一键启动推理
在这里插入图片描述

进入页面后,我们就可以开始使用 高性能应用服务HAI 部署的StableDiffusionWebUI 快速进行AI绘画了,整个的ui界面包括了

  1. 模型选择: 模型对于 SD 绘图来说非常重要,不同的模型类型、质量会很大程度的决定最终的出图效果(系统默认配置了基础模型,也可以更换)
  2. Prompt区: 如果你使用过 ChatGPT 你应该知道 Prompt 是什么。说的直白点就是你想让 SD 帮忙生成什么样的图,反向 Prompt 就是你不想让 SD 出生的图里有这些东西。后续课程也会详细的讲解如何更好的编写 Prompt
  3. 功能栏: 包括了常见的 文生图、图生图、模型获取、模型训练等功能。不同的功能页面也不同,这一节课,我们先针对最长使用的 文生图 模块页面来讲解
  4. 采样区: 采用什么样的绘画方式算法,以及“画多少笔” 来绘图。一定程度上决定出图的质量
  5. 调参区: 设置分辨率、每次出图的批次、出图抽象性(和 prompt 关联性的程度)
  6. 脚本区: 通过配置脚本可以提高效率;比如批量出图、多参数的出图效果比较

经常使用的功能如下:

在这里插入图片描述
这里推荐几个小技巧:

  1. 正向提示词(Prompt)和反向越多,AI 绘图结果会更加精准。另外,目前中文提示词的效果不好,还得使用英文提示词;
  2. 采样方式推荐使用Euler a、DDIM、DPM ++ 2M Karras这三个;
  3. 采样步骤建议在20~40之间,步数越高也就意味着耗费的资源会越多,对机器的配置会更高,且步数不是越高越好;
  4. 分辨率推荐使用512×512,在 SD 的最初模型 SD 1.5 训练的图片的分辨率大部分都是 512×512,所以在出图的时候,这个分辨率的效果也是最好的;
  5. 若是想明确某主体,应当使其生成步骤向前,生成步骤数加大,词缀排序向前,权重提高。画面质量 → 主要元素 → 细节;若是想明确风格,则风格词缀应当优于内容词缀,画面质量 → 风格 → 元素 → 细节

在这里插入图片描述

三、使用 HAI JupyterLab连接 进行 StableDiffusion API 的部署

点击Jupyter_Lab连接,进入JupyterLab
在这里插入图片描述
新建一个终端,cd进入/root/stable-diffusion-webui目录,然后以API 模式启动运行launch.py文件,并监听7862端口,命令如下:

cd /root/stable-diffusion-webui
python launch.py --nowebui --xformers --opt-split-attention  --listen --port 7862

启动成功后,如图所示:
在这里插入图片描述
为了使外部网络能够顺利地访问该服务器提供的API服务,我们还需要给 高性能应用服务HAI 配置端口规则,点击服务器的图标进入配置项:
在这里插入图片描述
添加入站规则,配置来源0.0.0.0/0 ,协议端口:TCP:7862 (根据您配置的端口填写),如下:
在这里插入图片描述
配置完成后输入 服务器IP地址:端口号/docs 可查看相关的 API 接口 swagger 使用指南,这里不再展开

这里我们可以使用Postman测试结构是否部署成功,打开Postman,新建一个Post请求,url为http://服务器IP地址:端口号/sdapi/v1/txt2img,然后body改为JSON格式,并输入相关请求参数,如下:
在这里插入图片描述
简单的请求参数如下:

{
     "denoising_strength": 0,
     "prompt": "puppy dogs",
     "negative_prompt": "",
     "seed": -1,
     "batch_size": 2,
     "n_iter": 1,
     "steps": 50,
     "cfg_scale": 7,
     "width": 512,
     "height": 512,
     "restore_faces": false,
     "tiling": false,
     "sampler_index": "Euler" 
}

其中,prompt为提示词,negative_prompt为反向提示词,seed为种子,随机数,batch_size为每次张数,n_iter为生成批次,steps为生成步数,cfg_scale为关键词相关性,width为宽度,height为高度,restore_faces为脸部修复,tiling为可平铺,sampler_index为采样方法。

点击Send后,HAI服务器接受请求并进行推理,推理后会将图以base64的方法发过来,返回的格式如下:

{
   "images": [...]// 这里是一个base64格式的字符串数组,根据你请求的图片数量而定
   "parameters": {  ... },//此处为你输入的body 
   "info": "{...}"// 返回的图片的信息
}

四、使用本地IDE实现私服Web端一键文生图

既然Postman测试成功,那么我们可以为其写一个Web前端页面,本次项目使用到的技术栈为Vue3+TS+Vite+Ant-Design+Axios,项目已经上传至CSDN,链接如下:https://download.csdn.net/download/air__Heaven/88492769

下载后,解压并打开终端,输入npm i安装依赖,然后打开vite.config.ts,将sdapi和controlnet的api改为HAI服务器的地址和端口:
在这里插入图片描述

然后输入npm run dev运行项目,就可以愉快的开始玩耍了!
在这里插入图片描述

其中main.vue中的核心代码如下:

// 定义文生图请求函数
async function txt2Img() {
   // 每次请求之前清空浏览器的 localStorage 中的缓存
   txt2imgReqStorage.value = null
   txt2imgResultStorage.value = null

   // 清空轮播图
   txt2img_imgs.value = []

   // 如果启用了 ControleNet 则将 ControlNet 相关组件中的参数填充到 文生图请求参数中
   if (controlNetEnable.value === true) {
      console.log(imgFileList.value)
      if (imgFileList.value?.length === 0) {
         message.error("ControlNet已启用,请上传图片")
         return
      }
      if (controlNet_payload.value.module === '') {
         message.error("ControlNet已启用,请选择预处理器")
         return
      }
      if (controlNet_payload.value.model === '') {
         message.error("ControlNet已启用,请选择模型")
         return
      }

      imgFileList.value?.forEach((value, index) => {
         if (index === 0) {
            controlNet_payload.value.input_image = value.thumbUrl || ''
         }
      })
      txt2img_payload.value.alwayson_scripts = {
         controlnet: {
            args: [controlNet_payload.value]
         }
      }
   } else {
      txt2img_payload.value.alwayson_scripts = {}
   }

   // 打印请求参数
   console.log("文生图请求参数:", txt2img_payload.value)
   // 将请求参数保存在浏览器的 localStorage 中
   txt2imgReqStorage.value = txt2img_payload.value;
   //开始请求
   message.loading('正在请求...', 10)
   // 文生图api调用
   const resp = await axios.post('/sdapi/v1/txt2img', txt2img_payload.value)
   // 打印请求结果
   console.log("文生图响应结果:", resp)
   if (resp.data) {
      message.success('请求成功!')
      // 提取请求结果中的图片
      txt2imgRes.value = resp.data
      // 定义一个临时数组,该数组将赋值给 txt2imgResultStorage
      let tempArr = ref<string[]>([])
      txt2imgRes.value?.images.forEach((value: string, index: number) => {
         txt2img_imgs.value.push('data:image/png;base64,' + value)
         // 临时数组中只存放2张图片,防止赋值给 txt2imgResultStorage 后超过5M(localStorage最大支持5M),抛出异常
         if (index < 2) {
            tempArr.value.push('data:image/png;base64,' + value)
         }
      })
      //将提取的请求结果中的图片保存在浏览器的 localStorage 中,如果叠加显示每次生成的图片,请把以下三行代码的注释去掉即可
      // if (tempArr.value.length > 0) {
      //     txt2imgResultStorage.value = tempArr.value
      // }
   } else {
      message.error('请求失败!')
   }
}

// 获取文生图的采样方法
async function txt2ImgSampler() {
   const resp = await axios.get("/sdapi/v1/samplers")
   console.log("采样方法:", resp)
   txt2ImgSamplerRes.value = resp.data
   txt2ImgSamplerRes.value?.forEach((sampler: Txt2ImgSamplers) => {
      txt2ImgSamplerOptions.value?.push({
         value: sampler.name,
         label: sampler.name
      })
   })
}

// 获取 ControlNet 的 Preprocessor 的值
async function controlNetPreProcessors() {
   const resp = await axios.get('/controlnet/module_list')
   console.log("ControlNet-Preprocessor:", resp)
   controlNetModuleRes.value = resp.data
   controlNetModuleRes.value?.module_list.forEach((module: string) => {
      controleNetModuleSelect.value?.push({ value: module, label: module })
   })
}

// 获取 ControlNet 的 Model 的值
async function controlNetModels() {
   const resp = await axios.get('/controlnet/model_list')
   console.log("ControlNet-Model:", resp)
   controlNetModelRes.value = resp.data
   controlNetModelRes.value?.model_list.forEach((model: string) => {
      controleNetModelSelect.value?.push({ value: model, label: model })
   })
}

// 该函数将在页面每次加载后进行调用
onMounted(() => {
   // 页面加载后获取保存在浏览器的 localStorage 中的数据去填充组件的输入
   if (Object.keys(txt2imgReqStorage.value).length !== 0) {
      txt2img_payload.value = txt2imgReqStorage.value
   }
   if (txt2imgResultStorage.value.length > 0) {
      txt2img_imgs.value = txt2imgResultStorage.value
   }

   // 调用获取文生图采样方法的函数
   txt2ImgSampler()
   // 调用获取 ControlNet 的 Preprocessor 的函数
   controlNetPreProcessors()
   // 调用获取 ControlNet 的 Model 的函数
   controlNetModels()
})

其中定义一个名为txt2Img的异步函数,用于处理文生图请求。函数根据是否启用了ControlNet,将ControlNet相关组件中的参数填充到文生图请求参数中。最后,打印请求参数并将其保存在浏览器的localStorage中,然后开始发送请求。

定义一个名为txt2ImgSampler的异步函数,用于获取文生图的采样方法。该函数通过调用API接口获取采样方法数据,并将其存储在txt2ImgSamplerRes变量中。

定义了两个异步函数controlNetPreProcessors和controlNetModels,分别用于获取ControlNet的预处理器和模型的值。这两个函数都通过调用API接口获取相应的数据,并将其存储在相应的变量中。

在页面加载后,调用onMounted函数。在该函数中,首先从浏览器的localStorage中获取保存的数据并填充到组件的输入中。然后依次调用txt2ImgSampler、controlNetPreProcessors和controlNetModels函数,以获取采样方法、预处理器和模型的值。

五、使用腾讯云Cloud Studio 快速云上开发

如果本地没有安装VSCode,也可以使用目前比较火的云IDE,选择打开腾讯云Cloud Studio,选择开发空间的手动创建并立即创建,自定义模板配置如下:

在这里插入图片描述

同样,将之前下载的压缩包上传到Cloud Studio开发空间的工作目录中,打开终端,输入解压命令unzip sd_api.zip,解压完成后,后面的步骤与第四章基本相同,即在终端窗口输入命令cd进入文件夹,然后输入npm install安装依赖包,等待依赖完成安装后就可以输入npm run dev启动Web项目了。
在这里插入图片描述
最后别忘了销毁HAI服务器和暂停腾讯云Cloud Studio使用空间。

六、高性能应用服务HAI使用感受

整体流程体验下来,HAI作为一款面向AI和科学计算的GPU应用服务产品,具有高性能计算能力、即插即用的云服务、灵活的配置选项、广泛的软件支持和安全保障等优点,是开发者进行复杂科学计算和AI模型训练的理想选择。

  1. 高性能计算能力:HAI基于腾讯云GPU云服务器底层算力,提供高性能计算能力,能够满足复杂科学计算和AI模型训练的需求。
  2. 即插即用的云服务: HAI提供即插即用的高性能云服务,无需复杂配置,开发者可以快速启动和部署GPU计算任务。
  3. 灵活的配置选项:HAI提供灵活的配置选项,用户可以根据自己的需求和预算选择不同的GPU实例类型和配置项等。
  4. 丰富的软件支持:HAI为客户提供了广泛的软件支持,包括流行的GPU应用程序和开发框架,如TensorFlow, PyTorch等,可以方便用户进行AI模型的训练和部署。
  5. 安全保障:腾讯云拥有高水准的安全防护机制和服务,保障用户的数据和计算任务的安全可靠。

在这里插入图片描述

【腾讯云HAI域探秘】活动目前正在进行中,本次活动是由腾讯云和CSDN联合推出的开发者技术实践活动,活动将通过技术交流直播、动手实验、有奖征文等形式,带您深入沉浸式体验腾讯云高性能应用服务HAI。在本次活动中,只要完成各个环节任务,不仅可以参与AIGC创作抽奖、优秀博文的评选,还可以获取相应的积分,参加最终的积分排行榜,获取丰厚的活动礼品。

在这里插入图片描述

最后

💖 个人简介:人工智能领域研究生,目前主攻文本生成图像(text to image)方向

📝 个人主页:中杯可乐多加冰

🔥 限时免费订阅:文本生成图像T2I专栏

🎉 支持我:点赞👍+收藏⭐️+留言📝

另外,我们已经建立了微信T2I学习交流群,如果你也是T2I方面的爱好者或研究者可以私信我加入。

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

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

相关文章

C++设计模式_23_Command 命令模式

我们将Command 和Visitor归为“行为变化”模式。 Command 命令模式与函数对象十分类似&#xff0c;但在C主流框架中&#xff0c;函数对象&#xff08;function object&#xff09;应用的更为广泛。 文章目录 1. “行为变化”模式1.1 典型模式 2. 动机( Motivation )3. 模式定义…

Java调用GDAL实现融合有相同字段属性的多边形矢量数据的一种方法

目录 一、写在文章前 二、实现思路 三、实现过程 1.打开矢量数据 2.生成融合结果 3.不融合不相邻的几何图形 4.融合后的几何图形写入到新的图层 5.融合的效果 四、完整的示例 一、写在文章前 如下图所示&#xff0c;融合&#xff08;dissolve&#xff09;具有相同字段属…

Linux中搭建coturn服务器

1、下载coturn源码 git clone https://github.com/coturn/coturn.git2、进入到coturn路径下&#xff0c;执行一下命令。 ./configure出现以下错误&#xff1a; 问题1&#xff1a;ERROR: OpenSSL Crypto development libraries are not installed properly in required locati…

浅谈安科瑞无线测温产品在南非某变电站的应用

摘要&#xff1a;随着电力工业的发展&#xff0c;对设备的安全性、可靠性要求越来越高。在这种条件下&#xff0c;高压设备的无线测温系统应运而生。这种技术是将内置电池或电流感应和无线发射模块的测温传感器安装于各测温点&#xff0c;由于其体积小&#xff0c;且无需任何接…

CHS零壹视频恢复程序监控版/海康版/大华版深入扫描功能演示

安防文件系统是一种嵌入式文件系统&#xff0c;一般情况下监控版程序扫描会基于文件系统进行扫描&#xff0c;如果想更深入的扫描一些数据建议开启深入扫描功能&#xff0c;具体方法如下: 适用版本:监控版/海康版/大华版/专业版/高级版 作用&#xff1a;舍弃嵌入式文件系统直…

手机端抓包流程

一.Charles 抓包 1.创建模拟器 2.配置证书 3.打开开发者工具中的usb调试 4.下载xposed安装 5.安装模块 破解app反代理 使用XposedJustTrustMe突破SSL Pinning验证_justtrustme模块官网-CSDN博客 配置流程 手机APP数据包抓包分析_socksdroid下载-CSDN博客 二.HttpCanary抓…

【CIO人物展】申菱环境CIO吴斌:制造业智能化转型,从3个“三”开始

吴斌 本文由申菱环境CIO吴斌投递并参与《2023中国数智化转型升级优秀CIO》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 近日&#xff0c;苏州市举办了苏州市智能制造生态大会暨苏州市智能制造产业联盟第二届二次会员大会&#xff0c;苏州市工信局副局长万资…

【观察】从口袋到云端全景式AI创新,联想“全栈智能”再升级

知名科技杂志《连线》创始主编凯文凯利曾预测&#xff1a;“在未来的 100 年里&#xff0c;人工智能将超越任何一种人工力量&#xff0c;将人类引领到一个前所未有的时代。” 确实如此&#xff0c;犹如历史上蒸汽机、电力、计算机和互联网等通用技术一样&#xff0c;近20年来&a…

哪个女人不是在事业和家庭间走钢丝?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 小黑 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩天津录音间 这是一场因2023年诺贝尔经济学奖获得者克劳迪娅戈尔丁著作《事业还是家庭&#xff1f;女性追求平等的百年…

12 _ 排序(下):如何用快排思想在O(n)内查找第K大元素?

上一节我讲了冒泡排序、插入排序、选择排序这三种排序算法,它们的时间复杂度都是O(n2),比较高,适合小规模数据的排序。这里会介绍两种时间复杂度为O(nlogn)的排序算法,归并排序和快速排序。这两种排序算法适合大规模的数据排序,比上一节讲的那三种排序算法要更常用。 归并…

PDF 表单直接保存到您的文档中--TX Text Control

TX Text Control .NET Server for ASP.NET Document Viewer 32.0.2 允许用户保存包含已填写表单字段的文档&#xff0c;从而更轻松地协作和共享信息。 TX Text Control .NET Server for ASP.NET 是一个适用于 ASP.NET 和 ASP.NET Core 的综合服务器端文档处理库。功能包括 PDF …

5.2 用户数据报协议UDP

思维导图&#xff1a; 课程笔记&#xff1a;5.2 用户数据报协议UDP 5.2.1 UDP概述 一、UDP基本概念 无连接协议&#xff1a;UDP是一个简单的面向数据报的传输层协议&#xff0c;不需要在数据传输前建立连接&#xff0c;故减少开销和延迟。复用/分用&#xff1a;UDP允许多个应…

记录rider编辑器快速文档 中英文显示的问题

起初是不同的项目里快速文档一个项目显示中文 一个项目显示英文 搞了很久不知道哪里的原因 偶然灵机一动,点开了下面docs.microsoft.com的地址进去一看 发现一个是4.6的文档 一个是4.6.1的文档 所以去项目属性里 切换了framework的版本. 然后汉化就好了 纯属强迫症,而且…

shell script 学习案例

或许进度最快的方法就是先抄袭&#xff0c;在改进&#xff0c;哈哈。学习下各个案例吧 第一&#xff1a;写过程序的都知道&#xff0c;第一个学的就是输出"Hello World!",那么学习shell也是一样&#xff0c;上案例 因为有脚本文件&#xff0c;所有同时 开了两个终端…

13 _ 线性排序:如何根据年龄给100万用户数据排序?

前两节中,着重分析了几种常用排序算法的原理、时间复杂度、空间复杂度、稳定性等。这节,将讲三种时间复杂度是O(n)的排序算法:桶排序、计数排序、基数排序。因为这些排序算法的时间复杂度是线性的,所以我们把这类排序算法叫作线性排序(Linear sort)。之所以能做到线性的时…

光刻机之父林本坚发声,中国芯片可自主研发5纳米,美国拦不住

外媒报道指早已退休的台积电前研发副总林本坚接受采访的时候表示&#xff0c;美国无法阻止中国研发先进工艺&#xff0c;还认为中国可以利用现有设备研发更先进的5纳米工艺&#xff0c;他的表态让外媒相当吃惊。 林本坚如此说法在中国的华为研发出相当于7纳米工艺的麒麟9000S之…

Linux常用命令——chfn命令

在线Linux命令查询工具 chfn 用来改变finger命令显示的信息 补充说明 chfn命令用来改变finger命令显示的信息。这些信息都存放在/etc目录里的passwd文件里。若不指定任何选项&#xff0c;则chfn命令会进入问答式界面。 语法 chfn(选项)(参数)选项 -f<真实姓名>或-…

玩转硬件之Micro:bit的玩法(三)——计步器

随着技术的发展&#xff0c;现在智能手机和智能手表已经走进千家万户&#xff0c;所以大家对于计步器可能不陌生&#xff0c;计步器是一种用于计算行走步数的装置。它通常是一个小型电子设备&#xff0c;可以佩戴在身体上&#xff0c;如腕带、腰带或口袋中。计步器通过感应人体…

代码随想录算法训练营第四十一天丨 动态规划part04

01背包理论基础 见连接&#xff1a;代码随想录 416. 分割等和子集 思路 01背包问题 背包问题&#xff0c;大家都知道&#xff0c;有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解…

matlab 计算Ax=b的解,解线性方程组的现成工具

只写了最简单的方式&#xff0c;其中b需要是列向量&#xff0c;用分号隔开元素&#xff1b; octave:7> A[1,2; 1.0001, 2;] A 1.0000 2.00001.0001 2.0000octave:8> b[3; 3.0001;] b 3.00003.0001octave:9> xA\b x 1.00001.0000octave:10> b-A*x ans 00octave:…