近日,NVIDIA 开源其物理 AI 平台 NVIDIA Cosmos 中的关键模型——NVIDIA Cosmos Reason-1-7B。这款先进的多模态大模型能够理解视频、进行物理推理,并规划下一步行动。本文将一步步带你在本地服务器上完成该模型的部署,并搭建一个直观的 Web 交互界面,亲身体验前沿 AI 的“思考”过程。
1NVIDIA Cosmos 平台
所谓物理 AI,即赋予机器人、无人机、辅助驾驶汽车等自主机器感知、推理并与物理世界交互的能力。开发物理 AI 始终面临两大核心挑战:
数据瓶颈:获取训练复杂模型所需的海量、高质量真实世界数据,成本高昂且难以规模化。
测试困境:在安全可控的环境中验证模型的有效性与安全性,较为困难。
NVIDIA Cosmos 专为构建物理 AI 而生。作为一个整合前沿生成式世界基础模型(WFM)先进分词器、护栏以及用于加速数据处理和管理的高效工作流的集成平台。该技术为世界模型训练提供支持,并加速智能汽车(AV)和机器人的物理 AI 开发。
为攻克物理 AI 开发难题,NVIDIA Cosmos 引入了核心策略——合成数据(Synthetic Data)。通过在 NVIDIA Omniverse 及其 Isaac Sim 模拟平台中创建高度逼真的数字孪生世界,Cosmos 能够大规模、低成本地生成用于训练和测试的结构化数据。其目标是实现“模拟到现实的零样本部署”(Sim-to-Real Zero-Shot Deployment),在模拟环境中充分训练和验证的模型,无缝、高效且安全地应用于现实世界。
NVIDIA Cosmos 并非单一模型,而是一个由多个世界基础模型(World Foundation Models)和配套工具组成的综合性平台,其三大支柱各司其职:
Cosmos Predict:根据文本、图像或视频输入,生成符合物理规律且视觉逼真的未来场景。这允许开发者在安全的虚拟环境中,无限次地测试 AI 代理的反应,避免昂贵且危险的实体实验。
Cosmos Transfer:能将低保真或非视觉输入(如分割图、CAD 模型、激光雷达点云)转换为照片般逼真的高保真视频,加速了高质量合成数据的生产效率。
Cosmos Reason:作为多模态推理模型,能够理解复杂场景,进行基于物理和因果关系的推理,并以自然语言形式输出下一步的行动建议,可称作自主系统的“大脑”。
2NVIDIA Cosmos Reason-1-7B
本文的主角 Cosmos Reason-1-7B(70 亿参数),正是 Cosmos Reason 家族目前发布的两款先进多模态大语言模型之一,另一版本为 Cosmos Reason-1-56B(560 亿参数)。
Cosmos Reason-1-7B 基于“思维链”(Chain of Thoughts)推理模式,能将复杂问题层层分解,赋予 AI 系统在复杂的物理世界中进行时空感知和推理的能力。
简而言之,它能“看懂”摄像头捕捉到的视频流,结合人类的文本指令,进行深入的逻辑思考,最终生成最佳的决策或行动方案。
3实战教程:部署 Cosmos Reason-1-7B
接下来将带你完成 Cosmos Reason-1-7B 模型的本地化部署,并为其创建一个简洁的前端交互界面。整个过程分为三大核心步骤:
模型准备:从 Hugging Face Hub 下载 Cosmos-Reason1-7B 的模型权重。
后端部署:使用 vLLM 框架加载模型,以提供高性能的推理服务。
前端开发:集成 Gradio 库,创建一个用户友好的 Web 界面,便于模型交互。
注意:
你需要一块或多块性能强劲的 NVIDIA GPU 来运行此模型(部署演示中使用了 4 张 NVIDIA RTX 5880 Ada);
请确保已安装 vllm、gradio、transformers、torch 等必要的 Python 库。
下面的 Python 脚本整合了上述所有步骤,可供直接参考使用。
import gradio as gr
from transformers import AutoProcessor
from vllm import LLM, SamplingParams
from qwen_vl_utils import process_vision_info
# --- 1. 配置模型路径 ---
# 请将此路径修改为您在本地服务器上下载的模型权重文件夹路径
MODEL_PATH = "/data/Cosmos-Reason1-7B"
# --- 2. 初始化vLLM引擎 ---
# tensor_parallel_size 可根据您的GPU数量进行调整
llm = LLM(
model=MODEL_PATH,
tensor_parallel_size=4,
pipeline_parallel_size=1,
limit_mm_per_prompt={"image": 10, "video": 10},
)
# --- 3. 设置采样参数 ---
sampling_params = SamplingParams(
temperature=0.6,
top_p=0.95,
repetition_penalty=1.05,
max_tokens=4096,
)
# --- 4. 加载处理器 ---
processor = AutoProcessor.from_pretrained(MODEL_PATH)
# --- 5. 定义核心处理函数 ---
defparse_model_output(generated_text):
"""解析模型的输出,分离思考过程和最终答案。"""
think, answer = "", ""
# 分离标签
if" "in generated_text:
think_split = generated_text.split("")
think = think_split[0].replace("", "").strip()
answer_part = " ".join(think_split[1:]).strip()
else:
answer_part = generated_text
# 分离标签
if""in answer_part and" "in answer_part:
answer = answer_part.split("")[1].split(" ")[0].strip()
else:
answer = answer_part.strip()
return think, answer
defvideo_chat(video_path, user_prompt):
"""处理视频和文本输入,并返回模型的推理结果。"""
ifnot video_path ornot user_prompt:
return"请输入视频和问题!", "请输入视频和问题!"
messages = [
{"role": "system", "content": "You are a helpful assistant. Answer the question in the following format: your thought process
your answer
."},
{
"role": "user",
"content": [
{"type": "text", "text": user_prompt},
{"type": "video", "video": video_path, "fps": 4}
]
},
]
# 构建Prompt
prompt = processor.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
)
# 处理视觉信息
image_inputs, video_inputs, video_kwargs = process_vision_info(messages, return_video_kwargs=True)
mm_data = {}
if image_inputs isnotNone: mm_data["image"] = image_inputs
if video_inputs isnotNone: mm_data["video"] = video_inputs
llm_inputs = {
"prompt": prompt,
"multi_modal_data": mm_data,
"mm_processor_kwargs": video_kwargs,
}
# 生成结果
outputs = llm.generate([llm_inputs], sampling_params=sampling_params)
generated_text = outputs[0].outputs[0].text
# 解析并返回结果
think, answer = parse_model_output(generated_text)
return think, answer
# --- 6. 构建Gradio Web界面 ---
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("# Cosmos-Reason1-7B 视频理解Demo")
gr.Markdown("上传一段视频,提出你的问题,看看AI如何“思考”和回答。")
with gr.Row():
with gr.Column(scale=1):
video_input = gr.Video(label="上传视频 (MP4)")
prompt_input = gr.Textbox(label="请输入你的问题", lines=2, placeholder="例如:视频里的人正在干什么?他接下来最可能做什么?")
submit_btn = gr.Button(" 提交", variant="primary")
with gr.Column(scale=1):
with gr.Accordion(" AI的思考过程(点击展开/收起)", open=False):
think_output = gr.Textbox(label="Thinking Process", lines=10, interactive=False)
answer_output = gr.Textbox(label=" 最终答案", lines=6, interactive=False)
submit_btn.click(
video_chat,
inputs=[video_input, prompt_input],
outputs=[think_output, answer_output]
)
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)
4模型实测:是否能理解真实意图?
实测中拍摄了一段 MP4 格式视频作为输入:视频中,一只手正准备启动电风扇。
我们向模型提出一个微妙的问题:
Question: what is the most plausible next immediate subtask?(最可能的下一个直接子任务是什么?)
模型的回答堪称惊艳。为了更清晰地了解其思考方式,输出结果整理如下:
AI 的思考过程(摘要)
好的,我们来分析一下。用户询问手启动风扇后的下一个直接子任务。视频显示,手触摸风扇后,扇叶开始旋转,说明风扇被打开了。
既然已经打开,下一步是什么?通常,人们会检查风扇是否正常工作,比如调节风速或方向。考虑到这是一个“子任务”,下一个动作应该与风扇直接相关。
视频中的风扇底座上有指示灯,这很可能对应着不同的设置。因此,在“打开”这个宏观动作完成后,一个非常合理的、更精细化的交互就是去调整这些设置。所以,最可能的下一个子任务是调节风扇的速度。
最终答案
Adjust the fan's speed using the indicators on its base.(根据风扇底座上的指示灯调节风扇转速。)
从这个简单的例子可以看出,模型的回答已经超越了“打开风扇”这一基本预判,直接推断出更具体、更符合真实使用场景的交互动作——“调节风速”。
这表明模型不仅识别了视频中的物体(手和风扇),还深刻理解了该电器的功能属性(可调节的风速)以及精细化的操作逻辑。这种基于对物体功能的认知,准确“理解”视频中人的意图并给出高度合理预测的能力,充分展现了其在运动、人机交互以及功能逻辑关系上的强大理解与预测能力。
全部0条评论
快来发表一下你的评论吧 !