用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/ADu2021/skillXiv --skill smolvla-robotics-vla命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Convert arXiv papers into ready-to-use agent skills using category-aware extraction. First classifies the paper into one or more of 11 research categories, then applies a specialized extraction pipeline for each category — because different types of papers produce different types of usable knowledge. A single paper can yield multiple skills if it spans categories. Use this skill whenever the user wants to turn a paper into a skill, extract practical techniques from research, build a skill library from papers, convert arXiv papers into reusable agent instructions, or batch-process multiple papers into skills. Also trigger when someone asks about extracting actionable knowledge from papers, making research practical for LLM agents, or systematically converting academic contributions into structured agent capabilities.
Establish regret bounds for behavior cloning with discretized actions combining statistical error and quantization error terms. Prove smoothness requirements for safe quantizer design, show that learning-based quantizers fail these requirements, and propose model-based augmentation to reduce error dependence from H² to H.
Dynamically allocate LoRA ranks per-layer during fine-tuning instead of using fixed uniform ranks. Learn optimal rank for each layer and subject via variational framework with discretized exponential distribution, reducing memory footprint while maintaining fidelity and text-alignment.
基于 SOC 职业分类
正在显示 SKILL.md
| name | smolvla-robotics-vla |
| title | SmolVLA: A Vision-Language-Action Model for Affordable and Efficient Robotics |
| version | 0.0.2 |
| engine | skillxiv-v0.0.2-claude-opus-4.6 |
| license | MIT |
| url | https://arxiv.org/abs/2506.01844 |
| keywords | ["Vision-Language-Action","Robotics","Efficiency","Action Prediction"] |
| description | Deploy compact vision-language-action models that run on consumer GPUs for natural language robot control. |
Standard VLA (Vision-Language-Action) models require massive compute and expensive hardware to train and deploy, making robotics accessible only to well-funded labs. SmolVLA inverts this constraint: a carefully designed compact architecture achieves comparable task performance to models 10x larger while fitting on single-GPU training and consumer hardware or CPU inference. The secret is asynchronous decoupling of perception from action execution—separate workers process vision and planning, preventing any single bottleneck from stalling the system.
This enables researchers with limited budgets, roboticists at smaller organizations, and hobbyists to train and deploy capable robot controllers using affordable platforms and community-collected datasets.
Efficiency through specialization: rather than a single monolithic VLA, use a modular design where vision understanding and action planning operate asynchronously. The vision module processes images on one schedule, the action module on another—preventing the slower process from blocking the faster. Combined with architectural simplifications (pruning redundant layers, knowledge distillation from larger models), this yields compact systems deployable on CPUs for inference and trainable on single GPUs.
This implementation demonstrates the compact VLA architecture with asynchronous perception-action decoupling.
Build the lightweight vision-language component:
import torch
import torch.nn as nn
from transformers import AutoModel, AutoTokenizer
from typing import List, Tuple
class CompactVisionEncoder(nn.Module):
"""Lightweight vision encoder for robotics."""
def __init__(self, hidden_dim: int = 256):
super().__init__()
# Use smaller vision backbone
self.backbone = AutoModel.from_pretrained("openai/clip-vit-base-patch32")
# Project to compact hidden dimension
self.proj = nn.Linear(512, hidden_dim)
self.hidden_dim = hidden_dim
def forward(self, images: torch.Tensor) -> torch.Tensor:
"""
Process images to compact feature vectors.
Input shape: [batch, 3, 224, 224]
Output shape: [batch, hidden_dim]
"""
with torch.no_grad():
features = self.backbone.get_image_features(images)
# Project to compact dimension
compact_features = self.proj(features)
return compact_features
class LanguageCommandEncoder(nn.Module):
"""Encode natural language commands for robot control."""
def __init__(self, hidden_dim: int = 256):
().__init__()
.tokenizer = AutoTokenizer.from_pretrained()
.encoder = AutoModel.from_pretrained()
.proj = nn.Linear(, hidden_dim)
.hidden_dim = hidden_dim
() -> torch.Tensor:
tokens = .tokenizer(
commands,
padding=,
truncation=,
return_tensors=
)
torch.no_grad():
outputs = .encoder(**tokens)
command_features = outputs.last_hidden_state[:, ]
compact_commands = .proj(command_features)
compact_commands
vision_encoder = CompactVisionEncoder(hidden_dim=)
command_encoder = LanguageCommandEncoder(hidden_dim=)
dummy_images = torch.randn(, , , )
dummy_commands = [, ]
image_features = vision_encoder(dummy_images)
command_features = command_encoder(dummy_commands)
()
()
Implement the compact action decoder with chunked output:
class ChunkedActionDecoder(nn.Module):
"""Decode actions in short chunks for responsive robot control."""
def __init__(self, hidden_dim: int = 256, action_dim: int = 7,
chunk_size: int = 4):
super().__init__()
self.hidden_dim = hidden_dim
self.action_dim = action_dim
self.chunk_size = chunk_size
# Lightweight transformer decoder
self.self_attn = nn.MultiheadAttention(hidden_dim, num_heads=4,
batch_first=True)
self.cross_attn = nn.MultiheadAttention(hidden_dim, num_heads=4,
batch_first=True)
self.ff = nn.Sequential(
nn.Linear(hidden_dim, hidden_dim * 2),
nn.ReLU(),
nn.Linear(hidden_dim * 2, hidden_dim)
)
# Action head: predict chunk_size * action_dim values
self.action_head = nn.Linear(
hidden_dim,
chunk_size * action_dim
)
# Normalization
self.norm1 = nn.LayerNorm(hidden_dim)
self.norm2 = nn.LayerNorm(hidden_dim)
self.norm3 = nn.LayerNorm(hidden_dim)
def forward(self, image_features: torch.Tensor,
command_features: torch.Tensor) -> torch.Tensor:
"""
Generate action chunk from fused multimodal features.
Output shape: [batch, chunk_size, action_dim]
"""
batch_size = image_features.shape[]
img_feat_seq = image_features.unsqueeze()
cmd_feat_seq = command_features.unsqueeze()
attn_out, _ = .self_attn(img_feat_seq, img_feat_seq, img_feat_seq)
img_feat_seq = .norm1(img_feat_seq + attn_out)
cross_out, _ = .cross_attn(cmd_feat_seq, img_feat_seq, img_feat_seq)
fused = .norm2(cmd_feat_seq + cross_out)
ff_out = .ff(fused)
fused = .norm3(fused + ff_out)
action_logits = .action_head(fused[:, ])
actions = action_logits.reshape(batch_size, .chunk_size, .action_dim)
actions
decoder = ChunkedActionDecoder(hidden_dim=, action_dim=, chunk_size=)
actions = decoder(image_features, command_features)
()
Build the asynchronous perception-action pipeline:
import queue
import threading
from dataclasses import dataclass
from typing import Optional
@dataclass
class RobotObservation:
timestamp: float
image: torch.Tensor
command: str
@dataclass
class ActionCommand:
timestamp: float
actions: torch.Tensor # [chunk_size, action_dim]
class AsyncRobotController:
"""Decoupled vision and action execution for responsive control."""
def __init__(self, vision_encoder, command_encoder, action_decoder,
control_frequency: float = 10.0):
self.vision_encoder = vision_encoder
self.command_encoder = command_encoder
self.action_decoder = action_decoder
self.control_frequency = control_frequency
self.control_period = 1.0 / control_frequency
# Queues for async communication
self.observation_queue = queue.Queue(maxsize=5)
self.action_queue = queue.Queue(maxsize=10)
# State
self.current_image_features = None
self.current_command_features = None
self.running =
.perception_thread =
.action_thread =
():
.running:
:
obs = .observation_queue.get(timeout=)
img_feat = .vision_encoder(obs.image.unsqueeze())
cmd_feat = .command_encoder([obs.command])
.current_image_features = img_feat
.current_command_features = cmd_feat
queue.Empty:
():
.running:
.current_image_features :
actions = .action_decoder(
.current_image_features,
.current_command_features
)
action_cmd = ActionCommand(
timestamp=,
actions=actions[]
)
:
.action_queue.put_nowait(action_cmd)
queue.Full:
:
.action_queue.get_nowait()
.action_queue.put_nowait(action_cmd)
queue.Empty:
time.sleep(.control_period)
():
.running =
.perception_thread = threading.Thread(target=.perception_worker)
.action_thread = threading.Thread(target=.action_worker)
.perception_thread.start()
.action_thread.start()
():
.running =
.perception_thread.join()
.action_thread.join()
():
:
.observation_queue.put_nowait(obs)
queue.Full:
() -> [ActionCommand]:
:
.action_queue.get(timeout=timeout)
queue.Empty:
time
controller = AsyncRobotController(
vision_encoder,
command_encoder,
decoder,
control_frequency=
)
controller.start()
i ():
dummy_obs = RobotObservation(
timestamp=time.time(),
image=torch.randn(, , ),
command=
)
controller.send_observation(dummy_obs)
action = controller.get_action(timeout=)
action :
()
controller.stop()
| Aspect | Details |
|---|---|
| Model Size | 300M-500M parameters typical; fits on single 24GB GPU for training |
| Vision Encoder | CLIP ViT-Base or smaller; lightweight enough for CPU inference |
| Action Dimension | 7D typical (end-effector pose + gripper); task-specific variation 5-10D |
| Chunk Size | 4-8 actions; balance between responsiveness and prediction stability |
| Training Data | 50k-500k robot trajectories; community datasets (Google Robot Dataset, etc.) |
| Batch Size | 16-32 on single GPU with gradient checkpointing |
When to Use:
When NOT to Use:
Common Pitfalls:
SmolVLA: A Vision-Language-Action Model for Affordable and Efficient Robotics https://arxiv.org/abs/2506.01844