ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

vLLM-Omni 独立实验服务器详解:JoyVL 交互服务器的部署、路由与 per-tick 决策机制

vLLM-Omni 独立实验服务器详解:JoyVL 交互服务器的部署、路由与 per-tick 决策机制 vLLM-Omni 独立实验服务器详解JoyVL 交互服务器的部署、路由与 per-tick 决策机制【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omnivLLM-Omni 的绝大多数端点由vllm serve model --omni启动的统一 API 服务器承载但实验包中保留了唯一一个独立的、面向用户的服务器进程——JoyVL 交互服务器。本文基于 standalone_servers.md 并结合 vllm_omni/experimental/fullduplex/joyvl/serving/server.py 源码讲清这条独立 HTTP 服务链路的定位、完整启动命令、路由协议、会话机制以及帧级请求如何产生silence/response/delegate三种决策。统一服务器与独立服务器的边界vLLM-Omni 的默认形态是统一服务器一条vllm serve model --omni命令同时暴露 chat、图像生成、音频、视频等多模态端点。实验包中的独立服务器则不走这条路径其路由不会被注册进统一 API 服务器——在 api_server.py 中搜索不到任何 joyvl 相关路由挂载可以从源码结构上印证这一点。目前仓库中仅有一个独立用户服务器服务器传输角色JoyVL 交互服务器HTTP在一个独立的 OpenAI 兼容模型后端之前叠加会话状态、记忆、主动决策与委派delegationPersonaPlex已收敛到统一服务器的先例值得注意的反例是 PersonaPlex它曾经以独立的兼容服务器形式提供现已不再单独发布改为通过统一的全双工路径vllm_omni/deploy/personaplex.yaml部署配置经WS /v1/realtime?duplex1对外服务详见 full_duplex_api.md 与 PersonaPlex 示例。fullduplex 包 README 说明MiniCPM-o 4.5 与 PersonaPlex 的原生全双工运行时已从 experimental 包毕业到稳定代码树vllm_omni/engine/duplex/等其 demo 级单进程服务器被直接移除而非晋升——这解释了为什么独立服务器目录如今只剩 JoyVL 一条线。JoyVL 交互服务器定位与包结构JoyVL 是一个编排层orchestration layer不是模型服务引擎它自身不做模型前向而是调用一个独立的 OpenAI 兼容后端通常就是普通vllm serve拉起的 JoyAI-VL-Interaction-Preview在其前面为每个会话叠加帧历史、三层摘要记忆、persona 策略与可选的后台大脑委派。其代码组织在 vllm_omni/experimental/fullduplex/joyvl/ 下serving/—— FastAPI 服务器、配置 dataclass、会话对象server.py、config.py、session.pydecision/—— 决策动作解析器与 persona 提示词、策略逻辑memory/—— 工作记忆块与中/长期摘要器Summarizerbridges/—— OpenAI 后端客户端与委派桥chat / image / edit / router / stub部署模型后端与编排器两个进程第一步拉起模型后端JoyAI-VL-Interaction-Preview8BQwen3-VL 架构、针对流式交互重新训练权重用普通vllm serve提供服务不需要--omni。按 standalone_servers.md 给出的命令vllm serve jdopensource/JoyAI-VL-Interaction-Preview \ --served-model-name JoyAI-VL-Interaction-Preview \ --port 8092 \ --max-model-len 131072 \ --enable-prefix-caching \ --limit-mm-per-prompt {image:256,video:1}参数要点来自 JoyAI-VL-Interaction recipe--enable-prefix-caching会话窗口随帧不断累积system 与记忆前缀会被前缀缓存复用使每 tick 的新增计算只剩新帧的视觉 token--limit-mm-per-prompt {image:256,video:1}图像上限需覆盖短期帧窗口chunk_frames默认 100小显存卡应同时调低该值、--max-model-len与--chunk-frames显存不足时可在该命令追加--quantization fp8从 bf16 检查点在线量化recipe 实测权重 9.9 GiB vs 16.8 GiB属省内存手段而非提速手段。第二步启动交互编排器python -m vllm_omni.experimental.fullduplex.joyvl.serving.server \ --port 8091 \ --main-backend-url http://127.0.0.1:8092/v1 \ --main-model JoyAI-VL-Interaction-Preview编排器是标准 argparse 程序入口为 server.py 的main()最终以 uvicorn 运行。完整命令行参数与默认值如下参数默认值说明--host0.0.0.0监听地址--port8070监听端口--main-backend-urlhttp://127.0.0.1:8061/v1主模型后端的 OpenAI 兼容/v1地址--main-modelJoyAI-VL-Interaction-Preview主模型名--personadefaultdefault/silent/talkative三选一--summarizer-backend-url/--summarizer-model未设置时回退到主后端/主模型三层摘要器所用后端--chunk-frames未设置时取配置默认100短期帧窗口T_s满窗后触发一次记忆整合--response-dedup-threshold1.01.0只丢弃完全重复的发言1.0用序列相似度额外丢弃近重复旁白--max-tokens/--temperature128/0.8每 tick 决策采样的超参--no-memory关禁用中/长期摘要记忆--no-delegation关关闭委派桥--delegation-backend-url无后台大脑的 OpenAI 兼容端点未配置时 delegation 保持关闭--delegation-model/--delegation-api-key无后台大脑模型名与密钥如指向第三方 API 时--delegation-kindchatchat/image/edit/router/stub见下文--delegation-image-url/--delegation-edit-url/--delegation-edit-model无router模式下的文生图 / 图编辑端点--no-force-silence关默认在用户指令到达前模型保持沉默force_silence_before_query配置最终落入 InteractionConfig dataclass其中还有一批源码级默认值供直接引用frame_seconds1.0、max_pixels262144、long_term_every_n_chunks5、long_term_memory_window15、mid_term_max_tokenslong_term_max_tokens4000、keep_qa_historyTrue、session_timeout_seconds3600.0、request_timeout_seconds300.0。HTTP 路由与协议服务器由create_app()构建为 FastAPI 应用路由一览与 standalone_servers.md 表格一致方法与路由用途GET /health就绪检查GET /v1/models报告所配置的交互模型POST /v1/chat/completions处理一帧或一次交互 tickPOST /reset重置会话POST /v1/streaming/reset/reset的别名POST /v1/streaming/persona切换会话 persona会话标识的解析优先级每个会话在首次请求时惰性创建SessionManager._get并发由每会话asyncio.Lock串行化step()与reset()竞争同一把锁保证重置不会在请求中途拆掉会话。过期会话由_evict_expired()按session_timeout_seconds默认 3600 秒惰性回收。会话 ID 按 server.py 中_session_id()的优先级解析x-streaming-session请求头x-session-id请求头请求体session_id字段请求体user字段兜底default每帧请求与响应结构使用方式是每个视频帧发一个多模态 Chat Completions 请求通常约 1 帧/秒用x-session-id标识会话messages里可携带一个常驻指令text part加一个或多个image_url帧。若请求中没有任何image_url帧服务器直接返回 400interaction server requires at least one image_url frame。curl http://127.0.0.1:8091/v1/chat/completions \ -H content-type: application/json \ -H x-session-id: demo \ -d { messages: [{role: user, content: [ {type: text, text: Alert me if a fire appears}, {type: image_url, image_url: {url: data:image/jpeg;base64,...}} ]}] }响应保持chat.completion外壳以便 OpenAI 客户端直接消费但在其上额外挂载interaction块_completion_response(){ id: intchat-…, object: chat.completion, model: JoyAI-VL-Interaction-Preview, choices: [{index: 0, message: {role: assistant, content: /response …}, finish_reason: stop}], interaction: { action: response, spoke: true, text: …, delegated_question: null, delegation: null, chunk_index: 0, frame_index: 12, inference_skipped: false, latency_ms: 84.2, memory: { long_term_memory: …, mid_term_summaries: [{chunk_index: 1, frame_range: …, summary_text: …}] } } }其中action只能是silence/response/delegate三值之一。这三个动作来自决策 token 协议模型输出以/silence、/response、/delegation标记由 output_parser.py 的parse_action()归一化为ParsedAction/response 文本 /delegation 问题会被拆成text与delegated_question两部分。inference_skipped为真时表示本 tick 因force_silence_before_query未走模型推理默认配置下指令未到达前模型强制沉默。策略层还有一个去重闸门JoyVLPolicy.commit()会把response文本与上一句比较完全相同阈值 1.0或相似度超过阈值时改写为silence避免流式旁白原地打转见 policy.py。记忆、persona 与委派三层摘要记忆每chunk_frames默认 100帧构成一个工作块块满后服务器以异步任务不阻塞请求路径调用摘要器把该块压缩进中期摘要每 5 个块再滚动一条长期记忆long_term_every_n_chunks5、窗口 15 条。摘要请求走--summarizer-backend-url/--summarizer-model指定的后端缺省复用主模型从而让模型能回答刚才有谁走过这类超出当前帧窗口的问题。--no-memory可整体关闭。persona 策略--persona选择系统提示词对应 prompts.py 中SYSTEM_PROMPTS的三个键default有意义的主动事件或提问时说话、silent仅被提问时回答、不委派、talkative主动连续旁白。运行中也可用POST /v1/streaming/persona热切换返回unknown_persona表示 persona 名无效。委派background brain当模型判定问题超出自身能力时输出/delegation question编排器通过委派桥转交后台大脑。_build_delegation()server.py按--delegation-kind装配不同的桥chat—— 更强的文本/视觉模型回答/chat/completionsimage—— 文生图模型出一张图/images/generationsedit—— 图编辑模型重绘当前帧router—— 逐请求分发到 chat / image / edit 三类端点后两者需分别给--delegation-image-url/--delegation-edit-urlstub—— 仅测试/演示用的罐头答案源码注释特别说明 stub 只在显式 opt-in 时启用否则虚假答案会混入会话记忆关键语义chat/image/edit/router都必须配后端 URL没有 URL 时委派整体保持关闭模型仍会念出委派备注但结果不会被折叠回会话。后台大脑是 bring-your-own任意自托管的 OpenAI 兼容端点均可。一键脚本、验证与测试recipe 提供了覆盖模型 编排器 WebUI ASR/TTS的可选一键脚本 start_all.sh以及围绕编排器的周边示例无头客户端 run_cli_demo.py读取本地视频逐帧驱动/v1/chat/completions打印 per-tick 决策时间线ASR / TTS 桥 bridges/语音输入输出是可插拔的外部服务RTSP 模拟脚本 rtsp/RTSP 是 WebUI 侧的输入方式浏览器拉流再走普通 API服务层无需改动。功能验证可用仓库内置测试pytest tests/e2e/features/fullduplex # 框架与 JoyVL 单元/集成测试该目录下包含 test_joyvl_brain.py、test_joyvl_policy.py 等针对记忆块与决策策略的用例可对照本文描述的行为做验证。小结vLLM-Omni 的独立实验服务器只剩 JoyVL 交互服务器一条它把每帧一个决策的流式交互状态帧历史、三层记忆、persona、委派从模型推理中剥离作为一个轻量 FastAPI 进程挂在普通vllm serve后端之前。理解了x-session-id会话语义、interaction响应块和--delegation-kind的装配规则就能自行把它接进任何 1 fps 视频流应用而 PersonaPlex 这类此前独立存在的服务器现在应统一改走/v1/realtime?duplex1的全双工路径。【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表