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