当使用万相进行图像生成时,若通过Prompt 优化仍无法满足对特定风格、IP形象或画面效果的定制需求,请使用模型微调。
适用范围
-
适用地域:本文描述的功能仅在新加坡地域可用,且必须使用该地域的API Key。
-
支持微调的方式:SFT-LoRA高效微调。
-
支持微调的模型:
-
图像生成(文生图/图生图):wan2.7-image-pro、wan2.7-image。
-
如何微调模型
文生图
微调目标:训练一个人物LoRA模型。
预期效果:输入一段提示词,模型自动生成特定人物在符合提示词场景下的描述。
|
输入提示词 人物在拥挤的早高峰地铁车厢内,抓着扶手,背景是模糊的乘客和车窗外的隧道灯光,身穿普通的上班族白衬衫和黑色西裤,人物站立面向镜头,半身照,写实抓拍感。 |
输出图像(微调前-文生图)
无参考图无法生成特定人物形象。 |
输出图像(微调后)
微调后的模型能稳定复现训练集中的特定人物形象。 |
图生图
微调目标:训练一个"末日废土红黑机甲"LoRA模型。
预期效果:输入一张人物图像,无需提示词,模型自动生成人物“末日废土红黑机甲”风格的图像。
|
输入图像
|
输出图像(微调前)
无法通过提示词每次生成固定风格的“末日废土红黑机甲”特效。 |
输出图像(微调后)
微调后的模型无需提示词即能复现训练集中的特定“末日废土红黑机甲”特效。 |
步骤1:上传数据集
将本地的数据集(.zip 格式)上传到阿里云百炼平台,并获取文件 ID (id)。
训练集样例数据:格式请参见训练集。
-
图像生成-文生图:wan-image-t2i-training-dataset.zip
-
图像生成-图生图:wan-image-i2i-training-dataset.zip
请求示例
本示例使用文生图,仅上传训练集,系统将自动从训练集中划分一部分作为验证集。
curl --location --request POST 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1/files' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--form 'file=@"./wan-image-t2i-training-dataset.zip"' \
--form 'purpose="fine-tune"'
响应示例
请保存 id,这是上传数据集的唯一标识。
{
"id": "file-ft-3c67043a747c-xxxxxx",
"object": "file",
"bytes": 73310369,
"filename": "wan-image-t2i-training-dataset.zip",
"purpose": "fine-tune",
"status": "processed",
"created_at": 1782271893
}
步骤2:微调模型
步骤2.1 创建微调任务
使用步骤1中的文件ID启动训练任务。
请求示例
请将<替换为训练数据集的文件id>完整替换为上一步获取的id。完整参数说明与格式约束请参见超参数。
curl --location 'https://dashscope-intl.aliyuncs.com/api/v1/fine-tunes' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "wan2.7-image-pro",
"training_datasets": [
{
"data_source_type": "file_id",
"file_id": "<替换为训练数据集的文件id>"
}
],
"training_type": "efficient_sft",
"hyper_parameters": {
"learning_rate": 3e-5,
"max_steps": 800,
"eval_steps": 200,
"max_token_length": "1k",
"gradient_clip": 0.5,
"weight_decay": 0.02,
"max_pixels": "1k",
"val_img_size": "1k",
"generation_type": "t2i",
"lora_rank": 32,
"save_total_limit": 10
}
}'
除使用步骤 1 获取的文件 ID 外,您还可以通过 OSS 挂载方式加载训练数据集,请求示例如下:
curl --location 'https://dashscope-intl.aliyuncs.com/api/v1/fine-tunes' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "wan2.7-image-pro",
"training_datasets": [
{
"data_source_type": "oss_mount",
"mount_storage": {
"region": "ap-southeast-1",
"bucket": "example_bucket",
"file_path": "dataset/data.jsonl"
}
}
],
"training_type": "efficient_sft",
"hyper_parameters": {
"learning_rate": 3e-5,
"max_steps": 800,
"eval_steps": 200,
"max_token_length": "1k",
"gradient_clip": 0.5,
"weight_decay": 0.02,
"max_pixels": "1k",
"val_img_size": "1k",
"generation_type": "t2i",
"lora_rank": 32,
"save_total_limit": 10
}
}'
使用 OSS 挂载方式加载数据集时,需将未经压缩的数据集文件夹整体上传到 OSS Bucket(如 dataset 文件夹下包含 data.jsonl 及对应的图片文件),不支持 zip 文件;挂载时指定 data.jsonl 的文件路径即可,无需单独指定图片文件。OSS Bucket 所属地域支持北京(cn-beijing)和新加坡(ap-southeast-1)。
训练耗时(仅供参考):
-
文生图(t2i):2K,300 步,约 77 分钟。
-
图生图(i2i):2K,300 步,约 110 分钟。
响应示例
关注 output 中的三个关键参数:
-
job_id:任务ID,用于查询进度。 -
finetuned_output:微调后的新模型名称,后续部署和调用时必须使用此名称。 -
status:模型训练状态。创建微调任务后,初始状态为PENDING,表示训练待开始。
{
...
"output": {
"job_id": "ft-202511111122-xxxx",
"status": "PENDING",
"finetuned_output": "xxxx-ft-202511111122-xxxx",
...
}
}
步骤2.2 查询微调任务状态
通过步骤2.1获得的 job_id 查询任务进度,轮询以下接口直到 status 变为 SUCCEEDED。
请求示例
请将 URL 中的 <替换为微调任务job_id> 完整替换为job_id的值。
curl --location 'https://dashscope-intl.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-intl.aliyuncs.com/api/v1/deployments' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model_name": "<替换为模型名称model_name>",
"capacity": 1,
"plan": "lora"
}'
响应示例
关注 output 中的两个参数:
-
deployed_model:部署的模型名称,用于查询部署状态和调用模型。 -
status:模型部署状态。部署微调模型后,初始状态为PENDING,表示部署未开始。
{
...
"output": {
"deployed_model": "wan2.7-image-pro-xxxxxxxxxxxx",
"status": "PENDING",
...
}
}
步骤3.2 查询部署状态
查询部署状态,轮询以下接口直到 status 变为 RUNNING。
本文示例的微调模型,部署过程预计需要 5~10分钟。
请求示例
请将<替换为deployed_model>完整替换为步骤3.1输出参数deployed_model的值。
curl --location 'https://dashscope-intl.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.7-image-pro-xxxxxxxxxxxx",
...
}
}
步骤4:调用模型生成图像
模型部署成功后(即部署状态status为 RUNNING ),即可发起调用。
当前部署后的图像模型仅支持异步调用,且返回响应的message.content中无type字段。
构建自定义数据集
除了使用本文示例数据体验微调流程外,您也可以构建自己的数据集进行微调。
数据集应包含 训练集(必须)和 验证集(可选,支持从训练集自动划分)。所有文件请打包为.zip 格式,文件名建议仅使用英文、数字、下划线或短横线。
数据集格式
训练集:必须提供
文生图
训练集包括训练目标图像和标注文件(data.jsonl)。
-
zip包目录结构:
wan-image-t2i-training-dataset.zip ├── data.jsonl # 必须固定命名为data.jsonl,最大支持 20MB ├── 1_0.png # 训练目标图像,最大分辨率4096*4096,单张≤20MB,支持PNG/JPG/JPEG/WEBP/BMP ├── 1_1.png # 文件名仅支持英文字符,平铺结构(禁止子目录) └── 1_2.png -
标注文件(data.jsonl):每一行代表一条训练数据,必须为 JSON 对象。
{ "prompt": "s86b5p, The character stands in a quiet private library in the afternoon, with tall dark walnut bookshelves behind, sunlight streaming through blinds casting striped light and shadow, wearing a soft beige cable-knit sweater, the character stands facing the camera, half-body shot, the image has a fine film grain texture.", "img_path": "./1_0.png" }
单图生图
训练集包括参考图像(输入)、训练目标图像(输出)和标注文件(data.jsonl)。
-
zip包目录结构:
wan-image-i2i-training-dataset.zip ├── data.jsonl # 必须固定命名为data.jsonl,最大支持 20MB ├── 1_0.jpg # 训练目标图像(输出) ├── 1_1.jpg # 参考图像(输入) ├── 6_0.jpg # 训练目标图像(输出) └── 6_1.jpg # 参考图像(输入) -
标注文件(data.jsonl):每一行代表一条训练数据,必须为 JSON 对象。
{ "prompt": "s86b5p, Change the background to an elevator with red lighting, featuring large floor-to-ceiling windows. Change the character's clothing to red tight-fitting mech armor with black stripe decorations.", "input_img": "./1_1.jpg", "img_path": "./1_0.jpg" }
多图生图
训练集包括多张参考图像(输入)、训练目标图像(输出)和标注文件(data.jsonl)。与单图生图不同,多图生图支持同时输入多张参考图像(如人物照片+姿态图,最多支持9张参考图),模型基于多张参考图的综合信息生成目标图像。
-
多图生图使用
input_imgs(数组),单图生图使用input_img(字符串),请注意区分。 -
input_imgs数组中的图像顺序应与训练意图一致(如第一张为人物参考,第二张为姿态参考)。
-
训练集样例:
-
zip包目录结构:
wan-image-multi-i2i-training-dataset.zip ├── data.jsonl # 必须固定命名为data.jsonl,最大支持 20MB ├── 1_0.jpg # 训练目标图像(输出) ├── 1_ref.jpg # 参考图像1(如人物照片) ├── 1_pose.jpg # 参考图像2(如姿态图) ├── 2_0.jpg # 训练目标图像(输出) ├── 2_ref.jpg # 参考图像1 └── 2_pose.jpg # 参考图像2 -
标注文件(data.jsonl):每一行代表一条训练数据,必须为 JSON 对象。使用
input_imgs字段传入多张参考图像路径。{ "prompt": "s86b5p, Change the background to an elevator with red lighting, featuring large floor-to-ceiling windows. Outside the windows, there is a post-apocalyptic scene with red mist. Change the character's clothing to red tight-fitting mech armor with black stripe decorations. Standing with both arms stretched horizontally to form a T-shape.", "input_imgs": ["./1_ref.jpg", "./1_pose.jpg"], "img_path": "./1_0.jpg" }
-
data.jsonl 必须为 Line-delimited JSONL 格式(每行一个独立 JSON 对象),禁止使用 JSON 数组格式(即文件首字符不能是
[)。 -
zip 包内文件必须平铺放置,禁止使用子目录。文件名仅支持英文字符(禁止中文、空格、特殊字符)。
验证集:可选
验证集包括标注文件(data.jsonl)和可选的参考图像(图生图模式需要),无需提供目标图像。训练任务会在每个评估节点,自动调用模型服务,使用验证集的 Prompt(和参考图像)生成预览图像。
-
验证集:
-
zip包目录结构:
wan-image-i2i-valid-dataset.zip ├── data.jsonl # 必须固定命名为data.jsonl,最大支持 20MB ├── input_001.png # 可选,图生图模式的参考图像 └── input_002.png -
标注文件(data.jsonl):每一行代表一条验证数据,必须为 JSON 对象。
文生图
{ "prompt": "s86b5p, The character is in a crowded morning rush hour subway car, holding onto a handrail, with blurred passengers in the background and tunnel lights outside the window, wearing a plain white office shirt and black trousers, the character stands facing the camera, half-body shot, realistic candid feel." }图生图
{ "prompt": "s86b5p, Change the background to an elevator with red lighting, featuring large floor-to-ceiling windows. Change the character's clothing to red tight-fitting mech armor with black stripe decorations.", "input_img": "./input_001.png" }多图生图
多图生图验证集使用
input_imgs(数组)传入多张参考图像路径,最多支持9张。{ "prompt": "s86b5p, Change the background to an elevator with red lighting, featuring large floor-to-ceiling windows. Outside the windows, there is a post-apocalyptic scene with red mist. Change the character's clothing to red tight-fitting mech armor with black stripe decorations. Standing with both arms stretched horizontally to form a T-shape.", "input_imgs": ["./input_001.png", "./input_002.png"] }
数据规模与限制
-
数据量:建议至少提供 25张 图像(推荐 50 张以上效果更佳)。要求同一角色/风格,多场景多角度,内容描述一致。
-
Zip压缩包:通过 API 上传时,总包大小 ≤ 1GB。
-
训练图像要求:
-
图像格式支持BMP、JPEG、PNG、WEBP。
-
图像分辨率 ≤ 4096×4096。
-
单个图像文件大小 ≤ 20MB。
-
数据收集和清洗
1. 确定微调场景
万相支持图像生成的微调场景包括:
-
IP角色风格化:让模型学会特定IP角色的绘画风格,如二次元人物、吉祥物形象等。
-
固定画面风格:提升模型对特定艺术风格的复现度,如扁平插画、水墨画、像素风等。
-
特定场景生成:复刻特定的构图模式或场景模板,如商品展示图、海报版式等。
2. 获取原始素材
-
AI 生成筛选:利用"万相"基础模型批量生成图像,再人工挑选出最符合目标效果的优质样本。这是最常用的方法。
-
真实拍摄:如果您的目标是追求高真实感的场景(如产品实拍、人物摄影等),使用实拍素材是最佳选择。
-
三维软件渲染:对于需要控制细节的场景或3D渲染风格,建议使用 3D 软件(如 Blender、C4D)制作素材。
3. 清洗数据
|
维度 |
正面要求 |
负面案例 |
|
一致性 |
核心特征必须高度统一。 例如:训练"扁平插画风格",所有图像必须都是相同的线条粗细和配色方案。 |
风格混杂。 数据集中既有厚涂风格,又有扁平风格。模型不知道该学哪种风格。 |
|
多样性 |
主体与场景越丰富越好。 覆盖不同主体(男女老少、猫狗建筑)和不同构图(远景、近景、特写)。同时,分辨率和长宽比应尽可能多样化。 |
单一场景或主体。 所有图像都是"穿红衣的人在白墙前"。模型会误以为"红衣"和"白墙"是风格的一部分,换了场景就不会生成了。 |
|
均衡性 |
各类型数据比例均衡。 如果包含多种风格,数量应大致相等。 |
比例严重失调。 90%是人像图像,10%是风景图像。模型可能在生成风景图像时效果不佳。 |
|
纯净度 |
画面干净清晰。 使用无干扰的原始素材。 |
有干扰元素。 图像中带有水印、明显的黑边或噪点。模型可能会把水印当成风格学进去。 |
|
分辨率 |
分辨率适中。 建议训练图像分辨率不超过 2048×2048,过大的图像会增加训练时间。 |
分辨率差异过大。 训练集中既有 256×256 的小图,又有 4096×4096 的大图,会影响训练稳定性。 |
图像标注:为图像编写Prompt
在数据集的标注文件(data.jsonl)中,每张图像都有对应的一段 Prompt。Prompt 是用来描述目标图像的画面内容,Prompt 的质量直接决定模型"学什么"。
Prompt编写公式
Prompt = [主体描述] + [背景描述] + [触发词] + [风格描述]
|
Prompt描述项 |
说明 |
填写建议 |
示例 |
|
主体描述 |
描述画面中原本存在的人或物 |
必填 |
一位年轻女性身着红色中式长衫... |
|
背景描述 |
描述画面中主体所处的环境 |
必填 |
背景是被绿色的藤蔓覆盖的砖墙... |
|
触发词 |
一个无实际意义的稀有词汇 |
推荐填写 |
s86b5p 或 m01aa |
|
风格描述 |
详细描述目标图像的艺术风格和画面特征 |
推荐填写 |
采用扁平化插画风格,以简洁流畅的线条、鲜明平涂色彩突出主体立体感与现代设计感。 |
使用验证集评估模型
指定验证集
微调任务必须包含训练集,验证集则是可选项。您可以选择由系统自动划分或手动上传验证集,具体指定方式如下:
方式一:未上传验证集(系统自动划分)
在创建微调任务时,如果没有单独上传验证集(即未传入validation_datasets参数),系统将根据split从训练集划分验证集,默认 0.9。即 90% 用于训练,10% 用作验证。
方式二:主动上传验证集(通过 validation_datasets 指定)
如果您希望使用一套自己准备的数据来评估Checkpoint,而不是依赖系统随机划分,可以上传自定义验证集。
注意:一旦选择主动上传,系统将完全忽略上述自动划分规则,仅使用您上传的数据进行验证。
挑选最佳Checkpoint进行部署
在训练过程中,系统会定期保存模型的"快照"(即 Checkpoint)。默认情况下,系统会输出最后一个Checkpoint作为最终的微调模型。但中间过程产出的Checkpoint效果可能优于最终版本,您可以从中挑选出最满意的一个进行部署。
系统将按照超参数eval_steps设定的间隔,在验证集上运行Checkpoint并生成预览图像。
-
如何评估:通过直接观察生成的预览图像来判断效果。
-
挑选标准:找到效果最好、且风格最贴合的那个 Checkpoint 。
操作步骤
步骤1:查看Checkpoint生成的预览效果
步骤2:导出Checkpoint,并获取待部署的模型名称
步骤3:部署并调用模型
计费说明
-
模型训练:收费。详情请参见模型训练计费。
-
费用 = 训练 Tokens 总量 × 单价。
-
训练结束后,在查询微调任务状态接口
usage字段查看训练消耗的总 Token 数。
下表列出了wan2.7-image、wan2.7-image-pro不同生成类型训练中常见训练步数及预估费用。该数据仅供参考,实际训练效果请以最终交付为准,费用请以正式账单为准。详细计费公式请参见模型训练计费。
generation_type
图片分辨率
常见Step步数
Token消耗预估
费用预估
t2i(文生图)
1K
500
6,400,000
$96
1000
12,800,000
$192
2000
25,600,000
$384
2K
500
11,610,000
$174.15
1000
23,220,000
$348.3
2000
46,440,000
$696.6
i2i(图生图)
1K
500
11,610,000
$174.15
1000
23,220,000
$348.3
2000
46,440,000
$696.6
2K
500
16,000,000
$240
1000
32,000,000
$480
2000
64,000,000
$960
-
-
模型部署与调用:部署免费,调用按微调的基础模型的标准调用价格计费。
模型名称
Lora部署调用价格
wan2.7-image-pro
$0.075/张
wan2.7-image
$0.03/张
API文档
常见问题
Q:如何设计一个好的触发词?
A: 规则如下:
-
推荐使用无实际语义的稀有字符组合,如 s86b5p、m01aa、EVEAven638123。确保在基模词表中无语义含义。
-
避免使用常用英语单词(如 beautiful, fire, dance),否则会污染模型原本对这些词的理解。




