|
EasyAnimateは、Alibaba CloudのPAIプラットフォームが独自に開発したDiT動画生成フレームワークです。動画データの前処理、VAEトレーニング、DiTトレーニング、モデル推論、モデル評価など、高解像度の長尺動画を生成するための包括的なソリューションを提供します。この記事では、EasyAnimateをPAIプラットフォームに統合し、モデル推論、微調整、そしてデプロイまでをワンクリックで完了させる実践的なプロセスを紹介します。 背景情報この記事では、ビデオ生成のための次の 2 つの方法を紹介します。
DSWは、アルゴリズム開発者向けにカスタマイズされたワンストップAI開発プラットフォームで、JupyterLab、WebIDE、Terminalなど、複数のクラウドベース開発環境を統合しています。ギャラリーには豊富なケーススタディとソリューションが用意されており、開発プロセスを迅速に習得するのに役立ちます。DSWギャラリーのケースチュートリアルを開くと、ワンクリックでノートブックを実行し、EasyAnimateベースの動画生成モデルの推論と学習タスクを完了し、モデルの推論や微調整などの二次開発操作を実行できます。
EasyAnimateは、AIオープンソースコミュニティから提供される多数の高品質な事前学習済みモデルを統合し、オープンソースモデルに基づく学習からデプロイ、推論までの全プロセスをゼロコードで実装できます。EasyAnimateを使用すると、モデルのデプロイと動画生成をワンクリックで実行でき、より高速で効率的、そしてより便利なAIアプリケーション体験をお楽しみいただけます。 料金の説明
注: このチュートリアルでは、DSW フリー リソース タイプ ecs.gn7i-c8g1.2xlarge の使用のみをサポートしています。
前提条件
方法1: DSWを使用するステップ1: DSWインスタンスを作成する
ステップ2: EasyAnimateモデルをインストールする
チュートリアルファイルeasyanimate.ipynbで、「開始」ボタンをクリックすると、環境インストールノードコマンド(関数の定義、コードのダウンロード、モデルのダウンロードなど)が実行されます。コマンドの1つのステップが正常に実行されたら、次のステップを順番に実行してください。 ステップ3: 推論モデル方法1: コードを使って推論する「開始」ボタンをクリックしてモデル推論を実行し、 「コードを使用して推論ノードのコマンドを実行」を選択します。生成された結果は**/mnt/workspace/demos/easyanimate/EasyAnimate/samples/easyanimate-videos**ディレクトリで確認できます。様々なパラメータを変更することで、様々な効果を得ることができます。パラメータの説明: 方法2: WebUIを使用して推論する
ステップ4: LoRAを微調整するEasyAnimateは、DiTモデルのトレーニング(LoRAファインチューニングとベースモデルのフルファインチューニング)やVAEのトレーニングなど、豊富なモデルトレーニング手法を提供しています。Galleryに組み込まれているLoRAファインチューニングコンポーネントの詳細については、EasyAnimateをご覧ください。 データを準備する「開始」ボタンをクリックして、 「モデルトレーニング」 > 「データ準備」ノードのコマンドを実行し、モデルトレーニング用のサンプルデータをダウンロードします。または、以下のフォーマット要件に従って独自のデータファイルを準備することもできます。ファイルのデータ形式は次のとおりです。 プロジェクト/ ├── データセット/ │ ├── 内部データセット/ │ ├── 動画/ │ │ §── 00000001.mp4 │ │ §── 00000002.mp4 │ │ └── …… │ └── 内部データセットのjson.json JSON ファイルのデータ形式とパラメータについては以下で説明します。 [
{
"ファイルパス": "videos/00000001.mp4",
"text": "スーツとサングラスをかけた若い男性グループが街の通りを歩いています。",
「タイプ」:「ビデオ」
},
{
"ファイルパス": "videos/00000002.mp4",
"text": "女性の絵が描かれたメモ帳。",
「タイプ」:「ビデオ」
}
...
]トレーニングモデル
export DATASET_NAME="" # トレーニングデータが配置されているディレクトリ export DATASET_META_NAME="datasets/Minimalism/metadata_add_width_height.json" # トレーニングファイルへのパス
方法2: クイックスタートを使用するステップ1: モデルをデプロイする
EasyAnimateは現在、bf16を使用した推論のみをサポートしています。A10以上のグラフィックカードを選択してください。
ステータスが「実行中」に変わると、モデルが正常にデプロイされたことを意味します。 ステップ2: モデルの使用モデルがデプロイされると、WebUI または API を使用してサービスを呼び出し、ビデオを生成できます。 ウェブUI
APIメソッド
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('出力更新版: ', 出力)で:
このサービスは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('# -------------------------------------------------------------- #')で:
|