AI Engineering••EN

LLM 추론 최적화 Part 1 — Attention 메커니즘 해부

Self-Attention을 밑바닥부터 구현. MHA → GQA → MQA 진화를 코드로 비교. KV Cache 동작 원리와 Prefill vs Decode 분석.

LLM 추론 최적화 Part 1 — Attention 메커니즘 해부

LLM 추론 최적화 Part 1 — Attention 메커니즘 해부

LLM을 실제 서비스에 배포하면 가장 먼저 부딪히는 벽은 추론 속도와 메모리입니다. 모델이 아무리 좋아도 느리고 비싸면 쓸 수 없습니다. 이 시리즈에서는 LLM 추론의 핵심 병목을 하나씩 해부하고, 실전 최적화 기법을 코드와 함께 다룹니다.

Part 1에서는 모든 최적화의 출발점인 Attention 메커니즘을 밑바닥부터 구현하고, MHA → GQA → MQA의 진화를 코드로 직접 비교합니다.

Self-Attention — 처음부터 구현

기본 구조

🔐

구독 회원 전용 글입니다

구독하면 모든 프리미엄 시리즈와 Jupyter 노트북이 열립니다.

결제하려면 무료 계정이 필요합니다. 언제든 취소할 수 있습니다.

관련 포스트

KV 캐시 줄이는 12가지, A100 한 장에서 실측 — 1편: 12개를 한 줄로 세울 수 없습니다
Models & Algorithms

KV 캐시 줄이는 12가지, A100 한 장에서 실측 — 1편: 12개를 한 줄로 세울 수 없습니다

KV 캐시 기법 목록은 12개를 나란히 놓지만 각각이 얼마인지는 말하지 않습니다. A100 한 장에서 재보니 프리픽스 재사용은 공유 프리픽스 작업을 59.4초에서 6.2초로 줄였고, paged 블록 크기는 용량을 1%도 바꾸지 못했습니다. 둘을 한 줄로 세울 수 없는 이유는 지불 단위가 다르기 때문입니다.

llama.cpp KV 캐시 양자화: q8_0 처리량 손실이 9%에서 22%로 커지는 이유
Models & Algorithms

llama.cpp KV 캐시 양자화: q8_0 처리량 손실이 9%에서 22%로 커지는 이유

본류 llama.cpp, A100 한 장, Qwen3-8B Q4_K_M, llama-server 동시 슬롯 1~32. 32K 프롬프트에서 q8_0은 요청당 128토큰을 생성할 때 서버 처리량의 9%를 잃었고, 1,024토큰을 생성할 때는 22%를 잃었습니다. 짧은 쪽은 프리필이 벽시계를 지배하는데 프리필은 KV 타입을 타지 않기 때문입니다. 토큰당 디코드는 34% 느렸고 이는 llama-bench 결과와 일치합니다. 시작 직후 VRAM 사용량은 64K 슬롯 4개에서 41.0 GiB에서 25.1 GiB로 내려갔습니다.

llama.cpp KV 캐시 양자화, A100 한 장에서 실측 — q8_0은 4K에서 공짜이고 64K에서는 디코드 속도 절반을 냅니다
Models & Algorithms

llama.cpp KV 캐시 양자화, A100 한 장에서 실측 — q8_0은 4K에서 공짜이고 64K에서는 디코드 속도 절반을 냅니다

본류 llama.cpp, Qwen3-8B, A100 한 장. -ctk q8_0 -ctv q8_0은 퍼플렉시티가 f16과 같고 32K 캐시를 2.11 GiB 줄이지만, 64K 깊이 디코드는 f16의 55%로 떨어집니다(q4_0은 50%). q5_1과 K q8_0/V q4_0 혼합은 프리필이 초당 43·63토큰으로 조용히 CPU에서 돌았습니다.