視頻生成解決方案
EasyAnimate是阿里云PAI平臺自主研發(fā)的DiT的視頻生成框架,它提供了完整的高清長視頻生成解決方案,包括視頻數(shù)據(jù)預處理、VAE訓練、DiT訓練、模型推理和模型評測等。本文為您介紹如何在PAI平臺集成EasyAnimate并一鍵完成模型推理、微調(diào)及部署的實踐流程。
背景信息
本文為您介紹以下兩種視頻生成的方式:
DSW是為算法開發(fā)者量身打造的一站式AI開發(fā)平臺,集成了JupyterLab、WebIDE、Terminal多種云端開發(fā)環(huán)境,其中,Gallery提供了豐富的案例和解決方案,幫助您快速熟悉研發(fā)流程。您可以打開DSW Gallery中的案例教程,實現(xiàn)一鍵式運行Notebook,完成基于EasyAnimate的視頻生成模型的推理和訓練任務,也可以進行模型推理和微調(diào)等二次開發(fā)操作。
快速開始集成了眾多AI開源社區(qū)中優(yōu)質(zhì)的預訓練模型,并且基于開源模型支持零代碼實現(xiàn)從訓練到部署再到推理的全部過程,您可以通過快速開始一鍵部署EasyAnimate模型并生成視頻,享受更快、更高效、更便捷的AI應用體驗。
費用說明
方式 | 費用說明 |
如果您的賬號為DSW或EAS的新用戶,可以免費試用對應產(chǎn)品。關于免費試用的額度、領取方式及注意事項等詳細信息,請參見新用戶免費試用。 說明
| |
如果您的賬號非新用戶,使用DSW和EAS會產(chǎn)生相應費用。更多計費詳情,請參見交互式建模(DSW)計費說明、模型在線服務(EAS)計費說明。 | |
如果您的賬號為DLC或EAS的新用戶,可以免費試用對應產(chǎn)品。關于免費試用的額度、領取方式及注意事項等詳細信息,請參見新用戶免費試用。 說明 由于免費試用資源存在資源額度限制,因此無法進行模型訓練相關操作。 | |
如果您的賬號非新用戶,使用DLC或EAS會產(chǎn)生相應費用。更多計費詳情,請參見分布式訓練(DLC)計費說明、模型在線服務(EAS)計費說明。 |
前提條件
創(chuàng)建PAI工作空間。具體操作,請參見開通PAI并創(chuàng)建默認工作空間。
方式一:使用DSW
步驟一:創(chuàng)建DSW實例
進入DSW頁面。
登錄PAI控制臺。
在概覽頁面選擇目標地域。
在左側(cè)導航欄單擊工作空間列表,在工作空間列表頁面中單擊目標工作空間名稱,進入對應工作空間內(nèi)。
在工作空間頁面的左側(cè)導航欄選擇模型開發(fā)與訓練>交互式建模(DSW),進入DSW頁面。
單擊創(chuàng)建實例。
在配置實例向?qū)ы撁?,配置以下關鍵參數(shù),其他參數(shù)保持默認即可。
參數(shù)
說明
實例名稱
本教程使用的示例值為:AIGC_test_01
資源規(guī)格
選擇GPU規(guī)格下的ecs.gn7i-c8g1.2xlarge,或其他A10、GU100規(guī)格。
鏡像
選擇官方鏡像的easyanimate:1.1.5-pytorch2.2.0-gpu-py310-cu118-ubuntu22.04。
數(shù)據(jù)集(可選)
單擊添加,單擊創(chuàng)建數(shù)據(jù)集,創(chuàng)建OSS或NAS數(shù)據(jù)集。
單擊確定。
步驟二:下載EasyAnimate模型
單擊目標DSW實例操作列下的打開,進入DSW實例的開發(fā)環(huán)境。
在Notebook頁簽的Launcher頁面,單擊快速開始區(qū)域Tool下的DSW Gallery,打開DSW Gallery頁面。
在DSW Gallery頁面中,搜索基于EasyAnimate的AI視頻生成示例,單擊在DSW中打開,即可自動將本教程所需的資源和教程文件下載至DSW實例中,并在下載完成后自動打開教程文件。
下載EasyAnimate相關代碼和模型并進行安裝。
在教程文件easyanimate.ipynb中,單擊運行環(huán)境安裝節(jié)點命令,包括定義函數(shù)、下載代碼和下載模型。當成功運行一個步驟命令后,再順次運行下個步驟的命令。
步驟三:推理模型
單擊運行模型推理>UI啟動節(jié)點的命令,進行模型推理。
單擊生成的鏈接,進入WebUI界面。
在WebUI界面選擇預訓練模型路徑,其它參數(shù)按需配置即可。
(可選)如果您希望使用圖生視頻功能,可以在Image to Video區(qū)域上傳對應圖片,用于生成視頻。
單擊Generate(生成),等待一段時間后,即可在右側(cè)查看或下載生成的視頻。
步驟四:微調(diào)LoRA
EasyAnimate提供了豐富的模型訓練方式,包括DiT模型的訓練(LoRA微調(diào)和基模型的全量微調(diào))和VAE的訓練。關于Gallery中內(nèi)置的LoRA微調(diào)部分,更多信息,請參見EasyAnimate。
準備數(shù)據(jù)
單擊執(zhí)行模型訓練>數(shù)據(jù)準備節(jié)點的命令,即可下載示例數(shù)據(jù),用于模型訓練。您也可以按照如下格式要求自行準備數(shù)據(jù)文件。
文件數(shù)據(jù)格式如下。
project/
├── datasets/
│ ├── internal_datasets/
│ ├── videos/
│ │ ├── 00000001.mp4
│ │ ├── 00000002.mp4
│ │ └── .....
│ └── json_of_internal_datasets.json
其中,JSON文件數(shù)據(jù)格式和參數(shù)說明如下。
[
{
"file_path": "videos/00000001.mp4",
"text": "A group of young men in suits and sunglasses are walking down a city street.",
"type": "video"
},
{
"file_path": "videos/00000002.mp4",
"text": "A notepad with a drawing of a woman on it.",
"type": "video"
}
.....
]
參數(shù) | 說明 |
file_path | 視頻/圖片數(shù)據(jù)的存放位置(相對路徑)。 |
text | 數(shù)據(jù)的文本描述。 |
type | 視頻為 |
啟動訓練
(可選)如果您使用自行準備的數(shù)據(jù)文件進行微調(diào),需要將對應的訓練腳本中的
DATASET_NAME
及DATASET_META_NAME
設置為訓練數(shù)據(jù)所在目錄及訓練文件地址。export DATASET_NAME=“” # 訓練數(shù)據(jù)所在目錄 export DATASET_META_NAME=“datasets/Minimalism/metadata_add_width_height.json” # 訓練文件地址
單擊執(zhí)行啟動訓練>LoRA訓練節(jié)點的命令。
訓練完成后,單擊執(zhí)行LoRA模型推理節(jié)點的命令,將訓練好的模型移動至EasyAnimate/models/Personalized_Model文件夾。
單擊生成的鏈接,進入WebUI界面,選擇訓練好的LoRA模型生成視頻。
方式二:使用快速開始
快速開始作為PAI的產(chǎn)品組件,集成了眾多AI開源社區(qū)中優(yōu)質(zhì)的預訓練模型,并且基于開源模型支持零代碼實現(xiàn)從訓練到部署再到推理的全部過程。您可以直接部署模型并使用,也可以根據(jù)實際需求微調(diào)訓練模型后部署使用。
場景一:直接部署模型
進入快速開始頁面。
登錄PAI控制臺。
在左側(cè)導航欄單擊工作空間列表,在工作空間列表頁面單擊目標工作空間名稱,進入對應工作空間。
在左側(cè)導航欄單擊快速開始,進入快速開始頁面。
在快速開始頁面,搜索EasyAnimate 高清長視頻生成,然后單擊部署,配置相關參數(shù)。
EasyAnimate目前僅支持使用bf16進行推理,請選擇A10及其以上的顯卡。
單擊部署,在彈出的計費提醒對話框中,單擊確定,頁面將自動跳轉(zhuǎn)到服務詳情頁面。
當狀態(tài)變?yōu)?b data-tag="uicontrol" id="2bfb5250f00tf" class="uicontrol">運行中時,表示模型部署成功。
模型部署完成后,您可以使用WebUI及API兩種方式調(diào)用服務來生成視頻。
WebUI方式
在服務詳情頁面,單擊查看WEB應用。
在WebUI界面選擇預訓練的模型路徑,其它參數(shù)按需配置即可。
單擊Generate(生成),等待一段時間后,即可在右側(cè)查看或下載生成的視頻。
API方式
在服務詳情頁面的資源詳情區(qū)域,單擊查看調(diào)用信息,獲取調(diào)用服務所需的信息。
通過接口更新Transformer模型,可在DSW實例或本地Python環(huán)境中執(zhí)行。
如果已經(jīng)在WebUI中選擇模型,則無需發(fā)送請求重復調(diào)用。如遇請求超時,請在EAS日志中確認模型已加載完畢。加載完成,日志中將提示
Update diffusion transformer done
。Python請求示例如下。
import json import requests def post_diffusion_transformer(diffusion_transformer_path, url='http://127.0.0.1:7860', token=None): datas = json.dumps({ "diffusion_transformer_path": diffusion_transformer_path }) head = { 'Authorization': token } r = requests.post(f'{url}/easyanimate/update_diffusion_transformer', data=datas, headers=head, timeout=15000) data = r.content.decode('utf-8') return data def post_update_edition(edition, url='http://0.0.0.0:7860',token=None): head = { 'Authorization': token } datas = json.dumps({ "edition": edition }) r = requests.post(f'{url}/easyanimate/update_edition', data=datas, headers=head) data = r.content.decode('utf-8') return data if __name__ == '__main__': url = '<eas-service-url>' token = '<eas-service-token>' # -------------------------- # # Step 1: update edition # -------------------------- # edition = "v3" outputs = post_update_edition(edition,url = url,token=token) print('Output update edition: ', outputs) # -------------------------- # # Step 2: update edition # -------------------------- # # 默認路徑 (二選一) diffusion_transformer_path = "/mnt/models/Diffusion_Transformer/EasyAnimateV3-XL-2-InP-512x512" # diffusion_transformer_path = "/mnt/models/Diffusion_Transformer/EasyAnimateV3-XL-2-InP-768x768" outputs = post_diffusion_transformer(diffusion_transformer_path, url = url, token=token) print('Output update edition: ', outputs)
其中:
調(diào)用服務,生成視頻或圖片。
服務輸入?yún)?shù)說明
參數(shù)名
說明
類型
默認值
prompt_textbox
用戶輸入的正向提示詞。
string
必填。無默認值
negative_prompt_textbox
用戶輸入的負向提示詞。
string
"The video is not of a high quality, it has a low resolution, and the audio quality is not clear. Strange motion trajectory, a poor composition and deformed video, low resolution, duplicate and ugly, strange body structure, long and strange neck, bad teeth, bad eyes, bad limbs, bad hands, rotating camera, blurry camera, shaking camera. Deformation, low-resolution, blurry, ugly, distortion."
sample_step_slider
用戶輸入的步數(shù)。
int
30
cfg_scale_slider
引導系數(shù)。
int
6
sampler_dropdown
采樣器類型。
取值包括:Eluer、EluerA、DPM++、PNDM、DDIM
string
Eluer
width_slider
生成視頻寬度。
int
672
height_slider
生成視頻高度。
int
384
length_slider
生成視頻幀數(shù)。
int
144
is_image
是否是圖片。
bool
FALSE
lora_alpha_slider
LoRA模型參數(shù)的權重。
float
0.55
seed_textbox
隨機種子。
int
43
lora_model_path
額外的LoRA模型路徑。
若有,則會在請求時帶上lora。在當次請求后移除。
string
none
base_model_path
需要更新的transformer模型路徑。
string
none
motion_module_path
需要更新的motion_module模型路徑。
string
none
generation_method
生成類型。包括:Video Generation,Image Generation
string
none
Python請求示例
服務返回base64_encoding,為base64結(jié)果。
您可以在/mnt/workspace/demos/easyanimate/目錄中查看生成結(jié)果。
import base64 import json import sys import time from datetime import datetime from io import BytesIO import cv2 import requests import base64 def post_infer(generation_method, length_slider, url='http://127.0.0.1:7860',token=None): head = { 'Authorization': token } datas = json.dumps({ "base_model_path": "none", "motion_module_path": "none", "lora_model_path": "none", "lora_alpha_slider": 0.55, "prompt_textbox": "This video shows Mount saint helens, washington - the stunning scenery of a rocky mountains during golden hours - wide shot. A soaring drone footage captures the majestic beauty of a coastal cliff, its red and yellow stratified rock faces rich in color and against the vibrant turquoise of the sea.", "negative_prompt_textbox": "Strange motion trajectory, a poor composition and deformed video, worst quality, normal quality, low quality, low resolution, duplicate and ugly, strange body structure, long and strange neck, bad teeth, bad eyes, bad limbs, bad hands, rotating camera, blurry camera, shaking camera", "sampler_dropdown": "Euler", "sample_step_slider": 30, "width_slider": 672, "height_slider": 384, "generation_method": "Video Generation", "length_slider": length_slider, "cfg_scale_slider": 6, "seed_textbox": 43, }) r = requests.post(f'{url}/easyanimate/infer_forward', data=datas, headers=head, timeout=1500) data = r.content.decode('utf-8') return data if __name__ == '__main__': # initiate time now_date = datetime.now() time_start = time.time() url = '<eas-service-url>' token = '<eas-service-token>' # -------------------------- # # Step 3: infer # -------------------------- # # "Video Generation" and "Image Generation" generation_method = "Video Generation" length_slider = 72 outputs = post_infer(generation_method, length_slider, url = url, token=token) # Get decoded data outputs = json.loads(outputs) base64_encoding = outputs["base64_encoding"] decoded_data = base64.b64decode(base64_encoding) is_image = True if generation_method == "Image Generation" else False if is_image or length_slider == 1: file_path = "1.png" else: file_path = "1.mp4" with open(file_path, "wb") as file: file.write(decoded_data) # End of record time # The calculated time difference is the execution time of the program, expressed in seconds / s time_end = time.time() time_sum = (time_end - time_start) % 60 print('# --------------------------------------------------------- #') print(f'# Total expenditure: {time_sum}s') print('# --------------------------------------------------------- #')
其中:
場景二:微調(diào)訓練后部署模型
進入快速開始頁面。
登錄PAI控制臺。
在左側(cè)導航欄單擊工作空間列表,在工作空間列表頁面單擊目標工作空間名稱,進入對應工作空間內(nèi)。
在左側(cè)導航欄單擊快速開始,進入快速開始頁面。
在快速開始頁面,搜索EasyAnimate 高清長視頻生成,單擊卡片,進入模型詳情頁面。
單擊右上角的微調(diào)訓練,根據(jù)業(yè)務需求完成訓練輸出配置、超參數(shù)配置等。其中,超參數(shù)詳情請參見附錄:微調(diào)模型超參數(shù)說明。
EasyAnimate目前僅支持使用bf16進行推理,請選擇A10及其以上的顯卡。如果使用圖片進行LoRA訓練,需要最低GPU顯存為20 GB。如果您使用更大的batch_size、num_train_epochs使用視頻數(shù)據(jù)進行微調(diào),訓練需要消耗更大的顯存。
單擊訓練,在彈出的計費提醒對話框中,單擊確定,頁面將自動跳轉(zhuǎn)到服務詳情頁面。
當任務狀態(tài)變?yōu)?b data-tag="uicontrol" id="1c06b08eac1sw" class="uicontrol">成功時,代表模型訓練成功。
單擊右上角的部署。
當狀態(tài)變?yōu)?b data-tag="uicontrol" id="f4dc2b6a601tl" class="uicontrol">運行中時,代表模型部署成功。
在服務詳情頁面,單擊查看WEB應用。
在WebUI界面,選擇訓練完成的LoRA模型進行視頻生成。
附錄:微調(diào)模型超參數(shù)說明
參數(shù)名稱 | 類型 | 含義 |
learning_rate | float | 學習率。 |
adam_weight_decay | float | Adam優(yōu)化器的權重衰減值。 |
adam_epsilon | float | Adam優(yōu)化器的epsilon值。 |
num_train_epochs | int | 訓練總輪數(shù)。 |
checkpointing_steps | int | 保存模型的間隔步數(shù)。 |
train_batch_size | int | 訓練采樣的批大小。 |
vae_mini_batch | int | 訓練vae的切片大小。 |
image_sample_size | int | 訓練圖片分辨率。 |
video_sample_size | int | 訓練視頻分辨率。 |
video_sample_stride | int | 訓練視頻采樣間隔。 |
video_sample_n_frames | int | 訓練視頻采樣幀數(shù)。 |
rank | int | LoRA rank。 |
network_alpha | int | LoRA nework_alpha。 |
gradient_accumulation_steps | int | 梯度累計步數(shù)。 |
dataloader_num_workers | int | 數(shù)據(jù)加載的子進程數(shù)。 |