Skip to content

Commit 651a07f

Browse files
authored
Merge pull request #72 from modelstudioai/feat/i2v-model-skill
feat: add i2v skill
2 parents 5420f72 + 099bdda commit 651a07f

3 files changed

Lines changed: 324 additions & 2 deletions

File tree

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
{
2+
"$schema": "https://json-schema.org/draft/2020-12/schema",
3+
"title": "ModelProfile",
4+
"description": "LLM 合成的模型画像(判断层),作为 profile 字段嵌入 models.jsonl 宿主记录。爬取后按 _meta.sourceHash 增量重编译。事实字段(openSource/callModes/familyComparison)由脚本机械注入,LLM 只写判断字段。字段值三态语义:缺失=未知;null=不适用(仅 familyTier/familyComparison 两处允许);有值=已知。",
5+
"$comment": "生成期校验清单(schema 无法表达,编译脚本必须执行):1) pipelineRole 的 from/to 与宿主 inferenceMetadata 的 request/response_modality 一致;2) 家族 itemCount>=2 时 familyTier/familyComparison 必为非 null,itemCount==1 时必为 null;3) familyComparison 按家族生成一段后扇出到族内全部成员,保证副本一致;4) 事实字段由脚本注入,禁止 LLM 生成。",
6+
"type": "object",
7+
"additionalProperties": false,
8+
"required": ["profileCompleteness", "_meta"],
9+
"properties": {
10+
"profileCompleteness": {
11+
"type": "string",
12+
"enum": ["full", "partial", "structured-only"],
13+
"description": "full=判断字段齐备(含负面清单与档位);partial=有定位和场景;structured-only=仅由结构化规格推导,未读过文档"
14+
},
15+
"oneLinePositioning": {
16+
"type": "string",
17+
"minLength": 4,
18+
"maxLength": 50,
19+
"description": "一句话定位(≤50字),用用户能理解的语言,禁止官方套话"
20+
},
21+
"scenes": {
22+
"type": "array",
23+
"minItems": 1,
24+
"uniqueItems": true,
25+
"items": {
26+
"type": "string",
27+
"enum": [
28+
"代码生成", "创意写作", "客服对话", "知识问答", "文档理解",
29+
"数据分析", "数学推理", "翻译", "图像生成", "图像编辑",
30+
"视频生成", "视频编辑", "语音合成", "语音识别", "实时对话",
31+
"Agent编排", "深度研究", "教育辅导", "电商营销", "角色扮演",
32+
"3D生成", "向量检索", "数字人",
33+
"音乐生成", "人脸人像", "虚拟试穿", "OCR文字识别",
34+
"情感分析", "意图识别", "图像修复", "语义重排"
35+
]
36+
},
37+
"description": "适用场景标签(受控词表)。通用场景 23 个 + 垂直场景 8 个"
38+
},
39+
"notSuitableFor": {
40+
"type": "array",
41+
"uniqueItems": true,
42+
"items": { "type": "string", "maxLength": 40 },
43+
"description": "不适用场景(自由文本负面清单)。空数组 [] 表示「无已知限制」;字段缺失表示「未知」"
44+
},
45+
"styleKeywords": {
46+
"type": "array",
47+
"maxItems": 5,
48+
"uniqueItems": true,
49+
"items": { "type": "string", "maxLength": 12 },
50+
"description": "风格关键词"
51+
},
52+
"familyTier": {
53+
"enum": ["flagship", "balanced", "lightweight", null],
54+
"description": "同族内的规模-质量档位。null=单模型家族不适用(≠未知;专用性由 scenes/pipelineRole 承载)。同族 ≥2 个模型时必填非 null 值(生成期校验)"
55+
},
56+
"familyComparison": {
57+
"type": ["string", "null"],
58+
"maxLength": 200,
59+
"description": "同族对比摘要(2-3句)。null=单模型家族不适用(≠未知)。生成纪律:每族生成一段后由脚本扇出到族内全部成员,保证族内副本一致"
60+
},
61+
"openSource": {
62+
"type": "boolean",
63+
"description": "是否开源。脚本从 families.jsonl 的 description 检测「开源」关键词机械注入;检测须排除否定表述(如「不开源」「非开源」);description 无明确信号时省略本字段(未知),宁缺勿错。注意该推断是家族级的,族内成员共享同一值"
64+
},
65+
"callModes": {
66+
"type": "array",
67+
"minItems": 1,
68+
"uniqueItems": true,
69+
"items": {
70+
"type": "string",
71+
"enum": ["sync", "async", "streaming", "realtime"]
72+
},
73+
"description": "支持的调用模式(可多值并存)。脚本从 groups/<slug>.json 的 samples 推导"
74+
},
75+
"pipelineRole": {
76+
"type": "array",
77+
"uniqueItems": true,
78+
"items": {
79+
"type": "object",
80+
"additionalProperties": false,
81+
"required": ["from", "to", "role"],
82+
"properties": {
83+
"from": { "$ref": "#/$defs/modality" },
84+
"to": { "$ref": "#/$defs/modality" },
85+
"role": {
86+
"type": "string",
87+
"maxLength": 30,
88+
"description": "语义角色,如「分镜描述生成」「画面转视频」"
89+
}
90+
}
91+
},
92+
"description": "流水线角色。from/to 须与宿主记录 inferenceMetadata 的 request/response_modality 一致(生成期校验)"
93+
},
94+
"_meta": {
95+
"type": "object",
96+
"additionalProperties": false,
97+
"required": ["generatedAt"],
98+
"properties": {
99+
"generatedAt": {
100+
"type": "string",
101+
"format": "date-time",
102+
"description": "本条 profile 的生成时间(ISO 8601)"
103+
},
104+
"sourceHash": {
105+
"type": "string",
106+
"maxLength": 16,
107+
"description": "全部输入源的内容哈希前 16 位,用于增量重编译判断。哈希输入必须覆盖喂进 profile 的所有来源:family description、wiki excerpts、groups/<slug>.json 的 samples 键名集合(callModes 的输入)、宿主 inferenceMetadata(pipelineRole 校验的输入)。任一来源变化都应触发重编译"
108+
},
109+
"generatorVersion": {
110+
"type": "string",
111+
"maxLength": 20,
112+
"description": "编译脚本版本号,如 1.0.0"
113+
}
114+
},
115+
"description": "元信息(脚本注入,非 LLM 生成)。用于增量编译判断和画像腐化检测"
116+
}
117+
},
118+
"allOf": [
119+
{
120+
"if": {
121+
"properties": { "profileCompleteness": { "const": "full" } }
122+
},
123+
"then": {
124+
"required": ["oneLinePositioning", "scenes", "notSuitableFor", "familyTier"]
125+
}
126+
},
127+
{
128+
"if": {
129+
"properties": { "profileCompleteness": { "const": "partial" } }
130+
},
131+
"then": {
132+
"required": ["oneLinePositioning", "scenes"]
133+
}
134+
}
135+
],
136+
"$defs": {
137+
"modality": {
138+
"type": "string",
139+
"enum": ["Text", "Image", "Video", "Audio"]
140+
}
141+
}
142+
}

‎skills/bailian-train-deploy/SKILL.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
---
22
name: bailian-train-deploy
3-
description: 用百炼 CLI (`bl`) 走完"数据→微调训练→导出→部署→调用"的完整闭环,或跳过训练直接部署基座模型。支持文本模型(SFT/DPO/CPT)、音频 TTS 模型(CosyVoice)和图像生成模型(Wan2.7)微调。涵盖数据集校验/上传、创建微调任务、等待训练、导出最佳 checkpoint、创建推理部署、等待就绪、给出调用示例。当用户提到在百炼 / DashScope / 阿里云模型工作室上"训练模型""微调""fine-tune""finetune""部署模型""模型上线""把微调模型跑起来/调用""训练一个推理模型""继续预训练""LoRA/SFT/DPO 训练""语音合成模型""TTS 微调""CosyVoice""声音克隆""图像生成微调""文生图""图生图""Wan2.7""图像模型训练"等,都应激活本技能——即使用户没明说"用 bl",只要意图是百炼平台的训练或部署,就用本技能,不要自己拼凑命令。
3+
description: 用百炼 CLI (`bl`) 走完"数据→微调训练→导出→部署→调用"的完整闭环,或跳过训练直接部署基座模型。支持文本模型(SFT/DPO/CPT)、音频 TTS 模型(CosyVoice)、图像生成模型(Wan2.7)和视频生成模型(Wan i2v/kf2v)微调。涵盖数据集校验/上传、创建微调任务、等待训练、导出最佳 checkpoint、创建推理部署、等待就绪、给出调用示例。当用户提到在百炼 / DashScope / 阿里云模型工作室上"训练模型""微调""fine-tune""finetune""部署模型""模型上线""把微调模型跑起来/调用""训练一个推理模型""继续预训练""LoRA/SFT/DPO 训练""语音合成模型""TTS 微调""CosyVoice""声音克隆""图像生成微调""文生图""图生图""Wan2.7""图像模型训练""视频生成微调""图生视频""首帧生视频""首尾帧""kf2v""i2v""Wan视频""视频特效训练"等,都应激活本技能——即使用户没明说"用 bl",只要意图是百炼平台的训练或部署,就用本技能,不要自己拼凑命令。
44
---
55

66
# 百炼模型训练→部署闭环 (`bl`)
77

8-
用百炼 CLI `bl` 把模型部署成可调用的专属推理服务——可以先微调再部署,也可以跳过训练直接部署基座。支持文本、音频 TTS 和图像生成三种模态,两处"等待"用 Monitor 异步轮询,不阻塞主流程。
8+
用百炼 CLI `bl` 把模型部署成可调用的专属推理服务——可以先微调再部署,也可以跳过训练直接部署基座。支持文本、音频 TTS、图像生成和视频生成四种模态,两处"等待"用 Monitor 异步轮询,不阻塞主流程。
99

1010
```
1111
链路 A(先训练后部署):
@@ -21,6 +21,7 @@ description: 用百炼 CLI (`bl`) 走完"数据→微调训练→导出→部署
2121
- **文本模型**(对话/推理)→ [`references/text.md`](references/text.md)
2222
- **音频 TTS 模型**(语音合成/CosyVoice)→ [`references/audio.md`](references/audio.md)
2323
- **图像生成模型**(文生图/图生图/Wan2.7)→ [`references/image.md`](references/image.md)
24+
- **视频生成模型**(图生视频/首尾帧/Wan i2v/kf2v)→ [`references/video.md`](references/video.md)
2425
- 未来新增模态 = 新增对应 reference 文件,本流程骨架不变
2526

2627
> 本技能假设 `bl`(bailian-cli)已安装。命令/flag 细节以 `bl <cmd> --help` 为准;本技能聚焦**流程编排与避坑**。
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
# 视频生成模型参考
2+
3+
> 本文件补充 [`SKILL.md`](../SKILL.md) 中视频生成微调链路的模态特异性细节(数据格式、模型、超参、部署、推理)。通用流程见 SKILL.md。
4+
5+
## 适用场景
6+
7+
用户想微调一个视频生成模型,用自己的视频数据训练出定制特效、动作或风格的 LoRA 模型。当前支持的基座:
8+
9+
| 基座模型 | 类型 | 说明 |
10+
|---|---|---|
11+
| `wan2.7-i2v` | 首帧图生视频 | 推荐,最新一代,质量最高 |
12+
| `wan2.5-i2v-preview` | 首帧图生视频 | 上一代 |
13+
| `wan2.2-i2v-flash` | 首帧图生视频 | 轻量快速 |
14+
| `wan2.2-kf2v-flash` | 首尾帧图生视频 | 给定首帧+尾帧,生成中间过渡视频 |
15+
16+
## 数据格式
17+
18+
视频生成数据是 **ZIP 包**(不是 .jsonl),内含标注文件和媒体文件。
19+
20+
### 首帧(i2v)数据集
21+
22+
```
23+
i2v-dataset.zip
24+
├── data.jsonl # 标注文件
25+
├── image_1.jpeg # 首帧图像(平铺)
26+
├── video_1.mp4 # 训练目标视频
27+
├── image_2.jpeg
28+
└── video_2.mp4
29+
```
30+
31+
JSONL 每行格式:
32+
```json
33+
{"prompt": "视频开头展示了...", "first_frame_path": "image_1.jpg", "video_path": "video_1.mp4"}
34+
```
35+
36+
### 首尾帧(kf2v)数据集
37+
38+
```
39+
kf2v-dataset.zip
40+
├── data.jsonl
41+
├── image/
42+
│ ├── image_1_first.jpg
43+
│ └── image_1_last.jpg
44+
└── video/
45+
└── video_1.mp4
46+
```
47+
48+
JSONL 每行格式:
49+
```json
50+
{"prompt": "视频开头展示了...", "first_frame_path": "image/image_1_first.jpg", "last_frame_path": "image/image_1_last.jpg", "video_path": "video/video_1.mp4"}
51+
```
52+
53+
### 验证集(可选)
54+
55+
验证集只需首帧图像(kf2v 需首帧+尾帧),**无需视频**。训练时系统会在每个 eval 节点自动生成预览视频。
56+
57+
```json
58+
{"prompt": "视频开头展示了...", "first_frame_path": "image_1.jpg"}
59+
```
60+
61+
### 数据要求
62+
63+
- 图像格式:BMP、JPEG、PNG、WEBP,分辨率 ≤ 4096×4096
64+
- 视频格式:MP4、MOV,分辨率 ≤ 4096×4096
65+
- 视频时长:wan2.2 建议 2~5 秒;wan2.5/2.7 建议 2~10 秒
66+
- 文件名**仅支持英文字符**(ASCII)
67+
- 建议至少 **10 条**数据(20~100 条推荐)
68+
- ZIP 包 ≤ 1GB
69+
- 数据集 schema 为 `video`(CLI 自动探测 `first_frame_path`/`video_path` 字段识别)
70+
71+
### 校验
72+
73+
```bash
74+
bl dataset validate --file <zip-path> --schema video
75+
```
76+
77+
## 创建训练任务
78+
79+
```bash
80+
bl finetune video create \
81+
--base-model wan2.7-i2v \
82+
--datasets <zip-path-or-file-id> \
83+
--output json
84+
```
85+
86+
### 超参默认值(按模型自动适配)
87+
88+
| 参数 | wan2.7 | wan2.5 | wan2.2 |
89+
|---|---|---|---|
90+
| `batch_size` | 1 | 4 | 4 |
91+
| `max_pixels` | 102400 | 36864 | 262144 |
92+
| `n_epochs` | 50 | 50 | 50 |
93+
| `learning_rate` | 2e-5 | 2e-5 | 2e-5 |
94+
| `eval_epochs` | 20 | 20 | 20 |
95+
| `lora_rank` | 32 | 32 | 32 |
96+
| `lora_alpha` | 32 | 32 | 32 |
97+
| `split` | 0.5 | 0.5 | 0.5 |
98+
99+
用户可通过 `--n-epochs`、`--batch-size`、`--learning-rate` 覆盖默认值。
100+
101+
### 小数据集注意
102+
103+
数据集较小时(< 10 条),默认 `split=0.5` 可能导致验证集 ≤ batch_size 报错。解决:
104+
- 使用 `--batch-size 1` 降低 batch_size
105+
- 或单独上传验证集 `--validations <file-id>`
106+
107+
## 等待训练完成
108+
109+
```bash
110+
bl finetune watch --job-id <job_id> --follow
111+
```
112+
113+
视频训练通常需要**数小时**。训练完成后输出 `finetuned_output`(如 `wan2.7-i2v-ft-202608061949-48ca`),这是部署用的模型名。
114+
115+
## 部署
116+
117+
```bash
118+
bl deploy image create \
119+
--model-name <finetuned_output> \
120+
--display-name my-video-lora \
121+
--plan lora \
122+
--output json
123+
```
124+
125+
视频 LoRA 部署使用 `plan=lora`(按 token 计费)。部署约 5~10 分钟进入 RUNNING。
126+
127+
```bash
128+
bl deploy get --deployed-model <deployed_model>
129+
```
130+
131+
## 推理与调用
132+
133+
部署 RUNNING 后,用 `bl video generate` 调用:
134+
135+
### 首帧(i2v)— 所有版本
136+
137+
```bash
138+
bl video generate \
139+
--model <deployed_model> \
140+
--image https://example.com/first_frame.png \
141+
--prompt "描述文本" \
142+
--prompt-extend false
143+
```
144+
145+
### 首尾帧(kf2v)— wan2.2-kf2v
146+
147+
```bash
148+
bl video generate \
149+
--model <deployed_model> \
150+
--image https://example.com/first_frame.png \
151+
--last-frame https://example.com/last_frame.png \
152+
--prompt "描述文本" \
153+
--prompt-extend false
154+
```
155+
156+
`--last-frame` 触发 kf2v 模式,自动切换到 `image2video/video-synthesis` 端点。
157+
158+
### 关键参数
159+
160+
| 参数 | 说明 |
161+
|---|---|
162+
| `--prompt-extend false` | LoRA 模型建议关闭 prompt 改写 |
163+
| `--resolution 720P` | 输出分辨率(480P / 720P,wan2.7 支持 1080P) |
164+
| `--download <path>` | 下载视频到本地 |
165+
| `--async` | 仅返回 task_id,不等待 |
166+
167+
## Prompt 编写建议
168+
169+
视频微调的 prompt 结构:`[主体描述] + [背景描述] + [触发词] + [运动描述]`
170+
171+
- **触发词**:无意义稀有词(如 `s86b5p`),作为特效的"视觉锚点"
172+
- **一致性**:所有包含同一特效的样本,运动描述部分保持一致
173+
- **多样性**:主体和场景越丰富越好,避免模型过拟合到单一背景
174+
175+
## 计费
176+
177+
- **训练**:按 token 计费,`bl finetune get --job-id <id>` 查看 `usage_tokens` 和 `training_cost`
178+
- **部署**:plan=lora 免费(闲置不计费)
179+
- **推理调用**:按基础模型标准价格计费

0 commit comments

Comments
 (0)