[경량화 챌린지] 15일차 - PagedAttention

ehghkwl·2025년 11월 29일

Lightweight Challenge

목록 보기
15/22

PagedAttention

vLLM 같은 최신 엔진들은 같은 GPU에서도 10~20배 더 많은 처리를 한다. 어떻게 이게 가능한걸까?
기존에는 input이 어느정도 길이로 들어올지 모르니, 메모리에 input 영역을 최대치로 예약해 놓는다. 실제로는 "안녕" 한단어가 들어오는 경우, 나머지 영역은 비워져있지만 사용은 못하는 죽은 영역이 되어 버린다.
그래서 이를 보완해서 PagedAttention이 제안되었다. OS에서는 메모리를 쪼개서 사용하는데, 왜 AI는 통으로 예약하는걸까? 에서 시작한 아이디어로, 메모리를 미리 예약해 놓지 않고 다음 과정을 수행한다.

  • input데이터를 아주 작은 block을 잘게 쪼갠다.
  • 메모리 빈곳이 있으면 아무 데나 넣는다. (block사이즈 이상의 이어진 메모리 영역이 있어야 됨)
  • 각 블럭이 흩어져 있기 때문에 block table을 만든다. (block table을 사용함으로써 생기는 오버헤드도 있다. 하지만, 처리량을 늘리는 것에 비하면 아주 미미한 정도임.)

이를 통해서는, 사실 하나의 input에 대한 속도가 빨라졌다기 보다는 batch 처리 할 수 있게끔 처리량이 늘었다. 결국 1초씩 100번을 수행했어야 하는 데이터를, 1초씩 10개 세트로 10번만 하게 돼서, 100초 -> 10초로 줄어들게 된 것이다.
하지만, on-device에서 실시간 추론의 경우는 사실 batch 사이즈는 별로 의미가 없다. 하지만, input영역을 pagging 해서 사용하는 것은 batch가 1일 때에도 유용하다! input 메모리 영역을 100만 예약해놨는데, 200이 들어오게 되면 Out Of Memory 오류가 발생하게 된다. 반면, Pagged Attention을 사용하는 경우, 200이 들어오더라도 10씩 분리하여 넣을 수 있는 영역에 쪼개 넣게 되어서, 200만큼의 하나의 영역이 아니라, 10만큼의 20개의 영역만 있으면 되게 된다. 그래서 비교적 더 큰 input도 감당할 수 있게 된다.

profile
안녕하세요.

0개의 댓글