EasyAnimateは、Platform for AI (PAI) 用の自社開発の拡散トランス (DiT) ビデオ生成フレームワークです。 EasyAnimateは、高解像度の長いビデオを生成するための完全なソリューションを提供します。 このソリューションには、ビデオデータ前処理、変分自動エンコーダ (VAE) トレーニング、DiTトレーニング、モデル推論、およびモデル評価が含まれます。 このトピックでは、EasyAnimateをPAIと統合し、数回クリックするだけでモデル推論、微調整、デプロイを実装する方法について説明します。
背景情報
次のいずれかの方法を使用してビデオを生成できます。
方法1: データサイエンスワークショップ (DSW) を使用する
DSWは、アルゴリズム開発者向けに調整されたエンドツーエンドの人工知能 (AI) 開発プラットフォームです。 DSWは、JupyterLab、WebIDE、Terminalなどの複数のクラウド開発環境を統合します。 DSWギャラリーは、効率的な方法で開発プロセスに慣れるのに役立つさまざまなケースとソリューションを提供します。 DSWギャラリーのチュートリアルに従って、ノートブックのケースまたはファイルを直接実行し、EasyAnimateベースのビデオ生成モデルを使用してモデルのトレーニングと推論を実行できます。 また、モデルの微調整など、モデルに基づいてセカンダリ開発操作を実行することもできます。
QuickStartは、多くのオープンソースAIコミュニティからの高品質の事前トレーニング済みモデルを統合します。 QuickStartは、オープンソースモデルに基づくトレーニング、デプロイ、および推論のプロセス全体を通して、ゼロコード実装もサポートしています。 QuickStartを使用して、数回クリックするだけでEasyAnimateモデルをデプロイし、ビデオを生成できます。 これにより、より速く、より効率的で、より便利なAIアプリケーションエクスペリエンスが提供されます。
課金
DSWを使用する場合、DSWおよびElastic Algorithm Service (EAS) リソースに対して課金されます。 QuickStartを使用している場合、ディープラーニングコンテナ (DLC) およびEASリソースに対して課金されます。
詳細については、「DSWの課金」、「EASの課金」、および「クイックスタートの課金」をご参照ください。
前提条件
PAIでワークスペースが作成されます。 詳細については、「PAIの有効化とデフォルトワークスペースの作成」をご参照ください。
Object Storage Service (OSS) が有効化されている、またはApsara File Storage NAS (NAS) が有効化されている。
方法1: DSWの使用
手順1: DSWインスタンスの作成
データサイエンスワークショップ (DSW) ページに移動します。
PAI コンソールにログインします。
[概要] ページの上部のナビゲーションバーで、リージョンを選択します。
左側のナビゲーションペインで、[ワークスペース] をクリックします。 [ワークスペース] ページで、管理するワークスペースの名前をクリックします。
[ワークスペースの詳細] ページの左側のナビゲーションウィンドウで、[モデルトレーニング] > [データサイエンスワークショップ (DSW)] を選択します。
表示されるページで、[インスタンスの作成] をクリックします。
[インスタンスの設定] ページで、主要なパラメーターを設定します。 下表にパラメーターを示します。 その他のパラメーターについては、デフォルト値を使用します。
パラメーター
説明
[インスタンス名]
インスタンスの名前を指定します。 この例では、AIGC_test_01が使用されます。
[インスタンスタイプ]
[GPU] タブで、ecs.gn7i-c8g1.2xlargeインスタンスタイプ、またはA10およびGU100 GPUを使用するインスタンスタイプを選択します。
[イメージ]
Alibaba Cloudイメージeasyanimate:1.1.5-pytorch2.2.0-gpu-py310-cu118-ubuntu22.04を選択します。
Dataset (オプション)
[追加] をクリックします。 データセットパネルで、[データセットの作成] をクリックして、OSSまたはApsara File Storage NAS (NAS) データセットを作成します。
[はい] をクリックします 。
ステップ2: EasyAnimateモデルのダウンロード
管理するDSWインスタンスの [操作] 列で、[開く] をクリックします。
[ノートブック] タブの [ランチャー] ページで、[クイックスタート] の [ツール] セクションの [DSWギャラリー] をクリックします。
DSWギャラリーページで、EasyAnimateに基づくAIビデオ生成デモを検索し、[DSWで開く] をクリックします。 必要なリソースとチュートリアルファイルは、DSWインスタンスに自動的にダウンロードされます。 ダウンロードが完了すると、チュートリアルファイルが自動的に開きます。
EasyAnimate関連のコードとモデルをダウンロードし、モデルをインストールします。
easyanimate.ipynbチュートリアルファイルで、アイコンをクリックして、環境の設定セクションの環境インストールコマンド (関数の定義、コードのダウンロード、モデルのダウンロードなど) を実行します。 ステップ内のコマンドが正常に実行されたら、ステップを順番に実行します。
ステップ3: モデル推論の実行
アイコンをクリックして、[モデル推論の実行] > [コードインファー]> [UIインファー] セクションのコマンドを実行し、モデル推論を実行します。
生成されたリンクをクリックして、web UIに移動します。
web UIで、事前トレーニング済みモデルのパスを選択します。 ビジネス要件に基づいて他のパラメーターを設定します。
オプションです。 画像を使用してビデオを生成する機能を使用する場合は、[画像からビデオへ] セクションに画像をアップロードします。
[生成] をクリックします。 しばらく待ちます。 次に、生成されたビデオを右側で表示またはダウンロードできます。
ステップ4: LoRAの微調整
EasyAnimateは、DiTモデルトレーニングやVAEモデルトレーニングなど、さまざまなモデルトレーニング方法を提供します。 DiTモデルのトレーニングには、ローランクアダプテーション (LoRA) の微調整とベースモデルの完全な微調整が含まれます。 DSWギャラリーに組み込まれたLoRAの微調整の詳細については、「EasyAnimate」をご参照ください。
データの準備
アイコンをクリックして、[モデルトレーニングの実行] > [データの準備] セクションのコマンドを実行します。 モデルトレーニング用にサンプルデータがダウンロードされます。 次の形式を使用してデータファイルを準備することもできます。
project/
├── datasets/
│ ├── internal_datasets/
│ ├── videos/
│ │ ├── 00000001.mp4
│ │ ├── 00000002.mp4
│ │ └── .....
│ └── json_of_internal_datasets.json
次の表に、JSONファイルの形式とパラメーターを示します。
[
{
"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"
}
.....
]
パラメーター | 説明 |
file_path | ビデオまたは画像データが保存されるパス。 これは相対パスです。 |
text | データのテキスト説明。 |
type | ファイルタイプ。 有効な値: |
モデルトレーニングの開始
オプションです。 微調整用に準備したデータファイルを使用する場合は、対応するトレーニングスクリプトの
DATASET_NAME
パラメーターとDATASET_META_NAME
パラメーターを、トレーニングデータのディレクトリとトレーニングファイルのパスに設定します。export DATASET_NAME=""# The directory of the training data. export DATASET_META_NAME=datasets/Minimalism/metadata_add_width_height.json# The path of the training file.
アイコンをクリックして、[モデルトレーニングの開始] > [LoRA Fintune] セクションのコマンドを実行します。
トレーニングが完了したら、アイコンをクリックしてLoRAモデルの推論セクションでコマンドを実行し、トレーニング済みモデルをEasyAnimate/models/Personalized_modelフォルダーに移動します。
生成されたリンクをクリックしてweb UIに移動し、トレーニング済みのLoRAモデルを選択してビデオを生成します。
方法2: QuickStartの使用
QuickStartはPAIの製品コンポーネントです。 QuickStartは、オープンソースAIコミュニティからの高品質の事前トレーニング済みモデルを統合し、オープンソースモデルに基づくトレーニング、展開、および推論のプロセス全体を通してゼロコード実装をサポートします。 モデルを直接デプロイして使用することも、モデルデプロイのビジネス要件に基づいてモデルを微調整することもできます。
シナリオ1: モデルの直接デプロイ
QuickStartページに移動します。
PAI コンソールにログインします。
左側のナビゲーションペインで、[ワークスペース] をクリックします。 [ワークスペース] ページで、管理するワークスペースの名前をクリックします。
[ワークスペースの詳細] ページの左側のナビゲーションウィンドウで、[クイックスタート] > [モデルギャラリー] を選択します。
モデルギャラリーページで、EasyAnimate Long Video Generation Modelを検索し、[デプロイ] をクリックしてパラメーターを設定します。
EasyAnimateは推論用にbf16のみをサポートします。 A10以降のGPUを使用するインスタンスタイプを選択する必要があります。
[デプロイ] をクリックします。 [課金通知] メッセージで、[OK] をクリックします。 モデル詳細ページの [サービスの詳細] タブが表示されます。
Statusパラメーターの値がRunningに変わると、モデルがデプロイされます。
モデルがデプロイされたら、web UIまたは関連するAPI操作を使用してモデルサービスを呼び出し、ビデオを生成します。
Web UI
[サービスの詳細] タブで、[Webアプリの表示] をクリックします。
web UIで、事前トレーニング済みモデルのパスを選択します。 ビジネス要件に基づいて他のパラメーターを設定します。
[生成] をクリックします。 しばらく待ちます。 次に、生成されたビデオを右側で表示またはダウンロードできます。
API
[サービスの詳細] タブの [リソース情報] セクションで、[呼び出し情報の表示] をクリックして、モデルサービスの呼び出しに必要な情報を取得します。
DSWインスタンスまたはオンプレミスPython環境でAPI操作を呼び出して、トランスフォーマーモデルを更新します。
web UIでモデルを選択した場合、モデルサービスを呼び出すためのリクエストを送信する必要はありません。 リクエストがタイムアウトした場合は、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 # -------------------------- # # The default path. You can select one of the following paths. 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)
次のパラメータに注意してください。
モデルサービスを呼び出して、ビデオまたは画像を生成します。
モデルサービスの呼び出しに使用するパラメーターを次の表に示します。
パラメーター
説明
タイプ
デフォルト値
prompt_textbox
肯定的なプロンプト。
String
デフォルト値なし
negative_prompt_textbox
否定的なプロンプト。
String
" ビデオは高品质ではなく、低解像度であり、オーディオ 質は明確ではないです。 奇妙な動きの軌道、悪い構図と 変形したビデオ、低解像度、複製と醜い、奇妙なボディ構造、 長くて奇妙な首、悪い歯、悪い目、悪い手足、悪い手、回転 カメラ、ぼやけたカメラ、揺れカメラ。 変形、低解像度、ぼやけ、 醜い、歪み。
sample_step_slider
ステップの数。
int
30
cfg_scale_slider
ガイダンス係数。
int
6
sampler_dropdown
サンプラーのタイプ。 有効な値: Eluer、EluerA、DPM ++ 、PNDM、およびDDIM。
String
エルアー
エルアー
width_slider
生成されたビデオの幅。
int
672
height_slider
生成されたビデオの高さ。
int
384
length_slider
生成されたビデオのフレーム数。
int
144
is_image
イメージを生成するかどうかを指定します。
bool
FALSE
lora_alpha_スライダー
LoRAモデルパラメータの重み。
float
0.55
seed_textbox
ランダムシード。
int
43
lora_model_path
LoRAモデルの追加パス。
追加のパスが存在する場合、LoRAは要求に含まれ、要求が完了した後に削除されます。
String
none
base_model_path
トランスモデル用に更新するパス。
String
none
motion_module_path
motion_moduleモデル用に更新する必要があるパス。
String
none
generation_method
生成タイプ。 有効な値: ビデオ生成と画像生成。
String
none
サンプルPythonリクエスト
モデルサービスがbase64_encodingを返した場合、モデルサービスはBase64-encodedです。
生成結果は、/mnt/workspace/demos/easyanimate/ ディレクトリで表示できます。
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('# --------------------------------------------------------- #')
次のパラメータに注意してください。
シナリオ2: モデルを微調整した後にモデルをデプロイする
QuickStartページに移動します。
PAI コンソールにログインします。
左側のナビゲーションペインで、[ワークスペース] をクリックします。 [ワークスペース] ページで、管理するワークスペースの名前をクリックします。
[ワークスペースの詳細] ページの左側のナビゲーションウィンドウで、[クイックスタート] > [モデルギャラリー] を選択します。
モデルギャラリーページで、EasyAnimate Long Video Generation Modelを検索し、モデルをクリックします。
モデル詳細ページの右上隅で、[微調整] をクリックして出力データ設定を実行し、ビジネス要件に基づいてハイパーパラメータを設定します。 ハイパーパラメーターの詳細については、「付録: 微調整モデルのハイパーパラメーター」をご参照ください。
EasyAnimateは推論用にbf16のみをサポートします。 A10以降のGPUを使用するインスタンスタイプを選択する必要があります。 LoRAモデルのトレーニングにイメージを使用する場合、GPUの最小メモリは20 GBです。 トレーニングで消費されるGPUメモリは、batch_sizeパラメーターとnum_train_epochsパラメーターの値によって異なります。 微調整にビデオデータを使用する場合、batch_sizeおよびnum_train_epochsパラメーターをより大きな値に設定する必要があり、トレーニングにはより多くのGPUメモリが必要です。
[微調整] をクリックします。 [課金通知] メッセージで、[OK] をクリックします。 モデルトレーニングの詳細ページの [タスクの詳細] タブが表示されます。
[Job Status] パラメーターの値が [Success] に変わった場合、モデルはトレーニングされます。
右上隅の [デプロイ] をクリックします。
[ジョブステータス] が [実行中] に変わると、モデルがデプロイされます。
[サービスの詳細] タブで、[Webアプリの表示] をクリックします。
web UIで、トレーニング済みのLoRAモデルを選択してビデオを生成します。
付録: 微調整モデルのハイパーパラメータ
パラメーター | タイプ | 説明 |
learning_rate | float | 学習率。 |
adam_weight_decay | float | アダムオプティマイザの重量減衰。 |
adam_epsilon | float | アダムオプティマイザのイプシロン。 |
num_train_epochs | int | トレーニングラウンドの総数。 |
checkpointing_steps | int | モデルが保存される間隔。 |
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 | モデルのトレーニングに使用するビデオのサンプリングフレーム数。 |
ランク | int | モデルの複雑さ。 |
network_alpha | int | ネットワークアルファ。 |
gradient_accumulation_steps | int | モデルトレーニングの勾配累積ステップ数。 |
dataloader_num_workers | int | データ読み込み用の子ワーカーの数。 |