写点什么

基于 EasyAnimate 模型的视频生成最佳实践

  • 2024-06-19
    浙江
  • 本文字数:4839 字

    阅读完需:约 16 分钟

EasyAnimate 是阿里云 PAI 平台自主研发的 DiT 的视频生成框架,它提供了完整的高清长视频生成解决方案,包括视频数据预处理、VAE 训练、DiT 训练、模型推理和模型评测等。本文为您介绍如何在 PAI 平台集成 EasyAnimate 并一键完成模型推理、微调及部署的实践流程。

背景信息

本文为您介绍以下两种视频生成的方式:



DSW 是为算法开发者量身打造的一站式 AI 开发平台,集成了 JupyterLab、WebIDE、Terminal 多种云端开发环境,其中,Gallery 提供了丰富的案例和解决方案,帮助您快速熟悉研发流程。您可以打开 DSW Gallery 中的案例教程,实现一键式运行 Notebook,完成基于 EasyAnimate 的视频生成模型的推理和训练任务,也可以进行模型推理和微调等二次开发操作。



快速开始集成了众多 AI 开源社区中优质的预训练模型,并且基于开源模型支持零代码实现从训练到部署再到推理的全部过程,您可以通过快速开始一键部署 EasyAnimate 模型并生成视频,享受更快、更高效、更便捷的 AI 应用体验。

费用说明

  • 如果您的账号为 DSW 或 EAS 的新用户,可以免费试用相应产品。关于免费试用的额度、领取方式及注意事项等详细信息,请参见新用户免费试用


说明:在本教程中,仅支持使用 DSW 免费资源类型 ecs.gn7i-c8g1.2xlarge。


前提条件

方式一:使用 DSW

步骤一:创建 DSW 实例

  1. 进入 DSW 页面。

  2. 登录PAI控制台

  3. 概览页面选择目标地域。

  4. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击目标工作空间名称,进入对应工作空间内。

  5. 在工作空间页面的左侧导航栏选择模型开发与训练>交互式建模(DSW),进入 DSW 页面。

  6. 单击创建实例

  7. 配置实例向导页面,配置以下关键参数,其他参数保持默认即可。


  1. 单击确定

步骤二:安装 EasyAnimate 模型

  1. 打开 DSW 实例。

  2. 登录PAI控制台

  3. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击目标工作空间,进入对应工作空间。

  4. 在页面左上方,选择使用服务的地域。

  5. 在左侧导航栏,选择模型开发与训练>交互式建模(DSW)

  6. 单击目标 DSW 实例操作列下的打开,进入 DSW 实例的开发环境。

  7. Notebook 页签的 Launcher 页面,单击快速开始区域 Tool 下的 DSW Gallery,打开 DSW Gallery 页面。

  8. 在 DSW Gallery 页面中,搜索 EasyPhoto: 基于 EasyAnimate 的 AI 视频生成示例,单击在 DSW 中打开,即可自动将本教程所需的资源和教程文件下载至 DSW 实例中,并在下载完成后自动打开教程文件。



  1. 下载 EasyAnimate 相关代码和模型并进行安装。


在教程文件 easyanimate.ipynb 中,单击开始按钮运行环境安装节点命令,包括定义函数下载代码下载模型。当成功运行一个步骤命令后,再顺次运行下个步骤的命令。

步骤三:推理模型

方式一:使用代码进行推理

单击开始按钮运行模型推理>使用代码进行推理节点的命令进行模型推理。您可在**/mnt/workspace/demos/easyanimate/EasyAnimate/samples/easyanimate-videos**目录中查看生成结果。您可以修改不同的参数来达到不同的效果,参数说明:



方式二:使用 WebUI 进行推理

  1. 单击开始按钮运行模型推理>UI 启动节点的命令,进行模型推理。

  2. 单击生成的链接,进入 WebUI 界面。



  1. 在 WebUI 界面选择预训练的模型路径、微调后的基模型和 LoRA 模型,设置 LoRA 权重,其它参数按需配置即可。



  1. 单击 Generate(生成),等待一段时间后,即可在右侧查看或下载生成的视频。


步骤四:微调 LoRA

EasyAnimate 提供了丰富的模型训练方式,包括 DiT 模型的训练(LoRA 微调和基模型的全量微调)和 VAE 的训练。关于 Gallery 中内置的 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"    }    .....]
复制代码



训练模型

  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 进行视频生成。

方式二:使用快速开始

步骤一:部署模型

  1. 进入快速开始页面。

  2. 登录PAI控制台

  3. 在左侧导航栏单击工作空间列表,在工作空间列表页面单击目标工作空间名称,进入对应工作空间内。

  4. 在左侧导航栏单击快速开始,进入快速开始页面。

  5. 在快速开始页面,搜索 EasyAnimate 高清长视频生成,然后单击部署,配置相关参数。


EasyAnimate 目前仅支持使用 bf16 进行推理,请选择 A10 及其以上的显卡。



  1. 单击部署,在弹出的计费提醒对话框中,单击确定,页面将自动跳转到服务详情页面。


状态变为运行中时,即表示模型部署成功。

步骤二:使用模型

模型部署完成后,您可以使用 WebUI 及 API 两种方式调用服务来生成视频。

WebUI 方式

  1. 服务详情页面,单击查看 WEB 应用



  1. 在 WebUI 界面选择预训练的模型路径,其它参数按需配置即可。



  1. 单击 Generate(生成),等待一段时间后,即可在右侧查看或下载生成的视频。


API 方式

  1. 服务详情页面的资源详情区域,单击查看调用信息,获取调用服务所需的信息。



  1. 通过接口更新 Transformer 模型,可在 DSW 实例或本地 Python 环境中执行。


如果已经在 WebUI 中选择模型,则无需发送请求重复调用。如遇请求超时,请在 EAS 日志中确认模型已加载完毕。加载完成,日志中将提示 Update diffusion transformer done。Python 请求示例如下。


import jsonimport 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 = "v2" 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/EasyAnimateV2-XL-2-512x512" outputs = post_diffusion_transformer(diffusion_transformer_path, url = url, token=token) print('Output update edition: ', outputs)
复制代码


其中:


  • <eas-service-url>:替换为步骤1中查询到的服务访问地址。

  • <eas-service-token>:替换为步骤1中查询到的服务 Token。


  1. 调用服务,生成视频或图片。


  • 服务输入参数说明



  • Python 请求示例


服务返回 base64_encoding,为 base64 结果。您可以在**/mnt/workspace/demos/easyanimate/**目录中查看生成结果。


import base64import jsonimport sysimport timefrom datetime import datetimefrom io import BytesIO
import cv2import requestsimport base64

def post_infer(is_image, 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, "is_image": is_image, "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 # -------------------------- # is_image = False length_slider = 27 outputs = post_infer(is_image, length_slider, url = url, token=token) # Get decoded data outputs = json.loads(outputs) base64_encoding = outputs["base64_encoding"] decoded_data = base64.b64decode(base64_encoding)
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 time_end = time.time() time_sum = (time_end - time_start) % 60 print('# --------------------------------------------------------- #') print(f'# Total expenditure: {time_sum}s') print('# --------------------------------------------------------- #')
复制代码


其中:


  • < eas-service-url>:替换为步骤1中查询到的服务访问地址。

  • < eas-service-token>:替换为步骤1中查询到的服务 Token。

用户头像

还未添加个人签名 2020-10-15 加入

分享阿里云计算平台的大数据和AI方向的技术创新和趋势、实战案例、经验总结。

评论

发布
暂无评论
基于EasyAnimate模型的视频生成最佳实践_人工智能_阿里云大数据AI技术_InfoQ写作社区