From 8f99ac1a2074d38cfcb47e8ecd75e69590428f21 Mon Sep 17 00:00:00 2001 From: juhyuni Date: Wed, 27 May 2026 10:44:53 +0900 Subject: [PATCH 1/6] =?UTF-8?q?[FEAT]:=20neuron=20Phase=2016a=20(1/3)=20?= =?UTF-8?q?=E2=80=94=20HybridGraphLinear=20edge=20regrow=20(RigL/SET)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/graphlm/neuron/graph_hybrid.py 확장: - n_pruned_edges(): pruned 위치 수 - regrow_random(n, reset_weight=True): 무작위 n 개 pruned 위치 un-mask (SET 스타일) - regrow_by_score(n, scores, reset_weight=True): scores 기반 top-n pruned 위치 un-mask (RigL 스타일) - _activate_edges(): mask=1 + (옵션) weight=0 reset helper - regrow 가 정확히 n 개 활성화 (deterministic topk for score-based) - reset_weight=True 가 기본 — RigL/SET 표준 권장 (옛 prune 값의 노이즈 영향 회피) - 12 신규 unit tests: - regrow random / score / shape 검증 / n>n_pruned cap - reset_weight 동작 (True=0 init, False=옛 값 보존) - regrow 후 gradient flow 검증 (= 새 edge 실제 학습 가능) - constant sparsity (prune+regrow 동량 → sparsity 일정) - 202 → 214 tests, all green --- src/graphlm/neuron/graph_hybrid.py | 82 +++++++++++++++++ tests/neuron/test_graph_hybrid.py | 142 +++++++++++++++++++++++++++++ 2 files changed, 224 insertions(+) diff --git a/src/graphlm/neuron/graph_hybrid.py b/src/graphlm/neuron/graph_hybrid.py index 16f56f0..0a7cdef 100644 --- a/src/graphlm/neuron/graph_hybrid.py +++ b/src/graphlm/neuron/graph_hybrid.py @@ -286,6 +286,88 @@ def n_alive_edges(self) -> int: with torch.no_grad(): return int((self.edge_mask > 0).sum().item()) + # ── Phase 16a: edge regrow (DST) ──────────────────────────── + + def n_pruned_edges(self) -> int: + """현재 prune 된 edge 수 (mask=0).""" + with torch.no_grad(): + return int((self.edge_mask == 0).sum().item()) + + def regrow_random(self, n: int, *, reset_weight: bool = True) -> int: + """무작위 n 개 pruned 위치를 un-mask (SET 스타일). + + Args: + n: regrow 할 edge 수 (n_pruned_edges 이상이면 모두 살림). + reset_weight: True 면 regrown 위치의 ``weight`` 를 0 으로 초기화 — 옛 값이 학습 dynamics + 에 노이즈로 작용하지 않도록 (SET/RigL 의 일반적 권장). + + Returns: + 실제 regrow 된 edge 수. + """ + if n < 0: + raise ValueError(f"n must be >= 0, got {n}") + if n == 0: + return 0 + with torch.no_grad(): + pruned_indices = torch.nonzero(self.edge_mask == 0, as_tuple=False) # (n_pruned, 4) + n_pruned = pruned_indices.size(0) + if n_pruned == 0: + return 0 + n_to_regrow = min(n, n_pruned) + # 무작위 n 개 선택 + perm = torch.randperm(n_pruned, device=pruned_indices.device)[:n_to_regrow] + regrow_4d = pruned_indices[perm] + self._activate_edges(regrow_4d, reset_weight=reset_weight) + return n_to_regrow + + def regrow_by_score( + self, n: int, scores: Tensor, *, reset_weight: bool = True + ) -> int: + """``scores`` 기반 상위 n 개 pruned 위치를 un-mask (RigL 스타일). + + RigL: caller 가 dense gradient magnitude 를 scores 로 전달. 가장 큰 신호가 있던 pruned + edge 를 재활성화. + + Args: + n: regrow 할 edge 수. + scores: shape == edge_mask, 각 위치의 점수 (높을수록 regrow 우선). + reset_weight: regrown 위치 ``weight=0`` 초기화 여부. + + Returns: + 실제 regrow 된 edge 수. + """ + if n < 0: + raise ValueError(f"n must be >= 0, got {n}") + if scores.shape != self.edge_mask.shape: + raise ValueError( + f"scores shape {tuple(scores.shape)} != edge_mask shape " + f"{tuple(self.edge_mask.shape)}" + ) + if n == 0: + return 0 + with torch.no_grad(): + pruned_indices = torch.nonzero(self.edge_mask == 0, as_tuple=False) + n_pruned = pruned_indices.size(0) + if n_pruned == 0: + return 0 + n_to_regrow = min(n, n_pruned) + # pruned 위치의 score 만 추출 → top-n 선택 (largest=True) + pruned_scores = scores[ + pruned_indices[:, 0], pruned_indices[:, 1], + pruned_indices[:, 2], pruned_indices[:, 3], + ] + _, topk_idx = torch.topk(pruned_scores, n_to_regrow, largest=True) + regrow_4d = pruned_indices[topk_idx] + self._activate_edges(regrow_4d, reset_weight=reset_weight) + return n_to_regrow + + def _activate_edges(self, indices_4d: Tensor, *, reset_weight: bool) -> None: + """주어진 4D 인덱스 위치의 mask=1 + (옵션) weight=0 초기화 (internal helper).""" + i0, i1, i2, i3 = indices_4d[:, 0], indices_4d[:, 1], indices_4d[:, 2], indices_4d[:, 3] + self.edge_mask[i0, i1, i2, i3] = 1.0 + if reset_weight: + self.weight.data[i0, i1, i2, i3] = 0.0 + def extra_repr(self) -> str: return ( f"in_features={self.in_features}, out_features={self.out_features}, " diff --git a/tests/neuron/test_graph_hybrid.py b/tests/neuron/test_graph_hybrid.py index f1d343a..34d9abe 100644 --- a/tests/neuron/test_graph_hybrid.py +++ b/tests/neuron/test_graph_hybrid.py @@ -277,6 +277,148 @@ def test_prune_invalid_fraction_rejected(): lin.prune_bottom_fraction(1.5) +# ── Phase 16a: edge regrow (DST) ───────────────────────────── + + +def test_n_pruned_edges_consistent_with_alive(): + lin = HybridGraphLinear(16, 16, group_size=4) + total = lin.edge_mask.numel() + assert lin.n_pruned_edges() + lin.n_alive_edges() == total + + +def test_regrow_random_basic(): + """random regrow 가 정확히 n 개 살리고 alive count 증가.""" + torch.manual_seed(0) + lin = HybridGraphLinear(16, 16, group_size=4) + lin.prune_bottom_fraction(0.5) + alive_before = lin.n_alive_edges() + n_regrown = lin.regrow_random(50, reset_weight=True) + assert n_regrown == 50 + assert lin.n_alive_edges() == alive_before + 50 + + +def test_regrow_random_reset_weight_zeros(): + """reset_weight=True → 새로 살린 위치의 weight=0.""" + torch.manual_seed(0) + lin = HybridGraphLinear(16, 16, group_size=4) + lin.prune_bottom_fraction(0.5) + pruned_before = lin.edge_mask == 0 + n = lin.regrow_random(30, reset_weight=True) + # 새로 살린 위치 = pruned_before AND mask_now>0 + new_alive = pruned_before & (lin.edge_mask > 0) + assert int(new_alive.sum().item()) == n + assert torch.all(lin.weight.data[new_alive] == 0.0) + + +def test_regrow_random_no_reset_preserves_weight(): + """reset_weight=False → weight 값 보존.""" + torch.manual_seed(0) + lin = HybridGraphLinear(16, 16, group_size=4) + lin.prune_bottom_fraction(0.5) + # weight 의 prune 위치 값 기록 + pruned_before = lin.edge_mask == 0 + weight_at_pruned = lin.weight.data[pruned_before].clone() + lin.regrow_random(30, reset_weight=False) + # 일부 위치는 다시 alive 됨 — 그 위치의 weight 가 원래 값과 같은지 (변경 없음) 확인 + # 모든 pruned_before 위치의 weight 가 변경 안 됐어야 함 + assert torch.equal(lin.weight.data[pruned_before], weight_at_pruned) + + +def test_regrow_more_than_pruned_caps_at_pruned(): + """n > n_pruned 이면 모든 pruned 만큼만 regrow.""" + torch.manual_seed(0) + lin = HybridGraphLinear(16, 16, group_size=4) + lin.prune_bottom_fraction(0.3) + n_pruned = lin.n_pruned_edges() + n = lin.regrow_random(99999) + assert n == n_pruned + assert lin.n_pruned_edges() == 0 + + +def test_regrow_zero_noop(): + lin = HybridGraphLinear(16, 16, group_size=4) + lin.prune_bottom_fraction(0.5) + assert lin.regrow_random(0) == 0 + + +def test_regrow_negative_rejected(): + lin = HybridGraphLinear(16, 16, group_size=4) + with pytest.raises(ValueError, match="n must be >= 0"): + lin.regrow_random(-1) + + +def test_regrow_by_score_picks_top_n(): + """scores 기반 regrow 가 정확히 top-n 위치 선택.""" + torch.manual_seed(0) + lin = HybridGraphLinear(16, 16, group_size=4) + lin.prune_bottom_fraction(0.5) + # scores: pruned 위치마다 다른 값 (rank 가능) + scores = torch.zeros_like(lin.edge_mask) + pruned_indices = torch.nonzero(lin.edge_mask == 0, as_tuple=False) + # 첫 10 위치에 가장 큰 score + for rank, (i0, i1, i2, i3) in enumerate(pruned_indices[:10]): + scores[i0, i1, i2, i3] = 100.0 - rank + n = lin.regrow_by_score(5, scores) + assert n == 5 + # 첫 5 위치만 alive 됐는지 + for i0, i1, i2, i3 in pruned_indices[:5]: + assert lin.edge_mask[i0, i1, i2, i3] == 1.0 + # 다음 5 위치는 여전히 pruned + for i0, i1, i2, i3 in pruned_indices[5:10]: + assert lin.edge_mask[i0, i1, i2, i3] == 0.0 + + +def test_regrow_by_score_wrong_shape_rejected(): + lin = HybridGraphLinear(16, 16, group_size=4) + lin.prune_bottom_fraction(0.5) + bad_scores = torch.zeros(10) + with pytest.raises(ValueError, match="shape"): + lin.regrow_by_score(3, bad_scores) + + +def test_regrow_then_forward_gradient_flows(): + """regrow 후 forward 가 새 edge 에서 정상 grad 흐름 (mask=1 효과).""" + torch.manual_seed(0) + lin = HybridGraphLinear( + 16, + 16, + group_size=4, + adj_outer_init="uniform_around_one", + adj_inner_init="uniform_around_one", + ) + lin.prune_bottom_fraction(0.5) + # regrow 한 위치 + pruned_before = lin.edge_mask == 0 + lin.regrow_random(30, reset_weight=True) + regrown_positions = pruned_before & (lin.edge_mask > 0) + # forward + backward — regrown 위치는 weight=0 이지만 mask=1 이라 grad 는 흘러야 함 + x = torch.randn(4, 16) + lin(x).sum().backward() + # regrown 위치의 weight grad 가 nonzero (= 살아있음 증명) + grad_at_regrown = lin.weight.grad[regrown_positions] + assert (grad_at_regrown.abs().sum() > 0).item(), ( + "regrow 후 새 edge 의 weight grad 가 모두 0 — gradient 가 안 흐름" + ) + + +def test_constant_sparsity_prune_then_regrow(): + """prune N + regrow N → sparsity 변경 없음 (DST constant sparsity).""" + torch.manual_seed(0) + lin = HybridGraphLinear(16, 16, group_size=4) + lin.prune_bottom_fraction(0.5) + sparsity_after_prune = lin.effective_sparsity() + # 동량 regrow + n_prune = lin.n_pruned_edges() + target_swap = int(n_prune * 0.2) # 20% swap + lin.prune_bottom_fraction(0.2) # alive 의 20% 추가 prune + lin.regrow_random(target_swap) + # 정확히 같지는 않으나 근방 — prune+regrow 동량이면 sparsity 일정 + # 더 정확히: 새 prune 수 == regrow 수면 sparsity 동일 + sparsity_after_dst = lin.effective_sparsity() + # 두 sparsity 차이는 prune/regrow 의 정확성에 따라 +/- + assert abs(sparsity_after_dst - sparsity_after_prune) < 0.1 + + def test_edge_mask_in_state_dict(): """edge_mask 가 state_dict 에 포함되어 save/load 보존.""" lin1 = HybridGraphLinear(16, 16, group_size=4) From 1d9d805981e15dbb8ff6a2292c5ee2d8fb124b5a Mon Sep 17 00:00:00 2001 From: juhyuni Date: Wed, 27 May 2026 10:48:27 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[FEAT]:=20neuron=20Phase=2016a=20(2/3)=20?= =?UTF-8?q?=E2=80=94=20demo=20/=20train=20loop=20=EC=97=90=20DST=20cycle?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - HybridTransformerTrainConfig 확장: - regrow_method: None / 'random' (SET) / 'rigl' - dst_period: int (DST cycle 주기, None = single-cycle Phase 15 호환) - dst_swap_fraction: float (cycle 당 swap 비율, default 0.1) - dst_end_step: int | None (DST cycle 종료 step) - __post_init__ 에 4 인자 검증 추가 - 신규 helper: - _compute_dense_grad_scores: mask 일시 1 → forward+backward → |weight.grad| → mask 복원 (RigL 용) - _dst_swap_step: alive 의 swap_fraction prune + 같은 수 regrow (constant sparsity) - train loop: - prune_at_step 직후 (Phase 15 호환) + dst_period 마다 DST cycle 실행 - dst_end_step 이후로는 cycle 중지 (학습 stabilize) - result 에 dst_cycles 리스트 추가 (cycle 별 step / total_swap / sparsity_after) - ruff format 적용 --- src/graphlm/neuron/graph_hybrid.py | 10 +- src/graphlm/neuron/hybrid_transformer_demo.py | 126 ++++++++++++++++++ 2 files changed, 131 insertions(+), 5 deletions(-) diff --git a/src/graphlm/neuron/graph_hybrid.py b/src/graphlm/neuron/graph_hybrid.py index 0a7cdef..7f22d9d 100644 --- a/src/graphlm/neuron/graph_hybrid.py +++ b/src/graphlm/neuron/graph_hybrid.py @@ -320,9 +320,7 @@ def regrow_random(self, n: int, *, reset_weight: bool = True) -> int: self._activate_edges(regrow_4d, reset_weight=reset_weight) return n_to_regrow - def regrow_by_score( - self, n: int, scores: Tensor, *, reset_weight: bool = True - ) -> int: + def regrow_by_score(self, n: int, scores: Tensor, *, reset_weight: bool = True) -> int: """``scores`` 기반 상위 n 개 pruned 위치를 un-mask (RigL 스타일). RigL: caller 가 dense gradient magnitude 를 scores 로 전달. 가장 큰 신호가 있던 pruned @@ -353,8 +351,10 @@ def regrow_by_score( n_to_regrow = min(n, n_pruned) # pruned 위치의 score 만 추출 → top-n 선택 (largest=True) pruned_scores = scores[ - pruned_indices[:, 0], pruned_indices[:, 1], - pruned_indices[:, 2], pruned_indices[:, 3], + pruned_indices[:, 0], + pruned_indices[:, 1], + pruned_indices[:, 2], + pruned_indices[:, 3], ] _, topk_idx = torch.topk(pruned_scores, n_to_regrow, largest=True) regrow_4d = pruned_indices[topk_idx] diff --git a/src/graphlm/neuron/hybrid_transformer_demo.py b/src/graphlm/neuron/hybrid_transformer_demo.py index 1fd6415..ab5057e 100644 --- a/src/graphlm/neuron/hybrid_transformer_demo.py +++ b/src/graphlm/neuron/hybrid_transformer_demo.py @@ -15,6 +15,7 @@ from collections.abc import Iterator from dataclasses import dataclass +from typing import Literal import torch import torch.nn.functional as F @@ -68,6 +69,17 @@ class HybridTransformerTrainConfig: # 살아있는 edge 중 하위 magnitude 비율 (prune_bottom_fraction 사용). 0.0 → no-op. prune_fraction: float = 0.0 + # Phase 16a: DST regrow (constant sparsity 유지) + # prune_at_step 직후 + 이후 dst_period 마다 prune-and-regrow cycle 실행. + # regrow_method=None → Phase 15 호환 (static prune, no regrow). + regrow_method: Literal["random", "rigl"] | None = None + # DST cycle 주기 (default None = 첫 cycle 만, Phase 15 와 동일 형태) + dst_period: int | None = None + # DST cycle 에서 매번 swap 할 alive 비율 (= prune k% + regrow k%, sparsity 보존) + dst_swap_fraction: float = 0.1 + # DST cycle 종료 step (default None = max_steps 까지). 마지막 200 step 정도는 stabilize. + dst_end_step: int | None = None + # runtime seed: int = 0 device: str = "cpu" @@ -81,6 +93,19 @@ def __post_init__(self) -> None: f"prune_at_step must be in [1, max_steps={self.max_steps}], " f"got {self.prune_at_step}" ) + # Phase 16a regrow 검증 + if self.regrow_method not in (None, "random", "rigl"): + raise ValueError( + f"regrow_method must be None / 'random' / 'rigl', got {self.regrow_method!r}" + ) + if not 0.0 <= self.dst_swap_fraction <= 1.0: + raise ValueError(f"dst_swap_fraction must be in [0, 1], got {self.dst_swap_fraction}") + if self.dst_period is not None and self.dst_period < 1: + raise ValueError(f"dst_period must be >= 1, got {self.dst_period}") + if self.dst_end_step is not None and not 1 <= self.dst_end_step <= self.max_steps: + raise ValueError( + f"dst_end_step must be in [1, max_steps={self.max_steps}], got {self.dst_end_step}" + ) class HybridGraphTransformerLM(nn.Module): @@ -203,6 +228,78 @@ def _model_sparsity(model: nn.Module) -> float: return dead / total +# ── Phase 16a: DST cycle helpers ──────────────────────────── + + +def _compute_dense_grad_scores( + model: nn.Module, x: Tensor, y: Tensor, vocab_size: int +) -> dict[str, Tensor]: + """RigL 용 dense gradient magnitude 측정. + + edge_mask 를 일시적으로 모두 1 로 설정 → forward + backward → ``|weight.grad|`` 측정 → + edge_mask 복원. pruned edge 도 dense gradient 가 측정되어 regrow priority 결정에 활용. + + Returns: + layer 이름 → score tensor (shape == edge_mask shape). + """ + # 1. mask 저장 + dense 설정 + saved_masks: dict[str, Tensor] = {} + for name, mod in model.named_modules(): + if isinstance(mod, HybridGraphLinear): + saved_masks[name] = mod.edge_mask.clone() + mod.edge_mask.fill_(1.0) + # 2. 별도 forward + backward (현재 train step 의 gradient 와 분리) + for p in model.parameters(): + if p.grad is not None: + p.grad = None + logits = model(x) + loss = F.cross_entropy(logits.reshape(-1, vocab_size), y.reshape(-1)) + loss.backward() + # 3. score 추출 + scores: dict[str, Tensor] = {} + for name, mod in model.named_modules(): + if isinstance(mod, HybridGraphLinear): + scores[name] = mod.weight.grad.detach().abs().clone() + # 4. mask 복원 + grad clear (train loop 에서 다시 사용 안 하게) + for name, mod in model.named_modules(): + if isinstance(mod, HybridGraphLinear): + mod.edge_mask.copy_(saved_masks[name]) + for p in model.parameters(): + if p.grad is not None: + p.grad = None + return scores + + +def _dst_swap_step( + model: nn.Module, + swap_fraction: float, + regrow_method: Literal["random", "rigl"], + rigl_scores: dict[str, Tensor] | None, +) -> dict[str, dict]: + """DST cycle: 각 HybridGraphLinear 의 alive 중 swap_fraction 만큼 prune + 같은 수 regrow. + + constant sparsity 유지 — prune 한 수와 regrow 한 수가 같음. + + Returns: + layer 이름 → {pruned, regrown} count + """ + summary: dict[str, dict] = {} + for name, mod in model.named_modules(): + if not isinstance(mod, HybridGraphLinear): + continue + # prune alive 의 swap_fraction + n_pruned = mod.prune_bottom_fraction(swap_fraction) + # 같은 수 regrow + if regrow_method == "rigl": + if rigl_scores is None or name not in rigl_scores: + raise RuntimeError(f"regrow_method='rigl' 인데 layer '{name}' 의 scores 없음") + n_regrown = mod.regrow_by_score(n_pruned, rigl_scores[name]) + else: # random (SET) + n_regrown = mod.regrow_random(n_pruned) + summary[name] = {"pruned": n_pruned, "regrown": n_regrown} + return summary + + def train_hybrid_transformer_lm(config: HybridTransformerTrainConfig) -> dict: """1 run 학습 — Phase 13/14/15 sweep unit. @@ -231,6 +328,7 @@ def train_hybrid_transformer_lm(config: HybridTransformerTrainConfig) -> dict: optimizer = torch.optim.AdamW(model.parameters(), lr=config.lr) losses: list[float] = [] prune_event: dict | None = None + dst_cycles: list[dict] = [] model.train() for step in range(1, config.max_steps + 1): x, y = next(data_iter) @@ -255,6 +353,33 @@ def train_hybrid_transformer_lm(config: HybridTransformerTrainConfig) -> dict: "sparsity_after": _model_sparsity(model), } + # Phase 16a: DST swap cycle (prune+regrow) after initial prune + if ( + config.regrow_method is not None + and config.dst_period is not None + and config.prune_at_step is not None + and step > config.prune_at_step + and (step - config.prune_at_step) % config.dst_period == 0 + and (config.dst_end_step is None or step <= config.dst_end_step) + and config.dst_swap_fraction > 0 + ): + rigl_scores = None + if config.regrow_method == "rigl": + rigl_scores = _compute_dense_grad_scores(model, x, y, config.vocab_size) + cycle_summary = _dst_swap_step( + model, + swap_fraction=config.dst_swap_fraction, + regrow_method=config.regrow_method, + rigl_scores=rigl_scores, + ) + dst_cycles.append( + { + "step": step, + "total_swap": sum(c["pruned"] for c in cycle_summary.values()), + "sparsity_after": _model_sparsity(model), + } + ) + n_last = min(100, len(losses)) final_loss = sum(losses[-n_last:]) / n_last if n_last > 0 else 0.0 @@ -264,6 +389,7 @@ def train_hybrid_transformer_lm(config: HybridTransformerTrainConfig) -> dict: "final_adj": _snapshot_adj(model), "final_sparsity": _model_sparsity(model), "prune_event": prune_event, + "dst_cycles": dst_cycles, } From 8a3af503508d1b5453b07337dd74200fab58b51e Mon Sep 17 00:00:00 2001 From: juhyuni Date: Wed, 27 May 2026 10:50:35 +0900 Subject: [PATCH 3/6] =?UTF-8?q?[FEAT]:=20neuron=20Phase=2016a=20(3/3)=20?= =?UTF-8?q?=E2=80=94=20=EB=85=B8=ED=8A=B8=EB=B6=81=20(DST=20RigL=20vs=20SE?= =?UTF-8?q?T=20vs=20static,=2050%=20sparsity)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - notebooks/02-function-level/15-phase16a-rigl-set-regrow.ipynb 신규 - 4 mode × 2 seed = 8 run: dense / static_50 / dst_set_50 / dst_rigl_50 - arch 고정: hybrid_around_one_around_one + use_full_graph=True (Phase 14 최저 loss) - DST 설정: period=50, swap=10%, end_step=1300 (마지막 200 step stabilize) - 자동 verdict 4가지: - constant sparsity (target 0.5, ±0.02) - RigL ≤ static + 0.02 - RigL ≤ SET + 0.02 - all-finite (DST stability) - loss curve (prune + DST end 수직선) + sparsity trace (constant 유지 검증) --- .../15-phase16a-rigl-set-regrow.ipynb | 403 ++++++++++++++++++ 1 file changed, 403 insertions(+) create mode 100644 notebooks/02-function-level/15-phase16a-rigl-set-regrow.ipynb diff --git a/notebooks/02-function-level/15-phase16a-rigl-set-regrow.ipynb b/notebooks/02-function-level/15-phase16a-rigl-set-regrow.ipynb new file mode 100644 index 0000000..3b63ff2 --- /dev/null +++ b/notebooks/02-function-level/15-phase16a-rigl-set-regrow.ipynb @@ -0,0 +1,403 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# 15-phase16a-rigl-set-regrow\n", + "\n", + "**neuron Phase 16a** — paradigm 의 dynamic phase 두 번째 단계. Phase 15 의 *static prune* 을 확장하여 **iterative prune + regrow** 로 학습 중 topology 가 진화하는 DST (Dynamic Sparse Training) 구현.\n", + "\n", + "핵심 가설:\n", + "1. **RigL ≥ static prune?** — 같은 50% sparsity 에서 RigL DST 가 단순 prune 보다 낮은 loss?\n", + "2. **RigL ≥ SET?** — gradient-guided regrow 가 random regrow 보다 우수?\n", + "3. **constant sparsity 유지** — 각 DST cycle 후 sparsity 일정?\n", + "4. **all-finite** — DST cycle 도중 학습 안정성?\n", + "\n", + "설계: full graph block (`hybrid_around_one_around_one`, Phase 14 최저 loss 구조) 위에서 **4 mode × 2 seed = 8 run**.\n", + "- `dense`: prune 없음 (baseline)\n", + "- `static_50`: 50% prune at step 750, regrow 없음 (Phase 15)\n", + "- `dst_set_50`: 50% prune at step 750 + random regrow (SET) every 50 steps, swap 10%\n", + "- `dst_rigl_50`: 50% prune at step 750 + gradient-based regrow (RigL) every 50 steps, swap 10%\n", + "- dst_end_step = 1300 (마지막 200 step 은 stabilize)\n", + "\n", + "데이터: TinyShakespeare (char-LM, block_size=64)\n", + "시드: [42, 123]\n", + "작성일: 2026-05-27\n", + "연관: Issue [#76](https://github.com/EinSofINTEREST/GraphLM/issues/76) (Phase 16 main [#75](https://github.com/EinSofINTEREST/GraphLM/issues/75)) / Phase 15 PR [#72](https://github.com/EinSofINTEREST/GraphLM/pull/72)" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## 0. 환경 / 의존성" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "from __future__ import annotations\n", + "\n", + "import math\n", + "import statistics\n", + "from pathlib import Path\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import torch\n", + "\n", + "from graphlm.data.tinyshakespeare import (\n", + " CharTokenizer,\n", + " TinyShakespeareDataset,\n", + " load_tinyshakespeare_text,\n", + ")\n", + "from graphlm.neuron.hybrid_transformer_demo import (\n", + " HybridTransformerTrainConfig,\n", + " train_hybrid_transformer_lm,\n", + ")\n", + "from graphlm.utils import safe_perplexity\n", + "\n", + "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", + "print(f\"device: {device}\")\n", + "print(f\"torch: {torch.__version__}\")" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "## 1. Config + 데이터" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "text = load_tinyshakespeare_text()\n", + "tokenizer = CharTokenizer(text)\n", + "dataset = TinyShakespeareDataset(text, tokenizer)\n", + "vocab_size = tokenizer.vocab_size\n", + "print(f\"vocab_size = {vocab_size}, dataset size = {len(dataset)}\")\n", + "\n", + "# Phase 15 와 동일 hyperparameter (공정 비교)\n", + "HIDDEN_DIM = 128\n", + "N_HEADS = 4\n", + "FFN_DIM = 256\n", + "N_LAYERS = 4\n", + "GROUP_SIZE = 16\n", + "BLOCK_SIZE = 64\n", + "BATCH_SIZE = 32\n", + "LR = 3e-4\n", + "MAX_STEPS = 1500\n", + "PRUNE_AT_STEP = MAX_STEPS // 2 # 750\n", + "DST_PERIOD = 50 # 매 50 step 마다 DST cycle\n", + "DST_SWAP_FRACTION = 0.1 # alive 의 10% swap\n", + "DST_END_STEP = 1300 # 마지막 200 step stabilize\n", + "SEEDS = [42, 123]\n", + "ARCH = \"hybrid_around_one_around_one\"\n", + "\n", + "# 4 mode 정의\n", + "MODES = [\n", + " {\"name\": \"dense\", \"prune_fraction\": 0.0, \"prune_at_step\": None, \"regrow_method\": None},\n", + " {\n", + " \"name\": \"static_50\",\n", + " \"prune_fraction\": 0.5,\n", + " \"prune_at_step\": PRUNE_AT_STEP,\n", + " \"regrow_method\": None,\n", + " },\n", + " {\n", + " \"name\": \"dst_set_50\",\n", + " \"prune_fraction\": 0.5,\n", + " \"prune_at_step\": PRUNE_AT_STEP,\n", + " \"regrow_method\": \"random\",\n", + " },\n", + " {\n", + " \"name\": \"dst_rigl_50\",\n", + " \"prune_fraction\": 0.5,\n", + " \"prune_at_step\": PRUNE_AT_STEP,\n", + " \"regrow_method\": \"rigl\",\n", + " },\n", + "]\n", + "print(\n", + " f\"\\nDST cycle: period={DST_PERIOD}, swap_fraction={DST_SWAP_FRACTION}, end_step={DST_END_STEP}\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "## 2. Sweep 실행 (4 mode × 2 seed = 8 run)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "results = {}\n", + "for mode in MODES:\n", + " for seed in SEEDS:\n", + " key = (mode[\"name\"], seed)\n", + " print(f\"\\n== mode={mode['name']} seed={seed} ==\")\n", + " cfg = HybridTransformerTrainConfig(\n", + " dataset=dataset,\n", + " vocab_size=vocab_size,\n", + " hidden_dim=HIDDEN_DIM,\n", + " n_heads=N_HEADS,\n", + " ffn_dim=FFN_DIM,\n", + " n_layers=N_LAYERS,\n", + " group_size=GROUP_SIZE,\n", + " arch=ARCH,\n", + " use_full_graph=True,\n", + " block_size=BLOCK_SIZE,\n", + " batch_size=BATCH_SIZE,\n", + " lr=LR,\n", + " max_steps=MAX_STEPS,\n", + " prune_at_step=mode[\"prune_at_step\"],\n", + " prune_fraction=mode[\"prune_fraction\"],\n", + " regrow_method=mode[\"regrow_method\"],\n", + " dst_period=DST_PERIOD if mode[\"regrow_method\"] else None,\n", + " dst_swap_fraction=DST_SWAP_FRACTION,\n", + " dst_end_step=DST_END_STEP if mode[\"regrow_method\"] else None,\n", + " seed=seed,\n", + " device=device,\n", + " )\n", + " out = train_hybrid_transformer_lm(cfg)\n", + " results[key] = out\n", + " n_cycles = len(out[\"dst_cycles\"])\n", + " print(\n", + " f\" final_loss = {out['final_loss']:.4f} (ppl = {safe_perplexity(out['final_loss']):.2f})\"\n", + " f\" sparsity = {out['final_sparsity']:.3f} dst_cycles = {n_cycles}\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "## 3. 결과 표 + 자동 verdict" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "print(\n", + " f\"{'mode':>12s} {'seed':>6s} {'final_loss':>12s} {'perplexity':>12s} \"\n", + " f\"{'sparsity':>10s} {'dst_cycles':>12s}\"\n", + ")\n", + "print(\"-\" * 75)\n", + "for (name, seed), out in results.items():\n", + " fl = out[\"final_loss\"]\n", + " print(\n", + " f\"{name:>12s} {seed:>6d} {fl:>12.4f} {safe_perplexity(fl):>12.2f} \"\n", + " f\"{out['final_sparsity']:>10.3f} {len(out['dst_cycles']):>12d}\"\n", + " )\n", + "\n", + "# mode 별 평균\n", + "print(\"\\n== Mode summary (mean ± σ across seeds) ==\")\n", + "summary = {}\n", + "for mode in MODES:\n", + " name = mode[\"name\"]\n", + " vals = [results[(name, s)][\"final_loss\"] for s in SEEDS]\n", + " sparsities = [results[(name, s)][\"final_sparsity\"] for s in SEEDS]\n", + " m = statistics.mean(vals)\n", + " sd = statistics.stdev(vals) if len(vals) > 1 else 0.0\n", + " summary[name] = (m, sd, statistics.mean(sparsities))\n", + " print(\n", + " f\" {name:>12s} {m:.4f} ± {sd:.4f} (ppl ≈ {safe_perplexity(m):.2f}) \"\n", + " f\"sparsity={statistics.mean(sparsities):.3f}\"\n", + " )\n", + "\n", + "# 자동 verdict\n", + "print(\"\\n== Verdict ==\")\n", + "dense_loss = summary[\"dense\"][0]\n", + "static_loss = summary[\"static_50\"][0]\n", + "set_loss = summary[\"dst_set_50\"][0]\n", + "rigl_loss = summary[\"dst_rigl_50\"][0]\n", + "\n", + "# 1. constant sparsity — 3개 prune mode 모두 final sparsity 가 target 근방\n", + "sp_ok = all(abs(summary[m][2] - 0.5) < 0.02 for m in (\"static_50\", \"dst_set_50\", \"dst_rigl_50\"))\n", + "verdict_1 = \"PASS\" if sp_ok else \"FAIL\"\n", + "print(f\"1. constant sparsity (target 0.5, ±0.02): {sp_ok} [{verdict_1}]\")\n", + "\n", + "# 2. RigL ≥ static — DST RigL 이 static prune 보다 ≤ (낮거나 같음)\n", + "diff_rigl_static = rigl_loss - static_loss\n", + "verdict_2 = \"PASS\" if diff_rigl_static <= 0.02 else \"FAIL\"\n", + "print(f\"2. RigL ≤ static + 0.02: diff = {diff_rigl_static:+.4f} [{verdict_2}]\")\n", + "\n", + "# 3. RigL ≥ SET — gradient-guided 가 random 보다 ≤\n", + "diff_rigl_set = rigl_loss - set_loss\n", + "verdict_3 = \"PASS\" if diff_rigl_set <= 0.02 else \"FAIL\"\n", + "print(f\"3. RigL ≤ SET + 0.02: diff = {diff_rigl_set:+.4f} [{verdict_3}]\")\n", + "\n", + "# 4. all-finite\n", + "all_finite = all(math.isfinite(out[\"final_loss\"]) for out in results.values())\n", + "verdict_4 = \"PASS\" if all_finite else \"FAIL\"\n", + "print(f\"4. all-finite (DST stability): {all_finite} [{verdict_4}]\")\n", + "\n", + "# DST cycle 정보 (RigL seed=42 기준 샘플)\n", + "rigl_42_cycles = results[(\"dst_rigl_50\", 42)][\"dst_cycles\"]\n", + "print(f\"\\n== RigL seed=42 의 DST cycles ({len(rigl_42_cycles)}건) ==\")\n", + "for c in rigl_42_cycles[:3]:\n", + " print(f\" step={c['step']} swap={c['total_swap']} sparsity_after={c['sparsity_after']:.3f}\")\n", + "if len(rigl_42_cycles) > 6:\n", + " print(f\" ... (중략 {len(rigl_42_cycles) - 6}건) ...\")\n", + "for c in rigl_42_cycles[-3:]:\n", + " print(f\" step={c['step']} swap={c['total_swap']} sparsity_after={c['sparsity_after']:.3f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "## 4. Loss curve 시각화 — prune + DST cycle 표시" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1, figsize=(12, 6))\n", + "colors = {\n", + " \"dense\": \"tab:gray\",\n", + " \"static_50\": \"tab:red\",\n", + " \"dst_set_50\": \"tab:orange\",\n", + " \"dst_rigl_50\": \"tab:blue\",\n", + "}\n", + "window = 50\n", + "\n", + "for mode in MODES:\n", + " name = mode[\"name\"]\n", + " losses_per_seed = [results[(name, s)][\"losses\"] for s in SEEDS]\n", + " smoothed = []\n", + " for losses in losses_per_seed:\n", + " smoothed.append(\n", + " [\n", + " sum(losses[max(0, i - window + 1) : i + 1]) / min(i + 1, window)\n", + " for i in range(len(losses))\n", + " ]\n", + " )\n", + " arr = torch.tensor(smoothed)\n", + " mean = arr.mean(dim=0)\n", + " std = arr.std(dim=0)\n", + " steps = list(range(len(mean)))\n", + " ax.plot(steps, mean, label=name, color=colors[name], linewidth=1.5)\n", + " ax.fill_between(steps, mean - std, mean + std, color=colors[name], alpha=0.12)\n", + "\n", + "# prune step + DST end 수직선\n", + "ax.axvline(PRUNE_AT_STEP, color=\"black\", linestyle=\":\", alpha=0.5, label=f\"prune @ {PRUNE_AT_STEP}\")\n", + "ax.axvline(DST_END_STEP, color=\"gray\", linestyle=\":\", alpha=0.5, label=f\"DST end @ {DST_END_STEP}\")\n", + "\n", + "ax.set_xlabel(\"step\")\n", + "ax.set_ylabel(f\"loss (rolling mean w={window})\")\n", + "ax.set_title(\"Phase 16a — DST (RigL vs SET vs static): all 50% sparsity (mean ± σ over 2 seeds)\")\n", + "ax.legend(loc=\"upper right\")\n", + "ax.grid(alpha=0.3)\n", + "plt.tight_layout()\n", + "\n", + "out_dir = Path(\"../../runs/notebook-neuron-phase16a\")\n", + "out_dir.mkdir(parents=True, exist_ok=True)\n", + "fig.savefig(out_dir / \"loss_curves.png\", dpi=150, bbox_inches=\"tight\")\n", + "plt.show()\n", + "print(f\"saved: {out_dir / 'loss_curves.png'}\")" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "## 5. DST cycle sparsity 추적 (RigL)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1, figsize=(10, 5))\n", + "for seed in SEEDS:\n", + " cycles = results[(\"dst_rigl_50\", seed)][\"dst_cycles\"]\n", + " steps = [c[\"step\"] for c in cycles]\n", + " sparsities = [c[\"sparsity_after\"] for c in cycles]\n", + " ax.plot(steps, sparsities, marker=\"o\", label=f\"RigL seed={seed}\", linewidth=1.5)\n", + "\n", + "ax.axhline(0.5, color=\"black\", linestyle=\"--\", alpha=0.5, label=\"target sparsity 0.5\")\n", + "ax.set_xlabel(\"step\")\n", + "ax.set_ylabel(\"effective sparsity (mask=0 비율)\")\n", + "ax.set_title(\"Phase 16a — DST cycle 후 sparsity (constant 유지 검증)\")\n", + "ax.legend()\n", + "ax.grid(alpha=0.3)\n", + "ax.set_ylim(0.45, 0.55)\n", + "plt.tight_layout()\n", + "fig.savefig(out_dir / \"sparsity_trace.png\", dpi=150, bbox_inches=\"tight\")\n", + "plt.show()\n", + "print(f\"saved: {out_dir / 'sparsity_trace.png'}\")" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "## 6. 결론 / 다음 단계\n", + "\n", + "(셀 출력 보고 사용자가 채울 영역)\n", + "\n", + "- RigL vs SET vs static 의 final loss ranking?\n", + "- DST 가 static prune 보다 의미 있는 개선?\n", + "- constant sparsity 정확히 유지되는지?\n", + "\n", + "**Phase 16b 진입 시 가설**:\n", + "- 16a 의 *constant sparsity DST* 가 paradigm 안에서 작동 입증 → 16b 의 *capacity expansion (Net2Net)* 도 비슷한 통합 메커니즘 (edge_mask) 위에서 작동 가능?\n", + "- 16a + 16b 결합 → *grow + shrink 동시 dynamic*" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "GraphLM (uv .venv)", + "language": "python", + "name": "graphlm-uv-venv" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From acdf87a3df82c67b895f5281a09f3cfd393d0f9a Mon Sep 17 00:00:00 2001 From: juhyuni Date: Wed, 27 May 2026 11:06:42 +0900 Subject: [PATCH 4/6] =?UTF-8?q?[FIX]:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EB=B0=98=EC=98=81,=20.data=20=EC=82=AC=EC=9A=A9=20/=20dense=20?= =?UTF-8?q?grad=20side-effect=20/=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=A0=95=ED=99=95=EC=84=B1=20/=20=EC=A3=BC=EC=84=9D=204?= =?UTF-8?q?=EA=B1=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - gemini #3307952463 + Copilot #3307955940 (중복): _activate_edges 의 self.weight.data 직접 수정 비권장 → with torch.no_grad(): + in-place [...] = 0.0 로 변경. helper 자체에 no_grad 보장. - gemini #3307952471 (HIGH): _compute_dense_grad_scores 가 model.grad 직접 수정 (side-effect) + 동결 layer 시 AttributeError → torch.autograd.grad(loss, weights, allow_unused=True) 로 재작성. .grad 미사용, requires_grad=False / unused layer 안전 처리. - Copilot #3307955897: test_constant_sparsity_prune_then_regrow 가 prune/regrow 동량 안 맞고 ±0.1 허용 → 두 번째 prune 의 return 값으로 정확한 regrow + sparsity / alive 정확 일치 assert. - Copilot #3307955919: dst_period 주석/실제 동작 불일치 (주석은 "None=첫 cycle만" 이나 실제는 None=미실행) → 주석을 실제 동작 (None=DST cycle 미실행, Phase 15 호환) 으로 수정. - 213 tests still green --- src/graphlm/neuron/graph_hybrid.py | 13 ++++-- src/graphlm/neuron/hybrid_transformer_demo.py | 45 ++++++++++--------- tests/neuron/test_graph_hybrid.py | 26 ++++++----- 3 files changed, 47 insertions(+), 37 deletions(-) diff --git a/src/graphlm/neuron/graph_hybrid.py b/src/graphlm/neuron/graph_hybrid.py index 7f22d9d..89b8499 100644 --- a/src/graphlm/neuron/graph_hybrid.py +++ b/src/graphlm/neuron/graph_hybrid.py @@ -362,11 +362,16 @@ def regrow_by_score(self, n: int, scores: Tensor, *, reset_weight: bool = True) return n_to_regrow def _activate_edges(self, indices_4d: Tensor, *, reset_weight: bool) -> None: - """주어진 4D 인덱스 위치의 mask=1 + (옵션) weight=0 초기화 (internal helper).""" + """주어진 4D 인덱스 위치의 mask=1 + (옵션) weight=0 초기화 (internal helper). + + ``self.weight`` 는 Parameter — `.data` 직접 수정은 autograd 우회로 비권장 + (gemini #3307952463 / Copilot #3307955940). ``with torch.no_grad()`` + in-place 갱신. + """ i0, i1, i2, i3 = indices_4d[:, 0], indices_4d[:, 1], indices_4d[:, 2], indices_4d[:, 3] - self.edge_mask[i0, i1, i2, i3] = 1.0 - if reset_weight: - self.weight.data[i0, i1, i2, i3] = 0.0 + with torch.no_grad(): + self.edge_mask[i0, i1, i2, i3] = 1.0 + if reset_weight: + self.weight[i0, i1, i2, i3] = 0.0 def extra_repr(self) -> str: return ( diff --git a/src/graphlm/neuron/hybrid_transformer_demo.py b/src/graphlm/neuron/hybrid_transformer_demo.py index ab5057e..ec1c34f 100644 --- a/src/graphlm/neuron/hybrid_transformer_demo.py +++ b/src/graphlm/neuron/hybrid_transformer_demo.py @@ -70,10 +70,12 @@ class HybridTransformerTrainConfig: prune_fraction: float = 0.0 # Phase 16a: DST regrow (constant sparsity 유지) - # prune_at_step 직후 + 이후 dst_period 마다 prune-and-regrow cycle 실행. - # regrow_method=None → Phase 15 호환 (static prune, no regrow). + # 동작: regrow_method != None AND dst_period != None 일 때만 DST cycle 실행. + # prune_at_step 이후 dst_period 마다 prune-and-regrow 실행 (dst_end_step 까지). + # regrow_method=None → no regrow (Phase 15 호환, static prune). regrow_method: Literal["random", "rigl"] | None = None - # DST cycle 주기 (default None = 첫 cycle 만, Phase 15 와 동일 형태) + # DST cycle 주기 (default None = DST cycle 미실행 = Phase 15 호환) + # (Copilot #3307955919 — 주석/동작 일치) dst_period: int | None = None # DST cycle 에서 매번 swap 할 alive 비율 (= prune k% + regrow k%, sparsity 보존) dst_swap_fraction: float = 0.1 @@ -236,37 +238,38 @@ def _compute_dense_grad_scores( ) -> dict[str, Tensor]: """RigL 용 dense gradient magnitude 측정. - edge_mask 를 일시적으로 모두 1 로 설정 → forward + backward → ``|weight.grad|`` 측정 → - edge_mask 복원. pruned edge 도 dense gradient 가 측정되어 regrow priority 결정에 활용. + edge_mask 를 일시적으로 모두 1 로 설정 → forward → ``torch.autograd.grad`` 로 weight gradient + 직접 추출 → edge_mask 복원. 모델의 ``.grad`` 속성을 건드리지 않아 train loop 의 gradient + accumulation / 동결 layer 와 안전 (gemini #3307952471). Returns: layer 이름 → score tensor (shape == edge_mask shape). """ # 1. mask 저장 + dense 설정 saved_masks: dict[str, Tensor] = {} + target_modules: dict[str, HybridGraphLinear] = {} for name, mod in model.named_modules(): if isinstance(mod, HybridGraphLinear): saved_masks[name] = mod.edge_mask.clone() mod.edge_mask.fill_(1.0) - # 2. 별도 forward + backward (현재 train step 의 gradient 와 분리) - for p in model.parameters(): - if p.grad is not None: - p.grad = None + target_modules[name] = mod + # 2. 별도 forward (현재 train step 의 gradient 와 분리) logits = model(x) loss = F.cross_entropy(logits.reshape(-1, vocab_size), y.reshape(-1)) - loss.backward() - # 3. score 추출 + # 3. torch.autograd.grad 로 직접 gradient 추출 (.grad 미사용, side-effect 없음) + weights_to_grad = [mod.weight for mod in target_modules.values() if mod.weight.requires_grad] + grads = torch.autograd.grad(loss, weights_to_grad, allow_unused=True) if weights_to_grad else [] + # 4. score 추출 + mask 복원 scores: dict[str, Tensor] = {} - for name, mod in model.named_modules(): - if isinstance(mod, HybridGraphLinear): - scores[name] = mod.weight.grad.detach().abs().clone() - # 4. mask 복원 + grad clear (train loop 에서 다시 사용 안 하게) - for name, mod in model.named_modules(): - if isinstance(mod, HybridGraphLinear): - mod.edge_mask.copy_(saved_masks[name]) - for p in model.parameters(): - if p.grad is not None: - p.grad = None + grad_iter = iter(grads) + for name, mod in target_modules.items(): + mod.edge_mask.copy_(saved_masks[name]) + if not mod.weight.requires_grad: + # 동결 layer — 0 score (regrow 우선순위 최하) + scores[name] = torch.zeros_like(mod.weight) + continue + g = next(grad_iter) + scores[name] = g.detach().abs().clone() if g is not None else torch.zeros_like(mod.weight) return scores diff --git a/tests/neuron/test_graph_hybrid.py b/tests/neuron/test_graph_hybrid.py index 34d9abe..ec9ca40 100644 --- a/tests/neuron/test_graph_hybrid.py +++ b/tests/neuron/test_graph_hybrid.py @@ -402,21 +402,23 @@ def test_regrow_then_forward_gradient_flows(): def test_constant_sparsity_prune_then_regrow(): - """prune N + regrow N → sparsity 변경 없음 (DST constant sparsity).""" + """DST cycle: 같은 수 prune + regrow → sparsity 정확히 일정 (Copilot #3307955897 강화).""" torch.manual_seed(0) lin = HybridGraphLinear(16, 16, group_size=4) lin.prune_bottom_fraction(0.5) - sparsity_after_prune = lin.effective_sparsity() - # 동량 regrow - n_prune = lin.n_pruned_edges() - target_swap = int(n_prune * 0.2) # 20% swap - lin.prune_bottom_fraction(0.2) # alive 의 20% 추가 prune - lin.regrow_random(target_swap) - # 정확히 같지는 않으나 근방 — prune+regrow 동량이면 sparsity 일정 - # 더 정확히: 새 prune 수 == regrow 수면 sparsity 동일 - sparsity_after_dst = lin.effective_sparsity() - # 두 sparsity 차이는 prune/regrow 의 정확성에 따라 +/- - assert abs(sparsity_after_dst - sparsity_after_prune) < 0.1 + sparsity_before_cycle = lin.effective_sparsity() + alive_before_cycle = lin.n_alive_edges() + + # DST cycle: 두 번째 prune 의 return 값을 받아 그 수만큼 정확히 regrow + n_pruned_in_cycle = lin.prune_bottom_fraction(0.2) # alive 의 20% + n_regrown = lin.regrow_random(n_pruned_in_cycle) + assert n_regrown == n_pruned_in_cycle, "DST cycle: regrow 수가 prune 수와 일치해야 함" + + # 정확히 동일 sparsity / alive 유지 (constant sparsity) + assert lin.effective_sparsity() == sparsity_before_cycle, ( + f"DST 후 sparsity 불일치: {lin.effective_sparsity()} vs {sparsity_before_cycle}" + ) + assert lin.n_alive_edges() == alive_before_cycle def test_edge_mask_in_state_dict(): From f18959aa3f2bcf5d76c11a8521e59ebb4a73efa1 Mon Sep 17 00:00:00 2001 From: juhyuni Date: Wed, 27 May 2026 11:21:51 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[FIX]:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EB=B0=98=EC=98=81,=20dense=20grad=20try/finally=20=EB=B3=B5?= =?UTF-8?q?=EC=9B=90=20+=20notebook=20DST=20cycle=20=EB=B3=84=20sparsity?= =?UTF-8?q?=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CodeRabbit #3308022927: _compute_dense_grad_scores 의 forward/grad 예외 시 edge_mask 미복원 → all-1 mask 로 학습 지속 위험 → try/finally 로 mask 복원 보장. 정상/예외 경로 모두 복원. - CodeRabbit #3308022917: notebook verdict 1 의 constant sparsity 검증이 final_sparsity 만 보고 cycle 중간 drift 미감지 → static 은 final, DST 는 모든 dst_cycles[*].sparsity_after 검증 (target 0.5 ±0.02). --- .../15-phase16a-rigl-set-regrow.ipynb | 68 +------------------ src/graphlm/neuron/hybrid_transformer_demo.py | 47 ++++++++----- 2 files changed, 31 insertions(+), 84 deletions(-) diff --git a/notebooks/02-function-level/15-phase16a-rigl-set-regrow.ipynb b/notebooks/02-function-level/15-phase16a-rigl-set-regrow.ipynb index 3b63ff2..3796563 100644 --- a/notebooks/02-function-level/15-phase16a-rigl-set-regrow.ipynb +++ b/notebooks/02-function-level/15-phase16a-rigl-set-regrow.ipynb @@ -199,71 +199,7 @@ "id": "8", "metadata": {}, "outputs": [], - "source": [ - "print(\n", - " f\"{'mode':>12s} {'seed':>6s} {'final_loss':>12s} {'perplexity':>12s} \"\n", - " f\"{'sparsity':>10s} {'dst_cycles':>12s}\"\n", - ")\n", - "print(\"-\" * 75)\n", - "for (name, seed), out in results.items():\n", - " fl = out[\"final_loss\"]\n", - " print(\n", - " f\"{name:>12s} {seed:>6d} {fl:>12.4f} {safe_perplexity(fl):>12.2f} \"\n", - " f\"{out['final_sparsity']:>10.3f} {len(out['dst_cycles']):>12d}\"\n", - " )\n", - "\n", - "# mode 별 평균\n", - "print(\"\\n== Mode summary (mean ± σ across seeds) ==\")\n", - "summary = {}\n", - "for mode in MODES:\n", - " name = mode[\"name\"]\n", - " vals = [results[(name, s)][\"final_loss\"] for s in SEEDS]\n", - " sparsities = [results[(name, s)][\"final_sparsity\"] for s in SEEDS]\n", - " m = statistics.mean(vals)\n", - " sd = statistics.stdev(vals) if len(vals) > 1 else 0.0\n", - " summary[name] = (m, sd, statistics.mean(sparsities))\n", - " print(\n", - " f\" {name:>12s} {m:.4f} ± {sd:.4f} (ppl ≈ {safe_perplexity(m):.2f}) \"\n", - " f\"sparsity={statistics.mean(sparsities):.3f}\"\n", - " )\n", - "\n", - "# 자동 verdict\n", - "print(\"\\n== Verdict ==\")\n", - "dense_loss = summary[\"dense\"][0]\n", - "static_loss = summary[\"static_50\"][0]\n", - "set_loss = summary[\"dst_set_50\"][0]\n", - "rigl_loss = summary[\"dst_rigl_50\"][0]\n", - "\n", - "# 1. constant sparsity — 3개 prune mode 모두 final sparsity 가 target 근방\n", - "sp_ok = all(abs(summary[m][2] - 0.5) < 0.02 for m in (\"static_50\", \"dst_set_50\", \"dst_rigl_50\"))\n", - "verdict_1 = \"PASS\" if sp_ok else \"FAIL\"\n", - "print(f\"1. constant sparsity (target 0.5, ±0.02): {sp_ok} [{verdict_1}]\")\n", - "\n", - "# 2. RigL ≥ static — DST RigL 이 static prune 보다 ≤ (낮거나 같음)\n", - "diff_rigl_static = rigl_loss - static_loss\n", - "verdict_2 = \"PASS\" if diff_rigl_static <= 0.02 else \"FAIL\"\n", - "print(f\"2. RigL ≤ static + 0.02: diff = {diff_rigl_static:+.4f} [{verdict_2}]\")\n", - "\n", - "# 3. RigL ≥ SET — gradient-guided 가 random 보다 ≤\n", - "diff_rigl_set = rigl_loss - set_loss\n", - "verdict_3 = \"PASS\" if diff_rigl_set <= 0.02 else \"FAIL\"\n", - "print(f\"3. RigL ≤ SET + 0.02: diff = {diff_rigl_set:+.4f} [{verdict_3}]\")\n", - "\n", - "# 4. all-finite\n", - "all_finite = all(math.isfinite(out[\"final_loss\"]) for out in results.values())\n", - "verdict_4 = \"PASS\" if all_finite else \"FAIL\"\n", - "print(f\"4. all-finite (DST stability): {all_finite} [{verdict_4}]\")\n", - "\n", - "# DST cycle 정보 (RigL seed=42 기준 샘플)\n", - "rigl_42_cycles = results[(\"dst_rigl_50\", 42)][\"dst_cycles\"]\n", - "print(f\"\\n== RigL seed=42 의 DST cycles ({len(rigl_42_cycles)}건) ==\")\n", - "for c in rigl_42_cycles[:3]:\n", - " print(f\" step={c['step']} swap={c['total_swap']} sparsity_after={c['sparsity_after']:.3f}\")\n", - "if len(rigl_42_cycles) > 6:\n", - " print(f\" ... (중략 {len(rigl_42_cycles) - 6}건) ...\")\n", - "for c in rigl_42_cycles[-3:]:\n", - " print(f\" step={c['step']} swap={c['total_swap']} sparsity_after={c['sparsity_after']:.3f}\")" - ] + "source": "print(\n f\"{'mode':>12s} {'seed':>6s} {'final_loss':>12s} {'perplexity':>12s} \"\n f\"{'sparsity':>10s} {'dst_cycles':>12s}\"\n)\nprint(\"-\" * 75)\nfor (name, seed), out in results.items():\n fl = out[\"final_loss\"]\n print(\n f\"{name:>12s} {seed:>6d} {fl:>12.4f} {safe_perplexity(fl):>12.2f} \"\n f\"{out['final_sparsity']:>10.3f} {len(out['dst_cycles']):>12d}\"\n )\n\n# mode 별 평균\nprint(\"\\n== Mode summary (mean ± σ across seeds) ==\")\nsummary = {}\nfor mode in MODES:\n name = mode[\"name\"]\n vals = [results[(name, s)][\"final_loss\"] for s in SEEDS]\n sparsities = [results[(name, s)][\"final_sparsity\"] for s in SEEDS]\n m = statistics.mean(vals)\n sd = statistics.stdev(vals) if len(vals) > 1 else 0.0\n summary[name] = (m, sd, statistics.mean(sparsities))\n print(\n f\" {name:>12s} {m:.4f} ± {sd:.4f} (ppl ≈ {safe_perplexity(m):.2f}) \"\n f\"sparsity={statistics.mean(sparsities):.3f}\"\n )\n\n# 자동 verdict\nprint(\"\\n== Verdict ==\")\ndense_loss = summary[\"dense\"][0]\nstatic_loss = summary[\"static_50\"][0]\nset_loss = summary[\"dst_set_50\"][0]\nrigl_loss = summary[\"dst_rigl_50\"][0]\n\n# 1. constant sparsity — static 은 final, DST 는 모든 cycle 별 sparsity 검증\n# (CodeRabbit #3308022917 — final 만 보면 cycle 중간 drift 미감지)\nstatic_ok = abs(summary[\"static_50\"][2] - 0.5) < 0.02\ndst_cycles_ok = all(\n abs(c[\"sparsity_after\"] - 0.5) < 0.02\n for mode_name in (\"dst_set_50\", \"dst_rigl_50\")\n for seed in SEEDS\n for c in results[(mode_name, seed)][\"dst_cycles\"]\n)\nsp_ok = static_ok and dst_cycles_ok\nverdict_1 = \"PASS\" if sp_ok else \"FAIL\"\nprint(\n f\"1. constant sparsity (static final + 모든 DST cycle, target 0.5 ±0.02): \"\n f\"{sp_ok} [{verdict_1}]\"\n)\n\n# 2. RigL ≥ static — DST RigL 이 static prune 보다 ≤ (낮거나 같음)\ndiff_rigl_static = rigl_loss - static_loss\nverdict_2 = \"PASS\" if diff_rigl_static <= 0.02 else \"FAIL\"\nprint(f\"2. RigL ≤ static + 0.02: diff = {diff_rigl_static:+.4f} [{verdict_2}]\")\n\n# 3. RigL ≥ SET — gradient-guided 가 random 보다 ≤\ndiff_rigl_set = rigl_loss - set_loss\nverdict_3 = \"PASS\" if diff_rigl_set <= 0.02 else \"FAIL\"\nprint(f\"3. RigL ≤ SET + 0.02: diff = {diff_rigl_set:+.4f} [{verdict_3}]\")\n\n# 4. all-finite\nall_finite = all(math.isfinite(out[\"final_loss\"]) for out in results.values())\nverdict_4 = \"PASS\" if all_finite else \"FAIL\"\nprint(f\"4. all-finite (DST stability): {all_finite} [{verdict_4}]\")\n\n# DST cycle 정보 (RigL seed=42 기준 샘플)\nrigl_42_cycles = results[(\"dst_rigl_50\", 42)][\"dst_cycles\"]\nprint(f\"\\n== RigL seed=42 의 DST cycles ({len(rigl_42_cycles)}건) ==\")\nfor c in rigl_42_cycles[:3]:\n print(f\" step={c['step']} swap={c['total_swap']} sparsity_after={c['sparsity_after']:.3f}\")\nif len(rigl_42_cycles) > 6:\n print(f\" ... (중략 {len(rigl_42_cycles) - 6}건) ...\")\nfor c in rigl_42_cycles[-3:]:\n print(f\" step={c['step']} swap={c['total_swap']} sparsity_after={c['sparsity_after']:.3f}\")" }, { "cell_type": "markdown", @@ -400,4 +336,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/src/graphlm/neuron/hybrid_transformer_demo.py b/src/graphlm/neuron/hybrid_transformer_demo.py index ec1c34f..54fc80e 100644 --- a/src/graphlm/neuron/hybrid_transformer_demo.py +++ b/src/graphlm/neuron/hybrid_transformer_demo.py @@ -253,24 +253,35 @@ def _compute_dense_grad_scores( saved_masks[name] = mod.edge_mask.clone() mod.edge_mask.fill_(1.0) target_modules[name] = mod - # 2. 별도 forward (현재 train step 의 gradient 와 분리) - logits = model(x) - loss = F.cross_entropy(logits.reshape(-1, vocab_size), y.reshape(-1)) - # 3. torch.autograd.grad 로 직접 gradient 추출 (.grad 미사용, side-effect 없음) - weights_to_grad = [mod.weight for mod in target_modules.values() if mod.weight.requires_grad] - grads = torch.autograd.grad(loss, weights_to_grad, allow_unused=True) if weights_to_grad else [] - # 4. score 추출 + mask 복원 - scores: dict[str, Tensor] = {} - grad_iter = iter(grads) - for name, mod in target_modules.items(): - mod.edge_mask.copy_(saved_masks[name]) - if not mod.weight.requires_grad: - # 동결 layer — 0 score (regrow 우선순위 최하) - scores[name] = torch.zeros_like(mod.weight) - continue - g = next(grad_iter) - scores[name] = g.detach().abs().clone() if g is not None else torch.zeros_like(mod.weight) - return scores + try: + # 2. 별도 forward (현재 train step 의 gradient 와 분리) + logits = model(x) + loss = F.cross_entropy(logits.reshape(-1, vocab_size), y.reshape(-1)) + # 3. torch.autograd.grad 로 직접 gradient 추출 (.grad 미사용, side-effect 없음) + weights_to_grad = [ + mod.weight for mod in target_modules.values() if mod.weight.requires_grad + ] + grads = ( + torch.autograd.grad(loss, weights_to_grad, allow_unused=True) if weights_to_grad else [] + ) + # 4. score 추출 + scores: dict[str, Tensor] = {} + grad_iter = iter(grads) + for name, mod in target_modules.items(): + if not mod.weight.requires_grad: + # 동결 layer — 0 score (regrow 우선순위 최하) + scores[name] = torch.zeros_like(mod.weight) + continue + g = next(grad_iter) + scores[name] = ( + g.detach().abs().clone() if g is not None else torch.zeros_like(mod.weight) + ) + return scores + finally: + # 5. mask 복원 — 예외 발생해도 항상 실행 (CodeRabbit #3308022927). 미복원 시 학습이 + # all-1 mask 로 계속되어 paradigm 의 prune 효과 사라짐. + for name, mod in target_modules.items(): + mod.edge_mask.copy_(saved_masks[name]) def _dst_swap_step( From 36b5fcdac1027e4e14bd72e2bb7530765eaddd47 Mon Sep 17 00:00:00 2001 From: juhyuni Date: Wed, 27 May 2026 11:45:32 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[CHORE]:=20Phase=2016a=20figure=20=EC=9E=90?= =?UTF-8?q?=EC=82=B0=20=EC=B6=94=EA=B0=80=20(Notion=20=EC=9E=84=EB=B2=A0?= =?UTF-8?q?=EB=93=9C=EC=9A=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/figures/neuron/phase16a/loss_curves.png | Bin 0 -> 118864 bytes .../figures/neuron/phase16a/sparsity_trace.png | Bin 0 -> 51314 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/figures/neuron/phase16a/loss_curves.png create mode 100644 docs/figures/neuron/phase16a/sparsity_trace.png diff --git a/docs/figures/neuron/phase16a/loss_curves.png b/docs/figures/neuron/phase16a/loss_curves.png new file mode 100644 index 0000000000000000000000000000000000000000..3e6de4ace9e039221a866ffe12e39056d6cd9771 GIT binary patch literal 118864 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 literal 0 HcmV?d00001