Yooniel/olmo3-7b-nla-warmstart-data
OLMo-3-7B-Instruct NLA warm-start data (layer 21) SFT warm-start data for training a Natural Language Autoencoder (NLA) on allenai/OLMo-3-7B-Instruct, in the format consumed by EasyNLA's nla.train_sft. An NLA has two learned parts: AV (verbalizer) — reads a residual-stream activation (injected at a marker token) and writes a natural-language explanation of it. AR (reconstructor) — maps that explanation back to the activation vector. What's here file rows… See the full description on the dataset page: https://huggingface.co/datasets/Yooniel/olmo3-7b-nla-warmstart-data.
OLMo-3-7B-Instruct NLA warm-start data (layer 21)
SFT warm-start data for training a Natural Language Autoencoder (NLA) on `allenai/OLMo-3-7B-Instruct`, in the format consumed by EasyNLA's nla.train_sft.
An NLA has two learned parts:
- AV (verbalizer) — reads a residual-stream activation (injected at a marker token) and writes a natural-language explanation of it.
- AR (reconstructor) — maps that explanation back to the activation vector.
What's here
Each parquet ships a *.nla_meta.yaml sidecar — the contract EasyNLA asserts against the live tokenizer at load time (injection marker, prompt templates, d_model, extraction layer). Load those; never hardcode them.
Extraction: raw (unnormalized) residual-stream activation at layer 21 (2/3 depth of OLMo-3-7B's 32 layers), taken at the last token of each text prefix. d_model = 4096. The injection marker for OLMo's tokenizer is 一.
How it was made
The gold explanations are model-agnostic — the teacher (Claude Sonnet 4.6) wrote them from the source text alone, never seeing an activation. So this dataset reuses the explanations from `asher577/easynla-warmstart-data` (originally Qwen3-8B) and re-extracts only the `activation_vector` column from OLMo-3-7B-Instruct — every row's detokenized_text_truncated was forwarded through OLMo and the layer-21 last-token residual replaces the old Qwen vector. Everything else (prompt, response/explanation, provenance) is carried through unchanged. See scripts/reextract_activations.py in EasyNLA.
The RL split (regenerate, not shipped)
The GRPO RL rollout pool isn't shipped — it carries no new information. RL uses <INJECT> prompt + activation with no gold summary (the AV generates explanations on-policy), and the activations are exactly the ar_sft_train vectors (doc-disjoint from av_sft, so the AV meets activations it never saw in SFT). So the RL parquet is just ar_sft_train with the AR prompt swapped for the AV <INJECT> prompt — regenerate it locally (CPU only, no model):
from dataclasses import replace
from pathlib import Path
from nla.datagen.sidecar import read_sidecar_local, write_sidecar_local
# 1. recast ar_sft_train's sidecar to a stage-0 "base" sidecar for a symlink
m = read_sidecar_local(Path("ar_sft_train.parquet"))
write_sidecar_local(Path("rl_base.parquet"), replace(
m, dataset_id="base_rl", stage="base",
tokens=None, prompt_templates={}, api_summaries=None))
Path("rl_base.parquet").symlink_to("ar_sft_train.parquet")# 2. rebuild as the rl split (adds the AV <INJECT> prompt, recomputes token meta)
python -m nla.datagen.stage3_build \
--input rl_base.parquet --stage rl --output rl.parquet --keep-debug-metadataThe av_sft_val split doubles as the doc-disjoint held-out set for FVE eval.
Usage
python -m nla.train_sft --mode av --base-ckpt allenai/OLMo-3-7B-Instruct \
--parquet av_sft_train.parquet --sidecar av_sft_train.parquet \
--heldout-parquet av_sft_val.parquet --save-dir ckpts/av \
--use-lora --lora-r 128 --lora-alpha 16 --lr 1e-4
python -m nla.train_sft --mode ar --base-ckpt allenai/OLMo-3-7B-Instruct \
--parquet ar_sft_train.parquet --sidecar ar_sft_train.parquet \
--heldout-parquet av_sft_val.parquet --save-dir ckpts/ar \
--ar-num-layers 22 --use-lora --lora-r 128 --lora-alpha 16 --lr 2e-5Built on Celeste's nanoNLA / EasyNLA. Explanations derived from asher577/easynla-warmstart-data.
