搭建類似妙鴨相機(jī)的應(yīng)用
本文以部署ModelScope社區(qū)的人物AIGC基礎(chǔ)模型(ly261666/cv_portrait_model)搭建類似妙鴨相機(jī)的應(yīng)用為例,演示如何使用數(shù)據(jù)緩存。通過(guò)數(shù)據(jù)緩存提前拉取模型數(shù)據(jù),然后在創(chuàng)建應(yīng)用實(shí)例時(shí)直接掛載模型數(shù)據(jù),可以免去在實(shí)例中拉取模型數(shù)據(jù)的等待時(shí)間,加速應(yīng)用部署。
背景信息
妙鴨相機(jī)是一款基于AIGC的應(yīng)用,用戶在小程序中上傳一些個(gè)人照片,就能得到個(gè)人專屬的數(shù)字分身,然后再挑選喜歡的風(fēng)格模板,即可得到一組對(duì)應(yīng)的個(gè)人寫真。
阿里云達(dá)摩院近期推出了開源版“妙鴨相機(jī)”,即facechain。facechain的基本原理是典型的SD(Stable Diffusion)+LoRA,流程大致如下:
對(duì)已有的幾張個(gè)人照片(原圖)進(jìn)行訓(xùn)練,得到個(gè)人專屬的面部LoRA權(quán)重。
基于標(biāo)準(zhǔn)的SD基礎(chǔ)模型生成各種風(fēng)格的個(gè)人照片(結(jié)果圖)。
說(shuō)明facechain會(huì)在此基礎(chǔ)上,使用多種人像、皮膚相關(guān)的模型進(jìn)行人像優(yōu)化,從而生成更優(yōu)效果的照片。
雖然目前開源版本的facechain下載后即可配置使用,但存在以下問題:
訓(xùn)練和推理的過(guò)程中會(huì)直接從模型Hub下載模型,整個(gè)應(yīng)用涉及多個(gè)模型,大小約25 GB,導(dǎo)致整體耗時(shí)長(zhǎng),并且直接通過(guò)公網(wǎng)下載模型對(duì)帶寬和網(wǎng)絡(luò)穩(wěn)定性要求很高,一旦無(wú)法下載就會(huì)失敗。
不支持人臉記憶,只能基于當(dāng)前最新的訓(xùn)練結(jié)果進(jìn)行推理,即不能保留歷史訓(xùn)練出來(lái)的LoRA權(quán)重。
如果想換個(gè)模型或者更新版本等,需要手動(dòng)修改代碼,維護(hù)復(fù)雜,配置不靈活。
針對(duì)上述問題,ECI推出了優(yōu)化版本,即eci-facechain。主要優(yōu)化點(diǎn)如下:
將模型數(shù)據(jù)放入ECI數(shù)據(jù)緩存中,應(yīng)用啟動(dòng)后無(wú)需從模型Hub下載模型。
支持人臉記憶,訓(xùn)練流程支持給人臉打標(biāo)簽,推理時(shí)支持通過(guò)標(biāo)簽選擇歷史訓(xùn)練過(guò)的人臉進(jìn)行生成。
新增環(huán)境變量配置項(xiàng)(詳見
env.py
文件),無(wú)需修改應(yīng)用代碼即可通過(guò)容器的環(huán)境變量自定義SD的模型、版本、目錄、以及應(yīng)用端口等。優(yōu)化Web頁(yè)面,例如支持設(shè)置生成照片的像素等。
前提條件
您使用的VPC已綁定公網(wǎng)NAT網(wǎng)關(guān),并配置SNAT條目允許該VPC或下屬交換機(jī)的資源可以訪問公網(wǎng)。
如果VPC沒有綁定公網(wǎng)NAT網(wǎng)關(guān),您需要在創(chuàng)建數(shù)據(jù)緩存和部署應(yīng)用時(shí)綁定EIP,以便可以拉取公網(wǎng)數(shù)據(jù)。
準(zhǔn)備運(yùn)行環(huán)境
硬件要求
需使用GPU規(guī)格。vCPU、內(nèi)存等無(wú)具體要求,建議選擇顯存高的規(guī)格。ECI支持的GPU規(guī)格,請(qǐng)參見規(guī)格說(shuō)明。
軟件環(huán)境
ECI已基于eci-facechain制作了一個(gè)公共容器鏡像,您可以直接使用該鏡像或者將其作為基礎(chǔ)鏡像進(jìn)行二次開發(fā)。鏡像地址為registry.cn-hangzhou.aliyuncs.com/eci_open/facechain:1.0.2。
操作步驟
創(chuàng)建數(shù)據(jù)緩存
控制臺(tái)
訪問ModelScope,獲取模型ID。
本示例使用人物AIGC基礎(chǔ)模型(ID為ly261666/cv_portrait_model)的v4.0版本。在ModelScope找到目標(biāo)模型后,在模型詳情頁(yè)面頂部可以復(fù)制模型ID。
在頂部菜單欄左上角處選擇地域。
在左側(cè)導(dǎo)航欄,單擊數(shù)據(jù)緩存。
創(chuàng)建人物AIGC基礎(chǔ)模型的數(shù)據(jù)緩存。
單擊創(chuàng)建數(shù)據(jù)緩存。
完成數(shù)據(jù)緩存參數(shù)配置。
本文使用的參數(shù)示例如下,其中緩存數(shù)據(jù)源為拉取人物AIGC基礎(chǔ)模型的固定配置,其他參數(shù)可自定義配置,更多信息,請(qǐng)參見創(chuàng)建數(shù)據(jù)緩存。
配置項(xiàng)
示例值
緩存所屬Bucket
test
緩存所屬目錄
/model/cv
緩存名
cv
緩存大小
20 GiB
緩存數(shù)據(jù)源
類型:URL
參數(shù)
repoSource:ModelScope/Mode
repoId:ly261666/cv_portrait_model
revision:v4.0
單擊確定。
查看數(shù)據(jù)緩存狀態(tài)。
在數(shù)據(jù)緩存頁(yè)面刷新查看數(shù)據(jù)緩存狀態(tài),當(dāng)狀態(tài)為Available時(shí),表示可以使用該數(shù)據(jù)緩存。
OpenAPI
訪問ModelScope,獲取模型ID。
本示例使用人物AIGC基礎(chǔ)模型(ID為ly261666/cv_portrait_model)的v4.0版本。在ModelScope找到目標(biāo)模型后,在模型詳情頁(yè)面頂部可以復(fù)制模型ID。
創(chuàng)建人物AIGC基礎(chǔ)模型的數(shù)據(jù)緩存。
調(diào)用CreateDataCache接口創(chuàng)建數(shù)據(jù)緩存所采用的參數(shù)示例如下,表示從ModelScope拉取指定模型數(shù)據(jù),保存到名為test的Bucket的
/model/cv/
目錄。數(shù)據(jù)緩存名為cv,保留時(shí)長(zhǎng)為1天。重要如果您通過(guò)SDK創(chuàng)建數(shù)據(jù)緩存,DataSource.Options中的各個(gè)參數(shù)前無(wú)需添加參數(shù)名的長(zhǎng)度,例如
#10#repoSource
直接寫成repoSource
,#6#repoId
直接寫成repoId
即可。{ "RegionId": "cn-beijing", "VSwitchId": "vsw-2ze23nqzig8inpr******", "SecurityGroupId": "sg-2ze1003ujo0fuv******", "Bucket": "test", "Path": "/model/cv/", "Name": "cv", "DataSource": { "Type": "URL", "Options": { "#6#repoId": "ly261666/cv_portrait_model", "#10#repoSource": "ModelScope/Model", "#8#revision": "v4.0" } }, "RetentionDays": 1 }
查詢數(shù)據(jù)緩存狀態(tài)。
根據(jù)返回的數(shù)據(jù)緩存ID調(diào)用DescribeDataCaches接口查詢數(shù)據(jù)緩存信息,當(dāng)數(shù)據(jù)緩存的狀態(tài)(DataCaches.Status)為Available時(shí),表示可以使用該數(shù)據(jù)緩存。
搭建“妙鴨相機(jī)”
控制臺(tái)
在彈性容器實(shí)例控制臺(tái)的容器組頁(yè)面,單擊創(chuàng)建彈性容器組。
填寫實(shí)例相關(guān)配置信息,然后單擊配置確認(rèn)。
本文使用的參數(shù)示例如下,實(shí)例使用GPU規(guī)格,并掛載了人物AIGC基礎(chǔ)模型的數(shù)據(jù)緩存。實(shí)例內(nèi)容器使用ECI提供的制作好的facechain鏡像,容器啟動(dòng)后會(huì)運(yùn)行一個(gè)Web服務(wù),可通過(guò)8888端口訪問。
說(shuō)明當(dāng)VPC已綁定公網(wǎng)NAT網(wǎng)關(guān)時(shí),創(chuàng)建ECI實(shí)例時(shí)可以不綁定EIP。在實(shí)例創(chuàng)建完成后,您可以配置DNAT條目實(shí)現(xiàn)外部訪問ECI實(shí)例。
容器默認(rèn)對(duì)外開放8888端口,如果想要修改端口,可通過(guò)設(shè)置容器環(huán)境變量APP_PORT來(lái)指定端口。
配置區(qū)域
配置項(xiàng)
示例值
容器組配置
指定規(guī)格
ecs.gn6i-c4g1.xlarge
名稱
cv
容器配置
容器名稱
cv
鏡像
鏡像:registry.cn-hangzhou.aliyuncs.com/eci_open/facechain
版本:1.0.2
數(shù)據(jù)緩存
緩存Bucket
test
單擊添加,掛載人物AIGC基礎(chǔ)模型的數(shù)據(jù)緩存
緩存目錄:/model/cv/
目標(biāo)容器:cv
容器掛載目錄:/mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/
彈性公網(wǎng)IP
彈性公網(wǎng)IP
自動(dòng)創(chuàng)建
帶寬峰值:5 Mbps
確認(rèn)實(shí)例配置信息,閱讀并選中服務(wù)協(xié)議,單擊確認(rèn)訂單。
返回容器組頁(yè)面,確認(rèn)應(yīng)用部署狀態(tài)并查看實(shí)例的EIP地址。
在容器組頁(yè)面可以查看實(shí)例狀態(tài),單擊實(shí)例ID進(jìn)入實(shí)例詳情頁(yè)可以查看容器狀態(tài)。當(dāng)實(shí)例狀態(tài)和容器狀態(tài)均為運(yùn)行中時(shí),表示應(yīng)用部署成功。您可以在IP地址列獲取實(shí)例的EIP地址。
OpenAPI
使用數(shù)據(jù)緩存創(chuàng)建ECI實(shí)例,部署“妙鴨相機(jī)”應(yīng)用。
調(diào)用CreateContainerGroup接口創(chuàng)建ECI實(shí)例所采用的參數(shù)示例如下,該實(shí)例使用GPU規(guī)格,并掛載了人物AIGC基礎(chǔ)模型。
說(shuō)明以下示例中,系統(tǒng)會(huì)自動(dòng)創(chuàng)建并為ECI實(shí)例綁定一個(gè)EIP。當(dāng)VPC已綁定公網(wǎng)NAT網(wǎng)關(guān)時(shí),創(chuàng)建ECI實(shí)例時(shí)可以不綁定EIP。在實(shí)例創(chuàng)建完成后,您可以配置DNAT條目實(shí)現(xiàn)外部訪問ECI實(shí)例。
容器默認(rèn)對(duì)外開放8888端口,如果想要修改端口,可通過(guò)設(shè)置容器環(huán)境變量APP_PORT來(lái)指定端口。
{ "RegionId": "cn-beijing", "SecurityGroupId": "sg-2ze1003ujo0fuv******", "VSwitchId": "vsw-2ze23nqzig8inpr******", "ContainerGroupName": "cv", "InstanceType": "ecs.gn6i-c4g1.xlarge", "DataCacheBucket": "test", "AutoCreateEip": true, "Container": [ { "Image": "registry.cn-hangzhou.aliyuncs.com/eci_open/facechain:1.0.2", "Name": "cv", "VolumeMount": [ { "MountPath": "/mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/", "Name": "model-cv" } ] } ], "Volume": [ { "Type": "HostPathVolume", "HostPathVolume.Path": "/model/cv/", "Name": "model-cv" } ] }
確認(rèn)應(yīng)用部署狀態(tài)。
根據(jù)返回的實(shí)例ID調(diào)用DescribeContainerGroupStatus查詢實(shí)例和容器狀態(tài)。當(dāng)實(shí)例狀態(tài)(Status)和容器狀態(tài)(ContainerStatuses.State)為Running,表示實(shí)例已經(jīng)創(chuàng)建成功,容器正在運(yùn)行。
查詢實(shí)例的EIP地址。
根據(jù)返回的實(shí)例ID調(diào)用DescribeContainerGroups查詢實(shí)例詳情,在InternetIp中可以獲取實(shí)例的EIP地址。
測(cè)試模型效果
在ECI實(shí)例所屬安全組中添加入方向規(guī)則,開放8888端口。
打開瀏覽器,訪問“妙鴨相機(jī)”應(yīng)用的Web頁(yè)面。
本文示例的“妙鴨相機(jī)”應(yīng)用已單獨(dú)綁定了EIP,可以直接輸入實(shí)例的EIP地址和容器開放的端口進(jìn)行訪問,例如
47.94.XX.XX:8888
。測(cè)試人物AIGC基礎(chǔ)模型是否可以類似妙鴨相機(jī)的效果。
在形象定制頁(yè)簽下,上傳人臉照片。
按需給人臉增加標(biāo)簽,然后單擊開始訓(xùn)練。
等待訓(xùn)練完成后,單擊形象體驗(yàn)頁(yè)簽。
按需選擇風(fēng)格模型、服裝風(fēng)格,配置圖片數(shù)量和高度寬度等參數(shù),然后單擊開始生成。
等待并查看生成結(jié)果。
說(shuō)明如果出現(xiàn)Error報(bào)錯(cuò),可查看容器日志確認(rèn)報(bào)錯(cuò)原因。如果是OOM,建議調(diào)小照片的寬度和高度,或者重新使用更大顯存的GPU規(guī)格來(lái)部署應(yīng)用。