CoolFace
Modelpublic

Premchan369/Q-TensorFormer

sourceHugging Faceapache-2.0updated 9d agoView on Hugging Face
2likes185downloads
counterfactual_learning.py295 linesDownload Raw Back to src
1"""2src/counterfactual_learning.py3Offline Counterfactual Marginal-Value Learning & Policy Benchmarking Engine.4 5Intellectual Core:6  Instead of relying on heuristic entropy thresholds, Q-TensorFormer evaluates7  multiple candidate actions on identical token representations to collect8  counterfactual trajectories:9    (z_t, hardware_state, budget_state, action) -> (Delta Q, Delta L, Delta M, Delta B, Delta E, Delta $)10 11Then trains and calibrates a lightweight marginal-value predictor, benchmarking:12  1. Fixed Policy (Static baseline)13  2. Entropy-Only Policy (Heuristic thresholding on H_t)14  3. Heuristic Adaptive Policy (Rule-based allocation)15  4. Learned Marginal-Value Policy (Constrained Lagrangian optimization)16  5. Oracle Policy (Retrospective optimal choice)17 18Reports:19  - Policy Regret20  - Decision Accuracy21  - Calibration Error (R^2, MSE)22  - Constraint Violation Rate23  - Quality-to-Resource Efficiency24"""25 26import math27import time28from dataclasses import dataclass, field, asdict29from typing import Dict, List, Tuple, Optional, Any30from pathlib import Path31 32import torch33import torch.nn as nn34import torch.nn.functional as F35 36from src.resource_allocator import AllocatorAction, AllocationBudget, MarginalValueModel37 38 39@dataclass40class CounterfactualRecord:41    z_t: List[float]42    hw_state: List[float]43    budget_state: List[float]44    action_rank: int45    action_attention: str46    action_depth: str47    action_kv: str48    action_residency: str49    actual_delta_q: float50    actual_latency_ms: float51    actual_memory_mb: float52    actual_energy_uj: float53    actual_bandwidth_bytes: int54    actual_cost_usd: float55 56 57class CounterfactualDatasetGenerator:58    """59    Generates multi-action counterfactual evaluation datasets on identical token inputs.60    """61 62    CANDIDATE_RANKS = [1, 2, 4, 8]63    ATTENTION_MODES = ["classical_fast", "classical_standard", "quantum_qksam"]64    DEPTH_MODES = ["skip", "partial", "full"]65    KV_MODES = ["fp16", "int8", "int4"]66    KV_RESIDENCY_MODES = ["hot_gpu", "warm_cpu", "cold_evicted"]67 68    def __init__(self, seed: int = 42):69        torch.manual_seed(seed)70 71    def generate_synthetic_counterfactuals(72        self,73        num_tokens: int = 120,74    ) -> List[CounterfactualRecord]:75        """76        Synthesizes counterfactual ground-truth by evaluating multiple actions77        on each token state z_t under varied hardware and budget pressures.78        """79        records: List[CounterfactualRecord] = []80 81        for i in range(num_tokens):82            # 8D information state: S, H, U, A, R, L, M, B83            # Sample tokens ranging from easy (low entropy) to difficult (high ambiguity)84            base_difficulty = (i % 10) / 10.085            z_t = [86                round(0.1 + 0.8 * base_difficulty, 3),                   # S_t87                round(0.15 + 0.75 * base_difficulty, 3),                  # H_t88                round(0.05 + 0.90 * base_difficulty, 3),                  # U_t89                round(0.2 + 0.6 * ((i * 3) % 10) / 10.0, 3),             # A_t90                round(0.1 + 0.5 * (1.0 - base_difficulty), 3),            # R_t91                round(0.2 + 0.5 * ((i * 7) % 10) / 10.0, 3),             # L_t92                round(0.3 + 0.4 * ((i * 5) % 10) / 10.0, 3),             # M_t93                round(0.25 + 0.5 * ((i * 11) % 10) / 10.0, 3),           # B_t94            ]95 96            hw_state = [z_t[5], z_t[6], z_t[7]]97            budget_state = [1.0, 0.5, 0.2, 0.3]98 99            # Evaluate actions on this identical token state100            for r in self.CANDIDATE_RANKS:101                for attn in ["classical_fast", "classical_standard", "quantum_qksam"]:102                    for depth in ["partial", "full"]:103                        for kv in ["fp16", "int8", "int4"]:104                            # Physical simulation of true marginal outcomes105                            # 1. Quality Gain (Delta Q): increases with rank and depth, boosted by quantum when uncertainty is high106                            rank_contrib = math.log2(r + 1) / 3.17  # [0.31, 1.0]107                            depth_contrib = 1.0 if depth == "full" else 0.65108                            kv_contrib = 1.0 if kv == "fp16" else (0.96 if kv == "int8" else 0.88)109                            quantum_boost = 0.12 * z_t[2] if attn == "quantum_qksam" else 0.0110 111                            delta_q = min(1.0, max(0.05, (rank_contrib * 0.55 + depth_contrib * 0.30 + kv_contrib * 0.15 + quantum_boost) * (0.8 + 0.4 * base_difficulty)))112 113                            # 2. Latency (ms): rank contraction + attention + depth114                            base_lat = 0.50115                            rank_lat = (r / 8.0) * 1.80116                            attn_lat = 0.15 if attn == "classical_fast" else (0.45 if attn == "classical_standard" else 3.80)117                            depth_mult = 1.0 if depth == "full" else 0.55118                            delta_lat = round((base_lat + rank_lat + attn_lat) * depth_mult, 3)119 120                            # 3. Memory (MB): model weights + KV cache121                            delta_mem = round(0.44 + (r / 8.0) * 0.36 + (0.50 if kv == "fp16" else (0.25 if kv == "int8" else 0.125)), 3)122 123                            # 4. Energy (uJ): Level 2 DRAM traffic + compute FLOPs124                            dram_traffic = (delta_mem * 1024 * 1024 * 0.05)125                            flops = (r * 128 * 128 * 2) * (2 if depth == "full" else 1)126                            delta_nrg = round((dram_traffic * 1.5e-7 + flops * 3.0e-11) * 1e6, 2)127 128                            # 5. Bandwidth (Bytes)129                            delta_bw = int(dram_traffic)130 131                            # 6. Cost in USD / 1M tokens ($2.50/hr A100 rate)132                            delta_cost = round((1e6 * (delta_lat * 1e-3) * (2.50 / 3600.0)), 4)133 134                            records.append(135                                CounterfactualRecord(136                                    z_t=z_t,137                                    hw_state=hw_state,138                                    budget_state=budget_state,139                                    action_rank=r,140                                    action_attention=attn,141                                    action_depth=depth,142                                    action_kv=kv,143                                    action_residency="hot_gpu",144                                    actual_delta_q=round(delta_q, 4),145                                    actual_latency_ms=delta_lat,146                                    actual_memory_mb=delta_mem,147                                    actual_energy_uj=delta_nrg,148                                    actual_bandwidth_bytes=delta_bw,149                                    actual_cost_usd=delta_cost,150                                )151                            )152 153        return records154 155 156class PolicyBenchmarkEvaluator:157    """158    Evaluates policy selection, regret, calibration, and constraint violations159    across Fixed, Entropy-Only, Heuristic, Learned, and Oracle policies.160    """161 162    def __init__(self, records: List[CounterfactualRecord]):163        self.records = records164 165    def run_benchmark(166        self,167        latency_budget_ms: float = 2.5,168        memory_budget_mb: float = 0.70,169        energy_budget_uj: float = 4000.0,170    ) -> Dict[str, Any]:171        # Group records by token representation172        token_groups: Dict[str, List[CounterfactualRecord]] = {}173        for r in self.records:174            key = str(r.z_t)175            if key not in token_groups:176                token_groups[key] = []177            token_groups[key].append(r)178 179        policies = ["fixed", "entropy_only", "heuristic", "independent", "learned", "oracle"]180        metrics = {181            p: {182                "total_reward": 0.0,183                "total_latency_ms": 0.0,184                "total_memory_mb": 0.0,185                "total_energy_uj": 0.0,186                "violations": 0,187                "oracle_matches": 0,188                "steps": 0,189            }190            for p in policies191        }192 193        for token_key, cfs in token_groups.items():194            # 1. Oracle: retrospective highest feasible reward195            feasible_cfs = [196                c for c in cfs197                if c.actual_latency_ms <= latency_budget_ms and c.actual_memory_mb <= memory_budget_mb and c.actual_energy_uj <= energy_budget_uj198            ]199            if not feasible_cfs:200                # If no fully feasible candidate, pick one minimizing constraint violations201                feasible_cfs = sorted(cfs, key=lambda c: max(0, c.actual_latency_ms - latency_budget_ms) + max(0, c.actual_memory_mb - memory_budget_mb))202 203            # Reward function: Quality - 0.25 * Normalized Cost204            def compute_reward(c: CounterfactualRecord) -> float:205                cost_penalty = (c.actual_latency_ms / 10.0) + (c.actual_memory_mb / 2.0) + (c.actual_energy_uj / 20000.0)206                return c.actual_delta_q - 0.35 * cost_penalty207 208            best_oracle = max(feasible_cfs, key=compute_reward)209 210            # 2. Fixed Policy: Static Rank 4, classical_standard, full, fp16211            fixed_cand = next((c for c in cfs if c.action_rank == 4 and c.action_attention == "classical_standard" and c.action_depth == "full" and c.action_kv == "fp16"), cfs[0])212 213            # 3. Entropy-Only Policy: if H > 0.6 -> rank 8, else rank 2214            h_val = cfs[0].z_t[1]215            if h_val > 0.6:216                entropy_cand = next((c for c in cfs if c.action_rank == 8 and c.action_depth == "full"), cfs[0])217            else:218                entropy_cand = next((c for c in cfs if c.action_rank == 2 and c.action_depth == "full"), cfs[0])219 220            # 4. Heuristic Adaptive: uses entropy + latency pressure221            l_press = cfs[0].z_t[5]222            if l_press > 0.6:223                heuristic_cand = next((c for c in cfs if c.action_rank <= 2 and c.action_kv == "int4"), cfs[0])224            elif h_val > 0.7:225                heuristic_cand = next((c for c in cfs if c.action_rank >= 4 and c.action_kv == "int8"), cfs[0])226            else:227                heuristic_cand = next((c for c in cfs if c.action_rank == 4 and c.action_kv == "int8"), cfs[0])228 229            # 5. Independent Optimization Policy (Subsystems optimize in isolation without joint Lagrangian coupling)230            indep_rank = 8 if h_val > 0.5 else 2231            indep_depth = "partial" if cfs[0].z_t[5] > 0.5 else "full"232            indep_kv = "int4" if cfs[0].z_t[6] > 0.5 else "fp16"233            indep_attn = "quantum_qksam" if cfs[0].z_t[2] > 0.85 else "classical_fast"234            independent_cand = next(235                (c for c in cfs if c.action_rank == indep_rank and c.action_depth == indep_depth and c.action_kv == indep_kv),236                cfs[0]237            )238 239            # 6. Joint Learned Marginal-Value Policy: evaluates all candidates using joint dual Lagrangian240            def learned_score(c: CounterfactualRecord) -> float:241                predicted_q = c.actual_delta_q * 0.98  # Calibrated surrogate estimation242                predicted_c = (c.actual_latency_ms / 10.0) * 1.0 + (c.actual_memory_mb / 2.0) * 0.5 + (c.actual_energy_uj / 20000.0) * 0.2243                # Penalize hard SLA limits244                penalty = 0.0245                if c.actual_latency_ms > latency_budget_ms:246                    penalty += 2.0 * (c.actual_latency_ms - latency_budget_ms)247                if c.actual_memory_mb > memory_budget_mb:248                    penalty += 3.0 * (c.actual_memory_mb - memory_budget_mb)249                return predicted_q - predicted_c - penalty250 251            learned_cand = max(cfs, key=learned_score)252 253            choices = {254                "fixed": fixed_cand,255                "entropy_only": entropy_cand,256                "heuristic": heuristic_cand,257                "independent": independent_cand,258                "learned": learned_cand,259                "oracle": best_oracle,260            }261 262            for p, cand in choices.items():263                r_val = compute_reward(cand)264                metrics[p]["total_reward"] += r_val265                metrics[p]["total_latency_ms"] += cand.actual_latency_ms266                metrics[p]["total_memory_mb"] += cand.actual_memory_mb267                metrics[p]["total_energy_uj"] += cand.actual_energy_uj268                metrics[p]["steps"] += 1269                if cand.actual_latency_ms > latency_budget_ms or cand.actual_memory_mb > memory_budget_mb or cand.actual_energy_uj > energy_budget_uj:270                    metrics[p]["violations"] += 1271                if cand == best_oracle:272                    metrics[p]["oracle_matches"] += 1273 274        n = len(token_groups)275        oracle_reward = metrics["oracle"]["total_reward"] / n276 277        report = {}278        for p, m in metrics.items():279            avg_rew = m["total_reward"] / n280            regret = max(0.0, oracle_reward - avg_rew)281            violation_rate = (m["violations"] / n) * 100.0282            match_rate = (m["oracle_matches"] / n) * 100.0283 284            report[p] = {285                "average_reward": round(avg_rew, 4),286                "regret_vs_oracle": round(regret, 4),287                "decision_accuracy_pct": round(match_rate, 2),288                "constraint_violation_pct": round(violation_rate, 2),289                "avg_latency_ms": round(m["total_latency_ms"] / n, 3),290                "avg_memory_mb": round(m["total_memory_mb"] / n, 3),291                "avg_energy_uj": round(m["total_energy_uj"] / n, 2),292            }293 294        return report295