alt.freeweights.minicpm / MiniCPM-RobotManip
From: openbmb <huggingface.co/openbmb>Newsgroups: alt.freeweights.minicpmSubject:

MiniCPM-RobotManip

Date: 2026-11-15Commit: 29cb257Signed: 2DC28CC7B26A283B ✓

Robotics model with 1.5B parameters. Safetensors weights, 3.60 GB in all. Published by openbmb under Apache-2.0.

1.5B params3.60GBMiniCPM-RobotManipsafetensorspermissive
FactsParams1.5BSize3.60 GBFormatssafetensorsTaskroboticsLicenseApache-2.0From sourcepermissive
$ fw get openbmb/MiniCPM-RobotManip
# manifest sha256 5850df2dd2a5… · 3.60 GB · 21 files
$ fw verify ./MiniCPM-RobotManip openbmb/MiniCPM-RobotManip
From sourceHosted (signed)openbmb/MiniCPM-RobotManipLast check: 2026-11-15 03:48 UTC

Get help: custom fine-tune or private deploy. We review your setup before we quote.

Works with

Runs with

Ranked by fit to this model (safetensors), then by GitHub stars.

Overview

Size
3.60 GB
Weights
3.54 GB (safetensors)
Parameters
1.5B
Formats
safetensors
Task
robotics
License
Apache-2.0 (permissive)
Files
21, each with a sha256
Publisher
openbmb
Added
2026-11-15
Section
alt.freeweights.minicpm
Lineage

Original release from the publisher.

Where these bytes come from
Publisher at the pinned commit→You

Sources are tried in order. A file counts only when its size and sha256 match the manifest. Sources are checked when you ask for them, not on a timer.

Sources
BadgeHostLast checkResult
From sourcehuggingface.co2026-11-15 03:48 UTCpassed

Model card

From the publisher at commit 29cb257. Shown as plain text with links; images open at the publisher.

MiniCPM-RobotManip

A Smarter and Faster On-Device AI Brain for Robots

Image: github Github &nbsp;|

Image: Discord Discord &nbsp;|

MiniCPM-RobotManip is a 1.5B vision-language-action model for embodied manipulation with the following highlights:

Generalist Manipulation: A unified 1.5B generalist policy that uses one set of weights across all downstream tasks and outperforms larger models such as π₀.₅ and Qwen-VLA across representative evaluations.

Streaming Context: Historical observations are continuously incorporated into the model context through streaming inference, reducing per-step compute from 125 TFLOPs to 3.3 TFLOPs while retaining 60 frames of history and supporting up to one minute of visual memory. This moves VLA beyond reactive action generation from single-frame observations toward continuous decision-making grounded in long-horizon visual context.

Efficient Inference: Inherits MiniCPM-V 4.6's visual token compression, reducing each frame from 256 to 64 visual tokens for 4× compression. With H100, BF16, and single-frame input, model-forward latency per decision step is 120 ms, compared with 234 ms for π0.5. The measurement excludes task autoregressive decoding.

Image: MiniCPM-RobotManip task demonstrations

Benchmark Results#

Image: manip_benchmark

Inference Example#

Please Ensure transformers==5.7.0

from __future__ import annotations

import argparse import json from pathlib import Path from typing import Sequence

import numpy as np import torch from PIL import Image from transformers import AutoModel, AutoProcessor

STATE_DIM = 80 IMAGE_SIZE = (448, 448)

class MiniCPMVLAInference: """Processor and model wrapper for single-sample VLA inference."""

def __init__( self, checkpoint_path: str | Path = "openbmb/MiniCPM-RobotManip", device: str | torch.device | None = None, ): if device is None: device = "cuda" if torch.cuda.is_available() else "cpu" self.device = torch.device(device) checkpoint = str(checkpoint_path) self.processor = AutoProcessor.from_pretrained(checkpoint, trust_remote_code=True) self.model = AutoModel.from_pretrained(checkpoint, trust_remote_code=True) self.model.to(self.device).eval()

@staticmethod def _load_images(images: Sequence[str | Path | Image.Image | np.ndarray]) -> list[np.ndarray]: if not images: raise ValueError("At least one image is required") loaded = [] for image in images: if isinstance(image, (str, Path)): with Image.open(image) as pil_image: array = np.asarray(pil_image.convert("RGB")) elif isinstance(image, Image.Image): array = np.asarray(image.convert("RGB")) elif isinstance(image, np.ndarray): array = image else: raise TypeError(f"Unsupported image type: {type(image)!r}") if array.ndim != 3 or array.shape[-1] != 3: raise ValueError(f"Expected an HxWx3 image, got shape {array.shape}") # Match the training pipeline's ResizeImage(size=(448, 448)), # including PIL's default resize interpolation. resized = Image.fromarray(array).resize(IMAGE_SIZE) loaded.append(np.asarray(resized).copy()) return loaded

def preprocess(self, images: Sequence, text: str) -> dict[str, torch.Tensor]: """Apply the same MiniCPM-V chat template and processor as training.""" content = [ {"type": "image", "image": image} for image in self._load_images(images) ] content.append({"type": "text", "text": text}) messages = [{"role": "user", "content": content}] inputs = self.processor.apply_chat_template( messages, tokenize=True, add_generation_prompt=True, return_dict=True, return_tensors="pt", processor_kwargs={"padding": False}, ) return { key: value.to(self.device) for key, value in inputs.items() if isinstance(value, torch.Tensor) }

def _prepare_state(self, state: torch.Tensor | np.ndarray | Sequence[float]) -> torch.Tensor: state = torch.as_tensor(state, dtype=torch.float32, device=self.device) if state.ndim == 1: state = state.unsqueeze(0).unsqueeze(0) elif state.ndim == 2: state = state.unsqueeze(1) if state.shape != (1, 1, STATE_DIM): raise ValueError(f"state must have shape (80,), (1, 80), or (1, 1, 80); got {tuple(state.shape)}") return state

@torch.inference_mode() def predict( self, images: Sequence[str | Path | Image.Image | np.ndarray], text: str, state: torch.Tensor | np.ndarray | Sequence[float] | None = None, embodiment_id: int = 0, seed: int | None = None, ) -> torch.Tensor: """Return one action chunk with shape (30, 80) on CPU.""" if not 0 <= embodiment_id < self.model.action_head.max_num_embodiments: raise ValueError( f"embodiment_id must be in [0, {self.model.action_head.max_num_embodiments - 1}]" ) if state is None: state = torch.zeros(STATE_DIM) state_tensor = self._prepare_state(state) embodiment = torch.tensor([embodiment_id], dtype=torch.long, device=self.device) if seed is not None: torch.manual_seed(seed) if self.device.type == "cuda": torch.cuda.manual_seed_all(seed)

vlm_inputs = self.preprocess(images, text) actions = self.model.predict_action( state=state_tensor, embodiment_id=embodiment, **vlm_inputs, ) return actions[0].float().cpu()

def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--image", action="append", required=True, help="Input image; repeat for multiple views") parser.add_argument("--text", required=True, help="Robot instruction/prompt") parser.add_argument("--device", default=None, help="Default: cuda if available, otherwise cpu") state_group = parser.add_mutually_exclusive_group() state_group.add_argument("--state-file", help="A .npy file containing 80 state values") state_group.add_argument("--state", nargs=STATE_DIM, type=float, metavar="VALUE") parser.add_argument("--embodiment-id", type=int, default=0) parser.add_argument("--seed", type=int, default=None) parser.add_argument("--output", help="Optional output .npy path; otherwise print JSON") return parser.parse_args()

if __name__ == "__main__": args = parse_args() if args.state_file: state = np.load(args.state_file) elif args.state is not None: state = args.state else: state = np.zeros(STATE_DIM, dtype=np.float32)

infer_runner = MiniCPMVLAInference( checkpoint_path="openbmb/MiniCPM-RobotManip", device=args.device, ) action = infer_runner.predict( images=args.image, text=args.text, state=state, embodiment_id=args.embodiment_id, seed=args.seed, ) if args.output: output_path = Path(args.output) output_path.parent.mkdir(parents=True, exist_ok=True) np.save(output_path, action.numpy()) print(f"Saved action {tuple(action.shape)} to {output_path}") else: print(json.dumps(action.tolist()))

Acknowledgement#

This project builds on and references starVLA and LeRobot. We thank the authors for their open-source contributions.

License#

Model weights and code are open-sourced under the Apache-2.0 license.

Files

21 files · 3.60 GBWeights 3.54 GB (safetensors). Sizes and sha256 from the signed manifest.
Show all 21 files with their sha256
FileSizesha256
.gitattributes1.93 KB42912cc38193acd98ac7b6fc95021a67f7d70cc5f5a4c20e4b6668a7c3430150
README.md9.09 KB61e0a3b25e7765d4b80bbd5c45a93d6630ac2d5a7434675dfe0fad6a7f20fa36
X_logo.jpg5.46 KBb52adc61484a7e61fc1ff433f5176e90505831bc3c9708133bb4811927ad2af5
action_head.py16.2 KB40dfb811a00fc7c716c0e329055231cb1fe9fd58bf8678bf42590a389a306341
chat_template.jinja7.30 KBdfe1fa43a3444f065406d3a2b9aa315602f5c146b80cf22e0426a6c1466d85aa
config.json4.42 KB9fd8d0c167ff8e79939d3e5ad7b37dd0a6ef83a00ddea1d9f6d7be79959a19a4
configuration_minicpm_vla.py1.16 KBba9d3422cfda9c44f6810c02c57f328974446ae4c148c4394a7d7ffce42758af
discord.jpeg99.2 KBf9e1ff687c640827320d7acd4cde532e6f2af416c2b6347955d1a81e20b76ddc
discord_logo.png272 B43a6549949cfd02dec4221b8e59f3ab582729da2dffa91cca116777b88b3edd2
feishu_logo.png512 Bc203b3b67cca3220f647befa1ea8523533aff679fca4c96ce9d8b400f9c62a77
generation_config.json214 B355e944b910ce784e4c561d67b8e7fee9c6c89385cc790e5a6affb7747b1f118
github_logo.png509 B303e9a1849c3780bb483955093d1e3f2537ef39d923ec0e8dea87d45e0951f36
manip_benchmark.png173 KB2899f1a811b52a55b8f531dda073a3e0cc2c0468797db3587654045da011a995
manip_case_en.gif31.5 MB47e593bfeb7ec800c36dbc22eeeaed61775d61b91de0e0d9b4cafb8d89ba99f1
model.safetensors3.54 GB404314e1f9599d3162fdaa46e4d0c40acf82c27bc7aee2e15e7fe675fb1635b7
modeling_minicpm_vla.py3.62 KBbd5d0bd2d5549e138b293726c85ea384581e16cb6a561c8f5d6505924af75841
modelscope_logo.png6.19 KB7ad5f7b9594a7a0df93505448b1d6cfc92ad50e324d5de0d61bd415b42f035b0
preprocessor_config.json315 Beb7cd430865c06eeaad22fcd28c6c606ce26b6fd54d3d6d0e99370779b3197a5
tokenizer.json20.0 MB33861e37bb955af1e3f3061182b820f347eba2b9c2c1011c82794bf0d6e77b54
tokenizer_config.json9.00 KBf08d15030f1157ca8826aa92f64408dba6ecf50292f5dd74a6287d6aec0c4660
x.png72.8 KBf9b731e0a8d42acfbf4201a8f54e567f7a1010adb81765d6f4c5d082b7a7b1d7
VersionsEach time the pinned upstream commit or file list changed in this repo. Newest first.
Upstream commitDateContents
29cb257541 pinned now2026-11-15 03:48 UTC21 files · 3.60 GB

Use it

$ fw get openbmb/MiniCPM-RobotManip
# manifest sha256 5850df2dd2a5… · 3.60 GB · 21 files
$ fw verify ./MiniCPM-RobotManip openbmb/MiniCPM-RobotManip
fw.pyChecks the signature and every sha256, tries each source in order, resumes.
$ python3 fw.py get https://freeweights.allternit.com/manifests/openbmb/MiniCPM-RobotManip.json --dir ./MiniCPM-RobotManip $ python3 fw.py verify ./MiniCPM-RobotManip ./openbmb__MiniCPM-RobotManip.json
hfThe Hugging Face CLI with one setting. Same repo id.
$ HF_ENDPOINT=https://freeweights.allternit.com hf download openbmb/MiniCPM-RobotManip --revision 29cb257541e9f96f493abe21174f8892e5dffe3f --local-dir ./MiniCPM-RobotManip

License

Name
Apache License 2.0
Id
Apache-2.0
Class
Permissive
Redistribution
yes
Listing
Hosted (signed)
Decided
License as declared by the publisher. No person read it. 2026-11-15
Text in
README.md
Text sha256
61e0a3b25e7765d4b80bbd5c45a93d6630ac2d5a7434675dfe0fad6a7f20fa36
Terms gate
No extra terms beyond the license.

Read the license text

Licenses are checked against the license table. A custom license passes only after a person reads it.

Provenance

From: openbmb <huggingface.co/openbmb>Newsgroups: alt.freeweights.minicpmSubject: MiniCPM-RobotManipDate: 2026-11-15Commit: 29cb257Signed: 2DC28CC7B26A283B ✓
Upstream
openbmb/MiniCPM-RobotManip
Pinned commit
29cb257541e9f96f493abe21174f8892e5dffe3f
Manifest
MiniCPM-RobotManip.json · .minisig
Manifest sha256
5850df2dd2a5bc623bac7b785846ae36a40d167fd9a0464d94a248376f26e2d4
Signature
minisign, Ed25519, key 2DC28CC7B26A283B
Created
2026-11-15 03:48 UTC
Generator
freeweights-manifest/0.1.0
Takedowns
None.

How to verify

$ curl -O https://freeweights.allternit.com/manifests/openbmb/MiniCPM-RobotManip.json $ curl -O https://freeweights.allternit.com/manifests/openbmb/MiniCPM-RobotManip.json.minisig $ minisign -Vm MiniCPM-RobotManip.json -P RWQ7KGqyx4zCLXtUFOqvfv8L3g+8fpKJ1FsuxPyOYMF+4KufbUxKq1Oq $ shasum -a 256 <file> # compare with the Files tab

A manifest whose signature fails must be rejected. A file whose size or sha256 does not match must be discarded. Verify a download

Model tree

No related models in this catalog.Nothing here lists this model as its parent, and it names no parent.
Get it
Download
$ HF_ENDPOINT=https://freeweights.allternit.com hf download openbmb/MiniCPM-RobotManip
Open in Freeweights Studio

Pull, verify and run it in the Allternit app on Desktop, web or phone.

Signed manifest
minisign, key 2DC28CC7B26A283B. MiniCPM-RobotManip.json. Provenance. Takedown history: none.
From: openbmb <huggingface.co/openbmb>Subject: AgentCPM-Explore-GGUF
From: openbmb <huggingface.co/openbmb>Subject: AgentCPM-Report
From: openbmb <huggingface.co/openbmb>Subject: AgentCPM-Report-GGUF
From: openbmb <huggingface.co/openbmb>Subject: BitCPM-CANN-0.5B-gguf
From: openbmb <huggingface.co/openbmb>Subject: BitCPM-CANN-1B-gguf
From: openbmb <huggingface.co/openbmb>Subject: BitCPM-CANN-3B-gguf