--- license: apache-2.0 tags: - reinforcement-learning - contextual-bandit - offline-rl - speculative-decoding - energy-efficiency - sglang --- # EAGLE3 Speculative Decoding -- Energy-Aware Policy Models Eight models, one problem: pick `(speculative_num_steps, speculative_eagle_topk, speculative_num_draft_tokens)` for sglang + EAGLE3 so GPU energy utilization lands inside a 95-98% band. All trained on the [`eagle3-speculative-decoding-energy-sweep`](https://huggingface.co/datasets/Pradheep1647/eagle3-speculative-decoding-energy-sweep) dataset. Full writeup, sweep mechanism, and live-validated results: [project README](https://github.com/HyperKuvid-Labs/energy_throttling_llms). **Shared I/O contract** -- input is a 4-dim state `[batch_size/8.0, gpu_temp_c/100.0, gpu_mem_used_mb/8192.0, gpu_util_pct/100.0]`; output is an index into the same 19-action space (`RL/policy.py` in the repo above), decoded to the three sglang flags. | file | algorithm | format | load | |---|---|---|---| | `mlp_bandit/policy.pth` | contextual bandit (QNetwork) | torch state_dict | `QNetwork(4, 19).load_state_dict(torch.load(...))` | | `lookup_table/model.json` | per-bs empirical best | JSON | `json.load(open(...))` -- `{batch_size: {"config": [...], "mean_reward": ...}}` | | `linucb/model.npz` | LinUCB | numpy | `np.load(...)` -- `theta` (per-action weight vectors), `A` (per-action design matrices), `actions` | | `thompson_sampling/model.npz` | Bayesian linear TS | numpy | `np.load(...)` -- `mean`, `cov` (per-action posteriors), `actions` | | `gbt/model.joblib` | gradient boosted trees | sklearn | `joblib.load(...)` -- `GradientBoostingRegressor`, features `[state, action_idx/19]` | | `doubly_robust/model.joblib` | doubly robust (direct model) | sklearn | `joblib.load(...)` -- `LinearRegression`, IPS correction term is not persisted (recomputed from raw sweep data at pick time) | | `cql/policy.pth` | conservative Q-learning | torch state_dict | `QNetwork(4, 19).load_state_dict(torch.load(...))` | | `bcq/policy.pth` | discrete BCQ | torch state_dict | `torch.load(...)` -- dict with `behavior_state_dict`, `q_state_dict`, `actions` | ## Which one to actually use `mlp_bandit`, `lookup_table`, and `doubly_robust` agree on every batch size and are the live-validated picks. `cql` and `bcq` collapsed to the non-speculative baseline past `bs=1` (overly conservative default hyperparameters against this reward scale) and are **not recommended** -- kept here for completeness, not as a suggested pick. See the project README for the full live A/B numbers per algorithm. ## Hardware this was validated on RTX 4060 Laptop GPU (8GB), `unsloth/Llama-3.2-1B-Instruct` target + `rescommons/SpecForge-EAGLE3-Llama-3.2-1B-Instruct` draft, 80W power cap. Picks are specific to this hardware/model pair -- retrain on the linked dataset (or a fresh sweep) before trusting these on different hardware.