vllm-omni 运行 Lance 3B 全模态离线推理:t2i / t2v / 图像视频编辑与理解实战

发布时间:2026/9/18 0:17:57
vllm-omni 运行 Lance 3B 全模态离线推理:t2i / t2v / 图像视频编辑与理解实战 vllm-omni 运行 Lance 3B 全模态离线推理t2i / t2v / 图像视频编辑与理解实战【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omniLancebytedance-research/Lance是一个 3B 规模的统一自回归autoregressive 扩散diffusion多模态模型基于 Qwen2.5-VL 骨干采用与 BAGEL 同源的 ByteDance Mixture-of-TransformersMoT架构。本指南以examples/offline_inference/lance/README.md为骨架结合仓库源码完整讲解如何在 vllm-omni 中通过单卡 16 GB 以上显存运行 Lance 的全部六类模态任务文生图、文生视频、图像编辑、视频编辑、图像理解、视频理解并深入剖析底层LancePipeline的实现细节使你不仅能跑通示例还能理解 checkpoint 布局、mRoPE 位置编码、Wan2.2 VAE 等关键原理。Lance 与 vllm-omniBAGEL 血统的三种特化Lance 的独特之处在于它是一个单模型覆盖生成与理解的统一多模态模型同一个 Qwen2-MoT 主干既能做自回归文本生成也能做扩散式图像 / 视频生成。官方发布的Lance_3Bcheckpoint 使用与 BAGEL 完全一致的*_moe_genMoT 权重布局因此 vllm-omni 的实现思路是直接复用 BAGEL 的 transformer 核心与整条前向/生成机制只特化三个地方见 pipeline_lance.pyCheckpoint 布局HF 仓库bytedance-research/Lance在一个仓库内打包了Lance_3B/图像与Lance_3B_Video/视频两个 LLM checkpoint、Qwen2.5-VL-ViT/理解 ViT与Wan2.2_VAE.pthVAE。它没有 BAGEL 风格的顶层config.json携带vae_config/vit_config/latent_patch_size这些是取自上config/config_factory.py与inference_lance.sh的常量被硬编码在LANCE_DEFAULTS中。理解 ViT采用打包的 Qwen2.5-VL 视觉塔Qwen2.5-VL-ViT/vit.safetensors取代 BAGEL 的 SigLIP。VAE采用 Wan2.2Wan2.2_VAE.pth取代 BAGEL 自带的自编码器。在 lance_transformer.py 中Lance 的 LLM 部分就是 BAGEL 的 Qwen2-MoT transformer 原样复用——Bagel/Qwen2MoTForCausalLM/Qwen2MoTConfig/NaiveCache全部直接 re-export仅新增了面向 Qwen2.5-VL packedpixel_valuesimage_grid_thw布局的LanceBagel子类、3D 潜变量位置编码LancePositionEmbedding3D与 Qwen2.5-VL 视觉包装器。六个模态任务对应上游 HF model cardt2i文生图、t2v文生视频、image_edit图像编辑、video_edit视频编辑、x2t_image图像理解、x2t_video视频理解。示例脚本还额外提供了image2video首帧图生视频路径。硬件要求单张 NVIDIA GPU16 GB 以上显存BF16 精度仓库在 B300 / A100 上验证CUDA ≥ 12.4推荐安装flash-attn原因见下文“注意力后端”小节。快速开始文生图与文生视频示例入口脚本为 end2end.py它是单阶段single-stage离线推理脚本不需要任何 deploy YAML。先看 README 中的两条核心命令# 文生图Text-to-image python examples/offline_inference/lance/end2end.py \ --model bytedance-research/Lance \ --prompts a corgi astronaut on the moon, cinematic \ --steps 30 --cfg-text-scale 4.0 --timestep-shift 3.5 \ --height 1024 --width 1024 \ --output ./out # 文生视频Text-to-video使用 Lance_3B_Video 子目录 python examples/offline_inference/lance/end2end.py \ --model bytedance-research/Lance/Lance_3B_Video --modality text2video \ --num-frames 25 --video-height 480 --video-width 768 \ --prompts a cat playing piano, cinematic \ --steps 30 --fps 8 --output ./out几点关键事实checkpoint 自动解析除video_edit必须显式指定--model bytedance-research/Lance/Lance_3B_Video以加载 3Dlatent_pos_embed表外其余路径都可以把--model指到顶层bytedance-research/Lance仓库脚本会自动解析正确的子 checkpoint。无需额外下载HF 仓库已捆绑全部组件Lance_3B/、Lance_3B_Video/、Qwen2.5-VL-ViT/、Wan2.2_VAE.pth一条命令即可开始。视频帧数上限为121--num-frames参数注释中注明 max 121对应潜变量空间的 31 帧上限详见下文源码解析。全部模态选项--modality的合法取值end2end.py 第 34-38 行modality任务必填输入输出text2img默认文生图--promptsPNGtext2video文生视频--promptsMP4image2video首帧图生视频--prompts--image-pathMP4img2img图像编辑--prompts--image-pathPNGvideo2video视频编辑--prompts--video-pathMP4img2text图像理解描述 / VQA--image-path提示词可选默认 Describe this image in detail.文本video2text视频理解--video-path文本参数详解parse_args 中定义的完整参数如下参数默认值说明--modelbytedance-research/LanceHF 仓库名或本地路径--promptsNone文本提示词nargs可传多个--txt-promptsNone提示词文件路径每行一条读取时自动去空行--modalitytext2img上述七种模态之一--image-pathNoneimg2text / img2img / image2video 的输入图像--video-pathNonevideo2text / video2video 的输入视频--num-frames25text2video 的 RGB 帧数最大 121--video-height/--video-width480 / 768视频帧分辨率--height/--widthNone1024t2i 图像分辨率--fps12保存 MP4 的帧率对齐上游 Lance 的save_fps12--output.输出目录自动创建--steps30去噪步数Lance 默认 30--cfg-text-scale4.0文本 CFG 强度Lance 默认 4.0--timestep-shift3.5Flow-match 时间步偏移Lance 默认 3.5--negative-promptNone负向提示词仅在cfg_text_scale 1.0时生效--seed42随机种子--max-text-tokens512x2t 理解路径的最大生成 token 数--do-sample/--no-sample采样开启x2t 生成是否采样--text-temperature0.8x2t 生成采样温度--system-promptNone覆盖任务系统提示词x2t 专用理解路径x2t的两个坑Lance 的贪心解码器对很多提示词会立即输出 EOS因此理解路径默认开启采样默认--text-temperature 0.8——注释明确说明低于 ~0.7 时 Lance 频繁立即 EOS0.8 是良好默认值可通过--no-sample切换回贪心解码--max-text-tokens控制理解回答的长度上限默认 512。--system-prompt的作用同样值得注意x2t_image / x2t_video 任务使用 per-example 的 QA 风格指令如 Look at the image carefully and answer the question.。如果不提供 system prompt模型会回落到 caption 风格默认提示词输出变成描述图像而非回答问题。在 prompts.py 的render_lance_prompt中system_prompt参数直接覆盖SYSTEM_PROMPTS表中的默认任务提示词。视频模态的 checkpoint 约束视频模态text2video/video2video/video2text/image2video要求Lance_3B_Video子 checkpoint。脚本会做一次智能重写end2end.py 第 231-236 行if args.modality in (text2video, video2video, video2text, image2video): if not str(resolved_model).rstrip(/).endswith(Lance_3B_Video): candidate os.path.join(resolved_model, Lance_3B_Video) if os.path.isdir(candidate): resolved_model candidate如果不这样做vllm-omni 会静默加载图像版Lance_3B的(4096, 2048)位置编码表而视频潜变量的时间维t_lat 1会立即越界崩溃。采样参数如何流入引擎end2end.py将--steps、--seed、--height、--width直接写到default_sampling_params_list[0]上把cfg_text_scale、timestep_shift等放入diffusion_params.extra_argsextra[cfg_text_scale] args.cfg_text_scale extra[timestep_shift] args.timestep_shift if args.modality in (img2text, video2text): extra[max_think_tokens] args.max_text_tokens extra[do_sample] args.do_sample extra[text_temperature] args.text_temperature if args.negative_prompt is not None: extra[negative_prompt] args.negative_prompt diffusion_params.extra_args extra在流水线侧pipeline_lance.py 的_forward_t2v/_forward_image_edit这些extra_args会与 prompt 字典里的extra_args合并并影响以下默认行为cfg_interval(0.4, 1.0)上游 Lance 默认在 t0.4 时关闭 CFGvllm-omni 保持该区间否则最后几步去噪会与上游输出产生分歧cfg_renorm_typeglobal、cfg_renorm_min0.0CFG 重归一化参数两侧默认一致cfg_img_scale1.0BAGEL 术语中的cfg_vit_scale1.0图像条件 CFG 默认关闭与上游一致负向提示词默认空字符串仅在cfg_text_scale 1.0时构建无条件 KV 缓存分支。引擎级参数单阶段 Lance 如何被拉起Lance 是单阶段扩散流水线脚本把所有引擎旋钮以扁平 kwargs 传给Omni构造器create_default_diffusion会据此物化 stage 配置这与vllm_omni/deploy/lance.yaml中的默认值完全一致omni_kwargs.setdefault(pipeline, lance) omni_kwargs.setdefault(max_num_batched_tokens, 32768) omni_kwargs.setdefault(max_num_seqs, 1) omni_kwargs.setdefault(enforce_eager, True) omni_kwargs.setdefault(trust_remote_code, True) omni_kwargs.setdefault(enable_prefix_caching, False) omni_kwargs.setdefault(async_chunk, False) omni Omni(**omni_kwargs)对照 lance.yamlpipeline: lance、async_chunk: falsestage 0 的max_num_batched_tokens: 32768、max_num_seqs: 1、enforce_eager: true、trust_remote_code: true、enable_prefix_caching: false、devices: 0、默认seed: 42。注意 YAML 注释中说明Lance 的 HFconfig.json只是描述性元数据没有model_type字段加载器无法仅凭模型目录自动检测必须显式指定pipeline: lance。在 model_executor/models/lance/pipeline.py 中LANCE_PIPELINE定义了单阶段拓扑model_typelance、default_deploy_config_namelance.yaml、model_archLancePipelinestage 0 为DIFFUSION执行类型、final_outputTrue、final_output_typeimage。同时在 registry.py 中注册了lance → pipeline_lance的映射。注意力后端提示脚本默认设置DIFFUSION_ATTENTION_BACKENDFLASH_ATTNos.environ.setdefault。原因写在第 210-214 行注释中——上游使用flash_attn_varlen_func而 SDPA 在 36 层 Qwen2 栈上会积累约 5 倍的数值漂移B300 实测。若未显式指定后端默认优先 flash-attn。源码级实现LancePipeline 的三个特化点LancePipeline(BagelPipeline)故意不调用BagelPipeline.__init__因为父类关于config.json/vit_config.json/ SigLIP / BAGEL AE 的假设对 Lance 不成立它复制 BAGEL 的构造序列但使用 Lance 专用组件构建器见 pipeline_lance.py。LANCE_DEFAULTS硬编码常量来自上游config_factory.py/inference_lance.sh的常量针对官方Lance_3B/model.safetensors验证常量值依据latent_patch_size_spatial/temporal1 / 1vae2llm.weight (2048, 48)⇒ patch_latent_dim 1×48Lance 不做 BAGEL 式 2×2 patch 展开Wan2.2 内部已 patchifymax_latent_size64latent_pos_embed.pos_embed (4096, 2048)⇒ max_latent_size64max_num_video_latent_frames31Lance_3B_Video的 3D 表(31*64*64, 2048)(126976, 2048)vit_max_num_patch_per_side70Qwen2.5-VL patch 数上限connector_actgelu_pytorch_tanh连接器激活函数timestep_shift/num_timesteps/cfg_text_scale3.5 / 30 / 4.0与 README 默认一致vae_z_channels/vae_downsample_spatial/vae_downsample_temporal48 / 16 / 4Wan2.2 VAE 结构模型装配顺序LLMQwen2-MoT从Lance_3B/llm_config.json读取Qwen2MoTConfig强制qk_normTrue、tie_word_embeddingsFalse官方 checkpoint 单独携带language_model.lm_head.weight保持 head 不绑定才能零 missing/unexpected key 加载。mRoPE 配置Lance 是 Qwen2.5-VL-MoT官方rope_scaling {type: mrope, mrope_section: [16, 24, 24]}。vllm-omni 保留该配置——BagelRotaryEmbedding按rope_type自动分派LanceBagel对纯文本块把标量位置广播为(3, S)对视频潜变量块输出真实的逐 token(t, h, w)三维位置。这是 Qwen2.5-VL 骨干产出连贯 x2t / t2v 输出的必要条件。理解 ViT用 transformers 的Qwen2_5_VLVisionConfig/Qwen2_5_VisionTransformerPretrainedModel实例化强制_attn_implementationsdpa官方配置写的是flash_attention_2在无 flash-attn 的硬件如 Blackwell 上会构造失败sdpa 推理数值等价再用LanceQwen2_5_VLNaViTWrapper包装。若 ViT 构造失败理解路径不可用但生成路径t2i不受影响。VAEWan2.2Wan2.2_VAE.pth_build_wan22_vae实现见 wan_vae.py支持多帧视频解码decode_video。视觉占位Lance checkpoint 没有独立connector/vit_pos_embed权重LanceBagel保留visual_undTrue以复用 BAGEL 的forward_cache_update_vit随后把connector换成恒等映射LanceIdentityConnector、vit_pos_embed换成零操作LanceZeroVitPosEmbed使严格加载检查不要求幻影权重、前向加法数值上为 no-op。视频 3D 位置表Lance_3B_Video用 3D 潜变量位置表替换 BAGEL 的 2DPositionEmbeddingLancePositionEmbedding3D(max_num_frames31, max_num_patch_per_side64, hidden_size2048)。权重来源Lance_3B/model.safetensors以bagel.前缀加载含language_model.* / vae2llm.* / llm2vae.* / time_embedder.* / latent_pos_embed.*Qwen2.5-VL-ViT/vit.safetensors以bagel.vit_model.vision_model.前缀最后加载并覆盖——镜像上游inference_lance.py的加载顺序vit.safetensors 最后胜出以恢复与上游逐字节一致的 ViT 输出视频 checkpoint 内置的vit_model.*会产生 rel_l2≈9 的偏差。forward 分派逻辑forward(req)依据 prompt 字典的modalities与multi_modal_data字段分派见 pipeline_lance.py条件路由modalities[video]first_frame_forward_i2v首帧图生视频VAEViT 预填充后全新生成多帧modalities[video]video_forward_video_editmodalities[video]_forward_t2vmodalities[text]video_forward_x2t_videomodalities[text]image_forward_x2t_imagemodalities[image]img2img/image_forward_image_edit其他回落到BagelPipeline.forwardt2i视频形状校验t2v 前向会做两重校验超出直接抛ValueError空间H/W ≤ max_latent_size * latent_downsample64 × 16 1024 像素上限时间(T-1) // 4 1 ≤ 31Wan2.2 时间下采样 4即 T ≤ 121 RGB 帧。image_edit 的六段式预填充上游 image_edit 的 KV 缓存结构被精确复刻_forward_image_edit注释详述了Lance.validation_gen_KVcache的布局seg1 因果段 |im_start|system\n{sys}|im_end|\n|im_start|user\n seg2 全可见段 ViT(ref) — 参考图过 Qwen2.5-VL ViT seg3 全噪声段 VAE(ref) — 参考图过 Wan2.2 VAE, time_embed(t0) seg4 因果段 用户编辑指令 seg5 因果段 |im_end|\n|im_start|assistant\n seg6 噪声 QUERY 待去噪的生成潜变量两个关键细节CFG 无条件分支只跳过 seg4用户指令其余段包括系统头、ViT/VAE 预填充全部共享cfg_text_context的 rope 计数器仍按 seg4 长度推进保证 seg5 的 rope 位置两分支一致。此外生成潜变量与参考 VAE 块共享相同的 mRoPE 位置网格——上游get_rope_index对 VAE 条件块和噪声块都输出锚定在同一 base 的[base_t, base_hhi, base_wwi]这正是模型能把噪声 token 映射回参考图 token、实现编辑的归纳偏置。参考图 VAE 编码结果通过单槽latent_cache在 gen 分支与 cfg 分支间共享避免 Wan2.2 的mu std * randn_like(std)每次调用重新采样导致两分支 KV 漂移。输出落盘图片与视频图像任务结果以lance_{i}_{j}.png保存i为请求序号j为同一请求内的多图序号视频任务lance_{i}.mp4使用 imageio 以--fps默认 12编码codeclibx264, quality8若 MP4 编码失败如缺编码器自动降级为逐帧 PNG 目录lance_{i}_frames/0000.png ...理解任务文本直接打印到 stdout[Output i] {text}。进阶统一 Gradio 演示7 任务仓库还提供 gradio_demo.py一个覆盖全部 7 个任务Video Generation / Image to Video / Video Edit / Video Understanding / Image Generation / Image Edit / Image Understanding的 Web UI风格镜像上游 Lance 的lance_gradio.py任务单选、宽高比 分辨率下拉非自由 H/W 滑条、左输入右输出的双栏布局、底部高级参数折叠面板。双 Omni 实例与设备布局后端按任务路由到两个独立的Omni实例Lance_3Bt2i、image_edit、x2t_imageLance_3B_Videot2v、i2v、video_edit、x2t_video。设备布局依据CUDA_VISIBLE_DEVICES可见卡数自动降级--ulysses-degree布局GPU 数1P0图像 Omni → 逻辑 0视频 Omni → 逻辑 1图像 视频真正并行22P1图像 → 0,1视频 → 2,3每个 Omni 内部用 Ulysses SP 切分 DiT 去噪序列单请求 t2v/i2v 约快 1.5-1.8 倍且图像视频仍并发4N图像 → 0..N-1视频 → N..2N-12N--replicas-per-omni则在每块卡上各加载一份完整模型做吞吐扩展2*N张卡适合替代实验性的 SP注释明确提示Lance 目前缺少_sp_plan注册表且 i2v 首帧 pin 不感知 SPSP1 时 i2v 会崩溃优先用 replica 做吞吐扩展。GPU 数不足时会先降 replica 再降 SP 并打印 WARN。分辨率桶与上游画布严格对齐上游把宽高比限制为6 个固定桶21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16没有 3:2 / 2:3会被上游桶选择器吸附到 4:3 / 3:4。每个桶的规范 (W, H) 由以下公式计算max_area resolution_vae ** 2 w1 round(sqrt(max_area * ar) / 16) * 16 h1 round(w1 / ar / 16) * 16 # 再选实际比值更接近 ar 的候选其中resolution_vae 480video_360p、640video_480p、768image_768res。Gradio 脚本按此精确计算并内置三张表保证与上游在同一输入图像下落到相同画布、无宽高比漂移VIDEO_360P_AR_TO_SIZE21:9→(752,320)、16:9→(624,352)、4:3→(560,416)、1:1→(480,480)、3:4→(416,560)、9:16→(352,624)VIDEO_480P_AR_TO_SIZE21:9→(976,416)、16:9→(848,480)、4:3→(752,560)、1:1→(640,640)、3:4→(560,752)、9:16→(480,848)IMAGE_AR_TO_SIZE21:9→(1152,496)、16:9→(1024,576)、4:3→(896,672)、1:1→(768,768)、3:4→(672,896)、9:16→(576,1024)。上传图片时还会用 log 空间距离把任意 W×H 吸附到最近的预设桶线性距离会不公平地偏向 4:3。质量参数与演示时长质量参数锁定为上游值steps30、timestep_shift3.5、cfg_text_scale4.0注释特别强调NOT 8.0、seed42、fps12。演示时长则刻意短于上游脚本t2v/i2v 默认 5 秒约 61 帧上游为 121 帧 ≈ B300 上约 2 分钟/请求video_edit 默认 4 秒约 49 帧对齐上游 50。在保证逐帧保真度的前提下把交互延迟压到约 60 秒需要逐字节复现上游官方输出时可用滑块把时长延长到最多 10 秒。官方示例注入若传入--examples-root指向上游 Lance 仓库检出目录demo 会解析config/examples/*.json为每个任务注入可点击的官方示例t2i / t2v{filename: prompt}映射只取 prompt 作为输入预设i2v / video_edit / x2tinterleave_array [prompt, media]或[media, [system, question, answer]]媒体路径按仓库相对路径解析缺失则静默跳过image_edit上游只给一张源图配 5 个不同 prompt5 张相同缩略图体验差demo 改用 i2v 帧池中 5 张视觉差异明显的源图并重写编辑指令video_edit自动把上游 8 个左右分屏源 | 编辑演示视频裁出左半边源视频作为可运行输入上下 RGB 差分判断会被自然天空/地面方差误导因此采用目视确认的垂直中线裁切多轮编辑 filmstrip 取第一块面板为源。调试建议与已知边界立即 EOS / 空回答理解路径务必保持--text-temperature 0.8采样默认值或用--system-prompt Look at the image carefully and answer the question.这类 QA 指令替代 caption 默认视频越界崩溃确认--model指向Lance_3B_Video或顶层仓库目录且脚本能自动找到该子目录且num_frames ≤ 121、video_height/width ≤ 1024与上游数值差异优先保证DIFFUSION_ATTENTION_BACKENDFLASH_ATTNSDPA 会引入约 5 倍数值漂移ViT 输出差异必须让Qwen2.5-VL-ViT/vit.safetensors最后加载仓库已如此实现否则 image_edit / video_edit 的 ViT 输出与上游逐字节不一致。整体来看vllm-omni 对 Lance 的支持呈现清晰的继承 特化路径transformer 核心完整复用 BAGEL 的 MoT 实现仅在 checkpoint 布局、Qwen2.5-VL 理解 ViT、Wan2.2 VAE 与 3D 位置编码四处做局部替换从而以单阶段扩散流水线同时覆盖六大生成/理解模态。无论是快速跑通end2end.py还是基于gradio_demo.py搭建交互式演示本文涉及的参数、默认值与源码路径都可作为直接参考。【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询