微调视频生成模型

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

适用范围

  • 适用地域:本文档仅适用于“中国大陆(北京)”地域,且必须使用该地域的API Key

  • 开通账号权限:若使用阿里云子账号RAM用户),需要为子账号授予模型调用、训练和部署权限

  • 支持微调的模型:图生视频-基于首帧:wan2.5-i2v-preview、wan2.2-i2v-flash。

  • 支持微调的方式:SFT-LoRA高效微调。

如何微调模型

本文将以训练一个“金钱雨特效”LoRA模型为例。预期效果是:输入一张图片,无需提示词,模型自动为其生成一段带有“金钱雨特效”的视频。

输入首帧图像

image_3

输出视频(微调前)

基模无法通过提示词每次生成固定运动的“金钱雨”特效(运动画面不可控)。

输出视频(微调后)

微调后的模型无需提示词即能稳定复现训练集中的特定“金钱雨”特效。

运行下述代码前,请获取与配置 API Key,并配置API Key

步骤1:上传数据集

将本地的数据集(.zip 格式)上传到阿里云百炼平台,并获取文件 ID (file_id)。

训练集样例数据:wan-i2v-training-dataset.zip。数据集格式请参见训练集

请求示例

本示例仅上传训练集,系统会自动从训练集中划分一部分作为验证集。
curl --location --request POST 'https://dashscope.aliyuncs.com/api/v1/files' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--form 'files=@"./wan-i2v-training-dataset.zip"' \
--form 'purpose="fine-tune"' \
--form 'descriptions="a fine-tune training data file for wan"'

响应示例

请保存 file_id,这是上传数据集的唯一标识。

{
    "data": {
        "uploaded_files": [
            {
                "name": "wan-i2v-training-dataset.zip",
                "file_id": "3bff1ef7-f72d-4285-bb75-xxxxxx"
            }
        ],
        "failed_uploads": []
    },
    "request_id": "1f3f1c5b-7418-4976-aaea-xxxxxx"
}

步骤2:微调模型

步骤2.1 创建微调任务

使用步骤1中的文件ID启动训练任务。

说明

关于模型微调的超参数设置,请参见超参数

请求示例

请将<替换为训练数据集的文件id>完整替换为上一步获取的file_id

Wan2.5模型

curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "model":"wan2.5-i2v-preview",
    "training_file_ids":[
        "<替换为训练数据集的文件id>"
    ],
    "training_type":"efficient_sft",
    "hyper_parameters":{
        "n_epochs":400,
        "batch_size":2,
        "learning_rate":2e-5,
        "split":0.9,
        "eval_epochs": 20,
        "max_pixels": 36864
    }
}'

Wan2.2模型

curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "model":"wan2.2-i2v-flash",
    "training_file_ids":[
        "<替换为训练数据集的文件id>"
    ],
    "training_type":"efficient_sft",
    "hyper_parameters":{
        "n_epochs":400,
        "batch_size":4,
        "learning_rate":2e-5,
        "split":0.9,
        "eval_epochs": 20,
        "max_pixels": 262144
    }
}'

响应示例

关注 output 中的三个关键参数:

  • job_id:任务ID,用于查询进度。

  • finetuned_output:微调后的新模型名称,后续部署和调用时必须使用此名称。

  • status:模型训练状态。创建微调任务后,初始状态为PENDING,表示训练待开始。

{
    ...
    "output": {
        "job_id": "ft-202511111122-xxxx",
        "status": "PENDING",
        "finetuned_output": "wan2.5-i2v-preview-ft-202511111122-xxxx",
        ...
    }
}
步骤2.2 查询微调任务状态

通过步骤2.1获得的 job_id 查询任务进度,轮询以下接口直到 status 变为 SUCCEEDED

说明

本文示例的微调任务训练需要数小时,具体耗时根据微调模型而定,请耐心等待。

请求示例

请将 URL 中的 <替换为微调任务job_id> 完整替换为job_id的值。

curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<替换为微调任务job_id>' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json'

响应示例

关注output 字段的两个参数:

  • status:当它的值变为 SUCCEEDED 时,表示模型已训练完毕,可以进行模型部署。

  • usage:模型训练消耗的总Token数量,用于模型训练计费。

{
    ...
    "output": {
        "job_id": "ft-202511111122-xxxx",
        "status": "SUCCEEDED",
        "usage": 432000,
        ...
    }
}

步骤3:部署微调后的模型

步骤3.1 部署模型为在线服务

当微调任务的状态为 SUCCEEDED 后,将模型部署为在线服务。

请求示例

请将<替换为模型名称model_name> 完整替换为创建微调任务的输出参数finetuned_output的值。

curl --location 'https://dashscope.aliyuncs.com/api/v1/deployments' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "model_name": "<替换为模型名称model_name>",
    "aigc_config": {
        "prompt": "根据图像内容提供视频描述,描述必须包含“然后开始展示s86b5p金钱雨特效,无数巨大尺寸的美元钞票(米黄底/深绿图案)如暴雨般倾泻而下,密集地砸向并环绕她(他)。钞票持续落下,同时镜头缓缓拉进,她(他)双臂舒展上扬,脖颈微仰,表情惊喜,完全沉浸在这场狂野的金钱雨中”。\n输出模板:\n视模板头展示了[主体描述]。[环境描述]。然后开始展示s86b5p金钱雨特效,无数巨大尺寸的美元钞票(米黄底/深绿图案)如暴雨般倾泻而下,密集地砸向并环绕她(他)。钞票持续落下,同时镜头缓缓拉进,她(他)双臂舒展上扬,脖颈微仰,表情惊喜,完全沉浸在这场狂野的金钱雨中。\n示例:\n视频开头展示了一位年轻女性在海滩上的场景。她的头发湿漉漉的,呈现出深棕色,卷曲且略显凌乱。她的脸上带着灿烂的笑容。背景是波涛汹涌的海浪和远处的山脉。然后开始展示s86b5p金钱雨特效,无数巨大尺寸的美元钞票(米黄底/深绿图案)如暴雨般倾泻而下,密集地砸向并环绕她。钞票持续落下,同时镜头缓缓拉进,她双臂舒展上扬,脖颈微仰,表情惊喜,完全沉浸在这场狂野的金钱雨中。",
        "lora_prompt_default": "然后开始展示s86b5p金钱雨特效,无数巨大尺寸的美元钞票(米黄底/深绿图案)如暴雨般倾泻而下,密集地砸向并环绕主角。钞票持续落下,同时镜头缓缓拉进,主角双臂舒展上扬,脖颈微仰,表情惊喜,完全沉浸在这场狂野的金钱雨中。"
    },
    "capacity": 1,
    "plan": "lora"
}'

响应示例

关注 output 中的两个参数:

  • deployed_model:部署的模型名称,用于查询部署状态和调用模型。

  • status:模型部署状态。部署微调模型后,初始状态为PENDING,表示部署未开始。

{
    ...
    "output": {
        "deployed_model": "wan2.5-i2v-preview-ft-202511111122-xxxx",
        "status": "PENDING",
        ...
    }
}
步骤3.2 查询部署状态

查询部署状态,轮询以下接口直到 status 变为 RUNNING

说明

本文示例的微调模型,部署过程预计需要 5~10分钟

请求示例

请将<替换为模型名称model_name>完整替换为步骤3.1输出参数deployed_model的值。

curl --location 'https://dashscope.aliyuncs.com/api/v1/deployments/<替换为deployed_model>' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' 

响应示例

关注output字段的两个参数:

  • status:当状态变为 RUNNING 时,表示模型已部署成功,可以开始调用。

  • deployed_model:部署的模型名称。

{
    ...
    "output": {
        "status": "RUNNING",
        "deployed_model": "wan2.5-i2v-preview-ft-202511111122-xxxx",
        ...
    }
}

步骤4:调用模型生成视频

模型部署成功后(即部署状态status为 RUNNING ),即可发起调用。

预期效果:只需输入一张图像,无需提示词,模型自动根据图像生成一段带有“金钱雨特效”的视频。

步骤4.1:创建视频生成任务,并获取task_id

请求示例

请将<替换为部署名称deployed_model>完整替换为上一步输出的deployed_model值。

curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/video-generation/video-synthesis' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--header 'X-DashScope-Async: enable' \
--data '{
    "model": "<替换为部署名称deployed_model>",
    "input": {
        "img_url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251219/imnlba/lora.webp"
    },
    "parameters": {
        "resolution": "480P",
        "prompt_extend": false
    }
}'

响应示例

请复制并保存task_id,用于下一步结果查询。

{
    "output": {
        "task_status": "PENDING",
        "task_id": "0385dc79-5ff8-4d82-bcb6-xxxxxx"
    },
    "request_id": "4909100c-7b5a-9f92-bfe5-xxxxxx"
}

输入参数说明

调用微调后的LoRA模型时,输入参数用法基本与基模“图生视频-基于首帧”API 一致。

下表仅列出 LoRA 模型特有的参数用法或限制,其他未提及的参数(如duration,默认5秒),请参见图生视频-基于首帧API

字段

类型

必选

描述

示例值

model

string

模型名称。

必须使用已成功部署且状态为RUNNING的微调模型。

wan2.5-i2v-preview-ft-202511111122-xxxx

input.prompt

string

文本提示词。

无需传入。由于在模型部署时已预置了prompt,模型会根据输入图像自动生成prompt。

-

parameters.resolution

string

生成的视频分辨率档位。

微调模型支持 480P、720P。默认720P。

720P

parameters.prompt_extend

boolean

是否开启prompt智能改写。

调用微调的LoRA模型时,建议关闭,即设置为false。

false

步骤4.2:根据task_id查询结果

使用task_id轮询任务状态,直到 task_status 变为 SUCCEEDED,并获取视频URL。

请求示例

请将86ecf553-d340-4e21-xxxxxxxxx替换为真实的task_id。
curl -X GET https://dashscope.aliyuncs.com/api/v1/tasks/86ecf553-d340-4e21-xxxxxxxxx \
--header "Authorization: Bearer $DASHSCOPE_API_KEY"

响应示例

视频URL有效期为24小时,请及时下载视频。
{
    "request_id": "c87415d2-f436-41c3-9fe8-xxxxxx",
    "output": {
        "task_id": "a017e64c-012b-431a-84fd-xxxxxx",
        "task_status": "SUCCEEDED",
        "submit_time": "2025-11-12 11:03:33.672",
        "scheduled_time": "2025-11-12 11:03:33.699",
        "end_time": "2025-11-12 11:04:07.088",
        "orig_prompt": "",
        "video_url": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.mp4?Expires=xxxx"
    },
    "usage": {
        "duration": 5,
        "video_count": 1,
        "SR": 480
    }
}

构建自定义数据集

除了使用本文示例数据体验流程外,您也可以构建自己的数据集进行微调。

数据集应包含 训练集(必须)和 验证集(可选,支持从训练集自动划分)。所有文件请打包为.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"        
    }

验证集:可选

图生视频-基于首帧的验证集包括首帧图片、标注文件(data.jsonl),无需提供视频。训练任务会在每个评估节点,自动调用模型服务,使用验证集的图片和 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。

数据收集和清洗

1. 确定微调场景

通义万相支持图生视频的微调场景包括:

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

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

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

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

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

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

3. 清洗数据

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

维度

正面要求

负面案例

一致性

核心特征必须高度统一

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

方向混杂

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

多样性

主体与场景越丰富越好

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

单一场景或主体

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

均衡性

各类型数据比例均衡

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

比例严重失调

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

纯净度

画面干净清晰

使用无干扰的原始素材。

有干扰元素

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

时长

素材时长 ≤ 目标时长

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

素材过长

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

视频标注:为视频编写Prompt

在数据集的标注文件(data.jsonl)中,每个视频都有对应的一段 Prompt。Prompt 是用来描述视频的画面内容,Prompt 的质量直接决定模型“学什么”。

Prompt示例

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

Prompt编写公式

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

Prompt描述项

说明

填写建议

示例

主体描述

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

必填

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

背景描述

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

必填

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

触发词

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

推荐填写

s86b5p 或 m01aa

运动描述

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

推荐填写

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

关于“触发词”
  • 触发词是什么?

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

  • 为什么要使用它?

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

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

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

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

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

如何写好Prompt

遵循特效描述的一致性原则

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

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

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

    样本类型

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

    训练集样本1

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

    训练集样本2

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

    验证集样本1

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

借助 AI 生成  Prompt

为了获得质量较高的Prompt,推荐使用Qwen-VL等多模态大模型来辅助生成视频的Prompt。

  1. 使用 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. 提炼特效模板

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

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

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

  1. 人工检查

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

使用验证集评估模型

指定验证集

微调任务必须包含训练集,验证集则是可选项。您可以选择由系统自动划分手动上传验证集,具体指定方式如下:

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

创建微调任务时,如果没有单独上传验证集,即未传入validation_file_ids参数,系统将根据以下两个超参数,自动从训练集中划分出一部分作为验证集:

  • split:训练集划分比例。例如,0.9 表示将90%的数据用于训练,剩余的10%用作验证。

  • max_split_val_dataset_sample:自动划分验证集的最大样本数。

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

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

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

    • 实际切分:min(10, 5)=5,所以系统只取 5 条作为验证集。

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

如果您希望使用一套自己准备的数据来评估Checkpoint,而不是依赖系统随机划分,可以上传自定义验证集。

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

操作步骤:主动上传验证集

  1. 准备验证集:将验证数据打包成一个独立的 .zip 文件,请参见验证集格式

  2. 上传验证集:调用上传数据集接口,上传这个验证集 .zip 文件,获得一个专属的文件ID。

  3. 创建任务时指定验证集:在调用创建微调任务接口时,将这个文件ID填入 validation_file_ids 参数中。

    {
        "model":"wan2.5-i2v-preview",
        "training_file_ids":[ "<训练集的文件id>" ],
        "validation_file_ids": [ "<自定义验证集的文件id>" ],
        ...
    }

挑选最佳Checkpoint进行部署

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

系统将按照超参数eval_epochs设定的间隔,在验证集上运行Checkpoint并生成预览视频。

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

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

操作步骤

步骤1:查看Checkpoint生成的预览效果
步骤1.1 查询已通过验证的Checkpoint列表

该接口仅返回通过验证集验证、且成功生成预览视频的 Checkpoint,验证失败的不会列出。

请求示例

curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<替换为微调任务job_id>/validation-results' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' 

响应示例

此接口返回一个仅包含成功通过验证的Checkpoint名称的列表。

{
    "request_id": "da1310f5-5a21-4e29-99d4-xxxxxx",
    "output": [
        {
            "checkpoint": "checkpoint-160"
        },
        ...
    ]
}

步骤1.2 查询Checkpoint对应的验证集结果

从上一步返回的 Checkpoint 列表中选择一个(例如“checkpoint-160”),查看其生成的视频效果。

请求示例

  • <替换为微调任务job_id>: 完整替换为创建微调任务输出参数job_id的值。

  • <替换为待导出的checkpoint>:完整替换为checkpoint的值,例如“checkpoint-160”。

curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<替换为微调任务job_id>/validation-details/<替换为选择的checkpoint>?page_no=1&page_size=10' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY"

响应示例

预览视频URLvideo_path,有效期为24小时,请及时下载视频并查看效果。重复此步骤,比较多个Checkpoint的效果,找出最满意的一个。

{
    "request_id": "375b3ad0-d3fa-451f-b629-xxxxxxx",
    "output": {
        "page_no": 1,
        "page_size": 10,
        "total": 1,
        "list": [
            {
                "video_path": "https://finetune-swap-wulanchabu.oss-cn-wulanchabu.aliyuncs.com/xxx.mp4?Expires=xxxx",
                "prompt": "视频开头展示了一位年轻男性坐在咖啡馆的场景。他穿着一件米色的Polo衫,神情专注且略显沉思,手指轻轻托着下巴。他的面前摆放着一杯热气腾腾的咖啡,背景是木质条纹的墙壁和一个装饰牌。然后开始展示s86b5p金钱雨特效,无数巨大尺寸的美元钞票(米黄底/深绿图案)如暴雨般倾泻而下,密集地砸向并环绕他。钞票持续落下,他双臂舒展上扬,脖颈微仰,表情惊喜,完全沉浸在这场狂野的金钱雨中。",
                "first_frame_path": "https://finetune-swap-wulanchabu.oss-cn-wulanchabu.aliyuncs.com/xxx.jpeg"
            }
        ]
    }
}

步骤2:导出Checkpoint,并获取待部署的模型名称
步骤2.1 导出模型

假设“checkpoint-160”的效果最佳,接下来是将其导出。

请求示例

  • <替换为微调任务job_id>: 完整替换为创建微调任务输出参数job_id的值。

  • <替换为待导出的checkpoint>:完整替换为checkpoint的值,例如“checkpoint-160”。

  • <替换为模型名称model_name>:完整替换创建微调任务输出参数finetuned_output的值。

curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<替换为微调任务job_id>/export/<替换为待导出的checkpoint>?model_name=<替换为控制台展示的导出模型名称>' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY"

响应示例

参数output=true表示导出请求已成功创建。

{
    "request_id": "0817d1ed-b6b6-4383-9650-xxxxx",
    "output": true
}
步骤2.2 查询部署后的新模型名称

导出模型需要一定的时间。请查询所有Checkpoint的状态,确认导出已完成,并获取它专属的、用于部署的新模型名称(model_name)。

请求示例

  • <替换为微调任务job_id> :完整替换为创建微调任务输出参数job_id的值。

curl --location 'https://dashscope.aliyuncs.com/api/v1/fine-tunes/<替换为微调任务job_id>/checkpoints' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY"

响应示例

请在返回列表中定位导出的 Checkpoint(如 checkpoint-160)。当其 status 变为 SUCCEEDED 时,表示导出成功;此时返回的 model_name 字段即为导出后的新模型名称。

{
    "request_id": "b0e33c6e-404b-4524-87ac-xxxxxx",
    "output": [
         ...,
        {
            "create_time": "2025-11-11T13:27:29",
            "full_name": "ft-202511111122-496e-checkpoint-160",
            "job_id": "ft-202511111122-496e",
            "checkpoint": "checkpoint-160",                             
            "model_name": "wan2.5-i2v-preview-ft-202511111122-xxxx-c160", // 重要字段,将用于模型部署和调用
            "model_display_name": "wan2.5-i2v-preview-ft-202511111122-xxxx", 
            "status": "SUCCEEDED" // 成功导出的checkpoint
        },
        ...
        
    ]
}
步骤3:部署并调用模型

在成功导出 Checkpoint 并获取 model_name 后,请按照以下步骤执行后续操作:

  • 模型部署:在输入参数 model_name,填入导出后获取到的具体值。

  • 模型调用:参照接口说明,调用已部署模型。

应用于生产环境

在实际生产中,如果初次训练的模型效果不佳(如画面崩坏、特效不明显、动作不准确),可参考以下维度调优:

1. 检查数据与Prompt

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

  • 样本数量:建议将高质量数据增加至 20条以上

  • Prompt:确保触发词为无意义稀有词(如 s86b5p),避免使用常用词(如 running)造成干扰。

2. 调整超参数:参数说明请参见超参数

  • n_epochs (训练轮数)

    • 默认值:400,推荐使用默认值。若需调整,请遵循 “总训练步数 (Steps) ≥ 800” 的原则。

    • 总步数计算公式: steps = n_epochs × 向上取整(训练集大小 / batch_size)。

    • 因此,n_epochs最小值计算公式:n_epochs = 800 / 向上取整(数据集大小 / batch_size)

    • 示例:假设训练集有5条数据,使用Wan2.5模型(batch_size=2)。

      • 每轮训练步数:5 / 2 = 2.5,向上取整为3。总的训练轮数: n_epochs = 800 / 3 ≈ 267。此值为推荐的最小值,可根据实际业务适当调高,比如300。

  • learning_rate (学习率)、batch_size (批次大小)推荐使用默认值,通常无需修改。

计费说明

  • 模型训练:收费。

  • 模型部署免费

  • 模型调用:收费。

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

API文档

视频生成模型微调API参考

常见问题

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

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

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

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

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

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

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

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

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

A: 规则如下:

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

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

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

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