HUOXIU

EasyAnimate モデルに基づくビデオ生成のベストプラクティス

EasyAnimateは、Alibaba CloudのPAIプラットフォームが独自に開発したDiT動画生成フレームワークです。動画データの前処理、VAEトレーニング、DiTトレーニング、モデル推論、モデル評価など、高解像度の長尺動画を生成するための包括的なソリューションを提供します。この記事では、EasyAnimateをPAIプラットフォームに統合し、モデル推論、微調整、そしてデプロイまでをワンクリックで完了させる実践的なプロセスを紹介します。

背景情報

この記事では、ビデオ生成のための次の 2 つの方法を紹介します。

  • 方法1: DSWを使用する

DSWは、アルゴリズム開発者向けにカスタマイズされたワンストップAI開発プラットフォームで、JupyterLab、WebIDE、Terminalなど、複数のクラウドベース開発環境を統合しています。ギャラリーには豊富なケーススタディとソリューションが用意されており、開発プロセスを迅速に習得するのに役立ちます。DSWギャラリーのケースチュートリアルを開くと、ワンクリックでノートブックを実行し、EasyAnimateベースの動画生成モデルの推論と学習タスクを完了し、モデルの推論や微調整などの二次開発操作を実行できます。

  • 方法2: クイックスタートを使用する

EasyAnimateは、AIオープンソースコミュニティから提供される多数の高品質な事前学習済みモデルを統合し、オープンソースモデルに基づく学習からデプロイ、推論までの全プロセスをゼロコードで実装できます。EasyAnimateを使用すると、モデルのデプロイと動画生成をワンクリックで実行でき、より高速で効率的、そしてより便利なAIアプリケーション体験をお楽しみいただけます。

料金の説明

  • DSWまたはEASを初めてご利用になる方は、該当製品を無料でお試しいただけます。無料トライアルの容量、利用方法、注意事項などの詳細は、「新規ユーザー向け無料トライアル」セクションをご覧ください。

注: このチュートリアルでは、DSW フリー リソース タイプ ecs.gn7i-c8g1.2xlarge の使用のみをサポートしています。

  • 新規ユーザーでない場合、DSWおよびEASのご利用にはそれぞれ料金が発生します。課金の詳細については、インタラクティブモデリング(DSW)課金ガイド、モデルオンラインサービス(EAS)課金ガイド、およびクイックスタート課金ガイドをご覧ください。

前提条件

  • PAIワークスペースを作成します。詳細な手順については、「PAIの有効化とデフォルトワークスペースの作成」を参照してください。

  • (オプション)OSSまたはNASをアクティベートします。詳細な手順については、OSSおよびNASの「はじめに」の概要をご覧ください。

方法1: DSWを使用する

ステップ1: DSWインスタンスを作成する

  1. DSW ページに入ります。

  2. PAI コンソールにログインします。

  3. 概要ページで対象地域を選択します。

  4. 左側のナビゲーション バーにあるワークスペース リストをクリックし、ワークスペース リスト ページで対象のワークスペース名をクリックして、対応するワークスペースに入ります。

  5. ワークスペース ページの左側のナビゲーション バーで、 [モデル開発とトレーニング] > [インタラクティブ モデリング (DSW)]を選択して、DSW ページに入ります。

  6. 「インスタンスの作成」をクリックします。

  7. 構成インスタンスウィザード ページで、次の主要なパラメータを構成し、その他のパラメータはデフォルト値のままにします。

  1. [OK]をクリックします。

ステップ2: EasyAnimateモデルをインストールする

  1. DSW インスタンスを開きます。

  2. PAI コンソールにログインします。

  3. 左側のナビゲーション バーにあるワークスペース リストをクリックし、ワークスペース リスト ページで対象のワークスペースをクリックして、対応するワークスペースに入ります。

  4. ページの左上で、サービスを利用する地域を選択します。

  5. 左側のナビゲーション バーで、 [モデル開発とトレーニング] > [インタラクティブ モデリング (DSW)]を選択します。

  6. 対象の DSW インスタンスの「操作」列の「開く」をクリックして、DSW インスタンスの開発環境に入ります。

  7. [ノートブック]タブの[ランチャー] ページで、 [クイック スタート]領域の[ツール]の下にある[DSW ギャラリー] をクリックして、[DSW ギャラリー] ページを開きます。

  8. DSWギャラリーページで、 「EasyPhoto: AI video generation example based on EasyAnimate」を検索し、 「Open in DSW」をクリックします。これにより、このチュートリアルに必要なリソースとチュートリアルファイルが自動的にDSWインスタンスにダウンロードされ、ダウンロードが完了するとチュートリアルファイルが自動的に開きます。

  1. 関連する EasyAnimate コードとモデルをダウンロードしてインストールします。

チュートリアルファイルeasyanimate.ipynbで、「開始」ボタンをクリックすると、環境インストールノードコマンド(関数の定義コードのダウンロードモデルのダウンロードなど)が実行されます。コマンドの1つのステップが正常に実行されたら、次のステップを順番に実行してください。

ステップ3: 推論モデル

方法1: コードを使って推論する

「開始」ボタンをクリックしてモデル推論を実行し、 「コードを使用して推論ノードのコマンドを実行」を選択します。生成された結果は**/mnt/workspace/demos/easyanimate/EasyAnimate/samples/easyanimate-videos**ディレクトリで確認できます。様々なパラメータを変更することで、様々な効果を得ることができます。パラメータの説明:

方法2: WebUIを使用して推論する

  1. [開始] ボタンをクリックして、 UI スタートアップノードでコマンドを実行し、モデル推論を実行します。

  2. 生成されたリンクをクリックして、WebUI インターフェイスに入ります。

  1. WebUI インターフェースで、事前トレーニング済みモデル パス、微調整済みベース モデル、LoRA モデルを選択し、LoRA の重みを設定し、必要に応じてその他のパラメータを構成します。

  1. 「生成」をクリックしてしばらくお待ちください。生成されたビデオは右側で閲覧またはダウンロードできます。

ステップ4: LoRAを微調整する

EasyAnimateは、DiTモデルのトレーニング(LoRAファインチューニングとベースモデルのフルファインチューニング)やVAEのトレーニングなど、豊富なモデルトレーニング手法を提供しています。Galleryに組み込まれているLoRAファインチューニングコンポーネントの詳細については、EasyAnimateをご覧ください。

データを準備する

「開始」ボタンをクリックして、 「モデルトレーニング」 > 「データ準備」ノードのコマンドを実行し、モデルトレーニング用のサンプルデータをダウンロードします。または、以下のフォーマット要件に従って独自のデータファイルを準備することもできます。ファイルのデータ形式は次のとおりです。

プロジェクト/
├── データセット/
│ ├── 内部データセット/
│ ├── 動画/
│ │ §── 00000001.mp4
│ │ §── 00000002.mp4
│ │ └── ……
│ └── 内部データセットのjson.json

JSON ファイルのデータ形式とパラメータについては以下で説明します。

 [
{
"ファイルパス": "videos/00000001.mp4",
"text": "スーツとサングラスをかけた若い男性グループが街の通りを歩いています。",
「タイプ」:「ビデオ」
},
{
"ファイルパス": "videos/00000002.mp4",
"text": "女性の絵が描かれたメモ帳。",
「タイプ」:「ビデオ」
}
...
]

トレーニングモデル

  1. 対応するトレーニング スクリプト内の DATASET_NAME と DATASET_META_NAME を、トレーニング データが配置されているディレクトリとトレーニング ファイルのアドレスに設定します。

 export DATASET_NAME="" # トレーニングデータが配置されているディレクトリ export DATASET_META_NAME="datasets/Minimalism/metadata_add_width_height.json" # トレーニングファイルへのパス

  1. [開始] ボタンをクリックして、トレーニングを開始するコマンド > LoRA トレーニングノードを実行します。

  2. トレーニングが完了したら、生成されたモデルをmodels/Personalized_modelフォルダに移動します。その後、UI でモデルを選択するか、開始ボタンをクリックしてLoRA モデル推論ノードコマンドを実行し、lora_path を指定してビデオを生成できます。

方法2: クイックスタートを使用する

ステップ1: モデルをデプロイする

  1. クイック スタート ページに入ります。

  2. PAI コンソールにログインします。

  3. 左側のナビゲーション バーにあるワークスペース リストをクリックし、ワークスペース リスト ページで対象のワークスペース名をクリックして、対応するワークスペースに入ります。

  4. 左側のナビゲーション バーの[クイック スタート]をクリックして、クイック スタート ページに入ります。

  5. クイック スタート ページで、 EasyAnimate HD ロング ビデオ ジェネレーターを検索し、 [デプロイ]をクリックして関連するパラメータを構成します。

EasyAnimateは現在、bf16を使用した推論のみをサポートしています。A10以上のグラフィックカードを選択してください。

  1. 「デプロイ」をクリックし、ポップアップの請求リマインダーダイアログボックスで「 OK 」をクリックします。ページは自動的にサービスの詳細ページにリダイレクトされます。

ステータスが「実行中」に変わると、モデルが正常にデプロイされたことを意味します。

ステップ2: モデルの使用

モデルがデプロイされると、WebUI または API を使用してサービスを呼び出し、ビデオを生成できます。

ウェブUI

  1. サービスの詳細ページでクリックしてWeb アプリケーションを表示します

  1. WebUI インターフェースで事前トレーニング済みモデルのパスを選択し、必要に応じて他のパラメータを構成します。

  1. 「生成」をクリックしてしばらくお待ちください。生成されたビデオは右側で閲覧またはダウンロードできます。

APIメソッド

  1. サービスの詳細ページのリソースの詳細領域で、クリックして呼び出し情報を表示し、サービスの呼び出しに必要な情報を取得します。

  1. インターフェースを介した Transformer モデルの更新は、DSW インスタンスまたはローカル Python 環境で実行できます。

WebUIで既にモデルを選択している場合は、再度呼び出しを行うためにリクエストを送信する必要はありません。リクエストがタイムアウトした場合は、EASログでモデルの読み込みが完了したことを確認してください。読み込みが完了すると、ログに「Update diffusion transformer done(拡散トランスフォーマーの更新が完了しました)」と表示されます。Pythonリクエストの例を以下に示します。

 JSONをインポート
輸入リクエスト
デフ post_diffusion_transformer(diffusion_transformer_path, url='http://127.0.0.1:7860', トークン=なし):
データ = json.dumps({
"拡散トランスフォーマーパス": 拡散トランスフォーマーパス
})
頭 = {
「承認」: トークン
}
r = リクエスト.post(f'{url}/easyanimate/update_diffusion_transformer', データ=datas, ヘッダー=head, タイムアウト=15000)
データ = r.content.decode('utf-8')
戻りデータ
def post_update_edition(edition, url='http://0.0.0.0:7860',token=None):
頭 = {
「承認」: トークン
}
データ = json.dumps({
「エディション」:エディション
})
r = リクエスト.post(f'{url}/easyanimate/update_edition', データ=datas, ヘッダー=head)
データ = r.content.decode('utf-8')
戻りデータ

__name__ == '__main__' の場合:
url = '<eas-service-url>'
トークン = '<eas-service-token>'
# -------------------------- #
# ステップ1: エディションを更新する
# -------------------------- #
エディション = "v2"
出力 = post_update_edition(edition,url = url,token = token)
print('出力更新版: ', 出力)
# -------------------------- #
# ステップ2: エディションを更新する
# -------------------------- #
# デフォルトのパスは変更できません: diffusion_transformer_path = "/mnt/models/Diffusion_Transformer/EasyAnimateV2-XL-2-512x512"
出力 = post_diffusion_transformer(diffusion_transformer_path、url = url、token = token)
print('出力更新版: ', 出力)

で:

  • <eas-service-url>: 手順 1 で確認したサービス アクセス アドレスに置き換えます。

  • <eas-service-token>: 手順 1 で取得したサービス トークンに置き換えます。

  1. ビデオや画像を生成するにはサービスを呼び出します。

  • サービス入力パラメータの説明

  • Pythonリクエストの例

このサービスはbase64_encoding(base64形式)を返します。生成された結果は**/mnt/workspace/demos/easyanimate/**ディレクトリで確認できます。

 base64をインポート
JSONをインポート
インポートシステム
インポート時間
datetime から datetime をインポートする
ioからBytesIOをインポートする
cv2をインポート
輸入リクエスト
base64をインポート
def post_infer(is_image, length_slider, url='http://127.0.0.1:7860', トークン=なし):
頭 = {
「承認」: トークン
}
データ = json.dumps({
"base_model_path": "なし",
"motion_module_path": "なし",
"lora_model_path": "なし",
"lora_alpha_slider": 0.55,
"prompt_textbox": "この動画は、ワシントン州セントヘレンズ山の、黄金色の時間帯に広​​がるロッキー山脈の息を呑むような絶景をワイドショットで捉えています。ドローン空撮による映像は、海岸沿いの崖の雄大な美しさを捉えています。赤と黄色の層状の岩肌は、鮮やかなターコイズブルーの海を背景に、色彩豊かに彩られています。
"negative_prompt_textbox": "奇妙な動きの軌跡、貧弱な構図と歪んだビデオ、最悪品質、通常の品質、低品質、低解像度、重複して醜い、奇妙な体の構造、長くて奇妙な首、悪い歯、悪い目、悪い手足、悪い手、回転するカメラ、ぼやけたカメラ、揺れるカメラ",
"sampler_dropdown": "オイラー",
"sample_step_slider": 30,
"幅スライダー": 672,
"height_slider": 384,
"is_image": is_image,
"length_slider": length_slider,
"cfg_scale_slider": 6,
"seed_textbox": 43,
})
r = リクエスト.post(f'{url}/easyanimate/infer_forward', データ=datas, ヘッダー=head,タイムアウト=1500)
データ = r.content.decode('utf-8')
戻りデータ
__name__ == '__main__' の場合:
# 開始時間
now_date = datetime.now()
time_start = time.time()

url = '<eas-service-url>'
トークン = '<eas-service-token>'
# -------------------------- #
# ステップ3: 推論
# -------------------------- #
is_image = False
長さスライダー = 27
出力 = post_infer(is_image, length_slider, url = url, token = token)

# デコードされたデータを取得する
出力 = json.loads(出力)
base64_encoding = 出力["base64_encoding"]
デコードされたデータ = base64.b64decode(base64_encoding)
is_image または length_slider == 1 の場合:
ファイルパス = "1.png"
それ以外:
ファイルパス = "1.mp4"
open(file_path, "wb") をファイルとして実行します:
file.write(デコードされたデータ)

#記録時間の終了
time_end = time.time()
時間合計 = (終了時間 - 開始時間) % 60
print('# -------------------------------------------------------------- #')
print(f'# 総支出: {time_sum}s')
print('# -------------------------------------------------------------- #')

で:

  • <eas-service-url>: 手順 1 で確認したサービス アクセス アドレスに置き換えます。

  • <eas-service-token>: 手順 1 で取得したサービス トークンに置き換えます。