연속 배치가 자리를 몇 개 둘 수 있는지는 스케줄러가 아니라 메모리가 정한다. 그 메모리의 대부분이 KV 캐시다.
무엇을 저장하는가
토큰을 하나 생성할 때마다 이전 토큰들의 키와 값 벡터가 필요하다. 매번 다시 계산하면 길이의 제곱으로 비용이 늘기 때문에 저장해 두고 재사용한다. 그 저장 공간이 KV 캐시다.
요청마다, 토큰마다, 레이어마다 쌓인다. 그래서 총량이 빠르게 커진다.
손으로 계산해 보기
한 토큰이 차지하는 크기는 대략 이렇게 잡는다.
토큰당 바이트 = 2(K와 V) × 레이어 수 × KV 헤드 수 × 헤드 차원 × 정밀도 바이트
레이어 32개, KV 헤드 8개, 헤드 차원 128, fp16인 모델이라면 토큰당 128KB다. 요청 하나가 컨텍스트 4천 토큰을 쓰면 512MB다. 80GB 카드에서 모델 가중치로 이미 상당 부분이 나갔다면, 동시 처리 자리는 수십 개 수준으로 떨어진다.
예산이 알려주는 것
이 계산은 두 가지를 바로 말해준다.
- 동시 요청 수를 늘리려면 컨텍스트 길이를 줄이거나 캐시를 압축해야 한다. 스케줄러 설정으로는 안 된다.
- 컨텍스트 상한을 두 배로 열면 동시 처리 자리는 대략 절반이 된다.
용량 계획에서 컨텍스트 상한과 동시 요청 수를 따로 정하는 경우를 종종 본다. 둘은 같은 예산을 나눠 쓰는 값이다. 함께 정해야 한다.