--- 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 --- # BLANK/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** | 1 | | **Promoted** | True (reject_sft warm-start) | | **Dataset pack** | [BLANK/slm-rl-space-invaders](https://huggingface.co/datasets/BLANK/slm-rl-space-invaders) | | **DQN teacher** | [BLANK/slm-rl-space-invaders-dqn](https://huggingface.co/BLANK/slm-rl-space-invaders-dqn) | Paste `BLANK/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 = "BLANK/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("BLANK/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 BLANK/slm-rl-space-invaders \ --adapter-url BLANK/slm-rl-space-invaders \ --dqn-url BLANK/slm-rl-space-invaders-dqn \ --generations 2 ``` ## Train metrics (if recorded) ```json { "eval": { "skipped": true }, "gate": { "promoted": true, "reason": "reject_sft warm-start" }, "train": {} } ``` Trained with [SLM-RL](https://github.com/CraftsMan-Labs/SLM-RL).