微调视频生成模型

当您在使用通义万相生成视频时,若通过 Prompt 优化或调用官方特效仍无法满足对特定动作、特效或风格的定制需求,请使用模型微调。

重要

本文档仅适用于中国大陆版(北京地域)。

微调场景

通义万相支持对 “图生视频-基于首帧” 模型进行微调,主要用于实现以下任务:

  • 固定视频特效:让模型学会某种特定的视觉变化,如旋转木马、魔法换装等。

  • 固定人物动作:提升模型对特定肢体动作的复现度,如特定的舞蹈动作、武术招式。

  • 固定视频运镜:复刻复杂的镜头语言,如推拉摇移、环绕拍摄等固定模板。

固定视频特效示例:学术换装

graduation (2)

固定人物动作示例:舞蹈动作

dance4 (1)

固定视频运镜示例:镜头拉近

pupil-国内 (1)

微调前须知

在开始之前,请按以下步骤确认是否需要微调:

  • 第一步:尝试 Prompt 优化

    查看Prompt使用指南,尝试调整提示词。增加风格描述、明确主体特征、细化镜头语言通常是成本最低且最高效的方法。

  • 第二步:检查官方特效库

    查看通义万相官方支持的视频特效是否满足需求。官方库可能已经包含了您想要的效果(如特定的运镜、转场等)。

  • 第三步:确认微调需求

    如果以上两种方法均无效,且需要生成的视频具有以下特征,则使用微调

    • 视觉高度统一:生成的一系列视频风格完全一致。

    • 私域知识:模型从未见过的特定内容(如公司私有IP形象、独创的魔法特效、特定的舞蹈动作)。

快速开始

使用API进行模型调优

计费说明

  • 模型训练:收费。费用 = 训练Tokens总量 × 训练单价,请参见计费说明

  • 模型部署:免费。部署专属模型不产生额外费用。

  • 模型调用:收费。按微调的基础模型的标准调用价格收费,请参见模型价格

支持微调的模型

模型服务

模型名称

微调方式

图生视频-基于首帧

wan2.2-i2v-flash

SFT-LoRA高效微调

wan2.5-i2v-preview

SFT-LoRA高效微调

SFT-LoRA高效微调

SFT:监督微调。即提供成对的训练数据:“输入”(如Prompt+图片)和“期望的输出”(视频),模型会学习它们之间的映射关系,从而掌握特定的视频生成能力。

目前仅支持SFT-LoRA高效微调。LoRA高效微调只需训练少量参数,训练速度快、成本低。适合固定风格、动作和特效的场景。

微调工作流程

微调一个专属模型主要分为四个步骤:

  1. 数据准备:收集视频与图片,按规范制作数据集,并编写对应的 Prompt。这是决定模型效果最关键的一步。

  2. 模型训练:上传数据集并调用 API 发起训练。训练过程由系统自动完成,自动输出微调后的模型(通常为最后一个Checkpoint)。

  3. 效果评估:观察验证集生成的预览视频,挑选效果最好的Checkpoint。

  4. 部署与调用:将选中的模型部署为在线服务,随后即可像调用官方模型一样使用它。

准备数据集

数据集格式

您需要准备 训练集(必须)和 验证集(可选,推荐使用自动划分)。所有文件需打包为.zip格式,文件名推荐写为英文、数字、下划线和短横线。

训练集(必须)

图生视频-基于首帧的训练集包含训练首帧图片、训练视频、标注文件(data.jsonl)。

  • 数据集样例:wan-i2v-training-dataset.zip

  • zip包目录结构:

    wan-i2v-training-dataset.zip
    ├── data.jsonl    (jsonl名称固定为data,最大支持20MB)
    ├── image_1.jpeg  (图像最大分辨率为1024*1024,单张最大不超过10MB,支持BMP、JPEG、PNG、WEBP格式)
    ├── video_1.mp4   (视频最大分辨率为512*512,单个最大不超过10MB,支持MP4、MOV格式)
    ├── image_2.jpeg
    └── video_2.mp4
  • 标注文件(data.jsonl):每一行是一个 JSON 对象,包含三个字段:Prompt、图片路径、视频路径。

    //一行训练数据展开后结构如下:
    {
        "prompt": "视频开头展示了一位年轻女性站在一堵爬满常春藤的砖墙前。她有着一头柔顺的红棕色长发,穿着一件白色的无袖连衣裙,佩戴着一条闪亮的银色项链,面带微笑。背景中的砖墙被绿色的藤蔓覆盖,显得古朴而自然。然后开始展示s86b5p金钱雨特效,无数巨大尺寸的美元钞票(米黄底/深绿图案)如暴雨般倾泻而下,密集地砸向并环绕她。钞票持续落下,她双臂舒展上扬,脖颈微仰,表情惊喜,完全沉浸在这场狂野的金钱雨中。",
        "first_frame_path": "image_1.jpeg",
        "video_path": "video_1.mp4"        
    }

验证集(可选)

图生视频-基于首帧的验证集不需要上传视频,只需提供 Prompt和首帧图片。训练任务会在每个评估节点,自动调用模型服务,使用验证集的图片和 Prompt 生成预览视频。

  • 数据集样例:wan-i2v-valid-dataset.zip

  • zip包目录结构:

    wan-i2v-valid-dataset.zip
    ├── data.jsonl    (jsonl名称固定为data,最大支持20MB)
    ├── image_1.jpeg   (图像最大分辨率为1024*1024,单张最大不超过10MB,支持BMP、JPEG、PNG、WEBP格式)
    └── image_2.jpeg
  • 标注文件(data.jsonl):每一行是一个 JSON 对象,包含两个字段:Prompt、图片路径。

    //一行验证数据展开后结构如下:
    {
        "prompt": "视频开头展示了一位年轻男性站在城市景观前的场景。他穿着黑白格子外套,内搭黑色连帽衫,面带微笑,神情自信。背景是夕阳下的城市天际线,远处可以看到著名的圆顶建筑和错落有致的屋顶,天空中云层密布,呈现出温暖的橙黄色调。然后开始展示s86b5p金钱雨特效,无数巨大尺寸的美元钞票(米黄底/深绿图案)如暴雨般倾泻而下,密集地砸向并环绕他。钞票持续落下,同时镜头缓缓拉进,他双臂舒展上扬,脖颈微仰,表情惊喜,完全沉浸在这场狂野的金钱雨中。",
        "first_frame_path": "image_1.jpg"
    }

数据规格限制

  • 数据量:至少 5数据,训练数据量越大越好。建议 20-100 条以获得稳定效果。

  • Zip压缩包:总大小 ≤ 2GB。

  • 文件数量:图片最多200张,视频最多200个。

  • 格式要求

    • 图像:图像格式支持BMP、JPEG、PNG、WEBP;图像分辨率 ≤ 1024x1024;单个图像文件 ≤ 10MB。

    • 视频:视频格式支持 MP4、MOV;视频分辨率 ≤ 512x512;单个视频文件 ≤ 10MB。

数据收集和清洗

在开始筛选前,您可以从以下三个渠道获取原始素材:

  • AI 生成筛选:利用“通义万相”基础模型批量生成视频,再人工挑选出最符合目标效果的优质样本。这是最常用的方法。

  • 真实拍摄:如果您的目标是追求高真实感的互动场景(如拥抱、握手等),使用实拍素材是最佳选择。

  • 三维软件渲染:对于需要控制细节的特效或抽象动画,建议使用 3D 软件(如 Blender、C4D)制作素材。

数据清洗标准

请按照以下要求清洗收集到的数据:

维度

正面要求

负面案例

一致性

核心特征必须高度统一

例如:训练“360度旋转”,所有视频必须都是顺时针旋转,且旋转速度基本一致。

方向混杂

数据集中既有顺时针,又有逆时针。模型不知道该学哪个方向。

多样性

主体与场景越丰富越好

覆盖不同主体(男女老少、猫狗建筑)和不同构图(远近景、俯仰拍)。同时,分辨率和长宽比应尽可能多样化。

单一场景或主体

所有视频都是“穿红衣的人在白墙前旋转”。模型会误以为“红衣”和“白墙”是特效的一部分,换了衣服就不会转了。

均衡性

各类型数据比例均衡

如果包含多种风格,数量应大致相等。

比例严重失调

90%是人像视频,10%是风景视频。模型可能在生成风景视频时效果不佳。

纯净度

画面干净清晰

使用无干扰的原始素材。

有干扰元素

视频中带有字幕、台标、水印、明显的黑边或噪点。模型可能会把水印当成特效学进去

时长

素材时长 ≤ 目标时长

若期望生成5秒视频,素材最好裁剪为4-5秒。

素材过长

期望生成5秒,却喂给模型8秒的素材,会导致动作学习不完整,产生截断感。

编写Prompt

Prompt 是用来描述视频的画面内容。Prompt 的质量直接决定模型“学什么”和“忽略什么”。

视频示例

Prompt示例

视频开头展示了一位年轻女性站在一堵爬满常春藤的砖墙前。她有着一头柔顺的红棕色长发,穿着一件白色的无袖连衣裙,佩戴着一条闪亮的银色项链,面带微笑。背景是被绿色的藤蔓覆盖的砖墙,显得古朴而自然。然后开始展示s86b5p金钱雨特效,无数巨大尺寸的美元钞票(米黄底/深绿图案)如暴雨般倾泻而下,密集地砸向并环绕她。钞票持续落下,她双臂舒展上扬,脖颈微仰,表情惊喜,完全沉浸在这场狂野的金钱雨中。

编写公式

Prompt = [主体描述] + [背景描述] + [触发词] + [运动描述]

Prompt描述项

说明

填写建议

示例

主体描述

描述画面中原本存在的人或物

必填

视频开头展示了一位年轻女性...

背景描述

描述画面中主体所处的环境

必填

背景是被绿色的藤蔓覆盖的砖墙...

触发词

一个无实际意义的稀有词汇

推荐填写

s86b5p 或 m01aa

运动描述

详细描述视频中特效发生的运动变化

推荐填写

无数巨大尺寸的美元钞票(米黄底/深绿图案)如暴雨般倾泻而下...

什么是触发词?
  • 触发词是什么?

    它相当于一个 "视觉锚点" 。因为很多复杂的动态(如某种特殊的舞蹈轨迹、独创的光影变化)很难用文字描述,所以用这个词强制告诉模型:当你看到 s86b5p 时,就必须生成这种特定的视觉效果。

  • 为什么要使用它?

    模型微调的本质是建立“文本”与“视频特征”的映射关系。触发词就是那个把“难以言传的特效”绑定到一个独一无二的词上,让模型能够锁定目标。

  • 既然有了触发词,为什么还要详细描述运动?

    两者分工不同,配合使用效果更好。

    • 运动描述:负责解释 “画面在发生什么”。它告诉模型基础的物理动作和逻辑,确保动作不走样。通常多个样本的运动描述是一致的。

    • 触发词:负责解释 “动作具体是什么样”。它代表了那些文字无法描述的独特变化和特征。

如何写好Prompt

在训练数据中,视频内容往往包含两部分:想学的(核心特效) 和 不想学的(偶然干扰信息)。为确保模型精确学习目标特征并忽略无关内容,请遵守以下两条规则。

规则一: 核心特效描述,尽量保持一致

所有包含该特效的样本,其特效描述部分应尽量保持一致。训练集和验证集均遵守此规则。

  • 示例:无论是“年轻女性”还是“西装男性”,只要是金钱雨特效,Prompt 后半段都统一写为:“...然后开始展示 s86b5p 金钱雨特效,无数美元钞票如暴雨般倾泻而下...

  • 目的:当模型发现 s86b5p 出现时,后面总是跟着一段固定的描述,且画面总是出现金钱雨,它就能记住:s86b5p = 金钱雨视觉效果。

样本类型

Prompt 内容(注意下划线部分的描述一致性)

训练集样本1

视频开头展示了一位年轻女性站在砖墙前...(省略环境描述)...然后开始展示 s86b5p 金钱雨特效,无数巨大尺寸的美元钞票(米黄底/深绿图案)如暴雨般倾泻而下,密集地砸向并环绕她。钞票持续落下,她双臂舒展上扬,表情惊喜,完全沉浸在这场狂野的金钱雨中。

训练集样本2

视频开头展示了一位西装男性在高档餐厅内...(省略环境描述)...然后开始展示 s86b5p 金钱雨特效,无数巨大尺寸的美元钞票(米黄底/深绿图案)如暴雨般倾泻而下,密集地砸向并环绕他。钞票持续落下,他双臂舒展上扬,表情惊喜,完全沉浸在这场狂野的金钱雨中。

验证集样本1

视频开头展示了一位年轻小孩站在城市景观前...(省略环境描述)...然后开始展示s86b5p金钱雨特效,无数巨大尺寸的美元钞票(米黄底/深绿图案)如暴雨般倾泻而下,密集地砸向并环绕他。钞票持续落下,同时镜头缓缓拉进,他双臂舒展上扬,脖颈微仰,表情惊喜,完全沉浸在这场狂野的金钱雨中。

规则二:干扰信息或动作,必须描述出来

如果视频中出现了与特效无关的干扰动作,必须在 Prompt 中写出来

  • 什么算干扰信息?

    • 假设本样本训练目标为“旋转木马变身特效”。

    • 样本在变身过程中出现了“上衣花纹动态增减”的变化,例如右侧新增花纹、左侧花纹消失。

    • 这属于与目标无关的视觉干扰,不应让模型学习。

  • 为什么必须在 Prompt 中显式描述?

    如果不描述,模型会误以为“衣服花纹变化”也是特效的一部分。

  • 怎么描述

    • Prompt中准确描述变化过程,例如:“变身过程中,上衣右侧多了一个花纹,然后左边的花纹消失了”。

    • 目的是告诉模型“这个花纹变化是跟这句话对应的,不是特效本身”,让模型学会忽略它。

如何在 Prompt 中显式描述“干扰信息”?

这是 Prompt 编写中 最容易出错 的环节。请仔细对比以下两个场景。

场景一:针对不同样本,训练集 Prompt 的区别

  • 训练集:Prompt = 期望的画面 + 画面里实际发生但不希望模型学习的干扰(若有)

在同一个训练集中,素材质量可能参差不齐。有的视频有干扰信息(如变身时衣服花纹变化,参考上述示例),有的视频画面干净。

样本类型

Prompt 描述

Prompt 写法区别

训练集样本1

含有干扰信息

视频开头展示了一位年轻女性在户外的场景...(省略背景描述)...然后她开始了s86b5p变身。变身过程中,上衣右侧多了一个花纹,然后左边的花纹消失了。变身结束后,她回到了童年时代,坐在木马上,身后是模糊的游乐园。

必须描述干扰信息。

告诉模型这是偶然的变化,不是特效的一部分。

训练集样本2

画面干净

视频开头展示了一位年轻男性坐在室内的咖啡馆中...(省略背景描述)...然后他开始了 s86b5p 变身。变身结束后,他回到了童年时代,坐在木马上,身后是模糊的游乐园。

无干扰信息,只需描述期望的画面。

场景二:针对同一个“含干扰信息样本”,训练集 vs 验证集 的区别

  • 训练集:Prompt = 期望的画面 + 画面里实际发生但不希望模型学习的干扰

  • 验证集:Prompt = 期望的画面

对于场景一的 “训练样本 1(含干扰信息)”,在训练和验证时的 Prompt 策略截然不同。

样本类型

Prompt 描述

Prompt 写法区别

训练集

视频开头展示了一位年轻女性在户外的场景...(省略背景描述)...然后她开始了s86b5p变身。变身过程中,上衣右侧多了一个花纹,然后左边的花纹消失了。变身结束后,她回到了童年时代,坐在木马上,身后是模糊的游乐园。

必须描述干扰信息。

告诉模型这是偶然的变化,不是特效的一部分。

验证集

视频开头展示了一位年轻女性在户外的场景...(省略背景描述)...然后她开始了s86b5p变身。变身结束后,她回到了童年时代,坐在木马上,身后是模糊的游乐园。

不用描述干扰信息。

验证集只描述期望生成的视频画面,不要包含干扰信息描述。

借助 AI 生成  Prompt

为了节省时间并提高准确率,我们推荐使用Qwen-VL等多模态大模型来辅助生成视频的Prompt。

步骤一:使用 AI 辅助生成初始描述

  1. 自由发散(寻找灵感):如果不知道该如何描述特效,可以先让 AI 自由发挥。

    • 直接发送“详细描述视频内容”,观察模型输出了什么。

    • 重点看模型用了哪些词汇来形容特效的运动轨迹(如“螺旋上升”、“粒子汇聚”),这些词汇可以作为后续优化的素材。

  2. 固定句式(规范输出):当您有了大概思路后,可基于标注公式设计一套固定句式,引导 AI 生成符合训练格式的 Prompt。

    示例代码

    代码调用详见视觉理解
    import os
    from openai import OpenAI
    
    client = OpenAI(
        # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
        # 新加坡和北京地域的API Key不同。获取API Key:https://help.aliyun.com/zh/model-studio/get-api-key
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        # 以下是北京地域base_url,如果使用新加坡地域的模型,需要将base_url替换为:https://dashscope-intl.aliyuncs.com/compatible-mode/v1
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    )
    completion = client.chat.completions.create(
        model="qwen3-vl-plus",
        messages=[
            {"role": "user","content": [{
                # 直接传入视频文件时,请将type的值设置为video_url
                # 使用OpenAI SDK时,视频文件默认每间隔0.5秒抽取一帧,且不支持修改,如需自定义抽帧频率,请使用DashScope SDK.
                "type": "video_url",
                "video_url": {"url": "https://cloud.video.taobao.com/vod/Tm1s_RpnvdXfarR12RekQtR66lbYXj1uziPzMmJoPmI.mp4"}},
                {"type": "text","text": "请仔细分析视频,并按照以下固定句式生成一段详细的视频描述"
                                        "句式模板:视频开头展示了[主体描述]。背景是[背景描述]。然后开始展示s86b5p金钱雨特效,[详细的运动描述]。"
                                        "要求:"
                                        "1.[主体描述]:详细描述画面中原本存在的人或物,包含人物/物体的外貌、衣着、表情等细节。"
                                        "2.[背景描述]:详细描述主体所处的环境,包含环境、光影、天气等细节。"
                                        "3.[运动描述]:详细描述特效发生时的动态变化过程(如物体如何移动、光影如何变化、镜头如何变化)。"
                                        "4.所有内容必须自然融入句式中,不得保留“[ ]”符号,也不得添加任何与描述无关的文字。"}]
             }]
    )
    print(completion.choices[0].message.content)

步骤二:提炼特效模板

  1. 建议对多个包含相同特效的样本重复运行,找出描述特效时共同使用的高频、准确词组,从中提炼出一段通用的“特效描述”。

  2. 将这段标准化的特效描述复制粘贴到该特效的所有数据集中。

  3. 保留每个样本独特的“主体”和“背景”描述,仅将“特效描述”部分替换为统一模板。

步骤三:人工检查

AI 可能会产生幻觉或识别错误,最后请进行人工检查,例如:确认主体和背景的描述是否符合画面真实情况等。

模型训练与超参数

常用超参数

参数详细介绍请参见超参数

超参数

含义

默认值

batch_size

批次大小。一次性送入模型训练的数据条数。

推荐固定为4。

4

n_epochs

训练轮数。所有数据被反复学习的次数。

建议:见下方计算公式。

400

learning_rate

学习率。控制学习的“步子”大小。

2e-5

max_pixels

训练视频的最大分辨率

系统会自动将超过此像素值的视频进行缩放。

wan2.2设为 262144(视频分辨率为512×512)

wan2.5设为 36864(视频分辨率为192×192)

split

训练集自动划分比例

仅在不上传验证集时生效。

例如:0.9 表示 90% 用于训练,10% 用于验证。

0.9

max_split_val_dataset_sample

自动划分验证集的最大样本数

仅在不上传验证集时生效。

5

eval_epochs

验证间隔。

训练期间每隔多少个epoch进行一次验证,用于阶段性评估模型训练效果。

20

计算 n_epochs

模型训练跟 总训练步数 (steps) 密切相关,其计算公式为:steps = n_epochs × 向上取整(训练集大小 / batch_size)。

为确保模型充分训练,建议总训练步数不少于 800 步。因此,n_epochs 可参考以下公式计算:

  • 计算公式:

  • 假设:训练集有10条数据,batch_size4。

    • 每轮训练步数:10 / 4 = 2.5,向上取整为3。

    • 总的训练轮数: n_epochs = 800 / 3 ≈ 267。

    • 此值为推荐的最小值,可根据实际需求适当调高,比如300。

查看训练Tokens 总量

模型训练计费公式:模型训练费用 = 训练Tokens总量 × 训练单价。其中,训练成本主要由 训练 Tokens 总量 决定。

训练结束后,您可以在查询微调任务状态返回结果的 usage 字段中查看本次训练实际消耗的 Tokens 总量。

使用验证集评估效果

如何指定验证集

验证集用于在训练过程中评估模型效果。您有两种方式指定验证集:

  • 方式一:未上传验证集(系统自动划分)

    如果您没有单独上传验证集,系统会自动从训练集中划出一部分数据用于验证。

    • 切分规则:系统会选取 数据集总数 × (1 - split) 和 max_split_val_dataset_sample 中的较小值

    • 示例:假设训练集有 100 条数据,split=0.9(即验证集切分10%),max_split_val_dataset_sample=5。

      • 理论切分:100 × 10% = 10 条。

      • 实际切分:因为上限是 5,所以系统只取 5 条作为验证集。

  • 方式二:主动上传验证集(通过 validation_file_ids 指定)

    • 您也可以单独准备一个验证集压缩包,并在创建微调任务中通过 validation_file_ids 参数传入。

    • 注意:一旦选择主动上传,系统将完全忽略上述自动划分规则,仅使用您上传的数据进行验证。

挑选最佳模型

在训练过程中,系统会定期保存模型的“快照”(即 Checkpoint)。默认情况下,系统会输出最后一个Checkpoint作为最终的微调模型。但中间过程产出的Checkpoint效果可能优于最终版本。您可以从中挑选出最满意的一个进行部署。

系统会根据 eval_epochs定期使用验证集生成预览视频。

  • 如何评估:通过直接观察生成的预览视频来判断效果。

  • 挑选标准:找到效果最好、且没有动作变形的那个 Checkpoint 。

模型部署与调用

挑选满意的模型进行部署。部署后,即可通过 API 像调用官方模型一样使用您的专属模型。

相关文档

使用API进行模型调优

常见问题

Q: 如何计算训练集和验证集的数据量?

A: 训练集必须提供,验证集可选。具体计算方式如下:

  • 当未传入验证集时:上传的训练集即为“数据集总数”,系统会自动从训练集中划出一部分数据用于验证。

    • 验证集数量 = min(数据集总数 × (1 − split), max_split_val_dataset_sample)。计算示例请参见如何指定验证集

    • 训练集数量 = 数据集总数 − 验证集数量。

  • 当主动传入验证集时:系统不再从训练数据中划分验证集。

    • 训练集数量 = 上传的训练集数据量。

    • 验证集数量 = 上传的验证集数据量。

Q: 训练效果不佳(如画面崩坏、特效不明显)怎么办?

A: 请根据以下内容检查:

  • 检查数据:数据一致性是核心。检查是否有方向相反、风格差异过大的“差样本”。

  • 检查 Prompt:是否忘记描述那些“偶然的干扰细节”?触发词是否使用了常用词(如 running)导致冲突?

  • 检查参数:检查总训练步数(steps)是否达到建议的最小值(如800步)。若步数过少,可适当增加 n_epochs。对于复杂任务,也可尝试微调 learning_rate

  • 添加数据:尝试将高质量数据增加到 20 条以上。

Q: 如何设计一个好的触发词?

A: 规则如下:

  • 使用无意义的字母组合,如 sksstyle, a8z2_effect。

  • 避免使用常用英语单词(如 beautiful, fire, dance),否则会污染模型原本对这些词的理解。

Q: 微调能改变视频的分辨率或时长吗?

A: 不能。微调是学习“内容”和“动态”,不是改变“规格”。输出视频的格式(分辨率、帧率、时长上限)依然由基础模型决定。