如何本地部署NVIDIA Cosmos Reason-1-7B模型

描述

近日,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.(根据风扇底座上的指示灯调节风扇转速。)

从这个简单的例子可以看出,模型的回答已经超越了“打开风扇”这一基本预判,直接推断出更具体、更符合真实使用场景的交互动作——“调节风速”。

这表明模型不仅识别了视频中的物体(手和风扇),还深刻理解了该电器的功能属性(可调节的风速)以及精细化的操作逻辑。这种基于对物体功能的认知,准确“理解”视频中人的意图并给出高度合理预测的能力,充分展现了其在运动、人机交互以及功能逻辑关系上的强大理解与预测能力。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分