Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Prepare and launch LoRA, LoKr, or T-LoRA training through lora-scripts-next (SD-Trainer), Anima-first. Use when the user asks to train a character, style, or concept LoRA, choose parameters or repeats and epochs, start a run, or monitor training on Anima, SD1.5, SDXL, or Flux. Organize and caption the dataset, run dataset-doctor, choose a documented starting preset from image count and VRAM, show one confirmation card, then call the mikazuki API and monitor its log.
.claude/skills/rinne414-lora-trainer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 208% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 147% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 130% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 239% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 125% | 0% |
把「训练一个 LoRA」的意图,变成一次受控的训练:准备数据 → 体检 → 组装配置 → 用户确认 → 通过 trainer API 开训 → 监看 log。本 skill 默认 Anima 优先,也支持 SD1.5 / SDXL / Flux。
> 训练耗时、占显存、难回退。在 POST /api/run 之前必须把组装好的配置摊给用户、明确确认;未确认不开训。
底层 = lora-scripts-next(SD-Trainer)的 mikazuki FastAPI(http://127.0.0.1:28000,路由前缀 /api)。完整契约见 ../references/trainer-api.md。
本 skill 的开训与打标只针对 SD-Trainer 的 mikazuki API——trainer-api.md 的契约只对它成立。绝不要把这套 /api/run body 发给别的训练器(kohya_ss GUI、OneTrainer、ai-toolkit…),它们的 API 完全不同。用户在用别的训练器时,按可移植性分层处理:
dataset-doctor 与 fix_dataset.py 是训练器无关的(标准 kohya <repeats>_<concept> + sidecar caption 约定),完整可用,全程离线。anima-params.md / presets.md 的键就是 kohya sd-scripts 词汇(network_dim、unet_lr、repeats/epochs 步数预算)。可以据此给参数建议,或替用户生成一份 kohya 风格 TOML / 命令行,让他们在自己的训练器里手动跑。/api/version 连不上 ≠ 中止一切:数据整理、体检、修复全部离线可做;开训需要 trainer 在线,打标则按底模需要已配置的 sd-image-sorter 或 trainer 端点。
../references/。两条路都必须过 dataset-doctor 闸门,必须确认后才开训。
0. 连 trainer、读显卡。 GET /api/version 确认在跑(连不上 → 让用户启动 run_gui.bat,可建议在输入框输入 ! run_gui.bat 直接在会话里运行)。再 GET /api/graphic_cards 自动读显存——不要问用户显存多大。
1. 收集最少输入。 必需:图片文件夹路径、练单角色/概念还是画风。单角色再明确 1girl / 1boy / 1other;画风 trigger 必须用 @ 前缀。其余自动推:
mychar → mych4r)。写进确认卡让用户改。<concept>-anima-v1;版本号冲突就 +1。2. 自动准备数据。 每步先跑 dry-run 把计划摊给用户,确认一次后加 --apply 执行(fixer 不删文件,原件进 _quarantine/):
<repeats>_<concept> 结构 → fix_dataset.py organize --repeats <R> --concept <name>(R 见第 3 步)。../lora-pipeline/scripts/tag_dataset.py --dataset-dir <concept-dir> --trigger <T> --subject-tag <count>;画风传 --style。快速通道与完整 pipeline 必须使用同一套分段 caption、模型阈值和语义审查。其他底模才用 POST /api/interrogate。doctor.py --trigger <T> --epochs <N> 体检:FAIL/WARN 的每个 issue code 都有对应建议(见 ../dataset-doctor/SKILL.md 修复手册)。把要做的修复一次列全、统一确认,再逐条执行;重检到 PASS,或让用户明确接受剩余 WARN。3. 自动选参。 不要让用户做数学:
repeats = clamp(round(150 / 图片数), 1, 10),epochs = 10(画风 12)→ 约 1500 步仅作首轮预算。doctor 去重后重算实际步数,并通过固定 seed 快照比较决定是否早停。../references/presets.md):显存 ≥16GB → preset 1(角色)/ 2(画风);≤12GB → preset 3(LoKr + blocks_to_swap=16;8GB 改 24)。4. 确认卡(强制)。 用人话摊牌,等用户回「确认」:
📋 训练确认卡
- 练什么:角色 LoRA「zkz」 · trigger: zkz(要换就说)
- 数据:32 张图 × 5 重复 × 10 轮 = 1600 步
- 显卡:RTX 4070 12GB → 用省显存配置(LoKr)
- 输出:./output/zkz-anima-v1/,每 2 轮存一个文件
- 底模:Anima(dim32/alpha16 · bf16 · unet_lr 2e-5)
回复「确认」开训;想改哪一项直接说。5. 开训 + 监看。 同进阶流程第 5–6 步。
1. 收集输入。 train_data_dir(<repeats>_<concept> 的父目录)、trigger word、output_name、模型类型、目标(角色/画风/概念)。缺就问。
2. 闸门:先体检。 调 dataset-doctor 跑 doctor.py --trigger <TRIGGER> --epochs <N> --batch-size <B>:FAIL → 停,先修(用 fix_dataset.py 对应命令)再重检;WARN → 摊给用户确认是否继续;PASS → 继续。
3. 组装 config。 从 ../references/presets.md 选模板,填 <TRAIN_DATA_DIR> / <OUTPUT_NAME>,用 doctor 的 effective_images 估算总步数:
steps_per_epoch = ceil(effective_images / train_batch_size)
total_steps = steps_per_epoch × max_train_epochs # 角色首轮检查区间约 1000–2500偏离区间就调 repeats/epochs。Anima 官方起点是 rank 32、unet_lr=2e-5;训练器服务端默认 5e-5 不是官方推荐。其余关键项:mixed_precision=bf16、gradient_checkpointing=true、attn_mode 留空自动、Windows max_data_loader_n_workers=0。caption 一律用单行 .txt;不要发送无效的 prefer_json_caption。
4. 摊牌 + 确认(强制)。 列出关键项(模型类型、底模、train_data_dir、network_dim/alpha、unet_lr、epochs、total_steps、output_dir、显存预估),明确征得同意再开训。
5. 开训。 POST /api/run,body = 组装好的 flat config(JSON)。用 PowerShell Invoke-RestMethod(示例见 trainer-api.md)。返回 status: fail → 把 message 给用户并修正;success → 记下 data.task_id 与 data.train_log_stream_url。
6. 监看。 轮询 GET /api/train/log/tail/{task_id}?limit=240(或让用户开 data.train_log_url / 6008 监控面板)。盯:loss=nan(多见于 fp16 → 改 bf16 或换优化器)、OOM(加 gradient_checkpointing / blocks_to_swap / 降分辨率)、报错退出。
output_dir 下:按 save_every_n_epochs 会有多个 epoch 快照(<name>-000002.safetensors …)+ 最终档。validate.py 在相同 seed 下与 strength 0 baseline 比较。选择能表达目标、同时仍响应姿势/主体/背景变化的快照。模型类型(决定 model_train_type 与底模,见 trainer-api.md 映射表):默认 → Anima(anima-lora,networks.lora_anima);用户点名 SDXL / SD1.5 / Flux → sdxl-lora / sd-lora / flux-lora;全量微调 → anima-finetune / sdxl-finetune(Anima ~24GB,先提醒)。
适配器 lora_type(见 anima-params.md):默认 lora;显存紧 / 小文件强风格 → lokr;timestep-aware → tlora(network_dim=32)。
| 需要处理的事 | 读取 / 执行 | | --- | --- | | 开训前体检数据集 / caption | ../dataset-doctor/scripts/doctor.py | | 一行命令修数据集问题(dry-run → --apply) | ../dataset-doctor/scripts/fix_dataset.py | | API 端点、/api/run body、SSE、打标、显卡查询 | ../references/trainer-api.md | | 参数含义、默认值、VRAM、步数预算 | ../references/anima-params.md | | 起手配置模板(角色/画风/低显存) | ../references/presets.md | | caption 写法、trigger 取法 | ../references/caption-guide.md |
/api/run 契约发给别的训练器,而是走「适用范围」的分层处理。/api/version);显存来自 /api/graphic_cards,没问用户。dataset-doctor;FAIL 没放行,WARN 已让用户确认。fix_dataset.py 修复都先 dry-run、经用户确认才 --apply;没有手写删除/改写命令。model_train_type 与底模 / network_module 一致(Anima=networks.lora_anima,LoKr=lycoris.kohya,T-LoRA=networks.tlora_anima)。cache_text_encoder_outputs=true、shuffle_caption=false。若显式开启 shuffle,必须用足够的 keep_tokens 或 keep_tokens_separator 保留完整固定前缀,而不是假设 trigger 在首位。total_steps;~1000–2500 只作首轮检查区间,偏离时已说明依据而非硬拦截。bf16;Automagic/CAME 会被服务端强制 bf16。用户:「用 D:/data/mychar 这堆图练个角色 LoRA」(文件夹里是 30 张散图,没 caption)。
/api/version OK;/api/graphic_cards → 4070 12GB。mych4r(mychar 是常见词,做数字变体)。fix_dataset.py organize "D:/data/mychar" --repeats 5 --concept mych4r(dry-run 摊牌 → 确认 → --apply)→ tag_dataset.py --dataset-dir ... --trigger mych4r --subject-tag 1girl → 复查语义审查 → doctor.py --trigger mych4r --epochs 10 → PASS 或剩余 WARN 已接受。POST /api/run → 监看 → 报告 ./output/mych4r-anima-v1/*.safetensors,并提示先试最后一个快照。dataset-doctor(体检 doctor.py,修复 fix_dataset.py)。../references/trainer-api.md;参数 → ../references/anima-params.md;模板 → ../references/presets.md;caption → ../references/caption-guide.md。| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | fail→fail | 15,903 | 20,543 | +29% | 1 | 1 | 0% | 2,945 | 6,622 | +125% | 0 | 0 | — |
case-01 | fail→fail | 10,070 | 11,956 | +19% | 1 | 1 | 0% | 1,826 | 4,540 | +149% | 0 | 0 | — |
case-02 | fail→pass | 10,984 | 22,459 | +104% | 1 | 1 | 0% | 2,151 | 6,615 | +208% | 0 | 0 | — |
case-04 | fail→pass | 11,680 | 10,996 | -6% | 1 | 1 | 0% | 2,187 | 5,412 | +147% | 0 | 0 | — |
case-05 | fail→pass | 12,366 | 7,183 | -42% | 1 | 1 | 0% | 2,056 | 4,738 | +130% | 0 | 0 | — |
case-06 | pass→pass | 10,147 | 6,210 | -39% | 1 | 1 | 0% | 1,722 | 4,529 | +163% | 0 | 0 | — |
case-07 | fail→pass | 8,290 | 5,795 | -30% | 1 | 1 | 0% | 1,280 | 4,341 | +239% | 0 | 0 | — |
case-08 | pass→pass | 6,946 | 4,843 | -30% | 1 | 1 | 0% | 1,457 | 4,388 | +201% | 0 | 0 | — |
case-09 | fail→pass | 12,125 | 6,342 | -48% | 1 | 1 | 0% | 2,110 | 4,742 | +125% | 0 | 0 | — |
case-10 | fail→pass | 11,882 | 6,462 | -46% | 1 | 1 | 0% | 2,208 | 4,427 | +100% | 0 | 0 | — |
case-11 | fail→pass | 10,255 | 5,954 | -42% | 1 | 1 | 0% | 1,840 | 4,476 | +143% | 0 | 0 | — |
case-12 | fail→fail | 3,772 | 4,461 | +18% | 1 | 1 | 0% | 600 | 4,181 | +597% | 0 | 0 | — |
case-13 | fail→pass | 10,931 | 6,242 | -43% | 1 | 1 | 0% | 1,724 | 4,517 | +162% | 0 | 0 | — |
case-14 | fail→pass | 6,782 | 4,701 | -31% | 1 | 1 | 0% | 1,116 | 4,398 | +294% | 0 | 0 | — |
case-15 | pass→pass | 8,271 | 2,902 | -65% | 1 | 1 | 0% | 1,405 | 3,922 | +179% | 0 | 0 | — |
case-16 | fail→pass | 9,044 | 2,877 | -68% | 1 | 1 | 0% | 1,608 | 4,058 | +152% | 0 | 0 | — |
case-17 | pass→pass | 8,565 | 4,560 | -47% | 1 | 1 | 0% | 1,373 | 4,285 | +212% | 0 | 0 | — |
case-18 | pass→pass | 11,460 | 7,365 | -36% | 1 | 1 | 0% | 1,988 | 4,767 | +140% | 0 | 0 | — |
case-19 | fail→fail | 14,871 | 8,881 | -40% | 1 | 1 | 0% | 2,280 | 5,312 | +133% | 0 | 0 | — |
case-20 | pass→pass | 9,125 | 8,477 | -7% | 1 | 1 | 0% | 1,652 | 4,898 | +196% | 0 | 0 | — |
case-21 | fail→pass | 9,477 | 5,154 | -46% | 1 | 1 | 0% | 1,536 | 3,993 | +160% | 0 | 0 | — |
case-22 | pass→pass | 10,568 | 6,520 | -38% | 1 | 1 | 0% | 1,556 | 4,693 | +202% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +50 percentage points is the difference between those two pass rates over the 21 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.