← 목록
기타 2026-06-19 15KB 읽기 16분

세션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/gelu12벡터12벡터 PASS

무엇을 했는지

  1. 골든 회귀 테스트 신설tests/삼진커널골든회귀.한선 (순수 한선씨, 가져오기 4커널).
- 4커널 10단언, VHDL 테스트벤치와 동일한 골든값에 단언 → 교차 일관성 잠금. - 결과: 통과 10 / 실패 0 — ALL GREEN.
  1. 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 진짜곱셈(wa)이 스칼라 부호선택과 발산. %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 길 = mn(배치 시 전체). 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로 상향됨(범위 밖).