Skip to content

Delete the unused Aloha tactile policy - #17

Merged
Vertax42 merged 1 commit into
mainfrom
chore/drop-unused-aloha-tactile-policy
Sep 15, 2026
Merged

Vertax42 merged 1 commit into
mainfrom
chore/drop-unused-aloha-tactile-policy

Conversation

@Vertax42

Copy link
Copy Markdown
Collaborator

src/openpi/policies/aloha_tactile_policy.py is dead code. Verified rather than assumed:

  • Zero importers. Counting references to every policy module, it is the only non-test one at zero — aloha_policy, its non-tactile sibling, is reached through LeRobotAlohaDataConfig.
  • Never YAML-reachable. registry.TRANSFORMS admits RepackTransform and nothing else, so no config could name AlohaTactileInputs even on purpose.
  • No config uses it. The only tactile mention under configs/ is the XTac-UMI one, which runs xtac_umi_policy and does not consume tactile streams.

What this leaves behind

Pi0TactileConfig stays in the model registry, and this was the only shipped transform producing the <arm>_tactile_<finger>_rgb slots it consumes. So Pi0Tactile is now a registered model with no shipped data path — anyone reaching for it has to write that transform themselves. models/pi0_tactile.py, pi0_tactile_config.py and IMAGE_KEYS_TACTILE are otherwise untouched.

If that whole path is dead too, removing it is a bigger and separate call — flagging it rather than folding it in here.

Verification

  • ruff check src/ examples/ clean
  • pytest src/openpi/training src/openpi/policies examples → 138 passed, identical to before the delete; the one failure (policy_rtc_test) reproduces on a clean tree and predates this branch
  • All six registries still resolve; openpi.training.config and openpi.policies.policy_config import clean

🤖 Generated with Claude Code

`aloha_tactile_policy` has no importers — the only policy module in the
package with none (`aloha_policy`, its non-tactile sibling, is reached
through `LeRobotAlohaDataConfig`). It was never YAML-reachable either:
the transform registry admits `RepackTransform` and nothing else, so no
config could name `AlohaTactileInputs` even deliberately.

Worth stating what this leaves behind: `Pi0TactileConfig` stays in the
model registry, and this was the only shipped transform producing the
`<arm>_tactile_<finger>_rgb` slots it consumes. Anyone reaching for
Pi0Tactile now has to write that transform. The model path is otherwise
untouched.

pytest src/openpi/training src/openpi/policies examples -> 138 passed,
unchanged from before the delete.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@Vertax42
Vertax42 force-pushed the chore/drop-unused-aloha-tactile-policy branch from 90708e2 to 541cc1c Compare September 13, 2026 14:19
@Vertax42

Copy link
Copy Markdown
Collaborator Author

Reviewed against upstream main at 7396c33 (fresh clone, not the PR's base). All three claims in the description hold:

Claim Check Result
Zero importers grep -rn "aloha_tactile|AlohaTactile" over the whole tree, excluding the file itself zero hits
Never YAML-reachable registry.py:55 TRANSFORMS dict literal contains RepackTransform and nothing else
No config uses it every tactile hit under configs/ all are the tactile: false video-decode flag; none reference this transform

The "what this leaves behind" note is also correct: aloha_tactile_policy.py:91-92 produces left_tactile_left_rgb / right_tactile_left_rgb, pi0_tactile.py:23 TACTILE_CAMERAS consumes exactly those, and nothing else in the repo produces them.

One thing the description assumes that does not hold

It treats Pi0Tactile as a working model left without a data path. It is not working. pi0_tactile.py:26 declares:

class Pi0Tactile(nnx.Module):

— nnx.Module, not Pi0 and not BaseModel (compare pi0.py:81, class Pi0(_model.BaseModel)). The body is written for a Pi0 parent regardless:

  • :37 super().__init__(config, rngs), commented "this creates the visual encoder and LLM" — nnx.Module creates neither
  • :77 and :106 read self.PaliGemma, which is never assigned anywhere in the class
  • only embed_prefix is implemented — no compute_loss, no sample_actions (both @abc.abstractmethod on BaseModel), no embed_suffix

Pi0TactileConfig.get_freeze_filter() has two more:

  • :115 super().get_freeze_filter() — BaseModelConfig has no such method; only Pi0Config defines it (pi0_config.py:92)
  • :120 self.freeze_visual_encoder — no such field exists anywhere in the repo

That path is reachable: yaml_loader.py:120 _maybe_inject_lora_freeze_filter calls model.get_freeze_filter() whenever the YAML omits freeze_filter and a variant string contains lora. Its :131 comment, "Only Pi0Config defines get_freeze_filter today", is out of date — Pi0TactileConfig defines it too, so the hasattr guard admits it rather than skipping it.

And ModelTransformFactory.__call__ (config.py:117) matches PI0, PI05, PI0_FAST with no case _, so a config naming Pi0TactileConfig falls off the end and gets model_transforms = None.

So deleting this transform costs Pi0Tactile nothing it could have used. That strengthens the case for this PR rather than weakening it — but it means the follow-up is a deletion, not a transform someone still needs to write.

Also worth knowing

aloha_tactile_policy.py was deleted once before, in 95ec789 ("Remove ALOHA and LIBERO policy implementations", 2026-01-27), and restored the same day by 01762f0 ("Restore aloha_policy.py and aloha_tactile_policy.py - critical for ARX5"). Given the tactile file has zero importers and its non-tactile sibling aloha_policy.py is reached through LeRobotAlohaDataConfig, that restore almost certainly needed the sibling, not this one.

LGTM.

@Vertax42
Vertax42 merged commit a9802f8 into main Sep 15, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant