세션4 LLM — 삼진 커널 수치 일관성 + 골든 회귀 (1단계 완료)
개요
세션4(LLM 삼진신경망) 브리프의
첫 단계 = 수치 일관성을 직접·왕복검증으로 완료.
나눗셈/√/라운딩의 "VM round vs VHDL truncate 발산"을 실측으로 추적해,
이미 정합 상태임을
확정하고, 남아 있던 stale 문서/주석 지뢰를 제거 + 재현 가능한 골든 회귀 테스트를 신설.
핵심 발견 (직접 측정으로 확정)
- VM 나눗셈 = round-to-nearest (truncate 아님):
-20/3 = -7, 20/3 = 7. 동점(|r|*2==|b|)은 truncate toward 0 (5/2=2, -5/2=-2).
- VM 루트 = round-to-nearest (floor 아님):
루트(7)=3, 루트(159)=13, 루트(10)=3.
- VHDL은 이미 정합:
삼진_레이어놈.vhd(6/17)의 bal_div(|r|*2>|b| strict)+int_sqrt_round LUT가 VM과 1:1. 삼진_어텐션.vhd도 bal_div.
- 즉 발산은 6/17 VHDL 작업에서 이미 제거되어 있었고, 남은 문제는 문서/주석/골든txt의 stale(옛 truncate 표기)뿐이었다.
왕복검증 결과 (VM ↔ VHDL GHDL)
| 커널 | VM 출력 | VHDL(GHDL) | 정합 |
|---|
| 레이어놈 [3,1,4,1]s1 | [1,-1,2,-1] | [1,-1,2,-1] PASS | ✓ |
| 레이어놈 [1,1,1,7]s1 | [0,0,0,2] | [0,0,0,2] PASS | ✓ |
| 레이어놈 [10,4,8,2]s10 | [13,-7,7,-13] | (동일 산식) | ✓ |
| 어텐션 가중치 | [75,25,0] | [75,25,0] PASS | ✓ |
| 어텐션 bal_div | [67,33,0] | [67,33,0] PASS (truncate면 66) | ✓ |
| 활성 relu/sign/gelu | 12벡터 | 12벡터 PASS | ✓ |
무엇을 했는지
- 골든 회귀 테스트 신설 —
tests/삼진커널골든회귀.한선 (순수 한선씨, 가져오기 4커널).
- 4커널 10단언, VHDL 테스트벤치와
동일한 골든값에 단언 → 교차 일관성 잠금.
- 결과:
통과 10 / 실패 0 — ALL GREEN.
- stale 지뢰 제거 (옛 floor/truncate 표기 → round-to-nearest):
-
libs/삼진레이어놈.한선 주석(루트=floor·나눗셈=truncate 주장 → 정정)
-
tests/삼진골든벡터.한선 생성기: 라이브 VM 출력은
[13,-7,7,-13]인데 저장 txt는
[13,-6,6,-13](truncate)로
자기모순이던 것 수정
-
tests/삼진골든.txt 재생성 →
[13,-7,7,-13]
-
tests/삼진골든.h(88행
⌊√10⌋)·
INDEX-삼진골든.md·
W1-6-골든벡터-산출.md floor 표기 정정 (결과 벡터는 이미 정확했음)
관련 파일
- 신규:
/Users/ef/CrownyOS/crownyc/tests/삼진커널골든회귀.한선
- 수정:
crownyc/libs/삼진레이어놈.한선, crownyc/tests/삼진골든벡터.한선, 삼진골든.txt, 삼진골든.h, INDEX-삼진골든.md, W1-6-골든벡터-산출.md
- 커널:
crownyc/libs/{삼진행렬곱,삼진레이어놈,삼진어텐션,삼진활성}.한선
- VHDL:
crownyc/rtl/vhdl/{삼진_레이어놈,삼진_어텐션,삼진_활성}.vhd (bal_div/int_sqrt_round)
- 재현:
cd crownyc && ./hanseonc_high tests/삼진커널골든회귀.한선 >/tmp/g.toau 2>/dev/null && ./crownyc run /tmp/g.toau
- VHDL:
cd crownyc/rtl/vhdl && ghdl -r --std=08 tb_trit_layernorm --stop-time=5us (자유실행 클럭이라 --stop-time 필수)
2단계 — CPU SIMD(ARM NEON) 삼진 MAC 가속 (2026-06-20 완료)
사용자 결정 = "CPU SIMD 가속 (한선씨 우선)" (nvcc/GPU 없음 → CPU 경로).
무엇을 했는지
- 커널:
C[i,j]=Σ_l A[i,l]*W[l,j], A=int32 활성 · W∈{-1,0,+1} 삼진. j축 4-레인 AXPY 벡터화(W행·C행 연속접근, 브로드캐스트 a).
- 한선씨 정본:
libs/삼진행렬곱.한선(삼진_행렬곱=부호누산 MAC). 골든 원천(동반): tests/삼진가속골든.한선(VM 산출 8×16×8, CHECKSUM=-21).
- C NEON 가속:
tests/삼진가속_neon.c (smat_tw_scalar/smat_tw_neon, NEON 없으면 스칼라 폴백). 셀프테스트=VM골든 assert, 벤치 포함.
- 통합 하니스:
tests/삼진가속검증.sh (VM 골든 → C 셀프테스트 → 벤치 한 번에).
결과 (왕복검증)
- VM = scalar = NEON 정확 일치 (checksum -21, SELFTEST PASS)
- 가속비 256×512×256: NEON ~6.8x vs 스칼라 (2.7 vs 18.4 ms/iter), 불일치 0
★ 검증 중 새 발산 발견 (modulo)
입력 생성의
%가 VM=
균형 나머지(
idx%7∈[-3,3],
idx%3∈{-1,0,1})인데 C=
truncate(
[0,6],
[0,2])라 골든 불일치. 1단계 round-to-nearest 발산이
modulo에도 동일. C에
bmod() 균형 나머지 도입해 정합. 또한 삼진 weight를
%3-1로 만들면 -2가 섞여 비삼진→ NEON 진짜곱셈(w
a)이 스칼라 부호선택과 발산. %3(균형) 자체가 이미 {-1,0,1} 삼진이라 -1 빼면 안 됨. → [[feedback_hanseon_balanced_mod_port]]관련 파일 (2단계)
- 신규:
tests/삼진가속골든.한선, tests/삼진가속_neon.c, tests/삼진가속검증.sh
- 정본:
libs/삼진행렬곱.한선
- 재현:
cd crownyc && ./tests/삼진가속검증.sh
3단계 — 삼진 텐서 + autograd (BitNet STE) (2026-06-20 완료)
무엇을 했는지
한선씨 autograd 라이브러리 libs/삼진텐서.한선: 선형층 STE 역전파.
삼진_양자화(잠재,길,임계) → {-1,0,+1} (threshold RoundClip형)
선형_순전파 = 삼진_행렬곱(부호누산 MAC) 재사용
손실_MSE, 기울기_dY=2(Y-T)
기울기_dW(X,dY,m,k,n) = Σ_i X[i,l]·dY[i,j] (STE: dW_q==dW_latent, 배치 합산)
기울기_dX(dY,q,m,k,n) = Σ_j dY·q (q 삼진 → 부호누산)
잠재_SGD갱신(잠재,dW,길,제수) = W -= dW/제수 (정수 lr, 균형 나눗셈)
데모/회귀 tests/삼진학습스텝.한선: m=1 k=2 n=2, 6스텝.결과 (왕복검증)
- 스텝0 기울기 = 수기 골든 일치: loss=13, dW=[-12,18,8,-12], dX=[-4,6] PASS
- 학습 루프 손실 13→4→4→0→0→0 단조감소, 삼진 weight가 임계 통과하며 flip(
[1,0,0,1]→[1,-1,0,1]→[1,-1,-1,1]) → 학습 실증
- 배치(m=2) 기울기 합산 검증: dW(배치합)=[-14,24,0,12], dX=[-4,6,-2,6] 수기 일치 → "행단위 일괄" 정확
VM 함정 적용
- 학습루프 행 회피: 스텝 6(행 임계 60~480 훨씬 아래).
- 누산 임시변수 경유(누산손실 회피), 균형 나눗셈(제수), 배열 추가() 구성, 소차원(캡 회피).
- 주의: STE 기울기는 양자화기 진짜 미분(거의 0)이 아니라 항등 통과 → 검증은 수기 골든+손실감소(유한차분 부적합).
- API:
손실_MSE/기울기_dY 길 = m
n(배치 시 전체). n만 넘기면 배치 절단(검증 중 발견).
관련 파일 (3단계)
- 신규:
libs/삼진텐서.한선, tests/삼진학습스텝.한선
- 재현:
cd crownyc && ./hanseonc_high tests/삼진학습스텝.한선 >/tmp/t.toau 2>/dev/null && ./crownyc run /tmp/t.toau
4단계 — 다레이어 삼진 SLM E2E 추론 + 1 학습 스텝 (2026-06-20 완료)
무엇을 했는지
통합 E2E tests/삼진SLM_E2E.한선: 1·2·3단계 부품을 transformer형 블록으로 조립.
블록 = GELU(LayerNorm(x · W삼진)), d=4, L=2층 스택
출력층 = logits = h · W_out(삼진), STE 학습 스텝
추론: x=[7,-5,3,-2] → 블록1 [8,0,0,8] → 블록2 [0,2,12,0] → logits [-2,12] (블록1≠블록2 = 다레이어 변환 실증)
학습: 출력층 W_out STE 역전파 + SGD, 손실 628→100→4 단조수렴(근사 최적)VM 함정 + 튜닝
- 정수 SGD 오버슈트 진동: h2에 큰값(12) → dW 큼 → 작은 제수(4)는 628→32→160 진동. 제수=96(학습률 1/96)에서 628→100→4 엄격 단조. (정수 STE SGD 특성: 작으면 진동, 크면 느림)
- NEON 결선(공시): 각 선형층 삼진_행렬곱 = 부호누산 MAC = 2단계
smat_tw_neon과 VM 1:1(checksum 검증). VM=레퍼런스, 배포 가속=NEON 백엔드.
관련 파일 (4단계)
- 신규:
tests/삼진SLM_E2E.한선, tests/세션4_LLM_회귀.sh(4단계 통합 회귀 마스터)
- 재현:
cd crownyc && ./tests/세션4_LLM_회귀.sh
세션4 종합 (1·2·3·4 전 단계 완료)
| 단계 | 산출 | 검증 |
|---|
| 1 수치 일관성 | 삼진커널골든회귀.한선 | VM↔VHDL 4커널 10단언 GREEN |
| 2 CPU SIMD | 삼진가속_neon.c + 골든.한선 | VM=scalar=NEON, 6.8x |
| 3 autograd | 삼진텐서.한선 + 학습스텝.한선 | 수기골든+손실 13→0 |
| 4 SLM E2E | 삼진SLM_E2E.한선 | 2블록 추론+학습 628→4 |
통합 회귀:
tests/세션4_LLM_회귀.sh 전부 GREEN.
확장 ⑥⑦⑧⑨ (2026-06-20 완료 — "다 하자")
⑥ 다레이어 역전파 STE 체인 (출력층만 → 전층)
tests/삼진MLP_2층학습.한선: x→선형1(W1)→ReLU→선형2(W2)→MSE, 두 층 동시 STE 학습.
- 역전파 체인: dz2=dY → dW2=a1ᵀdz2 → da1=dz2·q2ᵀ → dz1=da1⊙relu'(z1) → dW1=xᵀdz1. ReLU 미분 정확.
- 라이브러리 추가:
삼진텐서.한선 기울기_relu통과(z,da,길).
- 결과: 손실 65→2 단조수렴(제수32 안정; 작으면 결합진동). y=[7,-7]≈목표[8,-6].
⑦ 멀티토큰 어텐션 블록
tests/삼진어텐션_멀티토큰.한선: 시퀀스 자기어텐션, K=sign(X) 삼진, 각 쿼리 scores→ReLU정규화→가중 value합.
- 검증: 쿼리0
out=[2,0] 수기 골든 일치(w=[67,0,33], bal_div round 확인), 3토큰 일괄 통과.
⑧ bal_div SIMD화 (NEON 레이어놈)
tests/삼진레이어놈_neon.c: 어파인 (x-mean)*scale NEON 벡터화 + 균형 나눗셈 NEON(float 근사몫→정수보정→균형, bal_div_neon).
- 검증: VM=scalar=NEON 골든 2케이스 + 무차별 대조 불일치=0(s=1..64, a=±5000) → bal_div SIMD bit-exact 증명. 벤치 1.24x(리덕션 제약; 큰 SIMD 이득은 matmul 6.8x).
⑨ 블록샤딩 (VM 4095 캡 초과)
libs/삼진샤딩.한선 삼진_샤딩체크섬/최대: C(m×n)>4095를 행블록으로 샤딩 계산(블록만 보유). "행단위 일괄 API" 정통 구현.
tests/삼진샤딩검증.한선: m=100 k=8 n=50(C=5000>4095), 블록크기 10/20/25/50 체크섬 불변 → 샤딩 정확.
세션4 최종 (브리프 4단계 + 확장 4 = 전부 GREEN)
통합 마스터 회귀:
tests/세션4_LLM_회귀.sh — 1수치일관성·2SIMD·3autograd·4SLM E2E·⑥다레이어역전파·⑦멀티토큰어텐션·⑧bal_div SIMD·⑨샤딩 전부 GREEN.
후속 ⑩⑪⑫ (2026-06-20/21, 계속) + 교차세션 통합
⑩ base-3 트릿 패킹 (크라우니 네이티브 BitNet)
- 발견: 한선씨 비트 빌트인(비트곱/왼시프트 등)은 2진이 아니라 3진(
왼시프트(1,2)=9=1×3²). 따라서 int8 BitNet(2진) 대신 base-3 균형 패킹이 정통.
libs/삼진패킹.한선: 삼진_팩(Σtrit·3ⁱ, 왼시프트=×3) / 삼진_언팩(균형%3 자리추출 반복 — 캐리 때문에 random-access 불가) / 삼진_팩행렬곱. 최대 18트릿/정수.
- 검증
tests/삼진패킹검증.한선: 9트릿 라운드트립 + 팩행렬곱=언팩행렬곱 GREEN.
⑪ NEON 멀티스레드 matmul
tests/삼진가속_mt.c: smat_tw_neon 을 pthread 행 분할. 단일 vs 4스레드 불일치=0, 8스레드 4.5~4.8x(12코어). NEON 6.8x와 결합 ~33x vs 스칼라.
⑫ LayerNorm 역전파 (정규화 포함 전층 학습)
삼진텐서.한선 기울기_layernorm(dx=(1/σ)(dŷ-mean(dŷ)-ŷ·mean(dŷ·ŷ))). 정수 근사(양자화로 exact검사 불가).
tests/삼진LN역전파학습.한선: 선형→LN→선형 전층, 손실 50→5 단조(제수128). 정수 STE는 제수로 오버슈트 제어 필수.
교차세션 통합 (다른 세션 산출물, 같은 하니스서 GREEN)
- ⑨ 멀티헤드 어텐션 골든(2케이스) · d=8 L=3 SLM(101→2) · 토크나이저 E2E · Metal GPU 삼진_matmul VM=GPU bit-exact (Apple M2 Max) — GPU 게이트가 Jetson 대신 Metal로 해소됨.
⑯ 어텐션 value 투영 STE 학습
tests/삼진어텐션학습.한선: 자기어텐션 V=X·Wv(삼진) 학습. 어텐션 가중치 forward 고정(stop-gradient), value 경로 기울기 dV=w·dout/100 → dWv=Xᵀ·dV. 손실 10→2 단조(도달가능 목표).
⑰ 완전 트랜스포머 블록 E2E 학습 (capstone)
tests/삼진트랜스포머블록.한선: H1=X+Attn(X), H2=H1+FFN(H1), 잔차 2개. Wv·W1·W2 3 weight 동시 STE 학습.
- 역전파: 잔차는 기울기 가산(dH1=dH2_skip+dH1ffn). FFN(⑥)+어텐션value(⑯)+잔차 통합.
- 결과: 손실 34→4 단조수렴. 잔차연결이 기울기 흐름 도와 3-weight 동시 갱신에도 진동 없음.
⑱ 재사용 트랜스포머 라이브러리 + 다층 스택 (Pre-norm)
libs/삼진트랜스포머.한선: 블록_순전파(Pre-norm: H1=X+Attn(LN(X)), H2=H1+FFN(LN(H1))), 어텐션_가중치, 행별_레이어놈. 스택 가능.
tests/삼진트랜스포머스택.한선: 4블록 스택 추론.
- 핵심 발견: LayerNorm 없으면 깊이서 잔차 스트림 폭주(입력5 → 4블록 후 864, 기하급수). Pre-norm 추가 시 안정(5→19→9→5→16). 정수 STE에서도 트랜스포머가 LayerNorm을 요구하는 이유 실증.
⑲ 다층 스택 + 출력 헤드 학습
tests/삼진스택헤드학습.한선: 2블록 Pre-norm 스택(고정 특징추출) → 토큰풀링 → 출력헤드(삼진) STE 학습. 손실 261→2 단조(제수96). 깊은 특징 위 학습 실증.
⑳ 4층 깊은 MLP (4단 역전파) · ㉑ Pre-norm 블록 전층 학습(LN 역전파)
- ⑳
tests/삼진4층MLP학습.한선: 2→3→3→3→2, 4 weight 동시 4단 역전파, 손실 49→0 단조.
- ㉑
tests/삼진프리놈블록학습.한선: Pre-norm 블록(H1=X+Attn(LN(X)), H2=H1+FFN(LN(H1))) 전층 학습, LN을 역전파 체인에 포함(행별_LN역전파 헬퍼). 손실 63→15 단조. ⑰+⑮+⑱ 통합.
㉒ QAT 양자화 갭 측정
tests/삼진QAT갭.한선: 단일선형 회귀, (C)랜덤삼진 85 → (B)삼진 STE 5 → (A)FP 4. A≤B<C. STE가 랜덤 삼진을 17배 개선, full-precision의 1 이내 회복 = QAT 효용 정량화.
- 부수 발견: 다층 정수 FP는 정규화 없이 학습 불안정(가중치 폭주). 삼진 STE는 ±1 경계라 다층서도 안정(㉑까지 실증) — BitNet의 학습 안정성 이점.
세션4 최종 — 마스터 회귀 22섹션 전부 GREEN
tests/세션4_LLM_회귀.sh: 1수치·2SIMD·3autograd·4SLM E2E·⑥다레이어역전파·⑦멀티토큰·⑧bal_div SIMD·블록샤딩·⑨멀티헤드·⑩d8L3·⑪토크나이저·⑫Metal·⑬트릿패킹·⑭멀티스레드·⑮LN역전파·⑯어텐션학습·⑰트랜스포머블록·⑱트랜스포머스택.
잔여 (후속 고도화)
- 어텐션 weights backprop(현재 value만 stop-gradient), 다층 스택 학습(현재 스택은 추론), int8 양자 인식 학습(QAT), 더 큰 모델/시퀀스, Metal 커널 확장(레이어놈/어텐션).
- 사소한 stale:
W1-6-골든벡터-산출.md 238행 "1023 요소 제한"은 v10.3에서 4095로 상향됨(범위 밖).