当前位置: 首页 > article >正文

openpi π₀ 项目部署运行逻辑(三)——策略推理服务器 serve_policy.py

 π₀ 主控脚本都在 scripts 中:

其中,serve_policy.py 是 openpi 中的策略推理服务端脚本,作用为:启动一个 WebSocket 服务器,加载预训练策略模型,等待外部请求(如来自 main.py 的控制程序),然后执行动作推理并返回结果

一句话总结一下:

将一个 Pi0 策略模型部署为网络服务(WebSocket API),供机器人主控进程远程调用

目录

1 库引用

2 参数定义

3 加载策略模型

4 启动推理服务

5 使用方法总结

5.1 使用方法

5.2 问题分析


1 库引用

import dataclasses  # 用于创建结构化参数对象
import enum          # 用于定义环境枚举类型
import logging       # 用于日志输出
import socket        # 获取本机 IP 地址信息import tyro          # 命令行参数解析库,比 argparse 更现代# 引入策略和策略配置模块
from openpi.policies import policy as _policy
from openpi.policies import policy_config as _policy_config
# 引入 WebSocket 推理服务模块
from openpi.serving import websocket_policy_server
# 引入训练配置模块
from openpi.training import config as _config

2 参数定义

# 定义支持的机器人环境枚举类型
class EnvMode(enum.Enum):ALOHA = "aloha"ALOHA_SIM = "aloha_sim"DROID = "droid"LIBERO = "libero"# 定义用于加载 checkpoint 的参数结构
@dataclasses.dataclass
class Checkpoint:config: str  # 模型对应的训练配置名,如 "pi0_aloha_sim"dir: str     # checkpoint 目录路径(可以是本地或 S3)# 定义默认策略类型占位符结构
@dataclasses.dataclass
class Default:pass  # 使用默认模型配置(例如从 DEFAULT_CHECKPOINT 中选择)# 定义主入口参数结构体
@dataclasses.dataclass
class Args:env: EnvMode = EnvMode.ALOHA_SIM         # 使用的机器人环境default_prompt: str | None = None        # 默认语言提示词port: int = 8000                         # WebSocket 服务端口record: bool = False                     # 是否记录策略输出(用于调试)policy: Checkpoint | Default = dataclasses.field(default_factory=Default)# 定义每个环境对应的默认 checkpoint
DEFAULT_CHECKPOINT: dict[EnvMode, Checkpoint] = {EnvMode.ALOHA: Checkpoint(config="pi0_aloha",dir="s3://openpi-assets/checkpoints/pi0_base",),EnvMode.ALOHA_SIM: Checkpoint(config="pi0_aloha_sim",dir="s3://openpi-assets/checkpoints/pi0_aloha_sim",),EnvMode.DROID: Checkpoint(config="pi0_fast_droid",dir="s3://openpi-assets/checkpoints/pi0_fast_droid",),EnvMode.LIBERO: Checkpoint(config="pi0_fast_libero",dir="s3://openpi-assets/checkpoints/pi0_fast_libero",),
}

其中,class Args 使用 Tyro 来从命令行解析参数,包括以下选项:

  • --env:选择环境,如 ALOHA, DROID(仅在使用默认模型时起作用)
  • --default_prompt:语言提示词(自然语言)
  • --port:监听的端口(默认 8000)
  • --record:是否开启动作记录(用于调试)
  • --policy:加载指定 checkpoint,支持:1. Checkpoint(config="...", dir="...")  2. Default() 使用内置 checkpoint

3 加载策略模型

# 从默认环境创建策略模型
def create_default_policy(env: EnvMode, *, default_prompt: str | None = None) -> _policy.Policy:if checkpoint := DEFAULT_CHECKPOINT.get(env):return _policy_config.create_trained_policy(_config.get_config(checkpoint.config),  # 加载配置checkpoint.dir,                         # 加载参数default_prompt=default_prompt           # 设置默认语言提示)raise ValueError(f"Unsupported environment mode: {env}")# 从命令行参数创建策略模型
def create_policy(args: Args) -> _policy.Policy:match args.policy:case Checkpoint():  # 如果显式指定 checkpointreturn _policy_config.create_trained_policy(_config.get_config(args.policy.config),args.policy.dir,default_prompt=args.default_prompt)case Default():     # 否则使用默认模型return create_default_policy(args.env, default_prompt=args.default_prompt)

分两种情况:

1. 手动指定模型与路径,即增加参数 --policy:

--policy 'Checkpoint(config="pi0_aloha", dir="s3://openpi-assets/checkpoints/pi0_base")'

2. 使用内置默认策略(会从 S3 下载),即不指定参数 --policy:

uv run scripts/serve_policy.py --env ALOHA --default_prompt='fold the towel'

4 启动推理服务

# 主逻辑函数
def main(args: Args) -> None:policy = create_policy(args)            # 加载策略对象policy_metadata = policy.metadata       # 获取策略的元信息if args.record:                         # 如果启用记录,包裹为记录器policy = _policy.PolicyRecorder(policy, "policy_records")# 获取本机 IP 和主机名(日志打印)hostname = socket.gethostname()local_ip = socket.gethostbyname(hostname)logging.info("Creating server (host: %s, ip: %s)", hostname, local_ip)# 创建 WebSocket 推理服务对象server = websocket_policy_server.WebsocketPolicyServer(policy=policy,host="0.0.0.0",               # 监听所有接口port=args.port,               # 指定端口metadata=policy_metadata,    # 附加元信息)server.serve_forever()           # 启动阻塞服务循环# 脚本入口:解析 CLI 参数并运行主函数
if __name__ == "__main__":logging.basicConfig(level=logging.INFO, force=True)  # 初始化日志main(tyro.cli(Args))  # 使用 tyro 从命令行解析 Args 并运行

启动一个 WebSocket 服务端,监听端口,等待来自主控系统(如 main.py)的动作请求,完成如下功能:

  • 接收来自客户端的 observation(图像、语言提示等)
  • 执行 policy.infer(...) 
  • 返回预测的动作结果

5 使用方法总结

5.1 使用方法

✅ 最简单用法(使用默认模型):

uv run scripts/serve_policy.py --env ALOHA --default_prompt='fold the towel'

自动从 S3 下载 pi0_aloha 的默认模型,并运行推理服务器,端口0.0.0.0:8000

✅ 使用本地模型:

uv run scripts/serve_policy.py policy:checkpoint \--policy.config=pi0_aloha \--policy.dir=/home/yejiangchen/.cache/openpi/openpi-assets/checkpoints/pi0_aloha_towel

✅ 启用推理行为记录:

uv run scripts/serve_policy.py --record ...

将推理行为记录下来,便于调试

如果在使用本地模型时出现 bug,运行以下命令查看:

uv run scripts/serve_policy.py policy:checkpoint --help

运行成功可以看到:

可以看到日志:

  • 模型已经被正常加载(包括 JAX/Flax 环境、参数、norm stats)
  • 推理服务已启动,在 0.0.0.0:8000 监听 WebSocket 请求
  • 各种 INFO 日志都是正常的底层库启动信息(比如尝试加载 rocm、tpu,最后还是用的 CUDA/CPU,不影响使用)
  • 检查点参数与归一化参数(norm stats)都已找到并成功加载

5.2 问题分析

可以看到 GPU 启动问题,检查 JAX 是否用上 GPU,输入:

(pi0) yejiangchen@yejiangchen-System-Product-Name:~/Desktop/Codes/openpi-main$ python
Python 3.11.11 (main, Dec 11 2024, 16:28:39) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import jax
>>> print(jax.devices())
[CudaDevice(id=0)]

可以看到:jax.devices() 输出为 [CudaDevice(id=0)],这说明 JAX 在当前环境下已经可以正确识别并调用 GPU(CUDA)。 CUDA 驱动、jax、jaxlib 安装都没有问题

其实只要 jax.devices() 显示 CudaDevice,模型实际计算就会在 GPU 上执行,即便启动日志没高亮显示 gpu 关键字也没关系

JAX/Flax 框架有时不会像 PyTorch 那样在日志里明确输出 “Using CUDA”。它只会在代码第一次涉及到数组/张量运算时,将数据移动到 GPU。如果已经能看到 [CudaDevice(id=0)],说明后续所有计算都会尽量在 GPU 上进行

运行时使用 nvtop 查看 GPU 占用:

安装:

sudo apt install nvtop

使用:

nvtop

可以看到 GPU 基本拉满了

相关文章:

openpi π₀ 项目部署运行逻辑(三)——策略推理服务器 serve_policy.py

π₀ 主控脚本都在 scripts 中: 其中,serve_policy.py 是 openpi 中的策略推理服务端脚本,作用为:启动一个 WebSocket 服务器,加载预训练策略模型,等待外部请求(如来自 main.py 的控制程序&…...

WEB3—— 简易NFT铸造平台(ERC-721)-入门项目推荐

3. 简易NFT铸造平台(ERC-721) 目标:用户可以免费铸造一个 NFT,展示在前端页面。 内容: 编写 ERC-721 合约,每个地址可铸造一个 NFT。 提供 API: POST /mint:铸造 NFT(调…...

基于vue框架的独居老人上门护理小程序的设计r322q(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,护理人员,服务预约,服务评价,服务类别,护理项目,请假记录 开题报告内容 基于Vue框架的独居老人上门护理小程序的设计开题报告 一、研究背景与意义 (一)研究背景 随着社会老龄化的加剧,独居老…...

Android 15 控制亮屏灭屏接口实现

Android 15 控制亮屏灭屏接口实现 在 Android 系统开发中,控制设备的亮屏和灭屏是一个常见需求,尤其是在一些特定场景下,如智能家居控制、定时任务等。本文将详细介绍如何在 Android 15 中实现系统级别的亮屏和灭屏控制。 系统修改方案 为了实现更可靠的亮屏和灭屏控制,…...

【前端】Hexo一键生成目录插件推荐_放入Hexo博客

效果 使用 安装 npm install hexo-auto-toc插件会自动对<article>包含下的所有内容进行解析&#xff0c;自动生成目录。如果你的文章页面结构中内容没被<article>包裹&#xff0c;需要自行添加它&#xff08;即blog文件夹下的index.html&#xff09;查看效果 hex…...

每日一题——提取服务器物料型号并统计出现次数

提取服务器物料型号并统计出现次数 一、题目描述&#x1f4a1; 输入描述&#xff1a;&#x1f4e4; 输出描述&#xff1a; 二、样例示例&#x1f3af; 示例1&#x1f3af; 示例2 三、解题思路1. 子串提取策略&#xff1a;正则匹配2. 统计策略&#xff1a;哈希映射3. 输出策略 四…...

宫格导航--纯血鸿蒙组件库AUI

摘要&#xff1a; 宫格导航(A_GirdNav)&#xff1a;可设置导航数据&#xff0c;建议导航项超过16个&#xff0c;可设置“更多”图标指向的页面路由。最多显示两行&#xff0c;手机每行最多显示4个图标&#xff0c;折叠屏每行最多6个图标&#xff0c;平板每行最多8个图标。多余图…...

RNN 循环神经网络:原理与应用

一、RNN 的诞生背景 传统神经网络&#xff08;如 MLP、CNN&#xff09;在处理独立输入时表现出色&#xff0c;但现实世界中存在大量具有时序依赖的序列数据&#xff1a; 自然语言&#xff1a;"我喜欢吃苹果" 中&#xff0c;"苹果" 的语义依赖于前文 "…...

React---day2

2、jsx核心语法 2.1 class 和java很像啊 <script>// 定义一个对象class Person {//构造函数constructor(name , age){this.name name;this.age age;}// 定义一个方法sayHello(){console.log(hello ${this.name});}}// 创建一个对象Person1 new Person(张三 , 18);//…...

若依框架 账户管理 用户分配界面解读

下载下来若依网站后 先对 后端代码进行解读 首先项目架构&#xff1a; 一般用 admin 这个比较多进行二次开发 其他 rouyi-common,rouyi-framework:为公共部分 rouyi-generator&#xff1a;代码生成部分 ruoyi-quartz&#xff1a;定时任务 ruoyi-system&#xff1a;系统任务 …...

文档贡献 | 技术文档贡献流程及注意事项(保姆级教程)

内容目录 一、注册流程 二、创建分支&#xff08;Fork&#xff09; 三、使用GitLab界面更新文件的MR流程 四、使用Git命令行工具更新文件的MR流程 五、注意事项 一、注册流程 1、注册页面 在长安链平台注册页面&#xff0c;输入手机号码 &#xff0c;点击 “获取验证码”…...

open-vscode-server +nodejs 安装

GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/gh_mirrors/op/openvscode-server/?utm_sourceartical_gitcode&ind…...

知行之桥如何将消息推送到钉钉群?

在钉钉平台中&#xff0c;机器人主要分为企业机器人和自定义机器人两类。本文将重点介绍如何通过自定义机器人&#xff0c;实现将知行之桥 EDI 系统的通知消息高效推送至钉钉群&#xff0c;帮助企业第一时间掌握业务动态。 一、在钉钉群中添加自定义机器人 在需要接收知行之桥…...

09《从依赖管理到容器化部署:Maven 全链路实战笔记,解锁 Java 项目自动化构建的终极奥秘》

目录 一、Maven 核心基础强化 &#xff08;一&#xff09;Maven 架构与工作原理 1. 核心组件解析 2. 工作流程图示​编辑 &#xff08;二&#xff09;项目结构深度实践 1. 标准目录扩展说明 2. 多模块项目典型结构示例​编辑 二、依赖管理高级进阶 &#xff08;一&…...

<el-date-picker>组件传参时,选中时间和传参偏差8小时

遇到一个bug&#xff0c;不仔细看&#xff0c;都不一定能发现&#xff0c;bug描述&#xff1a;我们有一个搜索框&#xff0c;里面有一个时间选择器&#xff0c;当我使用<el-date-picker>时&#xff0c;我发现当我选择时分秒之后&#xff0c;显示都正常&#xff0c;但是当…...

ST MCU CAN模块--TTCAN模式浅析

ST MCU CAN模块使用总结 1 前言 ​ 传统CAN 采用事件触发消息传输机制,CSMA/ CD AMP( Carrier-Sense Mult iple Access w ith Co llision Detect ion and Arbit ration on Message Priorit ies, 载波侦听、多路访问、冲突检测、优先级仲裁) 介质访问控制机制, 即多个消息同时…...

MySQL数据库零基础入门教程:从安装配置到数据查询全掌握【MySQL系列】

第1章&#xff1a;认识MySQL 1.1 什么是MySQL&#xff1f; MySQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典MySQL AB公司开发&#xff0c;现由Oracle公司维护。它使用结构化查询语言&#xff08;SQL&#xff09;进行数据库的管理和操…...

动态规划(7):背包问题

引言 背包问题是动态规划中最经典、最重要的问题类型之一,它不仅在算法竞赛中频繁出现,也在实际应用中有着广泛的用途。从资源分配到投资组合优化,从生产计划到网络路由,背包问题的思想几乎无处不在。正因如此,背包问题被誉为动态规划的"必修课",掌握背包问题…...

谷歌浏览器Google Chrome v137.0.7151.41 中文版本版+插件 v1.11.1

一、软件介绍 这个版本解压就可以用&#xff0c;界面是中文的。 保留了核心功能&#xff0c; 二、软件特点 便携性 &#xff1a;解压即可使用&#xff0c;不想用了直接删掉整个文件夹。 增强功能 &#xff1a;通过Chrome增强软件劫持补丁chromev1.11.1 x64 (version.dll)实现多…...

《深入解析UART协议及其硬件实现》-- 第三篇:UART ASIC实现优化与低功耗设计

第三篇&#xff1a;UART ASIC实现优化与低功耗设计 1. ASIC与FPGA设计差异 1.1 标准单元库选型 库类型对设计的影响 &#xff1a; 高性能库&#xff08;High-Speed&#xff09; &#xff1a;使用低阈值电压晶体管&#xff0c;速度快但漏电功耗高&#xff0c;适合关键路径优化…...

Hadoop常用端口号和配置文件

常用端口号有&#xff1a; hadoop2.x Hadoop3.x 访问HDFS端口 50070 9870 访问MR执行情况端口 8088 8088 历史服务器 19888 19888 客户端访问集群端口 9000 8020 常用配置文件 hadoop2.x core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-si…...

Apache Paimon:存储结构、写入及其源码分析

Apache Paimon (此前称为 Flink Table Store)是一种流式数据湖存储技术&#xff0c;采用 LSM&#xff08;Log-Structured Merge-tree&#xff09;树结构来存储数据&#xff0c;支持高吞吐、低延迟的数据摄入和实时查询&#xff0c;尤其适用于流式和批量统一的场景。 1. 创建表…...

19、Python字符串高阶实战:转义字符深度解析、高效拼接与输入处理技巧

适合人群&#xff1a;零基础自学者 | 编程小白快速入门 阅读时长&#xff1a;约6分钟 文章目录 一、问题&#xff1a;Python的转义字符&#xff1f;1、例子1&#xff1a;快递地址格式化打印2、答案&#xff1a;&#xff08;1&#xff09;转义字符 二、问题&#xff1a;Python的…...

国芯思辰| 同步降压转换器CN2020应用于智能电视,替换LMR33620

在智能电视不断向高画质、多功能、智能化发展的当下&#xff0c;其内部电源管理系统的性能至关重要。同步降压转换器可以为智能电视提供稳定、高效的运行。 国芯思辰CN2020是一款脉宽调制式同步降压转换器。内部集成两个功率MOS管&#xff0c;在4.5~18V宽输入电压范围内可以持…...

6个月Python学习计划 Day 8 - Python 函数基础

第一周 Day 1 - Python 基础入门 & 开发环境搭建 Day 2 - 条件判断、用户输入、格式化输出 Day 3 - 循环语句 range 函数 Day 4 - 列表 & 元组基础 Day 5 - 字典&#xff08;dict&#xff09;与集合&#xff08;set&#xff09; Day 6 - 综合实战&#xff1a;学生信息…...

DeepSeek 提示词大全

目录 前言一、提示词基础理论 什么是提示词提示词的类型提示词的基本结构 二、提示词设计原则 明确指令结构化表达情境化需求渐进式引导边界与限制 三、场景化提示词模板 写作创作类角色扮演类信息提取类代码编程类教育学习类商业营销类生活助手类 四、提示词优化技巧 迭代式优…...

俄罗斯无人机自主任务规划!UAV-CodeAgents:基于多智能体ReAct和视觉语言推理的可扩展无人机任务规划

作者&#xff1a;Oleg Sautenkov 1 ^{1} 1, Yasheerah Yaqoot 1 ^{1} 1, Muhammad Ahsan Mustafa 1 ^{1} 1, Faryal Batool 1 ^{1} 1, Jeffrin Sam 1 ^{1} 1, Artem Lykov 1 ^{1} 1, Chih-Yung Wen 2 ^{2} 2, and Dzmitry Tsetserukou 1 ^{1} 1单位&#xff1a; 1 ^{1} 1斯科尔…...

结构性设计模式之Bridge(桥接)

结构性设计模式之Bridge&#xff08;桥接&#xff09; 摘要 桥接模式是一种结构性设计模式&#xff0c;其核心思想是将抽象部分与实现部分分离&#xff0c;使二者能够独立变化。本文通过汽车产品生产案例&#xff08;产品A/B与颜色红/蓝/黄&#xff09;展示了桥接模式的应用&…...

CSS篇-1

1. CSS 有哪些基本选择器&#xff1f;它们的权重是如何表示的&#xff1f; 这是一个关于 CSS 基础且极其重要的问题&#xff0c;因为它直接关系到我们如何精准地控制页面元素的样式&#xff0c;以及在样式冲突时浏览器如何决定哪个样式生效。理解 CSS 选择器及其权重&#xff…...

Android 16系统源码_无障碍辅助(一)认识无障碍服务

前言 Android 的无障碍辅助功能&#xff08;Accessibility&#xff09;是一套专为残障用户或特殊场景设计的核心技术框架&#xff0c;旨在让所有用户都能便捷地操作设备。其功能覆盖视觉、听觉、运动能力和认知障碍支持&#xff0c;同时为开发者提供标准化 API 以实现应用适配…...