分布式执行模式
相关源文件
生成此 wiki 页面时使用了以下文件作为上下文:
src/inference_service/inference_service/core/_policy_config.py
src/inference_service/inference_service/core/ascend_om/init.py
src/inference_service/inference_service/core/ascend_om/policy_wrapper.py
src/inference_service/inference_service/core/compiled_policy.py
src/inference_service/inference_service/core/postprocessor.py
src/inference_service/inference_service/core/preprocessor.py
src/inference_service/inference_service/core/pure_inference_engine.py
src/inference_service/inference_service/core/rknn/policy_wrapper.py
src/inference_service/inference_service/pure_inference_node.py
目的与范围
IB-Robot 中的 Distributed Execution Mode 提供基于局域网(LAN)的 device-edge-cloud 架构,用于计算卸载。该模式专为缺少 GPU 资源、无法运行大规模神经网络策略的轻量机器人控制器设计,例如 Raspberry Pi、工业 PC 或 edge boards src/inference_service/README.md:28-30。
通过拆分流水线,机器人控制器(Device)负责感知和轻量 CPU 任务,高性能服务器(Edge/Cloud)负责繁重的矩阵乘法。该架构保持与 pull-based action_dispatch 系统兼容,同时避免高带宽视频流占满网络 src/inference_service/README.md:31-35。
来源:src/inference_service/README.md:28-37,src/inference_service/README.en.md:26-35
架构概述
分布式流水线拆分为三个无 ROS 依赖的核心组件:TensorPreprocessor、PureInferenceEngine 和 TensorPostprocessor src/inference_service/README.md:9-12。
组件 |
代码实体 |
角色 |
位置 |
|---|---|---|---|
Edge Proxy |
|
运行 |
Robot Controller |
Inference Server |
|
运行 |
Compute Server |
系统数据流与代码实体
下图使用 VariantsList 协议进行 tensor 传输,将逻辑数据流映射到具体代码实体和 ROS 2 话题。
graph TB
subgraph DeviceNode["Device Machine (Robot / Sim)"]
AD["action_dispatcher_node"]
LPN["lerobot_policy_node.py<br/>(Asynchronous Proxy)"]
PRE["TensorPreprocessor<br/>(core/preprocessor.py)"]
POST["TensorPostprocessor<br/>(core/postprocessor.py)"]
EV["threading.Event"]
end
subgraph CloudNode["GPU Machine (Edge / Cloud)"]
PIN["pure_inference_node.py"]
ENGINE["PureInferenceEngine<br/>(core/pure_inference_engine.py)"]
CONV["TensorMsgConverter<br/>(tensormsg/converter.py)"]
end
AD -->|"Goal Request"| LPN
LPN --> PRE
PRE -->|"Serialized Tensors"| PUB_BATCH["/preprocessed/batch"]
LPN -.->|"Wait"| EV
PUB_BATCH -.->|"LAN (DDS)"| SUB_BATCH["/preprocessed/batch"]
SUB_BATCH --> PIN
PIN --> CONV
CONV --> ENGINE
ENGINE --> PIN
PIN -->|"Serialized Action"| PUB_ACT["/inference/action"]
PUB_ACT -.->|"LAN (DDS)"| SUB_ACT["/inference/action"]
SUB_ACT --> LPN
LPN --> EV
EV --> POST
POST -->|"Goal Result"| AD
来源:src/inference_service/README.md:39-54,src/inference_service/inference_service/pure_inference_node.py:38-46,src/inference_service/inference_service/core/preprocessor.py:73-81,src/inference_service/inference_service/core/postprocessor.py:70-77
实现细节
异步代理(Device 侧)
在分布式模式中,lerobot_policy_node.py 作为异步代理。它不在本地运行模型,而是:
按需采集传感器数据 src/inference_service/README.md:32。
在本地 CPU 上执行
TensorPreprocessorsrc/inference_service/README.md:32。发布轻量 tensor batch,并使用
threading.Event挂起当前线程 src/inference_service/README.md:32。收到服务器结果后唤醒,执行
TensorPostprocessorsrc/inference_service/README.md:33。
Pure Inference Node(Server 侧)
PureInferenceNode 是 PureInferenceEngine 的无状态封装。它提供:
协议转换:使用
TensorMsgConverter在 ROSVariantsList消息和 PyTorch tensor 之间桥接 src/inference_service/inference_service/pure_inference_node.py:106-137。Request ID 跟踪:从输入 batch 中提取
task.request_id,并作为action.request_id回传,以便 device 匹配异步响应 src/inference_service/inference_service/pure_inference_node.py:108-133。后端灵活性:通过
PolicyWrapper抽象支持cuda、cpu、npu、ascend_om和rknn后端 src/inference_service/inference_service/core/pure_inference_engine.py:29-49。
来源:src/inference_service/inference_service/pure_inference_node.py:38-98,src/inference_service/inference_service/core/pure_inference_engine.py:169-182,src/inference_service/README.md:189-200
配置与部署
该模式通过 robot_config YAML 切换,无需修改 launch 文件 src/inference_service/README.md:58-60。
YAML 配置
# src/robot_config/config/robots/your_robot.yaml
control_modes:
model_inference:
inference:
enabled: true
execution_mode: "distributed" # Set to 'monolithic' for single-machine
model: so101_act
启动流水线
Device(Robot): 使用
execution_mode:=distributed启动机器人栈。这会避免把模型加载到本地内存中 src/inference_service/README.md:128-136。ros2 launch robot_config robot.launch.py \ robot_config:=so101_single_arm \ control_mode:=model_inference \ execution_mode:=distributed
Edge/Cloud(Server): 启动专用推理服务器 src/inference_service/README.md:142-145。
ros2 launch inference_service cloud_inference.launch.py \ policy_path:=/path/to/model \ device:=cuda
硬件后端支持
PureInferenceEngine 支持专用硬件的编译后端:
Ascend OM:用于使用
.om文件的 Huawei Ascend NPU src/inference_service/inference_service/core/ascend_om/policy_wrapper.py:29-34。RKNN:用于 Rockchip NPU(例如 RK3588)src/inference_service/inference_service/core/pure_inference_engine.py:41。
来源:src/inference_service/README.md:156-187,src/inference_service/inference_service/core/pure_inference_engine.py:55-97