File size: 5,740 Bytes
d8b49d9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
---
library_name: transformers
tags:
- generated_from_trainer
model-index:
- name: mnt/home/bf996/experiments/densemixer/run2_sparse_out
  results: []
---

<!-- This model card has been generated automatically according to the information the Trainer had access to. You
should probably proofread and complete it, then remove this comment. -->

[<img src="https://raw.githubusercontent.com/axolotl-ai-cloud/axolotl/main/image/axolotl-badge-web.png" alt="Built with Axolotl" width="200" height="32"/>](https://github.com/axolotl-ai-cloud/axolotl)
<details><summary>See axolotl config</summary>

axolotl version: `0.17.0.dev0`
```yaml
# axolotl SFT — Run 2 (DenseMixer OFF = native sparse) — Qwen3-30B-A3B-Thinking-2507 on opencode traces.
# Experiment: axolotl-sft-opencode-densemoe (task #16). The CONTROL arm of the paired ablation:
#   BYTE-IDENTICAL to Run 1 (densemixer_run1_opencode.yaml) EXCEPT `dense_mixer: false` + `output_dir`.
# Control discipline (POLICY §2): SAME θ₀, seed, dataset + data-ORDER (same shared prepared path),
# seq_len, batch, packing, LR schedule, step count — the ONLY functional diff is dense_mixer true→false
# (plugin stays loaded; with false its pre_model_load is a no-op → stock sparse top-k MoE forward).
# Design/rationale: experiments/active/axolotl-sft-opencode-densemoe/{POLICY,STATE}.md.
#
# ⚠ LAUNCH PATH = DIRECT `axolotl.cli.train` (NOT hpc.launch — it would strip plugins/dense_mixer/fp8).
# ⚠ REQUIRES image `mega_final_dm.sqsh` (densemixer==1.0.1 + the tf-5.x port baked in).

# θ₀ — the SHARED init both runs start from (control discipline). IDENTICAL to Run 1.
base_model: /mnt/home/bf996/experiments/densemixer/theta0    # Qwen/Qwen3-30B-A3B-Thinking-2507 @ 144afc2f...
model_type: AutoModelForCausalLM
trust_remote_code: true

# === THE one-flag control diff: DenseMixer OFF ===
# Plugin stays in the stack (identical to Run 1); `dense_mixer: false` makes its pre_model_load a
# no-op → the model keeps the STOCK sparse top-k Qwen3MoE forward (non-selected experts' router
# logits get zero task-loss gradient). This is the sparse baseline for the Δθ counterfactual.
plugins:
  - axolotl.integrations.densemixer.DenseMixerPlugin
dense_mixer: false                # Run 2 = OFF (the ONLY functional diff vs Run 1).

# opencode SFT dataset — IDENTICAL pinned revision + SHARED prepared path (guarantees same data ORDER).
datasets:
  - path: /mnt/home/bf996/experiments/densemixer/data_nemotron_code_oracle
    ds_type: parquet
    data_files:
      - /mnt/home/bf996/experiments/densemixer/data_nemotron_code_oracle/data/train-*.parquet
    type: chat_template
    field_messages: conversations
    message_property_mappings:
      role: role
      content: content
    split_thinking: false
chat_template: chatml
dataset_prepared_path: /mnt/home/bf996/experiments/densemixer/prepared/run1   # SHARED with Run 1 (same tokens + order)
val_set_size: 0.0
dataset_num_proc: 1
dataloader_num_workers: 2
dataloader_prefetch_factor: 2

# === precision — bf16 + flash-attn (IDENTICAL to Run 1) ===
bf16: true
fp16: false
fp8: false                        # ⚠ MANDATORY EXPLICIT — axolotl 0.17 auto-enables fp8 on sm_100 → nan.
tf32: false
attn_implementation: flash_attention_2

# === memory / compute (IDENTICAL to Run 1) ===
# ⚠ Blackwell fix (B-only, functionally inert for A): the STOCK Qwen3MoE experts default to the
# `grouped_mm` kernel -> `torch._grouped_mm`, which is Hopper-only (cc 9.0) and RuntimeErrors on the
# B200 (cc 10.0) at the first step (job 31707). `eager` uses the per-expert F.linear loop (no
# grouped_mm) -> works on Blackwell. This is NOT a control confound: A (dense_mixer:true) replaces the
# whole SparseMoeBlock.forward with the tf-5.x port that accesses expert weights directly and NEVER
# calls self.experts.forward, so `experts_implementation` is never exercised on A's path — the only
# FUNCTIONAL A/B difference remains dense (all-expert STE) vs sparse (top-k). Both do per-expert F.linear.
experts_implementation: eager
deepspeed: /opt/axolotl/deepspeed_configs/zero3_bf16.json
gradient_checkpointing: true
chunked_cross_entropy: true
sequence_len: 16384
sample_packing: true

# === control discipline — IDENTICAL to Run 1 ===
seed: 42
micro_batch_size: 1
gradient_accumulation_steps: 4
num_epochs: 3.0
learning_rate: 2.0e-5
lr_scheduler: cosine
warmup_ratio: 0.1
max_grad_norm: 1.0
optimizer: adamw_torch_fused
weight_decay: 0.0

# === checkpoint cadence (IDENTICAL to Run 1) — θ₀ + intermediate + final for the Δθ trajectory ===
logging_steps: 1
save_steps: 10
save_total_limit: 100
output_dir: /mnt/home/bf996/experiments/densemixer/run2_sparse_out   # DISTINCT from Run 1 (not a control var)
special_tokens: {}

```

</details><br>

# mnt/home/bf996/experiments/densemixer/run2_sparse_out

This model was trained from scratch on the None dataset.

## Model description

More information needed

## Intended uses & limitations

More information needed

## Training and evaluation data

More information needed

## Training procedure

### Training hyperparameters

The following hyperparameters were used during training:
- learning_rate: 2e-05
- train_batch_size: 1
- eval_batch_size: 1
- seed: 42
- distributed_type: multi-GPU
- num_devices: 8
- gradient_accumulation_steps: 4
- total_train_batch_size: 32
- total_eval_batch_size: 8
- optimizer: Use OptimizerNames.ADAMW_TORCH_FUSED with betas=(0.9,0.999) and epsilon=1e-08 and optimizer_args=No additional optimizer arguments
- lr_scheduler_type: cosine
- lr_scheduler_warmup_steps: 9
- training_steps: 96

### Training results



### Framework versions

- Transformers 5.12.1
- Pytorch 2.8.0a0+5228986c39.nv25.06
- Datasets 4.8.5
- Tokenizers 0.23.0-rc0