155 lines
5.5 KiB
Markdown
155 lines
5.5 KiB
Markdown
|
|
# 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.
|