[FEAT#77] neuron Phase 16b — Net2Net function-preserving FFN grow (cross-shape expansion) - #79
Conversation
…et2Net-style grow)
- src/graphlm/neuron/graph_hybrid.py 확장 (2 신규 메서드):
- grow_out(n_new_groups): G_out 차원 확장 (out_features 증가)
- 새 weight rows: 같은 fan_in 기반 작은 random init
- adj_outer/inner/edge_mask 새 rows = 1
- bias 새 entries = 0
- grow_in(n_new_groups): G_in 차원 확장 (in_features 증가)
- **새 weight columns = 0 (function preservation 의 핵심)**
- adj_outer/inner/edge_mask 새 columns = 1
- Parameter replace 방식 — caller (train loop) 가 optimizer 재생성 필요
- 8 신규 unit tests:
- shape 정확성 (out / in 각각)
- **function preservation 핵심 2건**:
- grow_in: 새 input position 에 random 채워도 기존 output 정확히 동일
- grow_out + downstream grow_in: FFN-style chain (fc1 grow_out + fc2 grow_in) 의 forward 정확 보존
- grow 후 학습 가능성 (gradient 흐름)
- 입력 검증 (negative / 0 거부)
- prune mask 보존 (기존 pruned 위치 손실 없이 확장)
- 213 → 221 tests, all green
- HybridTransformerTrainConfig 확장: - grow_at_step: int | None - grow_ffn_target: int | None (target ffn_dim) - __post_init__ 에 grow 인자 검증 (target > current, divisible by group_size, 일관성 둘 다 set/None) - _grow_ffn_in_model: 모델의 모든 HybridGraphFFN 의 ffn_dim 확장 - fc1.grow_out(n) + fc2.grow_in(n) 동시 (function preservation 보장) - train loop: grow_at_step 에서 _grow_ffn_in_model 실행 + optimizer 재생성 (parameter replace 됐으므로) - result 에 grow_event + final_param_count 추가 - smoke test 검증: ffn 64→128 grow 직후 학습 정상 지속, params 37856→54368 (+44%), loss 거의 유지 (function preservation 확인)
- notebooks/02-function-level/16-phase16b-net2net-grow.ipynb 신규 - 3 mode × 2 seed = 6 run: - small_baseline: ffn=128 끝까지 (capacity 부족) - grown: ffn=128 시작 → step 750 에서 256 으로 grow (function-preserving) - large_baseline: ffn=256 끝까지 (large capacity reference) - arch 고정: hybrid_around_one_around_one + use_full_graph=True - 자동 verdict 4가지: - all-finite (grow stability) - grown < small_baseline (grow advantage) - grown ≤ large_baseline + 0.05 (capacity recovery) - function preservation 정성 검증 (grow 직후 spike 측정) - loss curve (grow step 수직선) + params vs loss trade-off plot
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (2)
📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughWalkthroughAdds Phase 16b Net2Net-style FFN expansion: HybridGraphLinear gains grow_out/grow_in, training config and orchestration perform coordinated FFN growth at a specified step (recreating the optimizer and recording grow_event), unit tests validate behavior, and a notebook runs a sweep evaluating function-preservation and training dynamics. ChangesNet2Net-style FFN expansion with function preservation
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related issues
Possibly related PRs
Suggested labelsenhancement Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Code Review
This pull request implements Phase 16b cross-shape expansion (Net2Net-style FFN growth) to dynamically increase model capacity during training while ensuring function preservation. It introduces grow_out and grow_in methods in HybridGraphLinear (where new input weights are initialized to zero to preserve output), integrates this growth mechanism into the training loop within hybrid_transformer_demo.py (including optimizer re-initialization), adds a demonstration notebook, and includes comprehensive unit tests to verify correctness, shape changes, and gradient flow. No review comments were provided, so there is no feedback to address.
There was a problem hiding this comment.
Pull request overview
이 PR은 neuron Phase 16b로, 학습 중 FFN 차원을 Net2Net-style (function-preserving) 로 확장할 수 있도록 HybridGraphLinear에 grow_out/grow_in을 추가하고, 데모 학습 루프에서 지정 step에 확장을 트리거해 cross-shape expansion 실험을 가능하게 합니다.
Changes:
HybridGraphLinear.grow_out/grow_in추가로 G_out/G_in 차원 확장 지원(특히grow_in은 새 input weight=0으로 function preservation 핵심 구현)HybridTransformerTrainConfig에 grow 관련 옵션 추가 및 train loop에서 grow step 처리(+ optimizer 재생성, 결과에 grow_event/param_count 기록)- shape/보존성/학습 가능성에 대한 테스트 및 Phase 16b 실험 노트북 추가
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 4 comments.
| File | Description |
|---|---|
src/graphlm/neuron/graph_hybrid.py |
HybridGraphLinear에 grow_out/grow_in 구현 추가(파라미터/버퍼 확장 로직) |
src/graphlm/neuron/hybrid_transformer_demo.py |
grow 설정 검증 + 모델 내 FFN 확장 헬퍼/학습 루프 grow 트리거 및 로깅 추가 |
tests/neuron/test_graph_hybrid.py |
grow의 shape 변화, function preservation, grow 후 backward 동작 등을 검증하는 테스트 추가 |
notebooks/02-function-level/16-phase16b-net2net-grow.ipynb |
small/grown/large 3모드×2시드 sweep 및 자동 verdict/시각화 추가 |
…grow no-op - Copilot #3308323611 + #3308323627 (grow_out + grow_in 동일 이슈): - .data 사용 비권장 + requires_grad 상태 (freeze 한 layer) 가 Parameter replace 시 unfreeze 되는 버그 → _grow_param helper 추가 (detach().clone() + 기존 requires_grad 복원), grow_out / grow_in 둘 다 사용 - Copilot #3308323642: - plain arch / HybridGraphFFN 없는 경우 _grow_ffn_in_model 의 n_layers_grown=0 인데도 optimizer 재생성 + grow_event 기록 (무용 + 주석 불일치) → n_layers_grown > 0 일 때만 optimizer 재생성 + grow_event. plain arch 시 진정한 no-op. - 18 grow tests still green, lint OK
연관 이슈
구현 내용
Phase 16a (PR #78) 가 within-shape DST (sparsity 재할당, parameter 수 동일) 였다면, Phase 16b 는 cross-shape expansion — 학습 중
ffn_dim을 확장하여 parameter 수 자체 증가. function preservation 보장 (Net2Net-style: 새 input weight = 0).신규 모듈
src/graphlm/neuron/graph_hybrid.py확장 (2 신규 메서드):grow_out(n_new_groups): G_out 차원 확장grow_in(n_new_groups): G_in 차원 확장src/graphlm/neuron/hybrid_transformer_demo.py확장:TrainConfig신규 2 인자:grow_at_step/grow_ffn_target+__post_init__검증_grow_ffn_in_model: 모델의 모든 HybridGraphFFN 확장 (fc1 grow_out + fc2 grow_in 동시)grow_event+final_param_count추가notebooks/02-function-level/16-phase16b-net2net-grow.ipynb신규Function preservation 메커니즘
FFN-style chain (fc1 → ... → fc2):
fc1.grow_out(n): ffn_dim 차원 추가 — 새 output 채널의 weight 는 작은 randomfc2.grow_in(n): 같은 차원 확장 — 새 input 채널의 weight = 0테스트 (213 → 221, +8 신규)
test_grow_out_shape_increased/test_grow_in_shape_increased: shape 정확성test_grow_in_function_preservation: 새 input 위치에 임의 값을 채워도 기존 output 정확히 동일test_grow_out_then_grow_in_downstream_preserves_forward: FFN-style chain (fc1 grow_out + fc2 grow_in) 의 forward 정확 보존 (핵심 verification)test_grow_out_then_train_step_runs/test_grow_in_then_train_step_runs: grow 후 학습 가능test_grow_negative_rejected: 입력 검증test_grow_preserves_existing_prune_mask: Phase 15/16a 와 호환 (기존 pruned 위치 보존)CPU smoke 결과
CI / 머지 게이트 점검
변경 영향 범위
src/graphlm/neuron/graph_hybrid.py(확장),hybrid_transformer_demo.py(확장),tests/neuron/test_graph_hybrid.py(확장),notebooks/02-function-level/(1 신규)Low—grow_at_step=None(default) 시 Phase 15/16a 와 동일 동작. opt-in.Required Status Checks
롤백 계획
grow_at_step미사용 시 backwards-compat. revert 영향 없음.Phase 16 의 메인 #75 완료 직전 단계
본 PR 머지 시 메인 #75 의 두 sub 모두 close:
머지 후 paradigm 의 두 dynamic 방향 모두 검증 완료:
다음 단계 (Phase 17 후보)
Summary by CodeRabbit
New Features
Tests