vLLM-Omni Dynin-Omni 离线推理实战:一站式端到端全模态生成入门

发布时间:2026/9/17 9:07:46
vLLM-Omni Dynin-Omni 离线推理实战:一站式端到端全模态生成入门 vLLM-Omni Dynin-Omni 离线推理实战一站式端到端全模态生成入门【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni本篇技术指南围绕 vLLM-Omni 仓库中的 Dynin-Omni 离线推理示例examples/offline_inference/dynin_omni/README.md展开完整讲解环境搭建、EMOVA 依赖安装、三段式 GPU 显存预算以及 t2t / i2t / s2t / t2i / v2t / i2i / t2s 七类任务的端到端运行方法。读完本文你将掌握通过统一的end2end.py入口在单卡上驱动 Dynin-Omni 全模态推理的完整链路并理解其背后的三阶段流水线拓扑与关键调参依据。1. Dynin-Omni 与 vLLM-Omni一个入口打通七种模态任务Dynin-Omni 是一个面向全模态文本、图像、音频、视频的统一模型vLLM-Omni 为其提供了三阶段离线推理流水线。examples/offline_inference/dynin_omni/目录下唯一的入口脚本 end2end.py 屏蔽了不同任务的差异让你只需切换--task参数即可完成从文本、图像、音频、视频到文本/图像/音频的七类推理任务含义输入输出t2t文本 → 文本多模态理解 / 文本生成--text文本i2t图像 → 文本图像描述--image--text文本s2t语音 → 文本语音转写--audio--text文本t2i文本 → 图像文生图--text图像v2t视频 → 文本视频描述--video--text文本i2i图像 → 图像图生图编辑--image--text图像t2s文本 → 语音文生语音--text音频这七类任务在脚本中被定义为TASK_CHOICES且每一类都有独立的运行时默认参数TASK_DEFAULT_RUNTIME与TASK_RUNTIME_FALLBACKS见 end2end.py即使用户不传任何生成参数也能直接跑通。2. 环境准备仓库安装与 EMOVA 依赖2.1 安装 vLLM-Omni首先进入仓库根目录并按需以可编辑模式安装cd REPO_ROOT pip install -e .end2end.py内部会通过bootstrap_repo_path()end2end.py自动将仓库根目录加入sys.path因此只要在仓库内执行即可正确导入vllm_omni相关模块。2.2 安装 EMOVA 相关依赖Dynin-Omni 的语音 tokenizer 与音频编解码链路依赖 EMOVAEmotion-oriented Multimodal Vision-Language-Audio组件。请按以下版本安装pip install \ phonemizer3.3.0 \ Unidecode1.4.0 \ hydra-core1.3.2 \ pytorch-lightning1.1.0 \ wget3.2 \ wrapt2.1.1 \ onnx1.20.1 \ frozendict2.4.7 \ inflect7.5.0 \ braceexpand0.1.7 \ webdataset1.0.2 \ torch-stft0.1.4 \ editdistance0.8.1这些依赖主要服务于语音前置处理phonemizer、Unidecode、inflect、editdistance、音频编解码torch-stft、onnx、训练/推理框架兼容pytorch-lightning、hydra-core、wrapt、frozendict与数据加载webdataset、wget、braceexpand。此外脚本在运行图像/视频 token 化时会用到cv2OpenCV与soundfile/scipy音频保存兜底请确保这些库也已安装。3. 三阶段流水线与显存预算3.1 默认部署拓扑单卡三段式Dynin-Omni 的推理被组织为三条流水线阶段默认全部运行在同一张 GPU 上。部署配置见 vllm_omni/deploy/dynin_omni.yaml三阶段拓扑被冻结在 pipeline.pyStage-0token2text多模态理解 / 文本生成负责把文本及媒体 token编码为语言模型理解Stage-1token2image将 Stage-0 的输出 token 解码为图像潜变量latentStage-2token2audio将 Stage-1 的输出 token 解码为音频潜变量。三个阶段均为LLM_GENERATION执行类型阶段间通过 worker-connector 的 full-payload 数据面token2text_to_token2image_full_payload/token2image_to_token2audio_full_payload生产者 对应消费者传递完整 token 载荷而非分块流式传输配置中的async_chunk: false即为此语义。由于 Dynin 的 HF 建模代码是自定义远程代码整个流水线必须开启trust_remote_code: true并关闭前缀缓存enable_prefix_caching: false。3.2 显存预算与 GPU 兼容性默认部署将三阶段显存利用率的和控制在 0.7单卡StageUtilizationA100 80GBH200 141GBStage-0 (token2text)0.5~40.0 GB~70.5 GBStage-1 (token2image)0.1~8.0 GB~14.1 GBStage-2 (token2audio)0.1~8.0 GB~14.1 GBTotal requested budget0.7~56.0 GB~98.7 GB从运行日志中可观察到 Stage-0 的权重加载信号例如Model loading took 15.12 GiB memory。需要留意Stage-1/2 的实际运行时占用还会随任务路径task path与后端backend分配进一步增加因此建议在表中预算之外额外保留 CUDA/PyTorch 运行时开销与临时分配的余量避免 OOM。GPU 兼容性方面本示例确认的目标 GPU 为NVIDIA H200 与 NVIDIA A100仓库中 Dynin 的 CI/e2e 测试还覆盖了 CUDAL4标记的硬件如 tests/e2e/offline_inference/test_dynin_omni_expansion.py 中的hardware_test(res{cuda: H100, ...})及 CI 专用部署配置 vllm_omni/deploy/dynin_omni_ci.yaml说明在显存更小的 L4 级 GPU 上也能以缩减配置跑通 smoke 测试。4. 端到端运行七类任务一条命令搞定从仓库根目录执行end2end.py通过--task切换任务类型、--model指定模型HF repo id 或本地目录默认snu-aidas/Dynin-Omni# t2t文本生成 python REPO_ROOT/examples/offline_inference/dynin_omni/end2end.py \ --task t2t --model snu-aidas/Dynin-Omni --text INSTRUCTION_TEXT # i2t图像描述 python REPO_ROOT/examples/offline_inference/dynin_omni/end2end.py \ --task i2t --model snu-aidas/Dynin-Omni --image IMAGE_PATH --text Please describe this image in detail. # s2t语音转写 python REPO_ROOT/examples/offline_inference/dynin_omni/end2end.py \ --task s2t --model snu-aidas/Dynin-Omni --audio AUDIO_PATH --text Transcribe the given audio. # t2i文生图 python REPO_ROOT/examples/offline_inference/dynin_omni/end2end.py \ --task t2i --model snu-aidas/Dynin-Omni --text INSTRUCTION_TEXT # v2t视频描述 python REPO_ROOT/examples/offline_inference/dynin_omni/end2end.py \ --task v2t --model snu-aidas/Dynin-Omni --video VIDEO_PATH --text Describe this video in detail. # i2i图生图编辑 python REPO_ROOT/examples/offline_inference/dynin_omni/end2end.py \ --task i2i --model snu-aidas/Dynin-Omni --image IMAGE_PATH --text INSTRUCTION_TEXT # t2s文生语音 python REPO_ROOT/examples/offline_inference/dynin_omni/end2end.py \ --task t2s --model snu-aidas/Dynin-Omni --text INSTRUCTION_TEXT4.1 输入/输出参数速查脚本的完整参数定义见 end2end.py核心参数如下参数默认值说明--task必填任务类型可选t2t/t2i/t2s/i2i/i2t/s2t/v2t--model必填HF repo id如snu-aidas/Dynin-Omni或本地模型目录--deploy-configvllm_omni/deploy/dynin_omni.yaml部署配置stage 设备、显存、batch token--dynin-config-path空强制指定 Dynin 推理配置 YAML 路径--model-cache-dir/tmp/dynin_localized_models--model为 HF repo id 时的本地缓存目录--localize-model/--no-localize-modelTrue是否将 HF 模型 snapshot 到缓存目录--text/--instruction空提示词 / 附加指令--image/--audio/--video空输入媒体路径对应任务必填--output-dir/--output-prefix/tmp下按任务分目录 / 时间戳输出目录与前缀--image-resolution336按任务可覆盖图像/视频帧预处理分辨率--num-frames8v2t 视频采样帧数--seed0随机种子--dtypeauto模型精度--max-tokens-per-stage1每阶段生成 token 数配合detokenizeFalse使用--max-new-tokens/--steps/--block-length按任务文本/自回归生成的步长与块长--temperature/--cfg-scale按任务采样温度与 CFG 强度--timesteps/--guidance-scale20 / 3.5t2i/i2i 扩散步数与引导强度--mask-token-id/--codebook-size/--audio-codebook-size126336 / 8192 / 4096mask token 与 codebook 尺寸--t2s-token-length/--t2s-condition512 /gender-female_emotion-neutral_speed-normal_pitch-normalt2s 音频 token 长度与音色条件--tokenizer-path随--model文本 tokenizer 来源--vq-model-image-path/--vq-model-audio-pathsnu-aidas/magvitv2/snu-aidas/emova_speech_tokenizer_vllm图像/音频 VQ 编码器来源--noise-type/--noise-schedule-name/--noise-schedule-paramsmask/cosine/{}扩散噪声与调度--use-train-i2i-prompt/--no-use-train-i2i-prompti2i 默认开启是否使用 i2i 训练提示模板--disable-hf-xet/--enable-hf-xet默认禁用 Xet控制 HF 下载是否使用 Xet4.2 各任务的运行时默认参数不传生成参数时脚本会从TASK_RUNTIME_FALLBACKSend2end.py按任务取默认值关键默认值如下t2tmax_new_tokens1024、steps1024、block_length16、temperature0.0、cfg_scale0.0t2iimage_token_count1024、timesteps20、guidance_scale3.5、temperature1.0i2itimesteps64、guidance_scale3.5、image_resolution336、use_train_i2i_promptTruei2tmax_new_tokens128、steps128、block_length2、image_resolution480、remaskinglow_confidences2tmax_new_tokens128、steps128、block_length2、remaskinglow_confidencet2st2s_token_length512、steps512、block_length128、temperature1.0、cfg_scale2.5v2tmax_new_tokens128、steps128、block_length2、image_resolution224、num_frames5。对于 i2t / v2t 这类自回归解码任务脚本还会通过_validate_generation_argsend2end.py强制校验max_new_tokens % block_length 0与steps % (max_new_tokens // block_length) 0不满足约束会直接报错避免生成流程中途失败。5. 任务背后的数据处理链路5.1 媒体输入 token 化对于带媒体输入的任务脚本会在推理前先完成 token 化图像i2t / i2i通过preprocess_image将图像等比缩放到image_resolution并居中裁剪再经MAGVITv2的get_code得到图像 token见 end2end.py视频v2t用 OpenCV 读取全部帧按num_frames均匀抽帧后逐帧走 MAGVIT 编码并拼接见 end2end.py音频s2t通过snu-aidas/emova_speech_tokenizer_vllm的encode得到音频 token见 end2end.py。这些 VQ 编码器与远程代码的解析逻辑集中在 dynin_omni_common.py其中DEFAULT_VQ_IMAGE_SOURCE snu-aidas/magvitv2、DEFAULT_VQ_AUDIO_SOURCE snu-aidas/emova_speech_tokenizer_vllm与脚本默认值一致并支持通过DYNIN_MAGVIT_REMOTE_CODE_REPO_ID、DYNIN_MAGVIT_REMOTE_CODE_REVISION等环境变量切换远程代码来源。5.2 提示词构建与特殊 tokenDynin-Omni 使用一套模态边界特殊 token|soi|/|eoi|图像起止、|soa|/|eoa|音频起止、|s2t|/|t2s|/|mmu|/|t2i|/|i2i|/|v2t|等任务 token完整列表定义于 end2end.py。脚本通过UniversalPrompting从模型远端代码解析fallback 到modeling_dynin_omni模块将文本、媒体 token 与占位 token 组装成模型可接受的输入并将 image/speech token 分别偏移到text_vocab_size与text_vocab_size codebook_size之后见make_prompt_payload与make_mmu_promptend2end.py。5.3 推理执行与结果落盘脚本通过vllm_omni.entrypoints.omni.Omni加载部署配置并执行omni.generate(prompt, sampling_params_list)end2end.py每个阶段各持有一份SamplingParams(max_tokens1, temperature0.0, top_p1.0, detokenizeFalse)——真正的 token 生成步数由runtime_info中的steps/block_length/max_new_tokens控制引擎层以「每阶段 1 token」的粒度串联整条流水线。输出按最终模态落盘文本写入output-dir/prefix.txt同时打印到终端图像从multimodal_output[image]提取 tensor 并转 PIL 保存为prefix.png音频提取波形与采样率默认sr24000优先用soundfile写 WAV失败时回退scipy.io.wavfile见 end2end.py。6. 注意事项与常见问题输出位置默认输出到/tmp下按任务区分的目录如/tmp/dynin_end2end_outputs、/tmp/dynin_t2i_outputs可通过--output-dir覆盖。强制本地配置若希望绕过配置自动发现自动发现会依次检查runtime_info.dynin_config_path→ 环境变量DYNIN_CONFIG_PATH→ 模型目录/HF 缓存中的候选路径见 dynin_omni_common.py可显式传入--dynin-config-path PATH_TO_DYNIN_OMNI_YAML。max_num_batched_tokens警告若日志出现max_num_batched_tokens (32768) exceeds max_num_seqs * max_model_len (4096)说明当前部署配置的单阶段 batch token 上限默认 32768超过了max_num_seqs * max_model_len的乘积约束。解决方法是调小部署配置中的max_num_batched_tokens——CI 配置 vllm_omni/deploy/dynin_omni_ci.yaml 就将其降为4096以适配 L4 级 GPU。本地模型目录--model既支持 HF repo id默认开启--localize-model自动 snapshot 到--model-cache-dir也支持直接指向本地模型目录脚本会自动据此决定local_files_only行为end2end.py。i2t/v2t 步长约束如上述这两类任务要求max_new_tokens % block_length 0且steps % num_blocks 0传参时请保持块整除关系。离线 e2e 测试仓库在 tests/e2e/offline_inference/test_dynin_omni_expansion.py 提供了覆盖 t2i 解码到图像、MMU 纯文本、图像到文本、语音到文本、t2s 解码到音频的 smoke 测试可作为运行链路的对照参考该测试通过dynin_config_path与DYNIN_CONFIG_PATH环境变量注入配置印证了「配置文件可通过运行期信息覆盖」的设计。7. 小结通过end2end.py这一统一入口vLLM-Omni 将 Dynin-Omni 的三阶段流水线token2text → token2image → token2audio封装为「一条命令、七类任务」的离线推理体验。部署侧的显存预算由 vllm_omni/deploy/dynin_omni.yaml 控制推理侧的采样、扩散与提示词参数由脚本内置的任务级默认值接管开发者只需关注--task、--model与输入媒体路径即可快速验证 Dynin-Omni 在文本、图像、音频、视频四类模态上的端到端能力。【免费下载链接】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个关键决策

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

获取专属建站方案

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

立即免费咨询