Skip to main content

Standalone inference SDK for ACT, SmolVLA, PI0, and PI0.5 policy inference.

Project description

Inference SDK

sparkmind-inference 是一个独立的 Python SDK,用于 ACT、SmolVLA、PI0 和 PI0.5 policy 模型推理。

它只关注一件事:

输入 observation,输出 action / action chunk。

硬件驱动、相机采集、Web API、会话编排、任务状态机等业务逻辑应放在上层业务应用中。

安装

推荐使用 uv 管理隔离环境:

uv venv --python 3.13 .venv
source .venv/bin/activate

从 PyPI 安装:

uv pip install "sparkmind-inference[all,examples]"

安装后 Python import 包名仍然是 sparkmind_inference

from sparkmind_inference import InferenceSDK

SDK 的 ACT / SmolVLA / PI0 / PI0.5 engine 依赖 SparkMind 模型实现。推荐先安装本地 SparkMind,再安装 Inference-SDK:

mkdir -p third_party
git clone https://github.com/Synria-Robotics/SparkMind.git third_party/SparkMind
uv pip install -e "third_party/SparkMind[pi,libero]"
uv pip install -e ".[all,examples]" -c constraints/validated.txt

如果 SparkMind checkout 在其他位置,请先安装该路径,并设置 INFERENCE_SDK_SPARKMIND_PATH 指向它。当前 rc 版本的 pyproject.toml 会声明 sparkmind==1.0.0rc2,确保用户安装到和本 SDK 一起验证过的 SparkMind;本地迁移分支仍可通过 editable install 覆盖。

可选依赖:

uv pip install -e ".[act]" -c constraints/validated.txt
uv pip install -e ".[examples]" -c constraints/validated.txt
uv pip install -e ".[vla]" -c constraints/validated.txt
uv pip install -e ".[all]" -c constraints/validated.txt

如果需要运行 dataset 验证和绘图示例,推荐直接安装:

uv pip install -e ".[all,examples]" -c constraints/validated.txt

pyproject.toml 使用经过验证的版本范围;constraints/validated.txt 固定当前验证环境的顶层依赖版本。当前验证主线是 Python 3.13、外部 LeRobot v0.5.1、SparkMind 1.0.0rc2、transformers 5.3.0。

Hugging Face 下载

预训练好的模型和 LeRobot / LIBERO 数据集可以直接从 Hugging Face 下载。examples/validate_dataset_inference.py--model--dataset 都支持传本地路径或 Hugging Face repo id;传 repo id 时脚本会自动调用 huggingface_hub.snapshot_download(),并缓存到仓库内 .cache/huggingface/

如果访问 Hugging Face 需要代理,可以按你的网络环境设置:

export HTTP_PROXY=http://host:port
export HTTPS_PROXY=http://host:port
export ALL_PROXY=http://host:port

也可以先手动下载到本地再运行验证:

hf download <model_repo_id> --repo-type model --local-dir models/<model_name>
hf download <dataset_repo_id> --repo-type dataset --local-dir data/lerobot/<dataset_name>

Public API Contract

  • 主入口从顶层导入:InferenceSDKObservationSmoothingConfigcreate_enginepredict_action_chunkpredict_action 和 SDK 自定义异常。
  • images 使用相机角色名作为 key,例如 headwrist;可用角色以 metadata.required_cameras 为准。
  • 每张图像应是 BGR 格式的 numpy.ndarray,形状为 (H, W, 3)
  • state 应是一维 numpy.ndarray,维度需要和模型 observation.state 一致。
  • ACT、SmolVLA、PI0 和 PI0.5 作为已验证推理路径;PI0.5 可通过 algorithm_type="pi05" 使用。
  • SDK 对外按 robot-space 处理夹爪,输入/输出最后一维夹爪通常是 [0, 1000]
  • predict_action_chunk()predict_action() 都在调用线程同步执行,不启动后台推理线程。
  • load_policy()、observation 校验和推理错误会抛出 SDK 自定义异常,方便上位机按错误类型处理。
  • LeRobot dataset 里的夹爪如果是归一化 [0, 1],验证脚本会通过 --dataset-gripper-scale auto 自动适配。

同步推理

推荐给业务应用使用高层 InferenceSDK API。它负责加载 policy、校验 observation,并输出一个动作 chunk。

from sparkmind_inference import InferenceSDK, Observation

with InferenceSDK(device="cuda:0") as sdk:
    metadata = sdk.load_policy(
        algorithm_type="pi0",
        checkpoint_dir="/path/to/checkpoint",
        instruction="Pick up the object.",
    )

    observation = Observation(
        images={
            "head": head_bgr,
            "wrist": wrist_bgr,
        },
        state=robot_state,
    )

    action_chunk = sdk.predict_action_chunk("pi0", observation)
    print(action_chunk.shape)  # (metadata.n_action_steps, metadata.action_dim)

真机控制可以使用同步单步 predict_action()。这会在调用线程内执行 engine.step() 并直接返回当前 tick 的一个 action;ACT 可配合同步时间集成提升控制输出稳定性:

from sparkmind_inference import InferenceSDK, Observation, SmoothingConfig

with InferenceSDK(
    device="cuda:0",
    smoothing_config=SmoothingConfig(
        control_fps=30.0,
        enable_temporal_ensemble=True,
        temporal_ensemble_coeff=0.01,
    ),
) as sdk:
    metadata = sdk.load_policy(
        algorithm_type="act",
        checkpoint_dir="/path/to/checkpoint",
    )

    while True:
        observation = Observation(images=read_camera_images(), state=read_robot_state())
        action = sdk.predict_action("act", observation)
        send_robot_action(action)

PI0.5 可使用 algorithm_type="pi05""pi0.5" / "pi0_5" / "pi0-5" 也会自动归一到 pi05

如果只需要执行一次推理,也可以使用一次性 API:

from sparkmind_inference import predict_action, predict_action_chunk

action_chunk = predict_action_chunk(
    algorithm_type="act",
    checkpoint_dir="/path/to/checkpoint",
    images=images,
    state=robot_state,
)

action = predict_action(
    algorithm_type="act",
    checkpoint_dir="/path/to/checkpoint",
    images=images,
    state=robot_state,
)

Advanced Engine API

底层 engine API 仍然保留,适合需要直接控制 load()reset()predict_chunk()step() 的场景。对外集成优先使用高层 InferenceSDK;engine、queue、trace 等内部类型不再从顶层包导出。

from sparkmind_inference import SmoothingConfig, create_engine

engine = create_engine(
    model_type="act",
    device="cuda:0",
    smoothing_config=SmoothingConfig(
        control_fps=30.0,
        aggregate_fn_name="latest_only",
    ),
)

ok, error = engine.load("/path/to/checkpoint")
if not ok:
    raise RuntimeError(error)

try:
    engine.reset()
    action_chunk = engine.predict_chunk(images, state)
    action = engine.step(images, state)
finally:
    engine.unload()

说明:

  • predict_chunk():直接返回当前 observation 对应的完整动作 chunk,适合离线验证和曲线对比。
  • step() / select_action():走 engine 内部动作队列,每次返回一个控制 tick 的动作。

可选推理增强

ACT 可以在同步 engine.step() 路径开启 LeRobot 风格时间集成。开启后每个控制 tick 都会重新预测一个 action chunk,并在线融合重叠时间步的动作:

engine = create_engine(
    model_type="act",
    device="cuda:0",
    smoothing_config=SmoothingConfig(
        enable_temporal_ensemble=True,
        temporal_ensemble_coeff=0.01,
    ),
)

SmolVLA、PI0 和 PI0.5 可以开启 RTC。rtc_inference_delay_steps 是静态延迟步数;如果你的控制环能测出实际推理延迟,可以按 tick 数传入:

engine = create_engine(
    model_type="pi05",
    device="cuda:0",
    smoothing_config=SmoothingConfig(
        enable_rtc=True,
        rtc_prefix_attention_schedule="LINEAR",
        rtc_execution_horizon=10,
        rtc_inference_delay_steps=0,
    ),
)

说明:ACT 时间集成当前用于同步 engine.step() / select_action();SmolVLA、PI0 和 PI0.5 的 RTC 也在同步推理路径中生效。

同步参数

  • control_fps:控制频率;同步 step() 会据此计算动作队列时间步。
  • action_chunk_size:可选,覆盖 checkpoint 里的 chunk_size,表示模型一次 forward 的动作 horizon。
  • n_action_steps:可选,覆盖 checkpoint 里的 n_action_steps,表示每次推理实际返回并进入动作队列的动作数,必须 <= action_chunk_size/chunk_size
  • aggregate_fn_name:同步 step() 内部动作队列出现重叠 timestep 时的融合方式,支持 latest_onlyweighted_averageaverageconservative
  • fallback_mode:同步动作队列为空时的行为;hold 使用当前 robot state,repeat 重复上一条动作。
  • enable_gripper_clamping:是否对夹爪动作做速度限制,真机可开启,离线曲线对比时可关闭。
  • enable_temporal_ensemble:为 ACT 的同步 step() 开启在线时间集成。
  • enable_rtc:为 SmolVLA / PI0 / PI0.5 开启 RTC。
  • rtc_prefix_attention_schedule:RTC 前缀注意力权重,支持 ZEROSONESLINEAREXP
  • rtc_execution_horizon / rtc_inference_delay_steps:RTC 执行窗口和静态推理延迟步数。

Alicia-M 真机控制

examples/alicia_m_sync_runtime.py 直接调用 Alicia-M-SDK,使用同步 InferenceSDK.predict_action()

  • Alicia-M-SDK 读取 [6 关节 rad, gripper 0~1000],送入 policy 前把 6 个关节转换成 degree。
  • 默认按绝对关节/夹爪目标发布,action[:6] 是 6 个关节 degree 目标,脚本用 joint_format="deg" 交给 Alicia-M-SDK;7 维 action 的 action[6] 是夹爪 [0, 1000]

如果 Alicia-M-SDK 没安装成包,示例会尝试加载同级目录 ../Alicia-M-SDK;也可以显式指定:

export ALICIA_M_SDK_PATH=/path/to/Alicia-M-SDK

OpenCV 相机示例:

python examples/alicia_m_sync_runtime.py \
  --model-type act \
  --checkpoint-dir /path/to/act_checkpoint \
  --device cuda:0 \
  --port /dev/ttyACM0 \
  --camera head=0 \
  --camera wrist=2 \
  --fps 30

ACT 可以开启同步时间集成:

python examples/alicia_m_sync_runtime.py \
  --model-type act \
  --checkpoint-dir /path/to/act_checkpoint \
  --device cuda:0 \
  --port /dev/ttyACM0 \
  --camera head=0 \
  --camera wrist=2 \
  --fps 30 \
  --temporal-ensemble

act 可加 --temporal-ensemblesmolvla / pi0 / pi05 可加 --enable-rtc

Dataset 验证

离线逐帧验证是当前正确性验证主线,用于确认模型预处理、权重加载和输出尺度是否正确。默认 raw 模式每帧调用 predict_chunk(),比较 chunk[0] 和 dataset action:

python examples/validate_dataset_inference.py \
  --model /path/to/act_checkpoint \
  --model-type act \
  --dataset /path/to/lerobot_dataset \
  --episode 0 \
  --execution-mode raw

同步 step 模式用于验证控制环真实会执行到的动作,适合 ACT temporal ensemble 或 RTC:

python examples/validate_dataset_inference.py \
  --model /path/to/act_checkpoint \
  --model-type act \
  --dataset /path/to/lerobot_dataset \
  --episode 0 \
  --execution-mode step \
  --temporal-ensemble

PI0 / PI0.5 示例:

python examples/validate_dataset_inference.py \
  --model /path/to/pi05_checkpoint \
  --model-type pi05 \
  --dataset /path/to/lerobot_dataset \
  --episode 0 \
  --instruction "pick and place" \
  --enable-rtc \
  --rtc-execution-horizon 10

如果只是做曲线对比,优先使用 raw 模式排除同步动作队列影响:

python examples/validate_dataset_inference.py \
  --model /path/to/pi05_checkpoint \
  --model-type pi05 \
  --dataset /path/to/lerobot_dataset \
  --episode 0 \
  --instruction "pick and place" \
  --execution-mode raw

验证结果会写入:

outputs/validate_dataset_inference/<timestamp>_<model>_<dataset>_<scope>/
├── plots/
├── csv/
├── summary.csv
└── summary.json

更多说明见 examples/validate_dataset_inference.md

LIBERO 仿真闭环验证

SmolVLA 的 LIBERO 闭环验证应优先使用 LeRobot official env wrapper,并在同一 observation 上同时计算 official policy action 和 SDK action。这样可以排除裸 OffScreenRenderEnv 的 reset、camera flip、settle step 和 action queue 差异。

python examples/compare_libero_sim_actions.py \
  --model lerobot/smolvla_libero \
  --benchmark libero_spatial \
  --task-id 0 \
  --max-steps 280 \
  --device cuda:0 \
  --execute sdk \
  --sdk-selection fifo \
  --save-video

该脚本会保存 action_comparison.csvsummary.jsonrollout_render.mp4。SmolVLA official eval 使用 FIFO chunk queue;不要用 wall-clock timestamp queue 判断 LIBERO 仿真正确性。

常见问题

PI0 / PI0.5 曲线明显不对

建议先用同步 raw 路径确认模型本身:

python examples/validate_dataset_inference.py \
  --model /path/to/pi0_checkpoint \
  --model-type pi0 \
  --dataset /path/to/lerobot_dataset \
  --episode 0 \
  --instruction "pick and place" \
  --execution-mode raw
  • 如果 raw 也不对,优先检查 checkpoint、config.json、processor stats、模型类型和 instruction。
  • 如果 raw 正常但 step 不对,再检查 n_action_stepscontrol_fps、ACT 时间集成或 RTC 配置。
  • PI0 / PI0.5 的权重加载现在会严格校验 missing/unexpected keys;如果 checkpoint 没有干净加载,SDK 会直接报错,避免误用随机初始化权重。
  • LeRobot 官方 PI checkpoint 会尽量保持和官方 processor 一致的 state/action 边界语义;legacy 导出格式继续使用 SDK stats 归一化。

离线环境加载 PI0 / PI0.5 tokenizer 失败

请先把 tokenizer 下载到本地,并通过环境变量指定:

export PI0_TOKENIZER_PATH=/path/to/local/paligemma-tokenizer
# PI0.5 也可使用专用环境变量
export PI05_TOKENIZER_PATH=/path/to/local/paligemma-tokenizer

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sparkmind_inference-1.0.0rc2.tar.gz (95.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sparkmind_inference-1.0.0rc2-py3-none-any.whl (73.8 kB view details)

Uploaded Python 3

File details

Details for the file sparkmind_inference-1.0.0rc2.tar.gz.

File metadata

  • Download URL: sparkmind_inference-1.0.0rc2.tar.gz
  • Upload date:
  • Size: 95.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for sparkmind_inference-1.0.0rc2.tar.gz
Algorithm Hash digest
SHA256 8bf4632ee5b2bca0d16157b5e04e2d4a2d4567152bf266b886e436f70c0e624a
MD5 819540bc0e2933b8eb25d385f5f9d0ec
BLAKE2b-256 b942b1464c6986358ca9be0ede81646a6e7f83c0e6ad3b9b36842387fa51e9d2

See more details on using hashes here.

File details

Details for the file sparkmind_inference-1.0.0rc2-py3-none-any.whl.

File metadata

File hashes

Hashes for sparkmind_inference-1.0.0rc2-py3-none-any.whl
Algorithm Hash digest
SHA256 1f9a24cb92daecf7a8291055af39735344f1aaf0fbf3fb945178f8c5425351eb
MD5 7bc8328798bc1e131e3c1aea5120cdb9
BLAKE2b-256 efb880e8f5bf168995ea494732eec2e33589e567877b416ae5b58114bb4c6094

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page