Downloads · 30 days
47
39% of all-time downloads
HashtagRobotics/smolvla-tic-tac-toe-games-1-15-120k
smolvla-tic-tac-toe-games-1-15-120k is a robotics model from HashtagRobotics. Use it for the robotics task on the model card, and read the license before you ship it in a product. It is set up for lerobot. The card lists the license as apache-2.0.
<p align="center" <a href="https://github.com/Hashtag-Robotics/so101-tic-tac-toe"<img alt="GitHub implementation" src="https://img.shields.io/badge/GitHub-End--to--endimplementation-181717?logo=github"</a <a href="htt…
Downloads · 30 days
47
39% of all-time downloads
All-time downloads
122
Public
Parameters
450M
15 GB on disk
Likes
2
Public
Click a slice to open those files.
.safetensors15.9 GB · 100%
How the weights are stored.
BF16447M · 99%
From the Hugging Face model README
A 450.05M-parameter SmolVLA checkpoint fine-tuned for language-conditioned, dual-camera, six-axis SO-101 tic-tac-toe placement.
This artifact is a full fine-tune of lerobot/smolvla_base on the 195-episode Hashtag Robotics SO-101 Tic-Tac-Toe dataset. It consumes one six-dimensional robot state, two physical RGB observations, and a templated natural-language placement command. It predicts chunks of 50 six-dimensional joint/gripper actions through SmolVLA's flow-matching action expert.
The checkpoint is the low-level manipulation policy in a larger system. It does not decide which tic-tac-toe move is strategically legal or desirable. In the end-to-end project, a Strands Agent reads game state and selects a legal target, while Strands Robots provides the robot/policy integration seam; the policy converts the selected placement command into physical motion. This separation keeps game reasoning, deterministic validation, and robot actuation independently testable.
This card reports the exact serialized architecture, parameter inventory, training configuration, checkpoint cadence, and evaluation gaps of the pinned artifact. It does not manufacture an offline score or physical success rate where no published result exists.
| Layer | Audience | Resource |
|---|---|---|
| Project narrative | General readers | How the robot learned to play |
| Reproduction and runtime | Engineers and robot operators | SO-101 Tic-Tac-Toe on GitHub |
| Training data | Robot-learning researchers | Dataset card and files |
| Model artifact | Policy users and evaluators | This card and the Hub files |
| Field | Value |
|---|---|
| Repository | HashtagRobotics/smolvla-tic-tac-toe-games-1-15-120k |
| Revision used for this report | 48a6313b7e4983781dd72919105ca691a77cd26c |
| Policy type | SmolVLA / LeRobot 0.6.1 |
| Base model | lerobot/smolvla_base |
| Recorded base revision | c83c3163b8ca9b7e67c509fffd9121e66cb96205 |
| VLM backbone family | HuggingFaceTB/SmolVLM2-500M-Video-Instruct |
| Training dataset revision | b1a5e8681619bd5352c29f0261843828503f1643 |
| Optimization steps | 120,000 |
| Parameters | 450,046,176 across 500 tensors |
| Root inference package | 906,740,966 bytes across 7 files |
model.safetensors | 906,712,520 bytes |
| Declared LFS SHA-256 | cf54a5cc71ec8811d6e59f390108c63144f00a84287d9c48e4302153b313dd7a |
| License | Apache-2.0 |
| Runtime input | Dataset source | Serialized policy key | Shape |
|---|---|---|---|
| Robot state | observation.state | observation.state | (6,) |
| Global scene camera | observation.images.top | observation.images.camera1 | RGB image |
| End-effector camera | observation.images.wrist | observation.images.camera2 | RGB image |
| Task instruction | Episode task string | tokenizer input | max 48 tokens |
The preprocessor's serialized rename map is part of the checkpoint:
{
"observation.images.top": "observation.images.camera1",
"observation.images.wrist": "observation.images.camera2"
}
Use these semantic camera roles, not arbitrary USB enumeration order. A swapped top/wrist mapping is a severe distribution shift even when tensor shapes still validate.
Input state and output action are six-dimensional and use the same ordering:
0 shoulder_pan.pos
1 shoulder_lift.pos
2 elbow_flex.pos
3 wrist_flex.pos
4 wrist_roll.pos
5 gripper.pos
The values are normalized with training-set mean and standard deviation by the serialized pre/postprocessors. Visual features use identity normalization in the policy normalization map. Actions are unnormalized after policy output before the robot adapter consumes them.
config.json retains the base policy's declared visual feature keys camera1, camera2, camera3, and empty_camera_0. The training preprocessor maps only the two physical dataset streams to camera1 and camera2; camera3 has no dataset mapping, and empty_cameras=1 configures a masked empty view for model compatibility. This release therefore has a two-physical-camera contract, not a four-camera capture system. Consumers should load the serialized preprocessor instead of synthesizing an undocumented third camera.
| Setting | Value |
|---|---|
| Observation steps | 1 |
| Predicted action chunk | 50 steps |
| Executed action steps per chunk | 50 |
| Action dimension | 6 |
| Flow-matching integration steps | 10 |
| Maximum internal state/action width | 32 / 32 |
| Tokenizer maximum length | 48 |
| Image resize with padding | 512 × 512 |
| Attention mode | Cross-attention |
| VLM layers used | 16 |
| Action-expert width multiplier | 0.75 |
At the dataset rate of 30 Hz, a 50-step action chunk spans approximately 1.67 seconds before runtime replanning or interruption behavior is considered. Operators should bound execution and retain a deterministic emergency-stop path; chunking is not a substitute for safety supervision.
The safetensors header contains 500 tensors and 450,046,176 scalar parameters.
<p align="center"> <img src="./assets/parameter-breakdown.png" alt="Model parameter breakdown by module and dtype" width="92%"> </p>| Module group | Parameters | Share |
|---|---|---|
| VLM backbone | 302,856,384 | 67.29% |
| Action expert | 98,245,840 | 21.83% |
| Language head | 47,308,800 | 10.51% |
| State/action/time projections | 1,635,152 | 0.36% |
| Total | 450,046,176 | 100% |
| Serialized dtype | Parameters | Share |
|---|---|---|
| BF16 | 446,772,624 | 99.27% |
| F32 | 3,273,552 | 0.73% |
These counts describe the serialized checkpoint, not peak runtime memory. Actual memory and latency depend on framework version, device, attention implementation, batch size, image preprocessing, cache behavior, and execution precision.
| Property | Value |
|---|---|
| Dataset | HashtagRobotics/tic-tac-toe-so101-block-a-clean-v1 |
| Pinned revision | b1a5e8681619bd5352c29f0261843828503f1643 |
| Episodes / frames | 195 / 144,723 |
| Cameras | Top + wrist, 640 × 480, 30 FPS |
| State/action | 6D SO-101 joint/gripper positions |
| Language tasks | 18: two piece identities × nine target cells |
| Published dataset split | Train only |
| Training configuration split | 10% evaluation fraction requested |
The policy is specialized to the physical arrangement represented by this dataset. Consult the dataset card for task balance, temporal distribution, action/state diagnostics, camera statistics, and licensing status.
Training used a single NVIDIA A100 40 GB environment and LeRobot 0.6.1.
| Hyperparameter | Value |
|---|---|
| Update steps | 120,000 |
| Batch size | 16 |
| Optimizer sample presentations | 1,920,000 |
| Full-dataset frame equivalents | 13.27× before split/sampler effects |
| Seed | 42 |
| Optimizer | AdamW |
| Peak learning rate | 1.0e-4 |
| Adam betas | (0.9, 0.95) |
| Adam epsilon | 1.0e-8 |
| Weight decay | 1.0e-10 |
| Gradient clipping | L2 norm 10.0 |
| Scheduler | 1,000-step warmup + cosine decay |
| Final scheduled learning rate | 2.5e-6 at step 120,000 |
| Image augmentation | Disabled |
| AMP flag | Disabled |
| PEFT | Disabled; full fine-tune |
| Vision encoder frozen | No |
| Action expert only | No |
| State projection trained | Yes |
| W&B logging | Disabled |
| Checkpoint interval | 20,000 steps |
| Maximum configured eval samples | 2,048 |
The 13.27× value is an optimizer-sample accounting ratio, not a guarantee of exact epochs: the 10% evaluation configuration, sampler behavior, sequence construction, and replacement behavior affect how often an individual frame is seen.
Six resumable checkpoints are published at 20K-step intervals. The learning rates below come from each serialized scheduler state. Elapsed time is reconstructed from the run identifier and Hub checkpoint commit times.
| Step | Learning rate | Hub-observed elapsed | Approx. cumulative rate |
|---|---|---|---|
| 20,000 | 9.3469e-5 | 2.44 h | 2.27 steps/s |
| 40,000 | 7.5625e-5 | 4.89 h | 2.27 steps/s |
| 60,000 | 5.1250e-5 | 7.34 h | 2.27 steps/s |
| 80,000 | 2.6875e-5 | 9.78 h | 2.27 steps/s |
| 100,000 | 9.0313e-6 | 12.23 h | 2.27 steps/s |
| 120,000 | 2.5000e-6 | 14.67 h | 2.27 steps/s |
The resulting approximate throughput is 36.35 presented samples/s at batch size 16. This is a Hub-observed end-to-end cadence, including checkpoint serialization and upload intervals—not a controlled GPU kernel, data-loader, or inference benchmark.
The complete repository is approximately 15.856 GB because it includes the final inference package plus six checkpoint directories containing optimizer and RNG state.
| Artifact set | Approximate size | Purpose |
|---|---|---|
| Root inference package | 906.74 MB | Load the final 120K policy |
| Six checkpoint trees | remainder of 15.856 GB | Resume training or analyze intermediate states |
The root inference package consists of seven required files:
config.json
model.safetensors
policy_postprocessor.json
policy_postprocessor_step_0_unnormalizer_processor.safetensors
policy_preprocessor.json
policy_preprocessor_step_5_normalizer_processor.safetensors
train_config.json
Download only those files when optimizer state is unnecessary:
from huggingface_hub import snapshot_download
MODEL_ID = "HashtagRobotics/smolvla-tic-tac-toe-games-1-15-120k"
REVISION = "48a6313b7e4983781dd72919105ca691a77cd26c"
model_dir = snapshot_download(
repo_id=MODEL_ID,
revision=REVISION,
allow_patterns=[
"config.json",
"model.safetensors",
"policy_postprocessor.json",
"policy_postprocessor_step_0_unnormalizer_processor.safetensors",
"policy_preprocessor.json",
"policy_preprocessor_step_5_normalizer_processor.safetensors",
"train_config.json",
],
)
The following reconstructs the policy and its serialized pre/postprocessors without commanding a robot:
from lerobot.policies import make_pre_post_processors
from lerobot.policies.smolvla.configuration_smolvla import SmolVLAConfig
from lerobot.policies.smolvla.modeling_smolvla import SmolVLAPolicy
MODEL_ID = "HashtagRobotics/smolvla-tic-tac-toe-games-1-15-120k"
REVISION = "48a6313b7e4983781dd72919105ca691a77cd26c"
config = SmolVLAConfig.from_pretrained(MODEL_ID, revision=REVISION)
config.device = "cuda" # Select a device supported by your environment.
policy = SmolVLAPolicy.from_pretrained(
MODEL_ID,
config=config,
revision=REVISION,
)
policy.eval()
preprocessor, postprocessor = make_pre_post_processors(
config,
pretrained_path=MODEL_ID,
pretrained_revision=REVISION,
preprocessor_overrides={"device_processor": {"device": config.device}},
)
print(type(policy).__name__)
print(config.input_features)
print(config.output_features)
For the guarded robot runtime, camera-role mapping, agent integration, simulation path, E-stop behavior, and task validation, use the versioned project implementation. A generic one-line rollout command is insufficient to reproduce the physical system safely.
No numeric model result is inserted into Hub metadata because the published artifact does not contain a trustworthy metric record for this 120K checkpoint.
| Evidence item | Status | What it establishes |
|---|---|---|
| Root artifact inventory | Available | Seven-file inference package is present |
| Safetensors header audit | Available | 500 tensors and 450.05M parameters are declared |
| Serialized input/output schema | Available | Two physical camera mappings, 6D state, 6D action |
| Configured 10% evaluation fraction | Available | Training intended to reserve an evaluation subset |
| Numeric held-out loss for 120K | Not published | No value should be inferred |
| Repeated physical task trials for 120K | Not published | No success rate should be inferred |
| Full-game physical benchmark for 120K | Not published | No game-completion rate should be inferred |
The repository's training configuration records eval_split=0.1 and max_eval_samples=2048, but no numeric evaluation log or metric artifact accompanies this checkpoint. Training loss, checkpoint completion, parameter integrity, and one successful robot video answer different questions; none is a substitute for repeated held-out physical trials.
The sequence above was recorded with an earlier Games 1–5, 80K-step policy in the same project family. It demonstrates the end-to-end agent/policy/robot interaction qualitatively. It is not an evaluation of this Games 1–15, 120K artifact and must not be counted as 120K success evidence.
Construct a revisioned, episode-disjoint evaluation set rather than splitting temporally adjacent frames.
| Measure | Reporting requirement |
|---|---|
| Flow-matching/action loss | Mean, standard deviation, sample count, split revision |
| Per-axis action MAE/RMSE | Six axes, in both normalized and serialized units |
| Chunk-horizon error | Error versus prediction offset from 1 to 50 |
| Piece/cell macro score | Equal weight across all 18 language tasks |
| Camera ablation | Top only, wrist only, both; same held-out episodes |
| Language ablation | Correct prompt, paraphrase, wrong-piece, wrong-cell controls |
Offline action error is useful for model comparison but does not directly predict closed-loop pick-and-place success.
Use at least 10 independent trials for each of the 18 task commands under the canonical setup, then add controlled perturbation suites. Freeze the policy, code revision, calibration, camera transforms, board/piece print revision, and safety thresholds before collection.
Primary outcome:
macro end-to-end placement success
= mean over 18 tasks of successful correct-piece / correct-cell placements
Also report:
Evaluate separately under:
Measure the policy and the game-playing agent separately. The agent should be scored on legal move selection and board-state interpretation; the policy should be scored on executing an already validated placement command. End-to-end game completion should additionally count perception errors, illegal-move prevention, turn handoff, recovery, and intervention. This prevents a strategic failure from being mislabeled as a motor-policy failure, or vice versa.
Appropriate uses include:
This checkpoint is not a general-purpose game-playing model, not a safety controller, not a collision-avoidance system, and not evidence of reliable autonomous operation outside the recorded task distribution.
camera3 is a retained declaration, not a third physical training stream.Physical execution requires an independently enforced preflight and runtime safety layer. At minimum, verify calibration identity, joint limits, action dimension/order, control frequency, camera roles, workspace clearance, power state, communication latency, chunk interruption, and an operator-accessible emergency stop. Validate in simulation first, then with bounded low-speed hardware-in-the-loop trials. Do not allow language-model output to bypass deterministic move validation or robot safety gates.
The model artifact is released under Apache License 2.0. The training dataset's repository does not declare a dataset license at its pinned revision; the model license does not automatically grant rights to redistribute the underlying dataset.
If you use this checkpoint, cite the exact revision together with SmolVLA and LeRobot:
@software{hashtagrobotics_smolvla_tictactoe_120k_2026,
author = {{Hashtag Robotics}},
title = {SmolVLA SO-101 Tic-Tac-Toe: Games 1--15, 120K},
year = {2026},
url = {https://huggingface.co/HashtagRobotics/smolvla-tic-tac-toe-games-1-15-120k},
note = {Revision 48a6313b7e4983781dd72919105ca691a77cd26c}
}