HAL 250M (return-conditioned AWR)

A 247M-parameter policy that plays Super Smash Bros. Melee, trained offline on human replays with advantage-weighted behavior cloning and return conditioning. No self-play or online RL.

Blog post: Hillclimbing Melee · Code: ericyuegu/hal

Files

File Use
hal-250m.hal Policy bundle for the HAL runtime (weights + normalization stats + return calibration). Use this to play.
model.safetensors Raw fp32 state_dict for hal.models.action_sequence.ActionSequenceTransformer.

Run it

You need Linux, an NVIDIA GPU, uv, and a Melee 1.02 NTSC ISO.

git clone https://github.com/ericyuegu/hal && cd hal
uv sync
uv run fetch --name dolphin-exiai                  # headless Dolphin for CPU matches
uv run fetch --name Slippi_Online-x86_64.AppImage  # Slippi Dolphin with a window
export HAL_ISO_PATH=/path/to/ssbm.iso
uv run hf download ericyuegu/hal-base-250m-rc hal-250m.hal --local-dir .

Against you. Plug your controller into port 1 of a GameCube controller adapter, then run:

uv run hal-policy play hal-250m.hal --character FOX --stage FINAL_DESTINATION

Dolphin opens with HAL on port 2. Pick your character, and HAL starts the match. Dolphin waits for each of HAL's actions, so HAL plays with no input delay.

Against a level-9 CPU, without a window:

uv run hal-policy eval hal-250m.hal --n-matches 1

--imitate selects a player style from the training vocabulary: a connect code, or PLATINUM, DIAMOND, or MASTER.

From Python:

from hal.inference.action_sequence_artifact import load_action_sequence_policy

policy = load_action_sequence_policy("hal-250m.hal", device="cuda")

Inference uses BF16 on CUDA or FP32 on CPU. Real-time play needs a GPU.

Model

  • Trunk: 12-layer transformer, width 1024, 16 heads, 256-frame context
  • Temporal decoder: 6 layers, width 1024, autoregressive over c_stick → main_stick → triggers → buttons, predicting action chunks
  • Return conditioning on discounted 60-frame return (default target: training p90 = 19.98)
  • Trained for 131,072 updates (98,304 stable + 32,768 cooldown) at batch 512 with Muon/AdamW on one B200
  • Data: Slippi ranked-anonymized replays plus professional player replays (44 sources)
Downloads last month

-

Downloads are not tracked for this model. How to track
Safetensors
Model size
0.2B params
Tensor type
F32
·
U8
·
BOOL
·
Video Preview
loading