本次有幸受邀作為新品先鋒體驗(yàn)官參加了【騰訊云HAI域探秘】活動(dòng),沉浸式體驗(yàn)高性能應(yīng)用服務(wù)HAI產(chǎn)品 + Stable Diffusion WebUI部署。
一、高性能應(yīng)用服務(wù)HAI產(chǎn)品 + Stable Diffusion Webui部署思路
騰訊云高性能應(yīng)用服務(wù)(Hyper Application Inventor, HAI),是一款面向AI、科學(xué)計(jì)算的GPU應(yīng)用服務(wù)產(chǎn)品,為開(kāi)發(fā)者量身打造的澎湃算力平臺(tái)?;隍v訊云GPU云服務(wù)器底層算力,提供即插即用的高性能云服務(wù),無(wú)需復(fù)雜配置,便可享受即開(kāi)即用的GPU云服務(wù)體驗(yàn)。我們的實(shí)驗(yàn)思路主要如下:
- 體驗(yàn)高性能應(yīng)用服務(wù)HAI啟動(dòng) StableDiffusionWebUI 進(jìn)行文生圖模型推理;
- 使用高性能應(yīng)用服務(wù)HA的JupyterLab連接進(jìn)行 StableDiffusion API 的部署;
- 使用本地IDE調(diào)用 StableDiffusion API 的前端Web頁(yè)面,實(shí)現(xiàn)私服一鍵文生圖;
- 使用騰訊Cloud Studio 快速開(kāi)發(fā)調(diào)用 StableDiffusion API 的前端Web頁(yè)面;
二、一鍵啟動(dòng)Stable Diffusion WebUI 推理
打開(kāi)高性能應(yīng)用服務(wù)HAI,申請(qǐng)到體驗(yàn)資格后,在控制臺(tái)點(diǎn)擊新建,選擇AI模型,選擇Stable Diffusion,地域任意選擇,算力方案選擇基礎(chǔ)型,然后為實(shí)例取個(gè)名稱如:stable_diffusion_test,硬盤默認(rèn)50GB,點(diǎn)擊購(gòu)買。
等待創(chuàng)建完成后,點(diǎn)擊算力連接,點(diǎn)擊stable_diffusion_webui,一鍵啟動(dòng)推理
進(jìn)入頁(yè)面后,我們就可以開(kāi)始使用 高性能應(yīng)用服務(wù)HAI 部署的StableDiffusionWebUI 快速進(jìn)行AI繪畫(huà)了,整個(gè)的ui界面包括了
- 模型選擇: 模型對(duì)于 SD 繪圖來(lái)說(shuō)非常重要,不同的模型類型、質(zhì)量會(huì)很大程度的決定最終的出圖效果(系統(tǒng)默認(rèn)配置了基礎(chǔ)模型,也可以更換)
- Prompt區(qū): 如果你使用過(guò) ChatGPT 你應(yīng)該知道 Prompt 是什么。說(shuō)的直白點(diǎn)就是你想讓 SD 幫忙生成什么樣的圖,反向 Prompt 就是你不想讓 SD 出生的圖里有這些東西。后續(xù)課程也會(huì)詳細(xì)的講解如何更好的編寫(xiě) Prompt
- 功能欄: 包括了常見(jiàn)的 文生圖、圖生圖、模型獲取、模型訓(xùn)練等功能。不同的功能頁(yè)面也不同,這一節(jié)課,我們先針對(duì)最長(zhǎng)使用的 文生圖 模塊頁(yè)面來(lái)講解
- 采樣區(qū): 采用什么樣的繪畫(huà)方式算法,以及“畫(huà)多少筆” 來(lái)繪圖。一定程度上決定出圖的質(zhì)量
- 調(diào)參區(qū): 設(shè)置分辨率、每次出圖的批次、出圖抽象性(和 prompt 關(guān)聯(lián)性的程度)
- 腳本區(qū): 通過(guò)配置腳本可以提高效率;比如批量出圖、多參數(shù)的出圖效果比較
經(jīng)常使用的功能如下:
這里推薦幾個(gè)小技巧:
- 正向提示詞(Prompt)和反向越多,AI 繪圖結(jié)果會(huì)更加精準(zhǔn)。另外,目前中文提示詞的效果不好,還得使用英文提示詞;
- 采樣方式推薦使用Euler a、DDIM、DPM ++ 2M Karras這三個(gè);
- 采樣步驟建議在20~40之間,步數(shù)越高也就意味著耗費(fèi)的資源會(huì)越多,對(duì)機(jī)器的配置會(huì)更高,且步數(shù)不是越高越好;
- 分辨率推薦使用512×512,在 SD 的最初模型 SD 1.5 訓(xùn)練的圖片的分辨率大部分都是 512×512,所以在出圖的時(shí)候,這個(gè)分辨率的效果也是最好的;
- 若是想明確某主體,應(yīng)當(dāng)使其生成步驟向前,生成步驟數(shù)加大,詞綴排序向前,權(quán)重提高。畫(huà)面質(zhì)量 → 主要元素 → 細(xì)節(jié);若是想明確風(fēng)格,則風(fēng)格詞綴應(yīng)當(dāng)優(yōu)于內(nèi)容詞綴,畫(huà)面質(zhì)量 → 風(fēng)格 → 元素 → 細(xì)節(jié)。
三、使用 HAI JupyterLab連接 進(jìn)行 StableDiffusion API 的部署
點(diǎn)擊Jupyter_Lab連接,進(jìn)入JupyterLab
新建一個(gè)終端,cd進(jìn)入/root/stable-diffusion-webui目錄,然后以API 模式啟動(dòng)運(yùn)行l(wèi)aunch.py文件,并監(jiān)聽(tīng)7862端口,命令如下:
cd /root/stable-diffusion-webui
python launch.py --nowebui --xformers --opt-split-attention --listen --port 7862
啟動(dòng)成功后,如圖所示:
為了使外部網(wǎng)絡(luò)能夠順利地訪問(wèn)該服務(wù)器提供的API服務(wù),我們還需要給 高性能應(yīng)用服務(wù)HAI 配置端口規(guī)則,點(diǎn)擊服務(wù)器的圖標(biāo)進(jìn)入配置項(xiàng):
添加入站規(guī)則,配置來(lái)源0.0.0.0/0 ,協(xié)議端口:TCP:7862 (根據(jù)您配置的端口填寫(xiě)),如下:
配置完成后輸入 服務(wù)器IP地址:端口號(hào)/docs 可查看相關(guān)的 API 接口 swagger 使用指南,這里不再展開(kāi)
這里我們可以使用Postman測(cè)試結(jié)構(gòu)是否部署成功,打開(kāi)Postman,新建一個(gè)Post請(qǐng)求,url為http://服務(wù)器IP地址:端口號(hào)/sdapi/v1/txt2img,然后body改為JSON格式,并輸入相關(guān)請(qǐng)求參數(shù),如下:
簡(jiǎn)單的請(qǐng)求參數(shù)如下:
{
"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為種子,隨機(jī)數(shù),batch_size為每次張數(shù),n_iter為生成批次,steps為生成步數(shù),cfg_scale為關(guān)鍵詞相關(guān)性,width為寬度,height為高度,restore_faces為臉部修復(fù),tiling為可平鋪,sampler_index為采樣方法。
點(diǎn)擊Send后,HAI服務(wù)器接受請(qǐng)求并進(jìn)行推理,推理后會(huì)將圖以base64的方法發(fā)過(guò)來(lái),返回的格式如下:
{
"images": [...],// 這里是一個(gè)base64格式的字符串?dāng)?shù)組,根據(jù)你請(qǐng)求的圖片數(shù)量而定
"parameters": { ... },//此處為你輸入的body
"info": "{...}"// 返回的圖片的信息
}
四、使用本地IDE實(shí)現(xiàn)私服Web端一鍵文生圖
既然Postman測(cè)試成功,那么我們可以為其寫(xiě)一個(gè)Web前端頁(yè)面,本次項(xiàng)目使用到的技術(shù)棧為Vue3+TS+Vite+Ant-Design+Axios,項(xiàng)目已經(jīng)上傳至CSDN,鏈接如下:https://download.csdn.net/download/air__Heaven/88492769
下載后,解壓并打開(kāi)終端,輸入npm i安裝依賴,然后打開(kāi)vite.config.ts,將sdapi和controlnet的api改為HAI服務(wù)器的地址和端口:
然后輸入npm run dev運(yùn)行項(xiàng)目,就可以愉快的開(kāi)始玩耍了!
其中main.vue中的核心代碼如下:
// 定義文生圖請(qǐng)求函數(shù)
async function txt2Img() {
// 每次請(qǐng)求之前清空瀏覽器的 localStorage 中的緩存
txt2imgReqStorage.value = null
txt2imgResultStorage.value = null
// 清空輪播圖
txt2img_imgs.value = []
// 如果啟用了 ControleNet 則將 ControlNet 相關(guān)組件中的參數(shù)填充到 文生圖請(qǐng)求參數(shù)中
if (controlNetEnable.value === true) {
console.log(imgFileList.value)
if (imgFileList.value?.length === 0) {
message.error("ControlNet已啟用,請(qǐng)上傳圖片")
return
}
if (controlNet_payload.value.module === '') {
message.error("ControlNet已啟用,請(qǐng)選擇預(yù)處理器")
return
}
if (controlNet_payload.value.model === '') {
message.error("ControlNet已啟用,請(qǐng)選擇模型")
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 = {}
}
// 打印請(qǐng)求參數(shù)
console.log("文生圖請(qǐng)求參數(shù):", txt2img_payload.value)
// 將請(qǐng)求參數(shù)保存在瀏覽器的 localStorage 中
txt2imgReqStorage.value = txt2img_payload.value;
//開(kāi)始請(qǐng)求
message.loading('正在請(qǐng)求...', 10)
// 文生圖api調(diào)用
const resp = await axios.post('/sdapi/v1/txt2img', txt2img_payload.value)
// 打印請(qǐng)求結(jié)果
console.log("文生圖響應(yīng)結(jié)果:", resp)
if (resp.data) {
message.success('請(qǐng)求成功!')
// 提取請(qǐng)求結(jié)果中的圖片
txt2imgRes.value = resp.data
// 定義一個(gè)臨時(shí)數(shù)組,該數(shù)組將賦值給 txt2imgResultStorage
let tempArr = ref<string[]>([])
txt2imgRes.value?.images.forEach((value: string, index: number) => {
txt2img_imgs.value.push('data:image/png;base64,' + value)
// 臨時(shí)數(shù)組中只存放2張圖片,防止賦值給 txt2imgResultStorage 后超過(guò)5M(localStorage最大支持5M),拋出異常
if (index < 2) {
tempArr.value.push('data:image/png;base64,' + value)
}
})
//將提取的請(qǐng)求結(jié)果中的圖片保存在瀏覽器的 localStorage 中,如果疊加顯示每次生成的圖片,請(qǐng)把以下三行代碼的注釋去掉即可
// if (tempArr.value.length > 0) {
// txt2imgResultStorage.value = tempArr.value
// }
} else {
message.error('請(qǐng)求失??!')
}
}
// 獲取文生圖的采樣方法
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 })
})
}
// 該函數(shù)將在頁(yè)面每次加載后進(jìn)行調(diào)用
onMounted(() => {
// 頁(yè)面加載后獲取保存在瀏覽器的 localStorage 中的數(shù)據(jù)去填充組件的輸入
if (Object.keys(txt2imgReqStorage.value).length !== 0) {
txt2img_payload.value = txt2imgReqStorage.value
}
if (txt2imgResultStorage.value.length > 0) {
txt2img_imgs.value = txt2imgResultStorage.value
}
// 調(diào)用獲取文生圖采樣方法的函數(shù)
txt2ImgSampler()
// 調(diào)用獲取 ControlNet 的 Preprocessor 的函數(shù)
controlNetPreProcessors()
// 調(diào)用獲取 ControlNet 的 Model 的函數(shù)
controlNetModels()
})
其中定義一個(gè)名為txt2Img的異步函數(shù),用于處理文生圖請(qǐng)求。函數(shù)根據(jù)是否啟用了ControlNet,將ControlNet相關(guān)組件中的參數(shù)填充到文生圖請(qǐng)求參數(shù)中。最后,打印請(qǐng)求參數(shù)并將其保存在瀏覽器的localStorage中,然后開(kāi)始發(fā)送請(qǐng)求。
定義一個(gè)名為txt2ImgSampler的異步函數(shù),用于獲取文生圖的采樣方法。該函數(shù)通過(guò)調(diào)用API接口獲取采樣方法數(shù)據(jù),并將其存儲(chǔ)在txt2ImgSamplerRes變量中。
定義了兩個(gè)異步函數(shù)controlNetPreProcessors和controlNetModels,分別用于獲取ControlNet的預(yù)處理器和模型的值。這兩個(gè)函數(shù)都通過(guò)調(diào)用API接口獲取相應(yīng)的數(shù)據(jù),并將其存儲(chǔ)在相應(yīng)的變量中。
在頁(yè)面加載后,調(diào)用onMounted函數(shù)。在該函數(shù)中,首先從瀏覽器的localStorage中獲取保存的數(shù)據(jù)并填充到組件的輸入中。然后依次調(diào)用txt2ImgSampler、controlNetPreProcessors和controlNetModels函數(shù),以獲取采樣方法、預(yù)處理器和模型的值。
五、使用騰訊云Cloud Studio 快速云上開(kāi)發(fā)
如果本地沒(méi)有安裝VSCode,也可以使用目前比較火的云IDE,選擇打開(kāi)騰訊云Cloud Studio,選擇開(kāi)發(fā)空間的手動(dòng)創(chuàng)建并立即創(chuàng)建,自定義模板配置如下:
同樣,將之前下載的壓縮包上傳到Cloud Studio開(kāi)發(fā)空間的工作目錄中,打開(kāi)終端,輸入解壓命令unzip sd_api.zip,解壓完成后,后面的步驟與第四章基本相同,即在終端窗口輸入命令cd進(jìn)入文件夾,然后輸入npm install
安裝依賴包,等待依賴完成安裝后就可以輸入npm run dev
啟動(dòng)Web項(xiàng)目了。
最后別忘了銷毀HAI服務(wù)器和暫停騰訊云Cloud Studio使用空間。
六、高性能應(yīng)用服務(wù)HAI使用感受
整體流程體驗(yàn)下來(lái),HAI作為一款面向AI和科學(xué)計(jì)算的GPU應(yīng)用服務(wù)產(chǎn)品,具有高性能計(jì)算能力、即插即用的云服務(wù)、靈活的配置選項(xiàng)、廣泛的軟件支持和安全保障等優(yōu)點(diǎn),是開(kāi)發(fā)者進(jìn)行復(fù)雜科學(xué)計(jì)算和AI模型訓(xùn)練的理想選擇。
- 高性能計(jì)算能力:HAI基于騰訊云GPU云服務(wù)器底層算力,提供高性能計(jì)算能力,能夠滿足復(fù)雜科學(xué)計(jì)算和AI模型訓(xùn)練的需求。
- 即插即用的云服務(wù): HAI提供即插即用的高性能云服務(wù),無(wú)需復(fù)雜配置,開(kāi)發(fā)者可以快速啟動(dòng)和部署GPU計(jì)算任務(wù)。
- 靈活的配置選項(xiàng):HAI提供靈活的配置選項(xiàng),用戶可以根據(jù)自己的需求和預(yù)算選擇不同的GPU實(shí)例類型和配置項(xiàng)等。
- 豐富的軟件支持:HAI為客戶提供了廣泛的軟件支持,包括流行的GPU應(yīng)用程序和開(kāi)發(fā)框架,如TensorFlow, PyTorch等,可以方便用戶進(jìn)行AI模型的訓(xùn)練和部署。
- 安全保障:騰訊云擁有高水準(zhǔn)的安全防護(hù)機(jī)制和服務(wù),保障用戶的數(shù)據(jù)和計(jì)算任務(wù)的安全可靠。
【騰訊云HAI域探秘】活動(dòng)目前正在進(jìn)行中,本次活動(dòng)是由騰訊云和CSDN聯(lián)合推出的開(kāi)發(fā)者技術(shù)實(shí)踐活動(dòng),活動(dòng)將通過(guò)技術(shù)交流直播、動(dòng)手實(shí)驗(yàn)、有獎(jiǎng)?wù)魑牡刃问剑瑤钊氤两襟w驗(yàn)騰訊云高性能應(yīng)用服務(wù)HAI。在本次活動(dòng)中,只要完成各個(gè)環(huán)節(jié)任務(wù),不僅可以參與AIGC創(chuàng)作抽獎(jiǎng)、優(yōu)秀博文的評(píng)選,還可以獲取相應(yīng)的積分,參加最終的積分排行榜,獲取豐厚的活動(dòng)禮品。
最后
?? 個(gè)人簡(jiǎn)介:人工智能領(lǐng)域研究生,目前主攻文本生成圖像(text to image)方向
?? 個(gè)人主頁(yè):中杯可樂(lè)多加冰
?? 限時(shí)免費(fèi)訂閱:文本生成圖像T2I專欄
?? 支持我:點(diǎn)贊??+收藏??+留言??文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-738663.html
另外,我們已經(jīng)建立了微信T2I學(xué)習(xí)交流群,如果你也是T2I方面的愛(ài)好者或研究者可以私信我加入。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-738663.html
到了這里,關(guān)于【騰訊云HAI域探秘】搭建一個(gè)永不宕機(jī)的本地SD文本生成圖像應(yīng)用--喂飯級(jí)高性能應(yīng)用HAI部署stable diffusion webui 一鍵文生圖的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!