2P by GN⁺ | ★ favorite | 댓글 1개
  • L-Mul은 LLM의 큰 에너지 비용이 부동소수점 곱셈에서 나온다는 점에 주목해, 곱셈을 정수 덧셈으로 근사하려는 선형 복잡도 곱셈 알고리듬임
  • fp32 곱셈은 int32 덧셈보다 에너지 비용이 37배 높아, 텐서 처리 하드웨어에 L-Mul을 적용하면 원소별 부동소수점 텐서 곱셈 에너지의 95%, dot product 에너지의 80%를 줄일 잠재력이 있음
  • 계산 방식은 가수(mantissa) 곱셈과 반올림을 생략하고, 부호는 XOR로 처리하며 나머지 비트는 x[1:] + y[1:] - offset 형태의 덧셈으로 구성함
  • 실험에서 4-bit mantissa L-Mul은 float8 e4m3 곱셈과 비슷한 정밀도를 보였고, 3-bit mantissa L-Mul은 float8 e5m2보다 나은 결과를 냄
  • 사전학습 LLM에 추가 학습 없이 L-Mul 어텐션을 적용했을 때 자연어 추론 과제 평균 손실은 0.07%였고, 비전 과제에서는 평균 정확도가 0.12% 향상됨

L-Mul이 겨냥하는 병목

  • 대형 신경망은 계산의 많은 부분을 부동소수점 텐서 곱셈에 쓰며, 이 연산은 덧셈보다 에너지 비용이 큼
  • L-Mul은 부동소수점 수의 곱셈을 정수 덧셈으로 근사하는 linear-complexity multiplication 알고리듬임
  • 적용 대상은 여러 계산 단계에 걸쳐 있음
    • 어텐션 메커니즘 내부 곱셈
    • 행렬 곱셈
    • 원소별 곱셈
  • Transformer 기반 LLM에서 어텐션은 입력 컨텍스트 길이 N에 대해 O(N²) 복잡도를 가지며, 고차원 텐서 곱셈까지 포함해 계산 효율의 주요 병목이 됨

산술 연산별 에너지 비용

  • Horowitz(2014)의 연산 비용 표는 덧셈과 곱셈의 에너지 차이를 직접 보여줌
    • int8 덧셈: 0.03 pJ
    • int32 덧셈: 0.1 pJ
    • fp16 덧셈: 0.4 pJ
    • fp32 덧셈: 0.9 pJ
    • int8 곱셈: 0.2 pJ
    • int32 곱셈: 3.1 pJ
    • fp16 곱셈: 1.1 pJ
    • fp32 곱셈: 3.7 pJ
  • fp32 곱셈은 fp32 덧셈보다 4배, int32 덧셈보다 37배 많은 에너지를 사용함
  • PyTorch의 텐서 곱셈 결과 누적 기본 정밀도는 fp32로 설정되어 있음
  • I/O와 제어 연산을 제외하면 fp32 곱셈을 int32 덧셈으로 근사할 때 에너지 사용량은 약 1/37 ≈ 2.7% 수준임
  • 누적 정밀도를 fp16으로 낮춰도 정수 덧셈은 부동소수점 곱셈 에너지의 약 4.7% 만 사용함

L-Mul의 계산 방식

  • 일반 부동소수점 곱셈은 두 수 x, y에 대해 다음 형태를 가짐
    • (1 + xm) · 2^xe · (1 + ym) · 2^ye
    • 결과는 (1 + xm + ym + xm · ym) · 2^(xe+ye)와 부호 XOR로 구성됨
  • 계산 병목은 m비트 가수에 대한 O(m²) 가수 곱셈임
  • L-Mul은 xm · ym을 제거하고 다음 형태로 근사함
    • (1 + xm + ym + 2^-l(m)) · 2^(xe+ye)
  • l(m)은 가수 비트 수에 따라 달라짐
    • m ≤ 3이면 m
    • m = 4이면 별도 값
    • m > 4이면 별도 값
  • 비트 수준 구현은 더 단순한 식으로 정리됨
    • 부호 비트: x[0] ⊕ y[0]
    • 나머지 비트: x[1:] + y[1:] - offset
  • 부동소수점 형식이 1 + xm을 암묵적으로 처리하므로, L-Mul은 실제 구현에서 하나의 adder로 구성될 수 있음
  • 가수 합이 2를 넘으면 carry가 자동으로 exponent에 전달됨
  • 기존 부동소수점 곱셈에 필요한 가수 곱셈과 반올림 과정을 건너뛰어 계산량을 줄임

Transformer 어텐션 적용

  • L-Mul 기반 어텐션은 Q, K, V를 만든 뒤 어텐션 계산의 행렬 곱셈을 L-matmul로 대체함
  • 계산 형태는 다음과 같음
    • K = H · Wk
    • Q = H · Wq
    • V = H · Wv
    • A = softmax[L-matmul(Q, Kᵀ) / √d]
    • H′ = L-matmul(A, H)
  • L-matmul은 일반 부동소수점 곱셈을 모두 L-Mul로 구현한 행렬 곱셈임
  • 이 구조는 부동소수점 곱셈을 정수 덧셈으로 바꿔 계산 자원 사용을 낮춤

정밀도·복잡도 분석과 실험 결과

  • 정밀도 분석은 L-Mul이 부동소수점 수의 fraction을 몇 비트까지 유지한 것과 동등한지 평가하는 방식으로 구성됨
  • 균등 분포 operand 기준 분석에서 L-Mul은 fp8 e5m2보다 정확함
  • 사전학습 LLM 5개의 결합 weight 분포를 기준으로 한 실용적 분석에서는 5-bit mantissa operand에서 fp8 e4m3보다 높은 정밀도를 달성할 수 있음
  • 실험 결과는 이론적 오차 추정과 일치함
    • 4-bit mantissa L-Mul은 float8 e4m3 곱셈과 비슷한 정밀도
    • 3-bit mantissa L-Mul은 float8 e5m2보다 높은 정밀도
  • 사전학습 LLM에는 표준 어텐션 구현을 L-Mul 어텐션으로 직접 바꿔 적용했으며, 추가 학습은 사용하지 않음
    • commonsense, structured reasoning, language understanding 과제 평균 성능 손실: 0.07%
    • visual question answering, object hallucination, free-form visual instruction 과제 평균 정확도 변화: 0.12% 향상
  • fine-tuning 실험에서는 어텐션, linear transformation, 원소별 곱셈의 모든 곱셈을 3-bit mantissa L-Mul로 바꾼 모델이 float8 e4m3 누적 정밀도를 쓰는 표준 모델과 비슷한 성능을 냄
  • 게이트 수준 계산량 추정에서 일반 곱셈은 다음 수준임
    • fp16 곱셈: 약 584
    • fp8 e4m3 곱셈: 약 325
    • fp8 e5m2 곱셈: 약 296
  • L-Mul의 게이트 수준 계산량 추정은 더 낮음
    • fp16 L-Mul: 약 256
    • fp8 L-Mul: 약 157
  • GPU에는 L-Mul의 네이티브 구현이 없어 효율을 완전히 활용하기 어렵고, L-Mul 기반 모델은 특수한 아키텍처 설계가 통합된 장치에서 학습·호스팅하는 것을 권장함
  • 해당 기술은 patent pending 상태임

댓글과 토론

Hacker News 의견들
  • 예전에 Intel CPU에서 부동소수점 계산이 비쌌을 때, 프로그래머들이 정수 꼼수로 우회하던 방법이 여럿 있었던 기억이 남
    Forth로 유명한 Chuck Moore는 1.6 × 4.1 같은 값을 중간 계산에서는 16 × 41처럼 정수로 처리한 뒤, 출력할 때 소수점을 다시 “맞는 위치”에 넣는 방식을 보여줬음. 부동소수점 값의 범위가 10을 곱해도 65536을 넘지 않는 식이면 16비트 정수에서도 잘 동작했고, 10비트 정밀도의 아날로그 값을 초당 여러 번 빠르게 계산해야 하는 임베디드 칩에 잘 맞았음
    Microsoft Streets and Trips 작업을 했던 Microsoft 엔지니어와도 오래전에 이야기한 적이 있는데, 그들도 보통은 부동소수점이었을 숫자와 계산을 실제 필요한 정밀도만 담은 어떤 패킹된 정수 형식에 넣어 당시 CPU에서 더 빠르게 돌리고 CD-ROM에 맞게 더 쉽게 압축했다고 했음. 스크린샷은 https://archive.org/details/3135521376_qq_CD1에 있음

    • 이건 고정소수점 산술이라고 부르는 기법이고, 더 많은 프로그래머가 알았으면 하는 멋진 방법임
      제대로 된 금융 관련 코드는 이걸 써야 하지만, 내가 본 금융 업계에서는 메인프레임을 돌리는 경우가 아니면 그리 흔하지 않았음. 재미있게도 FreeType, GDI, WPF, WARP(D3D11 참조 래스터라이저) 같은 소프트웨어 래스터라이저에서 고정소수점 산술을 훨씬 더 많이 봤음
    • 부동소수점 보조 프로세서가 흔하지 않던 시절의 프랙탈 생성기 FRACTINT를 만져본 기억이 있음. 고정소수점 수학으로 프랙탈을 계산하고 표시했는데, 그때는 프랙탈이 엄청 멋져 보이던 시기라 모두가 프랙탈 사업을 하고 싶어 했고 노벨상도 전부 프랙탈 연구자에게 돌아가던 때였음
    • Ozaki가 int8 텐서 코어로 fp64 행렬 곱셈을 해왔음
      https://arxiv.org/html/2306.11975v4
      정말 흥미로움
    • 내가 알기로는 지금도 돈이나 금융 숫자를 다루는 가장 좋은 방식임
    • 그 특정한 꼼수는 고정소수점 산술로 알려져 있음. 함수의 고정점과는 다른 개념임
  • “원소별 부동소수점 텐서 곱셈에서 에너지 비용을 잠재적으로 95%, 내적에서 80% 줄일 수 있다”는 식의 주장인데, 이게 합성곱 신경망 이야기라면 계산 최적화가 훨씬 큰 의미가 있었을 것임
    하지만 트랜스포머는 계산은 가볍고 메모리는 무거운 쪽임. 병목은 모델 가중치를 코어로 가져오는 과정이고, 인용된 95%와 80% 에너지 절감은 전체 추론 과정이 아니라 곱셈 연산만 따로 떼어낸 수치임

    • 사전 채우기(prefill)는 단일 배치에서도, 그리고 다중 배치 디코딩도 여전히 계산 지배적
      “디코더 전용 트랜스포머 추론은 메모리 대역폭이 병목”이라는 반복되는 말은 배치 크기가 1인 단일 배치 디코딩에서만 엄밀히 맞음. 그때는 대부분 벡터-행렬 곱을 하기 때문임
    • 더 나쁨. 에너지 이득은 fp32 계산과 비교했을 때의 결과인데, fp8에서는 곱셈기가 정말 작아서 덧셈기와 시프터가 에너지와 면적 면에서 연산기의 더 큰 부분을 차지하므로 이 논문의 이득은 작을 것임
      fp8에서 추정 게이트 수는 일반 fp8 곱셈기가 296이고 이 기법은 157이라서, 곱셈기 전력 이득은 훨씬 낮을 것임. 50% 정도가 더 합리적인 추정이고, 다시 말하지만 fp8에서는 내적에서 덧셈이 연산의 큰 부분을 차지함
      전반적으로 80% 전력 이득과 작은 정확도 저하를 주장하는 건 꽤 부정직해 보임. 전력 이득은 fp32 연산에만 해당하고, 작은 정확도 저하는 fp8 연산자에만 해당하기 때문임. fp32에서의 정확도 저하는 분석하지 않았고, fp8 내적에서 절약되는 전력도 제시하지 않았음
    • fp8은 충분히 작아서 곱셈을 더 큰 부동소수점 형식보다 훨씬 단순한 회로로 할 수 있을 것 같음
      fp4처럼 더 작은 형식은 그냥 조회표를 쓸 수도 있고, 그러면 사실상 어느 정도 표준화된 양자화 방식에 가까워짐
    • 트랜스포머에 정말 좋은 아키텍처는 메모리와 계산의 공존 배치처럼 보임
    • 단일 사용자나 가벼운 추론에서만 맞는 이야기임. 학습과 배치 추론에서는 금방 계산 병목이 될 수 있음
  • [2023] GradIEEEnt half decent: The hidden power of imprecise lines
    http://tom7.org/grad/murphy2023grad.pdf
    영상도 있음: https://www.youtube.com/watch?v=Ae9EKCyI1xU

  • 읽어보진 않았지만, 이건 어떤 형태로든 로그표를 쓰는 것 아닌가 싶음
    폄하하려는 게 아니라, 논리 게이트 같은 더 근본적인 수준에서 로그를 내가 제대로 이해하지 못하는 느낌이라 묻는 것임. 곱셈을 표 조회와 덧셈으로 바꿀 수 있다면, 반대로 어려운 덧셈과 쉬운 곱셈을 주는 회로나 그런 절충의 조합도 있어야 할 것 같음

    • 로그 공간은 좋음. 곱셈을 덧셈으로 대체할 수 있기 때문임
      이 부분은 쉽고 누구나 하드웨어로 구현할 수 있음. 까다로운 부분은 누적을 할 때, 특히 큰 범위에 걸친 누적을 하면서 계속 로그 공간에 머무르는 것임
    • 맞음, 이건 로그 수 체계가 작동하는 방식임
  • 논문에 오차항의 제대로 된 유도와 논의가 없어 보여서 의아함. 전부 추론 결과를 통해 간접적으로만 다뤄지고 있음

    • 나도 이 논문이 좀 이상하게 느껴졌음. 게이트 추정을 도식 없이 텍스트 설명으로만 하면 필요한 부분을 놓치기 너무 쉬움
      완전한 게이트 수준 설명까지는 아니어도 “덧셈기” 같은 블록 라벨이 붙은 그림은 필요했을 것임. 첫 문단에서 de Vries라는 이름을 본 것도 신뢰감에는 도움이 되지 않았음
  • 방법 섹션 각주에 “L-Mul 기반 모델은 특수 아키텍처 설계가 통합된 장치에서 학습하고 호스팅하기를 권장한다. 특허 출원 중”이라고 되어 있음

  • 계산량은 줄어들 것 같지만 값 하나당 여전히 8비트를 쓰므로, 추론 실행에 필요한 메모리 요구량은 줄이지 못함
    그래서 모델을 추론 용도로 더 접근 가능하게 만든다고 보기는 어려움. 이 저장 방식이 학습에도 적합하다면 잠재적으로 흥미로운 적용처가 될 수 있음

    • 실제로는 정밀도와 범위 관점에서 가중치당 약 0.5비트만큼 덜 효율적인데, 논문은 이 부분을 전혀 강조하지 않음
  • 바이트를 옮기는 데 계산보다 10배 넘는 에너지가 쓰임. 계산 효율은 사람들이 생각하는 만큼 큰 문제가 아님
    지금은 계산이 잘못된 위치에 있을 뿐이고, 최소한 내적에 들어가는 초기 집계에서는 메모리 버스를 우회해 메모리 셀 바로 옆에 있어야 함

    • 그래도 배터리 제약이 있는 장치에는 유용할 수 있지 않을까?
  • 내 경험상 고정소수점 수학의 진짜 마법사들은 8비트와 16비트 비디오 게임 디자이너들이었음
    그들이 한 최적화는 경이로웠고, 예를 들어 최초의 비행 시뮬레이터와 1인칭 슈팅 게임을 만들기 위해 3D 행렬 수학을 실시간으로 계산할 수 있게 해줬음

    • 각도를 2π = 256으로 재정의한 건 꽤 영리한 꼼수였음