--- library_name: peft base_model: LiquidAI/LFM2.5-350M pipeline_tag: text-generation tags: - lora - peft - transformers - reinforcement-learning - atari - slm-rl - space-invaders license: apache-2.0 --- # Flanker/slm-rl-space_invaders PEFT LoRA adapter that warm-starts **Space Invaders** play for [LiquidAI/LFM2.5-350M](https://huggingface.co/LiquidAI/LFM2.5-350M) in the [SLM-RL](https://github.com/CraftsMan-Labs/SLM-RL) workshop. | | | |---|---| | **Game** | `space-invaders` | | **Base model** | `LiquidAI/LFM2.5-350M` | | **Adapter layout** | `adapter/` (PEFT `adapter_config.json` + weights) | | **Training** | `reject_sft` on DQN teacher demos | | **Champion generation** | 2 | | **Promoted** | True (primary -1.9000 -> 0.7917, invalid_rate 0.0000, intervention_rate 0.0000) | | **Dataset pack** | [Flanker/slm-rl-space_invaders-data](https://huggingface.co/datasets/Flanker/slm-rl-space_invaders-data) | Paste `Flanker/slm-rl-space_invaders` as the playground **adapter URL** (and usually the same id as the **dataset URL**). ## Install ```bash pip install "transformers>=4.46" peft accelerate torch ``` ## Load with transformers + PEFT Weights live under the `adapter/` subfolder — pass `subfolder="adapter"`. ```python import torch from transformers import AutoModelForCausalLM, AutoTokenizer from peft import PeftModel BASE = "LiquidAI/LFM2.5-350M" ADAPTER = "Flanker/slm-rl-space_invaders" # this repo device = ( "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu" ) dtype = torch.bfloat16 if device != "cpu" else torch.float32 tokenizer = AutoTokenizer.from_pretrained(BASE) if tokenizer.pad_token is None: tokenizer.pad_token = tokenizer.eos_token model = AutoModelForCausalLM.from_pretrained(BASE, torch_dtype=dtype) model = PeftModel.from_pretrained(model, ADAPTER, subfolder="adapter") model.to(device).eval() messages = [ {"role": "system", "content": "You play Space Invaders. Reply with ACTION: ."}, {"role": "user", "content": "Legal actions: 1) NOOP 2) UP\nChoose."}, ] prompt = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=False, ) inputs = tokenizer(prompt, return_tensors="pt").to(device) with torch.inference_mode(): out = model.generate(**inputs, max_new_tokens=24, do_sample=False) print(tokenizer.decode(out[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True)) ``` ### Download only the adapter files ```python from huggingface_hub import snapshot_download path = snapshot_download("Flanker/slm-rl-space_invaders", allow_patterns="adapter/*") # then: PeftModel.from_pretrained(base_model, f"{path}/adapter") ``` ## Workshop / SLM-RL CLI ```bash slm-rl evolve --game space-invaders \ --dataset-url Flanker/slm-rl-space_invaders-data \ --adapter-url Flanker/slm-rl-space_invaders \ --generations 2 ``` ## Train metrics (if recorded) ```json { "eval": { "episodes": 4, "intervention_rate": 0.0, "invalid_rate": 0.0, "mean_entropy": null, "mean_score": 0.7916666666666666, "primary": 0.7916666666666666, "win_rate": 0.0 }, "gate": { "promoted": true, "reason": "primary -1.9000 -> 0.7917, invalid_rate 0.0000, intervention_rate 0.0000" }, "train": { "entropy": 0.607812587171793, "frac_reward_zero_std": 0.75, "kl": 0.08809181526885368, "loss": -0.004297492280602455, "num_prompts": 32, "reward": 0.09375 } } ``` Trained with [SLM-RL](https://github.com/CraftsMan-Labs/SLM-RL).