Buckets:
| import"../chunks/DsnmJJEf.js";import{i as V,h as B,C,H as s,a,E as Q,s as F}from"../chunks/DdZvggmf.js";import{p as R,o as Z,s as l,f as k,a as u,b as f,c as j,n as E}from"../chunks/BbekZcyp.js";const G='{"title":"AnyFlow","local":"anyflow","sections":[{"title":"Bidirectional 还是 Causal —— 怎么选 pipeline","local":"bidirectional-还是-causal--怎么选-pipeline","sections":[],"depth":2},{"title":"加载 checkpoint","local":"加载-checkpoint","sections":[],"depth":2},{"title":"Any-step 采样","local":"any-step-采样","sections":[],"depth":2},{"title":"图生视频 与 视频续写","local":"图生视频-与-视频续写","sections":[],"depth":2},{"title":"LoRA 微调","local":"lora-微调","sections":[],"depth":2},{"title":"常见坑","local":"常见坑","sections":[],"depth":2},{"title":"引用","local":"引用","sections":[],"depth":2}],"depth":1}';var N=j('<meta name="hf:doc:metadata"/>'),A=j(`<p></p> <!> <!> <p><a href="https://huggingface.co/papers/2605.13724" rel="nofollow">AnyFlow</a> 是一个视频扩散<strong>蒸馏</strong>框架,把预训练的 Wan2.1 教师 | |
| 模型蒸馏成在标准 Euler 采样下支持<em>任意步数 (any-step)</em> 的学生模型。同一个蒸馏出来的 checkpoint 可以 | |
| 在 1、2、4、8、16… NFE 下推理,<strong>质量随步数单调提升</strong> —— 这一点和 consistency models 不同,后者 | |
| NFE 增加反而经常掉点。</p> <p>核心思路是学习 <strong>flow map</strong> $\\Phi_{r\\leftarrow t}: \\mathbf{z}_t \\to \\mathbf{z}_r$(任意 $1 \\ge t \\ge r \\ge 0$), | |
| 而不是 consistency models 学的固定端点映射 $\\mathbf{z}_t \\to \\mathbf{z}_0$。Flow map 的可组合性消除了 | |
| 采样步之间的 re-noising;on-policy 蒸馏阶段额外用 <strong>DMD 反向散度监督</strong> + <strong>Flow-Map backward simulation</strong> (3 段 shortcut)补上 consistency 蒸馏遗留的 exposure-bias 缺口。</p> <p>AnyFlow 由 NVIDIA、新加坡国立大学(NUS)和 MIT 合作完成,作者为 Yuchao Gu、Guian Fang、Yuxin Jiang、Weijia Mao、Song Han、Han Cai、Mike Zheng Shou。原始训练代码在 <a href="https://github.com/NVlabs/AnyFlow" rel="nofollow"><code>NVlabs/AnyFlow</code></a>,项目主页是 <a href="https://nvlabs.github.io/AnyFlow" rel="nofollow">nvlabs.github.io/AnyFlow</a>,4 个发布 checkpoint 归在 <a href="https://huggingface.co/collections/nvidia/anyflow" rel="nofollow"><code>nvidia/anyflow</code></a> Hugging Face collection 里。</p> <p>本文档梳理实战要点:怎么选 pipeline、怎么用 any-step 采样、怎么把 AnyFlow 嵌进 T2V / I2V / V2V 工作流。</p> <!> <p>AnyFlow 提供两个 pipeline 形态,scheduler 和蒸馏方法相同,区别在于<strong>怎么对帧采样</strong>:</p> <ul><li><a href="../api/pipelines/anyflow#anyflowpipeline"><code>AnyFlowPipeline</code></a> —— <strong>bidirectional</strong> T2V。一次性对整个 | |
| 视频张量去噪,全局自注意力。<strong>纯 prompt 输入、不要流式输出</strong>时选这个。</li> <li><a href="../api/pipelines/anyflow#anyflowfarpipeline"><code>AnyFlowFARPipeline</code></a> —— <strong>causal (FAR)</strong>。 | |
| 按 chunk 分段去噪,块稀疏因果注意力 + 跨 chunk 复用 KV cache。<strong>图生视频 (I2V)</strong>、<strong>视频续写 (V2V)</strong>、 | |
| 或任何受益于逐帧自回归采样的场景选这个。同一个模型通过 <code>video</code>(像素空间)或 <code>video_latents</code> (已编码 latent)这两个互斥 kwarg 来切换三种任务模式。</li></ul> <p>简化对照表:</p> <table><thead><tr><th>场景</th><th>Pipeline</th><th>调用方式</th></tr></thead><tbody><tr><td>纯文生视频,固定 NFE 求最大质量</td><td><code>AnyFlowPipeline</code></td><td><code>pipe(prompt, ...)</code></td></tr><tr><td>图生视频(首帧给定)</td><td><code>AnyFlowFARPipeline</code></td><td><code>pipe(prompt, video=<单帧 tensor>, ...)</code></td></tr><tr><td>视频续写 / V2V</td><td><code>AnyFlowFARPipeline</code></td><td><code>pipe(prompt, video=<多帧 tensor>, ...)</code></td></tr><tr><td>流式 / 渐进式生成</td><td><code>AnyFlowFARPipeline</code></td><td>—</td></tr></tbody></table> <p>高分辨率下 bidirectional 单 token 更快;causal 牺牲一点单步速度,换来在所有 latent 帧分配前就能开始 | |
| 采样的能力,对超长序列尤其有用。</p> <!> <p>NVIDIA 发布了 4 个 AnyFlow checkpoint,pipeline × 规模各一份:</p> <!> <p>四个 checkpoint 共用同一份 <a href="../api/schedulers/flow_map_euler_discrete"><code>FlowMapEulerDiscreteScheduler</code></a>, | |
| 默认 <code>shift=5.0</code>。</p> <!> <p>AnyFlow 最关键的特性是同一个 checkpoint <strong>不需重新调度</strong>,NFE 越大质量越高。固定 prompt、扫一下步数 | |
| 就能看出模型怎么在延迟和保真度之间权衡:</p> <!> <p>paper 的 Tab 3 / Fig 1 表明:每个 AnyFlow checkpoint 在 4 → 32 NFE 范围 VBench Quality 都单调上升,而 | |
| consistency 类基线(rCM、Self-Forcing)在同区间反而掉点。</p> <blockquote class="tip"><p>Classifier-free guidance (CFG) 已经在训练阶段融进权重。pipeline 推理 | |
| 时<strong>不会</strong>再跑一次 unconditional 前向 —— guidance 直接由蒸馏后的权重带出。release 出来的 checkpoint | |
| 都用默认的 <code>guidance_scale=1.0</code> 即可。</p></blockquote> <!> <p>Causal pipeline 用同一个蒸馏模型支持三种任务模式,<strong>通过 <code>video</code> / <code>video_latents</code> 二选一来选</strong>:</p> <ul><li><code>video</code> —— 像素空间张量,形状 <code>(B, T, C, H, W)</code> ∈ <code>[0, 1]</code>,pipeline 内部会过一遍 <code>VideoProcessor</code> <ul><li>VAE 编码;</li></ul></li> <li><code>video_latents</code> —— 已经在模型布局下的 latent,跳过 VAE 编码;</li> <li>两者都不传 —— 纯文生视频;</li> <li>两者同时传 —— 抛 <code>ValueError</code>(互斥)。</li></ul> <p>Context tensor 的帧数必须满足 <code>T = 4n + 1</code>,跟 VAE 时间步长对齐。</p> <blockquote class="important"><p>FAR pipeline 是分块 (chunk) rollout,<code>num_frames</code> 必须配合 chunk 调度。发布的 checkpoint 在 | |
| transformer config 里写入 <code>chunk_partition=[1, 3, 3, 3, 3, 3, 3, 2]</code>(求和 21),对应标准 <code>num_frames=81</code>(21 = (81 − 1) // 4 + 1)。改 <code>num_frames</code> 时<strong>必须</strong>显式传匹配的 <code>chunk_partition</code>, | |
| 使其求和等于 <code>(num_frames - 1) // 4 + 1</code>,否则 pipeline 会抛 <code>ValueError</code>。比如 <code>num_frames=33</code> 对应 | |
| 9 个 latent 帧,可用 <code>chunk_partition=[1, 4, 4]</code>。</p></blockquote> <!> <p>底层 patchify chunk 调度根据 <code>video</code> / <code>video_latents</code> 是否给定自动调整:纯文生用 kernel 2 (full) 和 | |
| 4 (compressed);有 context 时第一个 chunk 改成 kernel 1,让条件帧保留全分辨率。</p> <p>如果你已经有 VAE 编码过的 latent,可以直接传 <code>video_latents=<tensor></code> 跳过 <code>vae_encode</code> 步骤 | |
| (和 <code>video</code> 互斥)。</p> <!> <p>两个 pipeline 都复用 <a href="../api/loaders/lora"><code>WanLoraLoaderMixin</code></a>,因此为对应 Wan2.1 backbone 训练的 | |
| LoRA adapter 直接加载即可:</p> <!> <p>如果要做<strong>继续 on-policy 蒸馏微调</strong>(用论文里相同的 DMD 反向散度监督配方训新 LoRA),请参考原始 | |
| AnyFlow 训练框架 <a href="https://github.com/NVlabs/AnyFlow" rel="nofollow"><code>NVlabs/AnyFlow</code></a>,这套训练流程不在 | |
| diffusers 范围内。</p> <!> <ul><li><strong>永远 <code>guidance_scale=1.0</code>。</strong> 蒸馏后的 checkpoint 已经把 CFG 融进权重。设 <code>> 1</code> 会多跑一遍 | |
| unconditional 前向、延迟翻倍、质量微降。</li> <li><strong>Bidirectional pipeline 不支持流式。</strong> 所有 <code>num_frames</code> 一起去噪。需要边采边播请用 causal pipeline。</li> <li><strong>Causal pipeline KV cache 假设 chunk 调度跨调用一致。</strong> 中途重建 cache 不被 release 模型支持。</li> <li><strong><code>num_frames</code> 必须满足 VAE 时间步长。</strong> release checkpoint 用 <code>(N - 1) % 4 == 0</code> 的值(如 9、17、33、81)。</li></ul> <!> <!> <!> <p></p>`,1);function S(I,g){R(g,!1),Z(()=>{new URLSearchParams(window.location.search).get("fw")}),V();var n=A();B("co8kiy",m=>{var w=N();F(w,"content",G),u(m,w)});var e=l(k(n),2);C(e,{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"});var o=l(e,2);s(o,{title:"AnyFlow",local:"anyflow",headingTag:"h1"});var p=l(o,10);s(p,{title:"Bidirectional 还是 Causal —— 怎么选 pipeline",local:"bidirectional-还是-causal--怎么选-pipeline",headingTag:"h2"});var t=l(p,12);s(t,{title:"加载 checkpoint",local:"加载-checkpoint",headingTag:"h2"});var J=l(t,4);a(J,{code:"aW1wb3J0JTIwdG9yY2glMEFmcm9tJTIwZGlmZnVzZXJzJTIwaW1wb3J0JTIwQW55Rmxvd1BpcGVsaW5lJTJDJTIwQW55Rmxvd0ZBUlBpcGVsaW5lJTBBJTBBJTIzJTIwQmlkaXJlY3Rpb25hbCUyQyUyMCVFOCVCRCVCQiVFOSU4NyU4RiUwQXBpcGUlMjAlM0QlMjBBbnlGbG93UGlwZWxpbmUuZnJvbV9wcmV0cmFpbmVkKCUwQSUyMCUyMCUyMCUyMCUyMm52aWRpYSUyRkFueUZsb3ctV2FuMi4xLVQyVi0xLjNCLURpZmZ1c2VycyUyMiUyQyUyMGR0eXBlJTNEdG9yY2guYmZsb2F0MTYlMEEpLnRvKCUyMmN1ZGElMjIpJTBBJTBBJTIzJTIwQmlkaXJlY3Rpb25hbCUyQyUyMCVFNiVCQiVBMSVFOCVBMSU4MCUwQXBpcGUlMjAlM0QlMjBBbnlGbG93UGlwZWxpbmUuZnJvbV9wcmV0cmFpbmVkKCUwQSUyMCUyMCUyMCUyMCUyMm52aWRpYSUyRkFueUZsb3ctV2FuMi4xLVQyVi0xNEItRGlmZnVzZXJzJTIyJTJDJTIwZHR5cGUlM0R0b3JjaC5iZmxvYXQxNiUwQSkudG8oJTIyY3VkYSUyMiklMEElMEElMjMlMjBDYXVzYWwlMjAoRkFSKSUyQyUyMDEuM0IlMEFwaXBlJTIwJTNEJTIwQW55Rmxvd0ZBUlBpcGVsaW5lLmZyb21fcHJldHJhaW5lZCglMEElMjAlMjAlMjAlMjAlMjJudmlkaWElMkZBbnlGbG93LUZBUi1XYW4yLjEtMS4zQi1EaWZmdXNlcnMlMjIlMkMlMjBkdHlwZSUzRHRvcmNoLmJmbG9hdDE2JTBBKS50byglMjJjdWRhJTIyKSUwQSUwQSUyMyUyMENhdXNhbCUyMChGQVIpJTJDJTIwMTRCJTBBcGlwZSUyMCUzRCUyMEFueUZsb3dGQVJQaXBlbGluZS5mcm9tX3ByZXRyYWluZWQoJTBBJTIwJTIwJTIwJTIwJTIybnZpZGlhJTJGQW55Rmxvdy1GQVItV2FuMi4xLTE0Qi1EaWZmdXNlcnMlMjIlMkMlMjBkdHlwZSUzRHRvcmNoLmJmbG9hdDE2JTBBKS50byglMjJjdWRhJTIyKQ==",highlighted:`<span class="hljs-keyword">import</span> torch | |
| <span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> AnyFlowPipeline, AnyFlowFARPipeline | |
| <span class="hljs-comment"># Bidirectional, 轻量</span> | |
| pipe = AnyFlowPipeline.from_pretrained( | |
| <span class="hljs-string">"nvidia/AnyFlow-Wan2.1-T2V-1.3B-Diffusers"</span>, dtype=torch.bfloat16 | |
| ).to(<span class="hljs-string">"cuda"</span>) | |
| <span class="hljs-comment"># Bidirectional, 满血</span> | |
| pipe = AnyFlowPipeline.from_pretrained( | |
| <span class="hljs-string">"nvidia/AnyFlow-Wan2.1-T2V-14B-Diffusers"</span>, dtype=torch.bfloat16 | |
| ).to(<span class="hljs-string">"cuda"</span>) | |
| <span class="hljs-comment"># Causal (FAR), 1.3B</span> | |
| pipe = AnyFlowFARPipeline.from_pretrained( | |
| <span class="hljs-string">"nvidia/AnyFlow-FAR-Wan2.1-1.3B-Diffusers"</span>, dtype=torch.bfloat16 | |
| ).to(<span class="hljs-string">"cuda"</span>) | |
| <span class="hljs-comment"># Causal (FAR), 14B</span> | |
| pipe = AnyFlowFARPipeline.from_pretrained( | |
| <span class="hljs-string">"nvidia/AnyFlow-FAR-Wan2.1-14B-Diffusers"</span>, dtype=torch.bfloat16 | |
| ).to(<span class="hljs-string">"cuda"</span>)`,lang:"py",wrap:!1});var c=l(J,4);s(c,{title:"Any-step 采样",local:"any-step-采样",headingTag:"h2"});var i=l(c,4);a(i,{code:"aW1wb3J0JTIwdG9yY2glMEFmcm9tJTIwZGlmZnVzZXJzJTIwaW1wb3J0JTIwQW55Rmxvd1BpcGVsaW5lJTBBZnJvbSUyMGRpZmZ1c2Vycy51dGlscyUyMGltcG9ydCUyMGV4cG9ydF90b192aWRlbyUwQSUwQXBpcGUlMjAlM0QlMjBBbnlGbG93UGlwZWxpbmUuZnJvbV9wcmV0cmFpbmVkKCUwQSUyMCUyMCUyMCUyMCUyMm52aWRpYSUyRkFueUZsb3ctV2FuMi4xLVQyVi0xLjNCLURpZmZ1c2VycyUyMiUyQyUyMGR0eXBlJTNEdG9yY2guYmZsb2F0MTYlMEEpLnRvKCUyMmN1ZGElMjIpJTBBJTBBcHJvbXB0JTIwJTNEJTIwJTIyJUU2JUEzJUFFJUU2JTlFJTk3JUU5JTg3JThDJUU0JUI4JTgwJUU1JThGJUFBJUU1JUIwJThGJUU3JTg2JThBJUU3JThDJUFCJUU1JTlDJUE4JUU1JTk1JTgzJUU3JUFCJUI5JUU1JUFEJTkwJUVGJUJDJThDJUU3JTk0JUI1JUU1JUJEJUIxJUU2JTg0JTlGJUU1JTg1JTg5JUU3JTg1JUE3JTIyJTBBJTBBZm9yJTIwbmZlJTIwaW4lMjAlNUIxJTJDJTIwMiUyQyUyMDQlMkMlMjA4JTJDJTIwMTYlMkMlMjAzMiU1RCUzQSUwQSUyMCUyMCUyMCUyMCUyMyUyMCVFNiVBRiU4RiVFOCVCRCVBRSVFOSU4NyU4RCVFNSVCQiVCQSUyMGdlbmVyYXRvciUyMCVFMiU4MCU5NCVFMiU4MCU5NCUyMCVFOCVCRiU5OSVFNiVBMCVCNyVFOCVCNyVBOCVFNiVBRCVBNSVFNiU5NSVCMCVFNSVBRiVCOSVFNiVBRiU5NCVFNiU5NyVCNiVFNSU5NCVBRiVFNCVCOCU4MCVFNSU4RiU5OCVFOSU4NyU4RiVFNiU5OCVBRiUyME5GRSVFMyU4MCU4MiUwQSUyMCUyMCUyMCUyMGdlbmVyYXRvciUyMCUzRCUyMHRvcmNoLkdlbmVyYXRvciglMjJjdWRhJTIyKS5tYW51YWxfc2VlZCgwKSUwQSUyMCUyMCUyMCUyMHZpZGVvJTIwJTNEJTIwcGlwZShwcm9tcHQlMkMlMjBudW1faW5mZXJlbmNlX3N0ZXBzJTNEbmZlJTJDJTIwbnVtX2ZyYW1lcyUzRDgxJTJDJTIwZ2VuZXJhdG9yJTNEZ2VuZXJhdG9yKS5mcmFtZXMlNUIwJTVEJTBBJTIwJTIwJTIwJTIwZXhwb3J0X3RvX3ZpZGVvKHZpZGVvJTJDJTIwZiUyMm91dF9uZmUlN0JuZmUlN0QubXA0JTIyJTJDJTIwZnBzJTNEMTYp",highlighted:`<span class="hljs-keyword">import</span> torch | |
| <span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> AnyFlowPipeline | |
| <span class="hljs-keyword">from</span> diffusers.utils <span class="hljs-keyword">import</span> export_to_video | |
| pipe = AnyFlowPipeline.from_pretrained( | |
| <span class="hljs-string">"nvidia/AnyFlow-Wan2.1-T2V-1.3B-Diffusers"</span>, dtype=torch.bfloat16 | |
| ).to(<span class="hljs-string">"cuda"</span>) | |
| prompt = <span class="hljs-string">"森林里一只小熊猫在啃竹子,电影感光照"</span> | |
| <span class="hljs-keyword">for</span> nfe <span class="hljs-keyword">in</span> [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">4</span>, <span class="hljs-number">8</span>, <span class="hljs-number">16</span>, <span class="hljs-number">32</span>]: | |
| <span class="hljs-comment"># 每轮重建 generator —— 这样跨步数对比时唯一变量是 NFE。</span> | |
| generator = torch.Generator(<span class="hljs-string">"cuda"</span>).manual_seed(<span class="hljs-number">0</span>) | |
| video = pipe(prompt, num_inference_steps=nfe, num_frames=<span class="hljs-number">81</span>, generator=generator).frames[<span class="hljs-number">0</span>] | |
| export_to_video(video, <span class="hljs-string">f"out_nfe<span class="hljs-subst">{nfe}</span>.mp4"</span>, fps=<span class="hljs-number">16</span>)`,lang:"py",wrap:!1});var U=l(i,6);s(U,{title:"图生视频 与 视频续写",local:"图生视频-与-视频续写",headingTag:"h2"});var M=l(U,10);a(M,{code:"aW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBaW1wb3J0JTIwdG9yY2glMEFmcm9tJTIwZGlmZnVzZXJzJTIwaW1wb3J0JTIwQW55Rmxvd0ZBUlBpcGVsaW5lJTBBZnJvbSUyMGRpZmZ1c2Vycy51dGlscyUyMGltcG9ydCUyMGV4cG9ydF90b192aWRlbyUyQyUyMGxvYWRfaW1hZ2UlMkMlMjBsb2FkX3ZpZGVvJTBBJTBBcGlwZSUyMCUzRCUyMEFueUZsb3dGQVJQaXBlbGluZS5mcm9tX3ByZXRyYWluZWQoJTBBJTIwJTIwJTIwJTIwJTIybnZpZGlhJTJGQW55Rmxvdy1GQVItV2FuMi4xLTEuM0ItRGlmZnVzZXJzJTIyJTJDJTIwZHR5cGUlM0R0b3JjaC5iZmxvYXQxNiUwQSkudG8oJTIyY3VkYSUyMiklMEElMEElMEFkZWYlMjB0b192aWRlb190ZW5zb3IoaW1hZ2VzJTJDJTIwaGVpZ2h0JTNENDgwJTJDJTIwd2lkdGglM0Q4MzIpJTNBJTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyJUU2JThBJThBJTIwUElMJTIwJUU1JTg4JTk3JUU4JUExJUE4JUU4JUJEJUFDJUU2JTg4JTkwJTIwRkFSJTIwcGlwZWxpbmUlMjAlRTklOUMlODAlRTglQTYlODElRTclOUElODQlMjAoQiUyQyUyMFQlMkMlMjBDJTJDJTIwSCUyQyUyMFcpJTIwJTVCMCUyQyUyMDElNUQlMjAlRTUlQkMlQTAlRTklODclOEYlRTMlODAlODIlMjIlMjIlMjIlMEElMjAlMjAlMjAlMjBmcmFtZXMlMjAlM0QlMjBucC5zdGFjayglNUJucC5hc2FycmF5KGltZy5yZXNpemUoKHdpZHRoJTJDJTIwaGVpZ2h0KSkpJTIwZm9yJTIwaW1nJTIwaW4lMjBpbWFnZXMlNUQpLmFzdHlwZSglMjJmbG9hdDMyJTIyKSUyMCUyRiUyMDI1NS4wJTBBJTIwJTIwJTIwJTIwJTIzJTIwZnJhbWVzJTNBJTIwKFQlMkMlMjBIJTJDJTIwVyUyQyUyMEMpJTIwJUUyJTg2JTkyJTIwKFQlMkMlMjBDJTJDJTIwSCUyQyUyMFcpJTIwJUUyJTg2JTkyJTIwJUU1JThBJUEwJTIwYmF0Y2glMjAlRTclQkIlQjQlMjAlRTIlODYlOTIlMjAoMSUyQyUyMFQlMkMlMjBDJTJDJTIwSCUyQyUyMFcpJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwdG9yY2guZnJvbV9udW1weShmcmFtZXMpLnBlcm11dGUoMCUyQyUyMDMlMkMlMjAxJTJDJTIwMikudW5zcXVlZXplKDApJTBBJTBBJTBBJTIzJTIwMSklMjAlRTYlOTYlODclRTclOTQlOUYlRTglQTclODYlRTklQTIlOTElRUYlQkMlODglRTYlOTclQTAlMjBjb250ZXh0JUVGJUJDJTg5JUUzJTgwJTgyODElMjAlRTUlQjglQTclRTUlOEMlQjklRTklODUlOEQlRTklQkIlOTglRTglQUUlQTQlMjBjaHVua19wYXJ0aXRpb24lRTMlODAlODIlMEF2aWRlbyUyMCUzRCUyMHBpcGUocHJvbXB0JTNEJTIyJUU0JUI4JTgwJUU1JThGJUFBJUU3JThDJUFCJUU1JTlDJUE4JUU1JUE0JTk1JUU5JTk4JUIzJUU0JUI4JThCJUU1JTg2JUIyJUU2JUI1JUFBJTIyJTJDJTIwbnVtX2luZmVyZW5jZV9zdGVwcyUzRDQlMkMlMjBudW1fZnJhbWVzJTNEODEpLmZyYW1lcyU1QjAlNUQlMEFleHBvcnRfdG9fdmlkZW8odmlkZW8lMkMlMjAlMjJ0MnYubXA0JTIyJTJDJTIwZnBzJTNEMTYpJTBBJTBBJTIzJTIwMiklMjAlRTUlOUIlQkUlRTclOTQlOUYlRTglQTclODYlRTklQTIlOTElMjAlRTIlODAlOTQlRTIlODAlOTQlMjAlRTUlOEQlOTUlRTUlQjglQTclMjBjb250ZXh0JTIwJUU3JUJCJThGJUU4JUJGJTg3JTIwVkFFJTIwJUU2JTk4JUFGJTIwMSUyMCVFNCVCOCVBQSUyMGxhdGVudCVFRiVCQyU4QyVFNiVBRCVBMyVFNSVBNSVCRCVFNSVBRiVCOSVFNCVCOCU4QSVFOSVCQiU5OCVFOCVBRSVBNCUyMGNodW5rX3BhcnRpdGlvbiUyMCVFNyU5QSU4NCVFNyVBQyVBQyVFNCVCOCU4MCVFOSVBMSVCOSUyMCglNjAlNUIxJTJDJTIwLi4uJTVEJTYwKSVFMyU4MCU4MiUwQWZpcnN0X2ZyYW1lJTIwJTNEJTIwbG9hZF9pbWFnZSglMjJwYXRoJTJGdG8lMkZmaXJzdF9mcmFtZS5wbmclMjIpJTBBY29udGV4dF90ZW5zb3IlMjAlM0QlMjB0b192aWRlb190ZW5zb3IoJTVCZmlyc3RfZnJhbWUlNUQpLnRvKCUyMmN1ZGElMjIpJTIwJTIwJTIzJTIwKDElMkMlMjAxJTJDJTIwMyUyQyUyMDQ4MCUyQyUyMDgzMiklMkMlMjAlNUIwJTJDJTIwMSU1RCUwQXZpZGVvJTIwJTNEJTIwcGlwZSglMEElMjAlMjAlMjAlMjBwcm9tcHQlM0QlMjIlRTQlQjglODAlRTUlOEYlQUElRTclOEMlQUIlRTglQjUlQjAlRTglQkYlODclRTklOTglQjMlRTUlODUlODklRTQlQjglOEIlRTclOUElODQlRTglOEQlODklRTUlOUQlQUElMjIlMkMlMEElMjAlMjAlMjAlMjB2aWRlbyUzRGNvbnRleHRfdGVuc29yJTJDJTBBJTIwJTIwJTIwJTIwbnVtX2luZmVyZW5jZV9zdGVwcyUzRDQlMkMlMEElMjAlMjAlMjAlMjBudW1fZnJhbWVzJTNEODElMkMlMEEpLmZyYW1lcyU1QjAlNUQlMEFleHBvcnRfdG9fdmlkZW8odmlkZW8lMkMlMjAlMjJpMnYubXA0JTIyJTJDJTIwZnBzJTNEMTYpJTBBJTBBJTIzJTIwMyklMjAlRTglQTclODYlRTklQTIlOTElRTclQkIlQUQlRTUlODYlOTklRTMlODAlODI5JTIwJUU1JUI4JUE3JTIwcmF3JTIwY29udGV4dCUyMCVFMiU4NiU5MiUyMDMlMjAlRTQlQjglQUElMjBsYXRlbnQlMjBjb250ZXh0JUVGJUJDJTlCJUU2JTk4JUJFJUU1JUJDJThGJUU4JUE2JTg2JUU3JTlCJTk2JTIwY2h1bmtfcGFydGl0aW9uJUVGJUJDJThDJUU4JUFFJUE5JUU3JUFDJUFDJUU0JUI4JTgwJUU1JTlEJTk3JUU2JUFEJUEzJUU1JUE1JUJEJUU4JUE2JTg2JUU3JTlCJTk2JTIwY29udGV4dCVFMyU4MCU4MiUwQWNvbnRleHRfZnJhbWVzJTIwJTNEJTIwbG9hZF92aWRlbyglMjJwYXRoJTJGdG8lMkZjb250ZXh0Lm1wNCUyMiklNUIlM0E5JTVEJTIwJTIwJTIzJTIwOSUyMCUzRCUyMDQlQzIlQjcyJTIwJTJCJTIwMSUwQWNvbnRleHRfdGVuc29yJTIwJTNEJTIwdG9fdmlkZW9fdGVuc29yKGNvbnRleHRfZnJhbWVzKS50byglMjJjdWRhJTIyKSUyMCUyMCUyMyUyMCgxJTJDJTIwOSUyQyUyMDMlMkMlMjA0ODAlMkMlMjA4MzIpJTBBdmlkZW8lMjAlM0QlMjBwaXBlKCUwQSUyMCUyMCUyMCUyMHByb21wdCUzRCUyMiVFNyVCQiVBNyVFNyVCQiVBRCVFOCVCRiU5OSVFNCVCOCVBQSVFNiU5NSU4NSVFNCVCQSU4QiUyMiUyQyUwQSUyMCUyMCUyMCUyMHZpZGVvJTNEY29udGV4dF90ZW5zb3IlMkMlMEElMjAlMjAlMjAlMjBudW1faW5mZXJlbmNlX3N0ZXBzJTNENCUyQyUwQSUyMCUyMCUyMCUyMG51bV9mcmFtZXMlM0Q4MSUyQyUwQSUyMCUyMCUyMCUyMGNodW5rX3BhcnRpdGlvbiUzRCU1QjMlMkMlMjAzJTJDJTIwMyUyQyUyMDMlMkMlMjAzJTJDJTIwMyUyQyUyMDMlNUQlMkMlMjAlMjAlMjMlMjA3JTIwJUU0JUI4JUFBJTIwY2h1bmslMjAlQzMlOTclMjAzJTIwJTNEJTIwMjElMjBsYXRlbnQlRUYlQkMlOUIlRTklQTYlOTYlRTUlOUQlOTclRTUlQjAlQjElRTYlOTglQUYlMjBjb250ZXh0JTBBKS5mcmFtZXMlNUIwJTVEJTBBZXhwb3J0X3RvX3ZpZGVvKHZpZGVvJTJDJTIwJTIydjJ2Lm1wNCUyMiUyQyUyMGZwcyUzRDE2KQ==",highlighted:`<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| <span class="hljs-keyword">import</span> torch | |
| <span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> AnyFlowFARPipeline | |
| <span class="hljs-keyword">from</span> diffusers.utils <span class="hljs-keyword">import</span> export_to_video, load_image, load_video | |
| pipe = AnyFlowFARPipeline.from_pretrained( | |
| <span class="hljs-string">"nvidia/AnyFlow-FAR-Wan2.1-1.3B-Diffusers"</span>, dtype=torch.bfloat16 | |
| ).to(<span class="hljs-string">"cuda"</span>) | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">to_video_tensor</span>(<span class="hljs-params">images, height=<span class="hljs-number">480</span>, width=<span class="hljs-number">832</span></span>): | |
| <span class="hljs-string">"""把 PIL 列表转成 FAR pipeline 需要的 (B, T, C, H, W) [0, 1] 张量。"""</span> | |
| frames = np.stack([np.asarray(img.resize((width, height))) <span class="hljs-keyword">for</span> img <span class="hljs-keyword">in</span> images]).astype(<span class="hljs-string">"float32"</span>) / <span class="hljs-number">255.0</span> | |
| <span class="hljs-comment"># frames: (T, H, W, C) → (T, C, H, W) → 加 batch 维 → (1, T, C, H, W)</span> | |
| <span class="hljs-keyword">return</span> torch.from_numpy(frames).permute(<span class="hljs-number">0</span>, <span class="hljs-number">3</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>).unsqueeze(<span class="hljs-number">0</span>) | |
| <span class="hljs-comment"># 1) 文生视频(无 context)。81 帧匹配默认 chunk_partition。</span> | |
| video = pipe(prompt=<span class="hljs-string">"一只猫在夕阳下冲浪"</span>, num_inference_steps=<span class="hljs-number">4</span>, num_frames=<span class="hljs-number">81</span>).frames[<span class="hljs-number">0</span>] | |
| export_to_video(video, <span class="hljs-string">"t2v.mp4"</span>, fps=<span class="hljs-number">16</span>) | |
| <span class="hljs-comment"># 2) 图生视频 —— 单帧 context 经过 VAE 是 1 个 latent,正好对上默认 chunk_partition 的第一项 (\`[1, ...]\`)。</span> | |
| first_frame = load_image(<span class="hljs-string">"path/to/first_frame.png"</span>) | |
| context_tensor = to_video_tensor([first_frame]).to(<span class="hljs-string">"cuda"</span>) <span class="hljs-comment"># (1, 1, 3, 480, 832), [0, 1]</span> | |
| video = pipe( | |
| prompt=<span class="hljs-string">"一只猫走过阳光下的草坪"</span>, | |
| video=context_tensor, | |
| num_inference_steps=<span class="hljs-number">4</span>, | |
| num_frames=<span class="hljs-number">81</span>, | |
| ).frames[<span class="hljs-number">0</span>] | |
| export_to_video(video, <span class="hljs-string">"i2v.mp4"</span>, fps=<span class="hljs-number">16</span>) | |
| <span class="hljs-comment"># 3) 视频续写。9 帧 raw context → 3 个 latent context;显式覆盖 chunk_partition,让第一块正好覆盖 context。</span> | |
| context_frames = load_video(<span class="hljs-string">"path/to/context.mp4"</span>)[:<span class="hljs-number">9</span>] <span class="hljs-comment"># 9 = 4·2 + 1</span> | |
| context_tensor = to_video_tensor(context_frames).to(<span class="hljs-string">"cuda"</span>) <span class="hljs-comment"># (1, 9, 3, 480, 832)</span> | |
| video = pipe( | |
| prompt=<span class="hljs-string">"继续这个故事"</span>, | |
| video=context_tensor, | |
| num_inference_steps=<span class="hljs-number">4</span>, | |
| num_frames=<span class="hljs-number">81</span>, | |
| chunk_partition=[<span class="hljs-number">3</span>, <span class="hljs-number">3</span>, <span class="hljs-number">3</span>, <span class="hljs-number">3</span>, <span class="hljs-number">3</span>, <span class="hljs-number">3</span>, <span class="hljs-number">3</span>], <span class="hljs-comment"># 7 个 chunk × 3 = 21 latent;首块就是 context</span> | |
| ).frames[<span class="hljs-number">0</span>] | |
| export_to_video(video, <span class="hljs-string">"v2v.mp4"</span>, fps=<span class="hljs-number">16</span>)`,lang:"py",wrap:!1});var T=l(M,6);s(T,{title:"LoRA 微调",local:"lora-微调",headingTag:"h2"});var y=l(T,4);a(y,{code:"cGlwZS5sb2FkX2xvcmFfd2VpZ2h0cyglMjJwYXRoJTJGb3IlMkZyZXBvJTJGd2l0aCUyRndhbl9sb3JhJTIyKQ==",highlighted:'pipe.load_lora_weights(<span class="hljs-string">"path/or/repo/with/wan_lora"</span>)',lang:"py",wrap:!1});var r=l(y,4);s(r,{title:"常见坑",local:"常见坑",headingTag:"h2"});var d=l(r,4);s(d,{title:"引用",local:"引用",headingTag:"h2"});var h=l(d,2);a(h,{code:"JTQwbWlzYyU3Qmd1MjAyNmFueWZsb3dhbnlzdGVwdmlkZW9kaWZmdXNpb24lMkMlMEElMjAlMjB0aXRsZSUzRCU3QkFueUZsb3clM0ElMjBBbnktU3RlcCUyMFZpZGVvJTIwRGlmZnVzaW9uJTIwTW9kZWwlMjB3aXRoJTIwT24tUG9saWN5JTIwRmxvdyUyME1hcCUyMERpc3RpbGxhdGlvbiU3RCUyQyUwQSUyMCUyMGF1dGhvciUzRCU3Qll1Y2hhbyUyMEd1JTIwYW5kJTIwR3VpYW4lMjBGYW5nJTIwYW5kJTIwWXV4aW4lMjBKaWFuZyUyMGFuZCUyMFdlaWppYSUyME1hbyUyMGFuZCUyMFNvbmclMjBIYW4lMjBhbmQlMjBIYW4lMjBDYWklMjBhbmQlMjBNaWtlJTIwWmhlbmclMjBTaG91JTdEJTJDJTBBJTIwJTIweWVhciUzRCU3QjIwMjYlN0QlMkMlMEElMjAlMjBlcHJpbnQlM0QlN0IyNjA1LjEzNzI0JTdEJTJDJTBBJTIwJTIwYXJjaGl2ZVByZWZpeCUzRCU3QmFyWGl2JTdEJTJDJTBBJTIwJTIwcHJpbWFyeUNsYXNzJTNEJTdCY3MuQ1YlN0QlMkMlMEElMjAlMjB1cmwlM0QlN0JodHRwcyUzQSUyRiUyRmFyeGl2Lm9yZyUyRmFicyUyRjI2MDUuMTM3MjQlN0QlMkMlMEElN0QlMEElMEElNDBhcnRpY2xlJTdCZ3UyMDI1bG9uZyUyQyUwQSUyMCUyMHRpdGxlJTNEJTdCTG9uZy1Db250ZXh0JTIwQXV0b3JlZ3Jlc3NpdmUlMjBWaWRlbyUyME1vZGVsaW5nJTIwd2l0aCUyME5leHQtRnJhbWUlMjBQcmVkaWN0aW9uJTdEJTJDJTBBJTIwJTIwYXV0aG9yJTNEJTdCR3UlMkMlMjBZdWNoYW8lMjBhbmQlMjBNYW8lMkMlMjBXZWlqaWElMjBhbmQlMjBTaG91JTJDJTIwTWlrZSUyMFpoZW5nJTdEJTJDJTBBJTIwJTIwam91cm5hbCUzRCU3QmFyWGl2JTIwcHJlcHJpbnQlMjBhclhpdiUzQTI1MDMuMTkzMjUlN0QlMkMlMEElMjAlMjB5ZWFyJTNEJTdCMjAyNSU3RCUwQSU3RA==",highlighted:`<span class="language-xml">@misc</span><span class="hljs-template-variable">{gu2026anyflowanystepvideodiffusion, | |
| title={AnyFlow: Any-Step Video Diffusion Model with On-Policy Flow Map Distillation}</span><span class="language-xml">, | |
| author=</span><span class="hljs-template-variable">{Yuchao Gu and Guian Fang and Yuxin Jiang and Weijia Mao and Song Han and Han Cai and Mike Zheng Shou}</span><span class="language-xml">, | |
| year=</span><span class="hljs-template-variable">{2026}</span><span class="language-xml">, | |
| eprint=</span><span class="hljs-template-variable">{2605.13724}</span><span class="language-xml">, | |
| archivePrefix=</span><span class="hljs-template-variable">{arXiv}</span><span class="language-xml">, | |
| primaryClass=</span><span class="hljs-template-variable">{cs.CV}</span><span class="language-xml">, | |
| url=</span><span class="hljs-template-variable">{https://arxiv.org/abs/2605.13724}</span><span class="language-xml">, | |
| } | |
| @article</span><span class="hljs-template-variable">{gu2025long, | |
| title={Long-Context Autoregressive Video Modeling with Next-Frame Prediction}</span><span class="language-xml">, | |
| author=</span><span class="hljs-template-variable">{Gu, Yuchao and Mao, Weijia and Shou, Mike Zheng}</span><span class="language-xml">, | |
| journal=</span><span class="hljs-template-variable">{arXiv preprint arXiv:2503.19325}</span><span class="language-xml">, | |
| year=</span><span class="hljs-template-variable">{2025}</span><span class="language-xml"> | |
| }</span>`,lang:"bibtex",wrap:!1});var b=l(h,2);Q(b,{source:"https://github.com/huggingface/diffusers/blob/main/docs/source/zh/using-diffusers/anyflow.md"}),E(2),u(I,n),f()}export{S as component}; | |
Xet Storage Details
- Size:
- 26.8 kB
- Xet hash:
- d03e0877c5f980c0eb2e71ba6c50fea4eec58df2a06c89c389969febefec374e
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.