# BUILD-A1: Träningsscript för amos-r2 (ESLM) **Datum:** 2026-06-06 **Utfört av:** Subagent BUILD-A1 --- ## ✅ Resultat: REKONSTRUERAT Det ursprungliga träningsscriptet **hittades INTE** på GPU-boxen. Scriptet `build/train_eslm.py` är en rekonstruktion baserad på artefakter som finns kvar efter träningen. --- ## 🔍 Sökning — Vad undersöktes ### Bash-historik - `~/.bash_history` **finns ej** (`cat: /home/ubuntu/.bash_history: No such file or directory`) - Inga alternativa historikfiler hittades (zsh_history, fish_history) - HISTSIZE=1000 / HISTFILESIZE=2000 är konfigurerat i `.bashrc` men filen har aldrig skapats (trolig orsak: sessionen kördes utan interaktivt bash, eller instansen rekurserades) ### Python-scripts - `find /home/ubuntu -name "*.py"` (exkl. train_env, eslm-venv, vllm_env): - **Inga egna träningsscripts hittades** - Enda `.py`-filerna i home (grunda nivåer) är Unsloth compiled-cache-filer - Inga `.ipynb`-notebooks utanför venv:er - Inga `nohup.out`, tmux-loggar eller screen-sessions ### Loggar - `~/vllm-install.log` / `~/vllm-serve.log` — vLLM-installation och serving, inget om träning - `/var/log/cloud-init-output.log` — cloud-init, inget om träning - journalctl — inget relevant --- ## 📦 Hittade artefakter med evidens ### `~/aamos_adapter/adapter_config.json` **DIREKTA FAKTA** (dessa är exakta, från adaptern som faktiskt skapades): | Parameter | Värde | Källa | |-----------|-------|-------| | `base_model_name_or_path` | `unsloth/Qwen2.5-7B-Instruct-bnb-4bit` | adapter_config.json | | `r` (lora_r) | **16** | adapter_config.json | | `lora_alpha` | **32** | adapter_config.json | | `lora_dropout` | **0.05** | adapter_config.json | | `target_modules` | `q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj` (alla 7) | adapter_config.json | | `bias` | `"none"` | adapter_config.json | | `use_dora` | `false` | adapter_config.json | | `use_rslora` | `false` | adapter_config.json | | `init_lora_weights` | `true` | adapter_config.json | | `peft_type` | `CAUSAL_LM` | adapter_config.json | | `peft_version` | `0.19.1` | adapter_config.json | ### `~/aamos_merged/config.json` | Parameter | Värde | Källa | |-----------|-------|-------| | Quantization | 4-bit NF4 (`bnb_4bit_quant_type: "nf4"`) | config.json | | Compute dtype | `bfloat16` | config.json | | Double quant | `true` | config.json | | Modell-arkitektur | `Qwen2ForCausalLM` (28 lager, hidden_size=3584) | config.json | | Max position embeddings | 32768 | config.json | ### `~/aamos_adapter/tokenizer_config.json` | Parameter | Värde | |-----------|-------| | tokenizer_class | `Qwen2Tokenizer` | | eos_token | `<|im_end|>` (ChatML-format) | | pad_token | `<|PAD_TOKEN|>` | | padding_side | `left` | | model_max_length | 32768 | ### Installerade paket (train_env / system) | Paket | Version | |-------|---------| | unsloth | 2026.5.8 | | trl | 0.24.0 | | peft | 0.19.1 | | transformers | 5.5.0 | ### `~/unsloth_compiled_cache/UnslothSFTTrainer.py` Innehåller `UnslothSFTConfig` med dessa **defaults** (Unsloth standard för trl 0.24): - `per_device_train_batch_size = 4` - `gradient_accumulation_steps = 2` - `num_train_epochs = 3.0` - `learning_rate = 5e-05` - `lr_scheduler_type = 'linear'` - `warmup_steps = 0.1` (10% av totala steps) - `optim = 'adamw_8bit'` - `weight_decay = 0.001` - `adam_beta1 = 0.9`, `adam_beta2 = 0.999` - `max_grad_norm = 1.0` - `seed = 3407` - `report_to = 'none'` --- ## ⚠️ Osäkra parametrar (GISSNINGAR märkta nedan) | Parameter | Värde i scriptet | Osäkerhet | |-----------|-----------------|-----------| | `max_seq_length` | 2048 | **GUESS** — vllm serve kör `max_model_len=2048` i `start_vllm_lora.sh`; konsistent med träning | | `num_train_epochs` | 3 | Unsloth default; okänd | | `per_device_train_batch_size` | 4 | Unsloth default; okänd | | `dataset_path` | via `--data` argument | Okänd — dataset finns ej kvar | | `assistant_only_loss` | ej satt (False) | Qwen-Instruct SFT brukar använda det; oklart | **Notera:** `start_vllm_lora.sh` kör med `--max-model-len 2048` vilket starkt antyder att `max_seq_length=2048` användes vid träning (vLLM-serving begränsas ofta till tränings-kontextlängden). --- ## 📄 Rekonstruerat script Sparad till: **`/home/bernt/.openclaw/workspace/build/train_eslm.py`** ### Användning ```bash # Aktivera train_env på GPU-boxen source ~/train_env/bin/activate # Kör träning python train_eslm.py \ --data /path/to/training_data.jsonl \ --output ~/aamos_adapter_new \ --max-seq-length 2048 \ --epochs 3 \ --lr 5e-5 \ --batch-size 4 \ --grad-accum 2 \ --merge-output ~/aamos_merged_new # valfritt ``` ### Dataset-format (JSONL) ```jsonl {"messages": [{"role": "system", "content": "..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]} {"messages": [{"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]} ``` --- ## 🔎 Sammanfattning | Aspekt | Status | |--------|--------| | Originalscript hittat | ❌ NEJ | | Bash-historik tillgänglig | ❌ NEJ (fil saknas) | | LoRA-hyperparametrar | ✅ BEKRÄFTADE (från adapter_config.json) | | Träningshyperparametrar | ⚠️ TROLIGA (från Unsloth defaults) | | max_seq_length | ⚠️ GUESS (2048, stöds av vllm-serve config) | | Antal epochs | ⚠️ OKÄNT (Unsloth default = 3 används) | | Dataset | ❌ OKÄNT (finns ej på GPU-boxen) | Scriptet är troligtvis nära originalet eftersom Unsloth-användare sällan avviker kraftigt från defaults för dessa parametrar. De viktigaste värdena (LoRA-konfigurationen) är exakta kopior från den faktiska adapterfilen.