如何在亞馬遜 SageMaker 進(jìn)行 Stable Diffusion 模型在線服務(wù)部署
前言 - 淺談 AIGC

AIGC - 引領(lǐng)人工智能走向春天
隨著人工智能技術(shù)的發(fā)展與完善,AI Generated Content (AIGC,人工智能自動(dòng)生成內(nèi)容) 在內(nèi)容的創(chuàng)作上為人們的工作和生活帶來前所未有的幫助,具體表現(xiàn)在能夠幫助人類提高內(nèi)容生產(chǎn)的效率,豐富內(nèi)容生產(chǎn)的多樣性、提供更加動(dòng)態(tài)且可交互的內(nèi)容。AIGC 相關(guān)技術(shù)可以在創(chuàng)意、表現(xiàn)力、迭代、傳播、個(gè)性化等方面,充分發(fā)揮技術(shù)優(yōu)勢(shì),打造新的數(shù)字內(nèi)容生成與交互形態(tài)。在這兩年AIGC在AI作畫、AI 作曲、AI 作詩、AI寫作、AI視頻生成、 AI語音合成等領(lǐng)域持續(xù)大放異彩;尤其是近段時(shí)間火遍全網(wǎng)的AI繪畫,作為用戶的我們只要簡(jiǎn)單輸入幾個(gè)關(guān)鍵詞幾秒鐘之內(nèi)一幅畫作就能誕生。
?春天里盛開的 AI 繪畫
最近以AIGC帶來巨大生產(chǎn)力提升的時(shí)尚寵兒不斷進(jìn)化升級(jí),爭(zhēng)相亮相。我們迎來ChatGPT 系列技術(shù)帶給我們一波又一波的AI盛宴,而在計(jì)算機(jī)視覺領(lǐng)域,AI 繪畫近兩年正在逐漸走向圖像生成舞臺(tái)的中央。

文本生成圖像(AI 繪畫)是根據(jù)文本生成圖像的的新型生產(chǎn)方式,相比于人類創(chuàng)作者,文本生成圖像展現(xiàn)出了創(chuàng)作成本低、速度快且易于批量化生產(chǎn)的優(yōu)勢(shì)。
AI 繪畫之Stable Diffusion 2.0 登場(chǎng)
近一年來,AI繪畫領(lǐng)域迅猛發(fā)展,國內(nèi)外科技巨頭和初創(chuàng)企業(yè)爭(zhēng)相涌入,出現(xiàn)了不少文本生成圖像的技術(shù)產(chǎn)品。這些產(chǎn)品背后主要使用基于擴(kuò)散生成算法的 dall-e-2 和 stable diffusion 等模型。
2022年 Stable Diffusion 2.0 版本的發(fā)布,再次點(diǎn)燃了無數(shù)創(chuàng)作者使用AI文本圖像生成技術(shù)來生成高質(zhì)量創(chuàng)意圖像的熱情 ,如下圖所示,Stable Diffusion相關(guān)代碼倉庫,gitHub star 數(shù)量正在飛速增長:

與 Stable Diffusion 上一個(gè)版本相比,Stable Diffusion 2.0 取得了更加優(yōu)異的圖像生成效果,具體表現(xiàn)如下:
1. ?通過在模型體系結(jié)構(gòu)中引入交叉注意力層,將擴(kuò)散模型轉(zhuǎn)化為強(qiáng)大而靈活的生成器,用于文本或邊界框等一般條件輸入,并以卷積方式實(shí)現(xiàn)高分辨率圖像生成;
2. ?基于 latent diffusion models(LDM)在圖像修復(fù)和類條件圖像合成方面獲得了目前最優(yōu)的分?jǐn)?shù);
3. ?在多項(xiàng)任務(wù)上都取得了非常有競(jìng)爭(zhēng)力的表現(xiàn),包括無條件圖像生成、文本到圖像合成和超分辨率;
4. ?同時(shí)與 pixel-based 擴(kuò)散模型方法相比顯著降低了計(jì)算要求,使得它的推理速度大大提升。
人人都有機(jī)會(huì)成為前沿的技術(shù)探索者
Stable Diffusion 2.0 和 chatGPT 等系列模型在計(jì)算機(jī)視覺和自然語言處理兩大AI應(yīng)用領(lǐng)域的優(yōu)異表現(xiàn), 引起學(xué)術(shù)界和工業(yè)界的極大轟動(dòng),人工智能事業(yè)發(fā)展似乎迎來了又一個(gè)春天。
眾所周知,隨著 AI 任務(wù)復(fù)雜性和應(yīng)用范圍增加,高精度大規(guī)模不斷涌現(xiàn),AI模型的訓(xùn)練和推理對(duì)算力的要求越來越高,對(duì)于中小企業(yè)和個(gè)人開發(fā)者而言,如果想訓(xùn)練或者部署稍微大的AI模型就不得不面對(duì)購買大量算力資源高投入的風(fēng)險(xiǎn),而具備高算力資源的企業(yè)則能夠有機(jī)會(huì)把握住各種神奇AIGC技術(shù)全面開花落地的歷史機(jī)遇。
我們普通的創(chuàng)業(yè)者和開發(fā)者,有沒有機(jī)會(huì)去訓(xùn)練和部署我們所看好領(lǐng)域的AIGC模型呢,答案是肯定的,在當(dāng)下這個(gè)云服務(wù)時(shí)代,人人都有機(jī)會(huì)成為前沿的技術(shù)探索者。
最近受邀參加了亞馬遜云科技 『云上探索實(shí)驗(yàn)室』實(shí)踐云上技術(shù)的系列活動(dòng),通過Amazon SageMaker 平臺(tái)快速完成 AIGC模型推理服務(wù)在線web部署,帶給我很多啟發(fā)和驚喜,原來在云端進(jìn)行AI模型推理部署可以如此簡(jiǎn)潔,優(yōu)雅、流暢。在參加這次活動(dòng)實(shí)踐的過程中,我也學(xué)到了很多有益的知識(shí)和技能, 接下來的博文就會(huì)以我的一次AIGC模型(Stable Diffusion 2.0 )web服務(wù)部署之旅帶大家一起體驗(yàn)如何在云端去落地AI模型服務(wù):
* ? [傳送門:Stable Diffusion 2.0 GitHub 倉庫]
* ?https://github.com/Stability-AI/stablediffusion
* ? [傳送門:亞馬遜云科技之云上探索實(shí)驗(yàn)室活動(dòng):從實(shí)踐中探索機(jī)器學(xué)習(xí)邊界]
* ?https://dev.amazoncloud.cn/experience?trk=cndc-detail\&sc_medium=corecontent\&sc_campaign=product\&sc_channel=csdn

基于Amazon SageMaker進(jìn)行Stable Diffusion 模型部署
認(rèn)識(shí) Amazon SageMaker
Amazon SageMaker?是一項(xiàng)完全托管的機(jī)器學(xué)習(xí)服務(wù):借助SageMaker的多種功能,數(shù)據(jù)科學(xué)家和開發(fā)人員可以快速輕松地構(gòu)建和訓(xùn)練機(jī)器學(xué)習(xí)模型,然后直接部署至生產(chǎn)環(huán)境就緒的托管環(huán)境。SageMaker涵蓋了ML 的整個(gè)工作流,可以標(biāo)記和準(zhǔn)備數(shù)據(jù)、選擇算法、訓(xùn)練模型、調(diào)整和優(yōu)化模型以便部署、預(yù)測(cè)和執(zhí)行操作。
經(jīng)過過去一周多的學(xué)習(xí)和實(shí)踐體驗(yàn),我發(fā)現(xiàn)這個(gè)平臺(tái)簡(jiǎn)直就是為我們這些創(chuàng)業(yè)者和個(gè)人開發(fā)者量身打造的AI服務(wù)落地利器。`許多AI工程項(xiàng)目,我們只需去構(gòu)造好自己的訓(xùn)練集和測(cè)試集,其余的模型訓(xùn)練、推理、部署,Amazon SageMaker 都能夠幫我們輕松完成。
本次博文所分享的 Stable Diffusion 2.0,通過參考官方提供的技術(shù)文檔,只用了 20分鐘左右的時(shí)間,我就在Amazon SageMaker 上成功搭建了一套流暢的AI繪畫在線服務(wù),接下來,讓我們一起揭秘。
借助 Amazon SageMaker 進(jìn)行環(huán)境搭建和模型推理
1. 創(chuàng)建 jupyter notebook 運(yùn)行環(huán)境
* ? [點(diǎn)擊鏈接登錄至亞馬遜云科技管理控制臺(tái)]
* ?https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1#
在搜索框中搜索 SageMaker ,如下圖所示

這里我們創(chuàng)建一個(gè)筆記本編程實(shí)例

我這里選擇的配置如下:

選擇角色,其他的默認(rèn)即可

大概5分鐘左右,實(shí)例就創(chuàng)建成功啦

* ? [復(fù)制鏈接,下載代碼]
* ?https://static.us-east-1.prod.workshops.aws/public/73ea3a9f-37c8-4d01-ae4e-07cf6313adac/static/code/notebook-stable-diffusion-ssh-inference.ipynb



2. 一鍵運(yùn)行所有代碼
這里我們直接一鍵運(yùn)行運(yùn)行所有代碼即可,代碼執(zhí)行過程中會(huì)依次完成 Stable Diffusion 模型相關(guān)類和函數(shù)的代碼定義、推理測(cè)試,并打包代碼和模型,然后部署模型至Sagemaker 推理終端節(jié)點(diǎn) (PS:這里的所有代碼運(yùn)行完畢大概需要5到10分鐘左右)

?關(guān)鍵代碼分析如下
?1. 環(huán)境準(zhǔn)備,代碼模型下載
檢查當(dāng)前 pyTorch 版本
```bash
!nvcc --version
!pip list | grep torch
```
安裝 Stable Diffusion 代碼運(yùn)行額外需要的依賴庫,這網(wǎng)速飛快
```bash
!sudo yum -y install pigz
!pip install -U pip
!pip install -U transformers==4.26.1 diffusers==0.13.1 ftfy accelerate
!pip install -U torch==1.13.1+cu117 -f https://download.pytorch.org/whl/torch_stable.html
!pip install -U sagemaker
!pip list | grep torch
```
> 下載代碼和模型文件,這里直接下載Hugging Face提供的代碼和模型即可

?2. 在Notebook中配置并使用模型
> 直接調(diào)用 函數(shù)進(jìn)行模型加載
```python
import torch
import datetime
from diffusers import StableDiffusionPipeline
# Load stable diffusion?
pipe = StableDiffusionPipeline.from_pretrained(SD_MODEL, torch_dtype=torch.float16)
```
> 在 Cuda 上進(jìn)行模型的推理,這里 Stable Diffusion V2 能夠支持生成的最大圖像尺寸為 768 * 768
```bash
# move Model to the GPU
torch.cuda.empty_cache()
pipe = pipe.to("cuda")
# V1 Max-H:512,Max-W:512
# V2 Max-H:768,Max-W:768
print(datetime.datetime.now())
prompts =[
? ? "Eiffel tower landing on the Mars",
? ? "a photograph of an astronaut riding a horse,van Gogh style",
]
generated_images = pipe(
? ? prompt=prompts,
? ? height=512,
? ? width=512,
? ? num_images_per_prompt=1
).images ?# image here is in [PIL format](https://pillow.readthedocs.io/en/stable/)
print(f"Prompts: {prompts}\n")
print(datetime.datetime.now())
for image in generated_images:
? ? display(image)
```
友情提示 :如果報(bào)錯(cuò),遇到推理時(shí) GPU 內(nèi)存不夠,則可以嘗試以下三種方式進(jìn)行解決
1. ?試一試生成分辨率小一點(diǎn)的圖片
2. ?減少生成圖片的數(shù)量
3. ?升級(jí)機(jī)型,選擇更強(qiáng)的GPU服務(wù)器
?3. 部署模型至Sagemaker 推理終端節(jié)點(diǎn)
我們這里直接使用 AWS 的 SageMaker Python 開發(fā)工具包部署模型剛剛已經(jīng)驗(yàn)證能夠運(yùn)行成功的模型和打包好的代碼。
* ? 編寫初始化的Sagemaker代碼用于部署推理終端節(jié)點(diǎn)
```python
import sagemaker
import boto3
'''
# 創(chuàng)建 Session
'''
sess = sagemaker.Session()
# sagemaker session bucket -> used for uploading data, models and logs
# sagemaker will automatically create this bucket if it not exists
sagemaker_session_bucket=None
if sagemaker_session_bucket is None and sess is not None:
? ? # set to default bucket if a bucket name is not given
? ? sagemaker_session_bucket = sess.default_bucket()
try:
? ? role = sagemaker.get_execution_role()
except ValueError:
? ? iam = boto3.client('iam')
? ? role = iam.get_role(RoleName='sagemaker_execution_role')['Role']['Arn']
sess = sagemaker.Session(default_bucket=sagemaker_session_bucket)
print(f"sagemaker role arn: {role}")
print(f"sagemaker bucket: {sess.default_bucket()}")
print(f"sagemaker session region: {sess.boto_region_name}")
```
* ? 創(chuàng)建 inference.py 腳本,進(jìn)行模型的加載和推理
```python
%%writefile ./$SD_MODEL/code/inference.py
import base64
import torch
from io import BytesIO
from diffusers import StableDiffusionPipeline
'''
# 加載模型到CUDA
'''
def model_fn(model_dir):
? ? # Load stable diffusion and move it to the GPU
? ? pipe = StableDiffusionPipeline.from_pretrained(model_dir, torch_dtype=torch.float16)
? ? pipe = pipe.to("cuda")
? ? return pipe
'''
# 推理方法
'''
def predict_fn(data, pipe):
? ? # 解析參數(shù) get prompt & parameters
? ? prompt = data.pop("prompt", "")
? ? # set valid HP for stable diffusion
? ? height = data.pop("height", 512)
? ? width = data.pop("width", 512)
? ? num_inference_steps = data.pop("num_inference_steps", 50)
? ? guidance_scale = data.pop("guidance_scale", 7.5)
? ? num_images_per_prompt = data.pop("num_images_per_prompt", 1)
? ? # 傳入?yún)?shù),調(diào)用推理 run generation with parameters
? ? generated_images = pipe(
? ? ? ? prompt=prompt,
? ? ? ? height=height,
? ? ? ? width=width,
? ? ? ? num_inference_steps=num_inference_steps,
? ? ? ? guidance_scale=guidance_scale,
? ? ? ? num_images_per_prompt=num_images_per_prompt,
? ? )["images"]
? ? # create response
? ? encoded_images = []
? ? for image in generated_images:
? ? ? ? buffered = BytesIO()
? ? ? ? image.save(buffered, format="JPEG")
? ? ? ? encoded_images.append(base64.b64encode(buffered.getvalue()).decode())
? ? # create response
? ? return {"generated_images": encoded_images}
```
在 Amazon Cloud9 創(chuàng)建前后端 Web 應(yīng)用
AWS Cloud9 是一種基于云的集成開發(fā)環(huán)境 (IDE),只需要一個(gè)瀏覽器,即可編寫、運(yùn)行和調(diào)試代碼。包括一個(gè)代碼編輯器、調(diào)試程序和終端,并且預(yù)封裝了適用于 JavaScript、Python、PHP 等常見編程語言的基本工具,無需安裝文件或配置開發(fā)計(jì)算機(jī),即可開始新的項(xiàng)目。
* ? 這里我直接參考官方提供的手冊(cè),跟著操作即可完成 Web 服務(wù)的部署
* ?https://catalog.us-east-1.prod.workshops.aws/workshops/3b86fa89-da3a-4e5f-8e77-b45fb11adf4a/zh-CN/2-create-cloud9#1.-cloud9
1. 創(chuàng)建云服務(wù)實(shí)例,并進(jìn)行web環(huán)境安裝
這里我試用了 Cloud9 云服務(wù),在查找服務(wù)處搜索 Cloud9,并點(diǎn)擊進(jìn)入Cloud9服務(wù)面板即可

點(diǎn)擊創(chuàng)建環(huán)境

我這里的設(shè)置如下

其他部分配置保持默認(rèn),在頁面底部點(diǎn)擊橙色的 Create 按鈕創(chuàng)建環(huán)境。 環(huán)境的創(chuàng)建將花費(fèi)1-2分鐘的時(shí)間。

創(chuàng)建成功之后,點(diǎn)擊 open 進(jìn)入服務(wù)控制臺(tái)

粘貼左側(cè)的代碼,復(fù)制到控制臺(tái)bash窗口進(jìn)行運(yùn)行,會(huì)自動(dòng)下載和解壓代碼
```bash
cd ~/environment
wget https://static.us-east-1.prod.workshops.aws/public/73ea3a9f-37c8-4d01-ae4e-07cf6313adac/static/code/SampleWebApp.zip
unzip SampleWebApp.zip
# ?在 AWS Cloud9 上安裝 Flask 和 boto3
pip3 install Flask
pip3 install boto3
```

2. 運(yùn)行啟動(dòng)web服務(wù),輸入想要生成的圖像參數(shù)和提示詞,調(diào)用推理服務(wù)
依賴的環(huán)境安裝好之后,就可以運(yùn)行這個(gè)服務(wù)代碼

服務(wù)啟動(dòng)成功之后,訪問 127.0.0.1:8080 即可訪問本地服務(wù);設(shè)定 width 和 Length 參數(shù),以及想要生成的圖片描述,然后點(diǎn)擊提交

等待 幾秒鐘之后,就得到了上面輸入的兩個(gè) 提示詞對(duì)應(yīng)生成的圖像,看得出來效果還是非常不錯(cuò)的;
* ? 經(jīng)測(cè)試發(fā)現(xiàn),即使每次輸入的提示詞是同一個(gè),模型生成得到的輸出也是不固定的
* ? 輸入的提示詞語越精準(zhǔn),生成的圖像效果會(huì)容易越好
* ? 基于亞馬遜SageMaker服務(wù)平臺(tái),如此快速(熟練之后,不到半個(gè)小時(shí))就能搭建好一套AI模型的web端在線推理調(diào)用,果然好的技術(shù)就是第一生產(chǎn)力

3. 文本圖像生成示例
這里提供3組文本圖像生成的示例,方便各位同學(xué)參考:

4. Stable Diffusion 2.0 模型效果優(yōu)缺點(diǎn)分析
目前業(yè)界已經(jīng)有不少文本圖像生成的服務(wù)和模型推出,Stable Diffusion 2.0 的圖像生成效果,整體上我覺得相當(dāng)驚艷,優(yōu)點(diǎn)很明顯:
1. ?能夠直接支持 512x512像素和768x768像素的圖像生成,生成圖像的整體質(zhì)量和局部細(xì)節(jié)都有顯著提升,其次在超分辨率高階Diffusion模型加持下,Stable Diffusion 2.0 可以進(jìn)一步生成分辨率2K以上的高清圖像。
2. ?對(duì)文本詞匯的解析比較精準(zhǔn),推理速度相比之前版本有較大提升,整體來看非常高效、魯棒,超越目前業(yè)界很多模型。
不足之處,Stable Diffusion 2.0 對(duì)于過短和過長的文本提示詞生成的圖像可能效果差異很大,這意味著有的時(shí)候,如果想要生成得到更加貼近我們預(yù)期的圖像,需要對(duì)專業(yè)的文本提示詞匯有所了解,使得輸入的文本提示詞更加精準(zhǔn)和容易讓模型理解。
亞馬遜云科技之云上探索實(shí)驗(yàn)室
亞馬遜云服務(wù)使用體驗(yàn)總結(jié)
通過此次深度參與?[亞馬遜云科技之云上探索實(shí)驗(yàn)室]?活動(dòng)并上手實(shí)踐不同AI項(xiàng)目的云端服務(wù)部署,我進(jìn)一步認(rèn)識(shí)到 AWS(Amazon Web Services)的強(qiáng)大所在:
1. ?可擴(kuò)展性:AWS允許用戶根據(jù)業(yè)務(wù)需要輕松擴(kuò)展服務(wù)器資源,能夠幫助客戶節(jié)省成本、提高效率;
2. ?可靠性:AWS 擁有持續(xù)領(lǐng)先的云服務(wù)基礎(chǔ)設(shè)施,具有高度可靠的分布式架構(gòu),能夠在全球業(yè)務(wù)范圍內(nèi)提供穩(wěn)定可靠的服務(wù);
3. ?安全性:AWS 提供各種安全功能和工具,有效幫助用戶保護(hù)數(shù)據(jù)和應(yīng)用程序;
4. ?靈活性:AWS 提供各種可定制的服務(wù)和功能,以滿足用戶的特定需求;
5. ?可信賴:AWS 在業(yè)界樹立良好的企業(yè)形象和服務(wù)口碑,早已成為全球數(shù)百萬企業(yè)和個(gè)人客戶的云轉(zhuǎn)型首選。
AWS 相比其他云服務(wù)廠商,還具備以下優(yōu)點(diǎn):
1. ?亞馬遜云科技為 AWS 提供全球覆蓋廣泛、服務(wù)深入的云平臺(tái),已有超過 200 項(xiàng)功能齊全的服務(wù)可供使用;
2. ?提供有一套構(gòu)建于 AWS 之上的按需付費(fèi)的生產(chǎn)效率應(yīng)用程序,使得團(tuán)隊(duì)用戶能夠快速、安全、經(jīng)濟(jì)高效地檢查項(xiàng)目狀態(tài)、進(jìn)行內(nèi)容協(xié)作,并實(shí)現(xiàn)實(shí)時(shí)通信;
3. ?提供最廣泛、最深入的機(jī)器學(xué)習(xí)服務(wù)及配套的云基礎(chǔ)設(shè)施和廣泛驗(yàn)證的算法模型,從而使每位開發(fā)人員、數(shù)據(jù)科學(xué)家和專家從業(yè)者都能利用機(jī)器學(xué)習(xí)技術(shù)高效切入AI服務(wù)的落地和部署;
4. ?提供全方位的在線開發(fā)工具,用戶能夠更快、更高效地托管代碼以及構(gòu)建、測(cè)試和部署應(yīng)用程序;
前沿技術(shù)有待大家一起去探索
這次有幸受邀參加亞馬遜云科技【云上探索實(shí)驗(yàn)室】活動(dòng),跟著亞馬遜云科技技術(shù)團(tuán)隊(duì)提供的系列非常詳盡的 AI模型云上推理部署實(shí)戰(zhàn)文檔和視頻教程一步步進(jìn)行真實(shí)的云上服務(wù)部署操作,讓我再次認(rèn)識(shí)到AI在各個(gè)領(lǐng)域技術(shù)突破所帶來的強(qiáng)大生產(chǎn)力,而通過借助 亞馬遜 SageMaker 平臺(tái)進(jìn)行AI模型服務(wù)部署大大簡(jiǎn)化我們普通開發(fā)者進(jìn)行AI模型部署服務(wù)的難度,使得對(duì)于中小企業(yè)和個(gè)人開發(fā)者而言,AI服務(wù)的快速落地也不再是一件難事。
通過使用 亞馬遜 SageMaker 服務(wù)平臺(tái),我們只需要一個(gè)瀏覽器,即可編寫、運(yùn)行和調(diào)試各種代碼,無需進(jìn)行復(fù)雜的機(jī)器適配和環(huán)境搭建,能夠快速完成AI模型的推理、測(cè)試、驗(yàn)證部署工作。
如果你也想親身感受最新、最熱門的亞馬遜云科技開發(fā)者工具與服務(wù),那么只需復(fù)制下方鏈接,即可跟著亞馬遜云科技團(tuán)隊(duì)工程師一起對(duì)更多有趣的AI技術(shù)進(jìn)行探索與實(shí)踐,出擊吧,AI 追夢(mèng)人
https://catalog.us-east-1.prod.workshops.aws/workshops/3b86fa89-da3a-4e5f-8e77-b45fb11adf4a/zh-CN/1-create-notebook
https://dev.amazoncloud.cn/experience?trk=cndc-detail&sc_medium=corecontent&sc_campaign=product&sc_channel=csdn

