すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:ビデオを生成する

最終更新日:Oct 22, 2024

EasyAnimateは、Platform for AI (PAI) 用の自社開発の拡散トランス (DiT) ビデオ生成フレームワークです。 EasyAnimateは、高解像度の長いビデオを生成するための完全なソリューションを提供します。 このソリューションには、ビデオデータ前処理、変分自動エンコーダ (VAE) トレーニング、DiTトレーニング、モデル推論、およびモデル評価が含まれます。 このトピックでは、EasyAnimateをPAIと統合し、数回クリックするだけでモデル推論、微調整、デプロイを実装する方法について説明します。

背景情報

次のいずれかの方法を使用してビデオを生成できます。

  • 方法1: データサイエンスワークショップ (DSW) を使用する

    DSWは、アルゴリズム開発者向けに調整されたエンドツーエンドの人工知能 (AI) 開発プラットフォームです。 DSWは、JupyterLab、WebIDE、Terminalなどの複数のクラウド開発環境を統合します。 DSWギャラリーは、効率的な方法で開発プロセスに慣れるのに役立つさまざまなケースとソリューションを提供します。 DSWギャラリーのチュートリアルに従って、ノートブックのケースまたはファイルを直接実行し、EasyAnimateベースのビデオ生成モデルを使用してモデルのトレーニングと推論を実行できます。 また、モデルの微調整など、モデルに基づいてセカンダリ開発操作を実行することもできます。

  • 方法2: QuickStartの使用

    QuickStartは、多くのオープンソースAIコミュニティからの高品質の事前トレーニング済みモデルを統合します。 QuickStartは、オープンソースモデルに基づくトレーニング、デプロイ、および推論のプロセス全体を通して、ゼロコード実装もサポートしています。 QuickStartを使用して、数回クリックするだけでEasyAnimateモデルをデプロイし、ビデオを生成できます。 これにより、より速く、より効率的で、より便利なAIアプリケーションエクスペリエンスが提供されます。

課金

DSWを使用する場合、DSWおよびElastic Algorithm Service (EAS) リソースに対して課金されます。 QuickStartを使用している場合、ディープラーニングコンテナ (DLC) およびEASリソースに対して課金されます。

詳細については、「DSWの課金」、「EASの課金」、および「クイックスタートの課金」をご参照ください。

前提条件

方法1: DSWの使用

手順1: DSWインスタンスの作成

  1. データサイエンスワークショップ (DSW) ページに移動します。

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

    2. [概要] ページの上部のナビゲーションバーで、リージョンを選択します。

    3. 左側のナビゲーションペインで、[ワークスペース] をクリックします。 [ワークスペース] ページで、管理するワークスペースの名前をクリックします。

    4. [ワークスペースの詳細] ページの左側のナビゲーションウィンドウで、[モデルトレーニング] > [データサイエンスワークショップ (DSW)] を選択します。

  2. 表示されるページで、[インスタンスの作成] をクリックします。

  3. [インスタンスの設定] ページで、主要なパラメーターを設定します。 下表にパラメーターを示します。 その他のパラメーターについては、デフォルト値を使用します。

    パラメーター

    説明

    [インスタンス名]

    インスタンスの名前を指定します。 この例では、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) データセットを作成します。

  4. [はい] をクリックします 。

ステップ2: EasyAnimateモデルのダウンロード

  1. 管理するDSWインスタンスの [操作] 列で、[開く] をクリックします。

  2. [ノートブック] タブの [ランチャー] ページで、[クイックスタート][ツール] セクションの [DSWギャラリー] をクリックします。

  3. DSWギャラリーページで、EasyAnimateに基づくAIビデオ生成デモを検索し、[DSWで開く] をクリックします。 必要なリソースとチュートリアルファイルは、DSWインスタンスに自動的にダウンロードされます。 ダウンロードが完了すると、チュートリアルファイルが自動的に開きます。

    image

  4. EasyAnimate関連のコードとモデルをダウンロードし、モデルをインストールします。

    easyanimate.ipynbチュートリアルファイルで、imageアイコンをクリックして、環境の設定セクションの環境インストールコマンド (関数の定義コードのダウンロードモデルのダウンロードなど) を実行します。 ステップ内のコマンドが正常に実行されたら、ステップを順番に実行します。

ステップ3: モデル推論の実行

  1. imageアイコンをクリックして、[モデル推論の実行] > [コードインファー]> [UIインファー] セクションのコマンドを実行し、モデル推論を実行します。

  2. 生成されたリンクをクリックして、web UIに移動します。

    image

  3. web UIで、事前トレーニング済みモデルのパスを選択します。 ビジネス要件に基づいて他のパラメーターを設定します。

    image

    オプションです。 画像を使用してビデオを生成する機能を使用する場合は、[画像からビデオへ] セクションに画像をアップロードします。

    image

  4. [生成] をクリックします。 しばらく待ちます。 次に、生成されたビデオを右側で表示またはダウンロードできます。

    image

ステップ4: LoRAの微調整

EasyAnimateは、DiTモデルトレーニングやVAEモデルトレーニングなど、さまざまなモデルトレーニング方法を提供します。 DiTモデルのトレーニングには、ローランクアダプテーション (LoRA) の微調整とベースモデルの完全な微調整が含まれます。 DSWギャラリーに組み込まれたLoRAの微調整の詳細については、「EasyAnimate」をご参照ください。

データの準備

imageアイコンをクリックして、[モデルトレーニングの実行] > [データの準備] セクションのコマンドを実行します。 モデルトレーニング用にサンプルデータがダウンロードされます。 次の形式を使用してデータファイルを準備することもできます。

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

ファイルタイプ。 有効な値: videoimage

モデルトレーニングの開始

  1. オプションです。 微調整用に準備したデータファイルを使用する場合は、対応するトレーニングスクリプトの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.
  2. imageアイコンをクリックして、[モデルトレーニングの開始] > [LoRA Fintune] セクションのコマンドを実行します。

  3. トレーニングが完了したら、imageアイコンをクリックしてLoRAモデルの推論セクションでコマンドを実行し、トレーニング済みモデルをEasyAnimate/models/Personalized_modelフォルダーに移動します。

  4. 生成されたリンクをクリックしてweb UIに移動し、トレーニング済みのLoRAモデルを選択してビデオを生成します。

    image

方法2: QuickStartの使用

QuickStartはPAIの製品コンポーネントです。 QuickStartは、オープンソースAIコミュニティからの高品質の事前トレーニング済みモデルを統合し、オープンソースモデルに基づくトレーニング、展開、および推論のプロセス全体を通してゼロコード実装をサポートします。 モデルを直接デプロイして使用することも、モデルデプロイのビジネス要件に基づいてモデルを微調整することもできます。

シナリオ1: モデルの直接デプロイ

  1. QuickStartページに移動します。

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

    2. 左側のナビゲーションペインで、[ワークスペース] をクリックします。 [ワークスペース] ページで、管理するワークスペースの名前をクリックします。

    3. [ワークスペースの詳細] ページの左側のナビゲーションウィンドウで、[クイックスタート] > [モデルギャラリー] を選択します。

  2. モデルギャラリーページで、EasyAnimate Long Video Generation Modelを検索し、[デプロイ] をクリックしてパラメーターを設定します。

    EasyAnimateは推論用にbf16のみをサポートします。 A10以降のGPUを使用するインスタンスタイプを選択する必要があります。

    image

  3. [デプロイ] をクリックします。 [課金通知] メッセージで、[OK] をクリックします。 モデル詳細ページの [サービスの詳細] タブが表示されます。

    Statusパラメーターの値がRunningに変わると、モデルがデプロイされます。

  4. モデルがデプロイされたら、web UIまたは関連するAPI操作を使用してモデルサービスを呼び出し、ビデオを生成します。

    Web UI

    1. [サービスの詳細] タブで、[Webアプリの表示] をクリックします。

      image

    2. web UIで、事前トレーニング済みモデルのパスを選択します。 ビジネス要件に基づいて他のパラメーターを設定します。

      image

    3. [生成] をクリックします。 しばらく待ちます。 次に、生成されたビデオを右側で表示またはダウンロードできます。

      image

    API

    1. [サービスの詳細] タブの [リソース情報] セクションで、[呼び出し情報の表示] をクリックして、モデルサービスの呼び出しに必要な情報を取得します。

      image

    2. 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)

      次のパラメータに注意してください。

      • <eas-service-url>: eas-service-urlを、ステップaで照会したエンドポイントに置き換えます。

      • <eas-service-token>: eas-service-tokenを、ステップaで照会したサービストークンに置き換えます。

    3. モデルサービスを呼び出して、ビデオまたは画像を生成します。

    • モデルサービスの呼び出しに使用するパラメーターを次の表に示します。

      パラメーター

      説明

      タイプ

      デフォルト値

      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('# --------------------------------------------------------- #')

      次のパラメータに注意してください。

      • <eas-service-url>: eas-service-urlを、ステップaで照会したエンドポイントに置き換えます。

      • <eas-service-token>: eas-service-tokenを、ステップaで照会したサービストークンに置き換えます。

シナリオ2: モデルを微調整した後にモデルをデプロイする

  1. QuickStartページに移動します。

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

    2. 左側のナビゲーションペインで、[ワークスペース] をクリックします。 [ワークスペース] ページで、管理するワークスペースの名前をクリックします。

    3. [ワークスペースの詳細] ページの左側のナビゲーションウィンドウで、[クイックスタート] > [モデルギャラリー] を選択します。

  2. モデルギャラリーページで、EasyAnimate Long Video Generation Modelを検索し、モデルをクリックします。

  3. モデル詳細ページの右上隅で、[微調整] をクリックして出力データ設定を実行し、ビジネス要件に基づいてハイパーパラメータを設定します。 ハイパーパラメーターの詳細については、「付録: 微調整モデルのハイパーパラメーター」をご参照ください。

    EasyAnimateは推論用にbf16のみをサポートします。 A10以降のGPUを使用するインスタンスタイプを選択する必要があります。 LoRAモデルのトレーニングにイメージを使用する場合、GPUの最小メモリは20 GBです。 トレーニングで消費されるGPUメモリは、batch_sizeパラメーターとnum_train_epochsパラメーターの値によって異なります。 微調整にビデオデータを使用する場合、batch_sizeおよびnum_train_epochsパラメーターをより大きな値に設定する必要があり、トレーニングにはより多くのGPUメモリが必要です。

    image

  4. [微調整] をクリックします。 [課金通知] メッセージで、[OK] をクリックします。 モデルトレーニングの詳細ページの [タスクの詳細] タブが表示されます。

    [Job Status] パラメーターの値が [Success] に変わった場合、モデルはトレーニングされます。

  5. 右上隅の [デプロイ] をクリックします。

    [ジョブステータス][実行中] に変わると、モデルがデプロイされます。

  6. [サービスの詳細] タブで、[Webアプリの表示] をクリックします。

    image

  7. web UIで、トレーニング済みのLoRAモデルを選択してビデオを生成します。

    image

付録: 微調整モデルのハイパーパラメータ

パラメーター

タイプ

説明

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

データ読み込み用の子ワーカーの数。