Skip to content

Commit ebe5b68

Browse files
committed
Merge remote-tracking branch 'vlacpp/main'
# Conflicts: # src/models/smolvla/action_expert.cpp # src/models/smolvla/vision.cpp
2 parents 9af3a27 + 804c73f commit ebe5b68

6 files changed

Lines changed: 75 additions & 410 deletions

File tree

README_zh.md

Lines changed: 57 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
# Robot.cpp
1+
# 🤖 Robot.cpp
22

33
【demo 位置】
44

5+
![1783392980125](image/README_zh/1783392980125.png)
6+
57
Robot.cpp是一个轻量化的on-device机器人模型推理框架,在llama.cpp的基础上进行开发,继承了其零依赖、轻量化的哲学,无需python相关的依赖配置,即可完成机器人模型推理,这使得其在跨平台尤其是环境配置复杂的边缘设备上具有优势。
68

79
具体而言,robot.cpp最核心的概念是 [`model-server`](robot_server/README_zh.md),其为最主要的统一模型接口。在实际工作,仅需要启动 `model-server`,其会监听机器人发送的推理请求,即接受机器人传来的observation,在下层model进行forward计算,返回model生成的action。整体通信设计上为了轻量化零依赖采用手写TCP协议的方式。
@@ -12,12 +14,14 @@ Robot.cpp是一个轻量化的on-device机器人模型推理框架,在llama.cp
1214
* `policy`:实际使用 `model-client`,与具体的机器人系统或者仿真系统连接的一层抽象,policy负责接受机器人平台给的observation,对其进行处理,然后交给 `model-client`,获得action的最终输出,在这一层看不到通信细节,使用更加友好。
1315
* `platform`:不同的机器人平台,负责传感器管理,以及机器人控制。
1416

15-
工具上,我们亦都提供了两种工具帮助更好地对机器人模型进行开发
17+
工具上,我们亦都提供了两种工具帮助更好地对机器人模型进行开发:
18+
19+
* [`hf2gguf`](tools/hf2gguf/README_zh.md):用来将safetensor格式的checkpoint转化成项目所需的gguf格式。
20+
* [`quant`](tools/quant/README_zh.md):对模型的任意tensor族群进行选择性quant的工具,用户仅需要调整yaml进行需求配置即可完成量化gguf的生成。
1621

17-
* [`hf2gguf`](tools/hf2gguf/README_zh.md):用来将safetensor格式的checkpoint转化成项目所需的gguf格式
18-
* [`quant`](tools/quant/README_zh.md):对模型的任意tensor族群进行选择性quant的工具,用户仅需要调整yaml进行需求配置即可完成量化gguf的生成
22+
---
1923

20-
## 快速使用
24+
## 🚀 快速使用
2125

2226
```bash
2327
git clone https://github.com/Robot-cpp/robot.cpp
@@ -27,30 +31,29 @@ git submodule update --init --recursive
2731

2832
我们介绍三类使用案例来帮助你快速了解本仓库:
2933

30-
* model-server的启动,其与最小dummy model-client通信的案例
31-
* model-server在仿真平台上的使用(以LIBERO为例)
32-
* model-server在真机平台上的使用(以SO-101为例)
34+
* model-server的启动,其与最小dummy model-client通信的案例
35+
* model-server在仿真平台上的使用(以LIBERO为例)
36+
* model-server在真机平台上的使用(以SO-101为例)
3337

34-
### model-server的启动与连接dummy client
38+
### 🔌 model-server的启动与连接dummy client
3539

36-
我们以smolvla的gguf为例,教您快速使用model-server
40+
我们以smolvla的gguf为例,教您快速使用model-server
3741

38-
#### step0: 下载gguf model
42+
#### Step 0:下载gguf model
3943

4044
在hugging-face上下载一份gguf示例:[huggingface.co/rrobottt/smolvla-so101-fp32](https://huggingface.co/rrobottt/smolvla-so101-fp32)
4145

42-
#### step1:model-server的启动
46+
#### Step 1:model-server的启动
4347

44-
我们提供了两种方式来完成model-server的启动
48+
我们提供了两种方式来完成model-server的启动
4549

4650
##### 方法1:直接下载
4751

48-
对于特定的一些平台与设定,我们已经预编译了一些`model-server`的二进制文件,可以直接在release page下载下来直接用
52+
对于特定的一些平台与设定,我们已经预编译了一些`model-server`的二进制文件,可以直接在release page下载下来直接用
4953

50-
下载之后,可以直接用下面的方式运行`model-server`
51-
52-
```
54+
下载之后,可以直接用下面的方式运行`model-server`
5355

56+
```bash
5457
./model-server \
5558
--model-type smolvla\
5659
--llm /path/to/smolvla-llm-f32.gguf \
@@ -73,22 +76,22 @@ git submodule update --init --recursive
7376

7477
启动成功后会显示:
7578

76-
```
79+
```text
7780
[model-server] listening on 127.0.0.1:5555 model=smolvla
7881
```
7982

80-
#### step2:完成一次对model-server的dummy请求
83+
#### Step 2:完成一次对model-server的dummy请求
8184

8285
server启动过后,会监听请求,我们提供了一份最小示例来进行一个随机的observation请求。可以使用python或者c++的方式来进行请求。
8386

84-
##### python最小例子
87+
##### Python最小例子
8588

86-
```
89+
```bash
8790
pip install numpy
8891
python robot_client/examples/python/minimal_example.py
8992
```
9093

91-
##### cpp最小例子
94+
##### C++最小例子
9295

9396
我们提供了一个从编译到运行的例子(`robot_client/shell/cpp_client_example.sh`),按需修改以下环境变量:
9497

@@ -102,37 +105,42 @@ python robot_client/examples/python/minimal_example.py
102105

103106
然后运行下面的bash:
104107

105-
```
108+
```bash
106109
bash robot_client/shell/cpp_client_example.sh
107110
```
108111

109-
### model-server在仿真平台上的使用(以LIBERO为例)
112+
### 🧪 model-server在仿真平台上的使用(以LIBERO为例)
110113

111114
详见 [LIBERO 仿真评测说明](eval/libero/README_zh.md)[English](eval/libero/README.md))。
112115

113-
### model-server在真机平台上的使用(以SO-101为例)
116+
### 🦾 model-server在真机平台上的使用(以SO-101为例)
114117

115118
详见link,亦可参考视频教程(bilibili link)
116119

117-
## 性能
120+
---
121+
122+
## ⚡ 性能
118123

119124
我们在不同的平台测试了我们的实现性能,我们对模型进行5次warmup,100次loop,取其从收到图片开始包括process,forward,到输出可用action chunk的latency平均值(单位:ms)。所有state projector均保持f32精度。
120-
其中,对libero设定,输入为两张256x256的图片,输入的state维度为8;对so101的真机设定,输入为一张224x224的图片,输入的state维度为6
121125

122-
其中对于smolvla的preprocess设定,参考官方的基本设定,即首先会将图片变成512*512
126+
其中,对libero设定,输入为两张256x256的图片,输入的state维度为8;对so101的真机设定,输入为一张224x224的图片,输入的state维度为6。
127+
128+
其中对于smolvla的preprocess设定,参考官方的基本设定,即首先会将图片变成512*512。
123129

124130
| Model | Mac M4 Pro (CPU) | Mac M4 Pro (Metal) | RTX 4090 | RTX 3060 | A100 |
125-
| ---------------------- | ---------------- | ------------------ | -------- | -------- | ---- |
126-
| smolvla@libero (bf16*) | 555 | 216 | 28 | | 43 |
127-
| smolvla@libero (f32) | 577 | 236 | 32 | | 41 |
128-
| smolvla@so-101 (bf16*) | 339 | 145 | 23 | | 35 |
129-
| smolvla@so-101 (f32) | 396 | 158 | 24 | | 33 |
130-
| pi0@libero (f32) | 1839 | 710 | 83 | | 79 |
131-
| pi0@libero (bf16*) | 1976 | 635 | 57 | | 70 |
131+
| ---------------------- | ---------------: | -----------------: | -------: | -------: | ---: |
132+
| smolvla@libero (bf16*) | 555 | 216 | 28 | | 43 |
133+
| smolvla@libero (f32) | 577 | 236 | 32 | | 41 |
134+
| smolvla@so-101 (bf16*) | 339 | 145 | 23 | | 35 |
135+
| smolvla@so-101 (f32) | 396 | 158 | 24 | | 33 |
136+
| pi0@libero (f32) | 1839 | 710 | 83 | | 79 |
137+
| pi0@libero (bf16*) | 1976 | 635 | 57 | | 70 |
132138

133139
> `bf16*`:在 Mac上使用 f16 结果替代 bf16,因为当前 Mac对 bf16 的支持不够好。
134140
135-
## 仓库架构
141+
---
142+
143+
## 🗂️ 仓库架构
136144

137145
关键目录如下:
138146

@@ -172,7 +180,9 @@ robot.cpp/
172180
└── lerobot/ # LeRobot 相关依赖或参考代码
173181
```
174182

175-
## 扩展与贡献
183+
---
184+
185+
## 🌱 扩展与贡献
176186

177187
robot.cpp 欢迎社区贡献新的模型 runtime、平台适配、评测流程、模型转换工具与性能优化。我们希望保持核心推理框架轻量、跨平台、易于复现,同时让不同机器人模型和平台能够以统一接口接入。
178188

@@ -183,9 +193,17 @@ robot.cpp 欢迎社区贡献新的模型 runtime、平台适配、评测流程
183193

184194
欢迎通过 issue 讨论设计,也欢迎提交 PR。对于较大的模型结构、协议变更或平台抽象调整,建议先开 issue 对齐接口边界。
185195

186-
## License
196+
---
197+
198+
## 📄 License
199+
200+
robot.cpp 源码使用 Apache License, Version 2.0 开源。完整协议文本见[LICENSE](LICENSE)
201+
202+
本仓库也包含若干第三方开源组件,它们遵循各自的开源协议;具体请参考`third_party/` 下对应组件自带的 license 文件。
203+
204+
---
187205

188-
## Acknowledgements
206+
## 🙏 Acknowledgements
189207

190208
robot.cpp 的设计与实现受益于多个优秀的开源项目:
191209

image/README_zh/1783392980125.png

609 KB
Loading

src/models/smolvla/action_expert.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,21 @@ static std::string fmt(const char * f, ...) {
7171
return std::string(buf.data(), n);
7272
}
7373

74+
static bool smolvla_action_expert_use_accel_backend() {
75+
const char * value = std::getenv("SMOLVLA_ACTION_USE_ACCEL");
76+
if (value == nullptr || value[0] == '\0') {
77+
return false;
78+
}
79+
80+
if (std::strcmp(value, "1") == 0 || std::strcmp(value, "true") == 0 || std::strcmp(value, "TRUE") == 0 ||
81+
std::strcmp(value, "on") == 0 || std::strcmp(value, "ON") == 0 || std::strcmp(value, "yes") == 0 ||
82+
std::strcmp(value, "YES") == 0) {
83+
return true;
84+
}
85+
86+
return false;
87+
}
88+
7489
static void smolvla_free_model_buffers(std::vector<ggml_backend_buffer_t> & bufs) {
7590
for (ggml_backend_buffer_t buf : bufs) {
7691
if (buf) {
@@ -350,7 +365,7 @@ struct smolvla_action_expert * smolvla_action_expert_load(const char * fname, in
350365
scheduler_config.op_offload = true;
351366
backend_loader backend;
352367
if (!backend.load(ctx->backend_cpu, ctx->backends, ctx->sched, ctx->buft_policy,
353-
false, scheduler_config, verbosity)) {
368+
smolvla_action_expert_use_accel_backend(), scheduler_config, verbosity)) {
354369
LOG_ERR("%s: failed to initialize action backend: %s\n", __func__, backend.error().c_str());
355370
smolvla_action_expert_free(ctx);
356371
return nullptr;

src/models/smolvla/vision.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -514,8 +514,8 @@ smolvla_vision_ctx * smolvla_vision_load(const char * mmproj_path, int verbosity
514514
scheduler_config.parallel = false;
515515
scheduler_config.op_offload = false;
516516
backend_loader backend;
517-
if (!backend.load(ctx->backend_cpu, ctx->backends, ctx->sched, ctx->buft_policy, true, scheduler_config,
518-
verbosity)) {
517+
if (!backend.load(ctx->backend_cpu, ctx->backends, ctx->sched, ctx->buft_policy,
518+
true, scheduler_config, verbosity)) {
519519
LOG_ERR("%s: failed to initialize vision backend: %s\n", __func__, backend.error().c_str());
520520
smolvla_vision_free(ctx);
521521
return nullptr;

tools/release/README.md

Lines changed: 0 additions & 69 deletions
This file was deleted.

0 commit comments

Comments
 (0)