vLLM 엔진에서 논의할 파라미터들:
- max-num-batched-tokens
- max-model-len
- gpu-memory-utilization
- enable-prefix-caching
- enable-chunked-prefill
- enforce-eager
max-model-len:
요약 사용되는 토큰 수(입력 + 출력)에 따라 설정
- 기본적으로 모델의 최대 길이는 사용 중인 모델의 최대 컨텍스트 길이와 동일합니다. 예를 들어, llama 3 8B instruct 모델의 경우 8192입니다.
- 사용 사례에 따라 모델의 최대 컨텍스트 길이보다 작은 값이 정해질 수 있다면, 이 파라미터에 해당 값을 설정하는 것이 좋습니다.
- 이는 모델 로딩 또는 사용 시 메모리 부족 오류를 방지할 뿐 아니라, max-num-batched-tokens 및 gpu-memory-utilization과 같은 다른 파라미터를 설정하는 데 도움이 됩니다.
- 이 값은 입력 및 출력 토큰 수를 모두 포함하므로, 총 토큰 수가 예를 들어 2046 이하라면 이 파라미터에 해당 값을 설정하세요.
max-num-batched-tokens:
요약 max-model-len에서 시작하여, max-model-len2, max-model-len3…과 같은 값으로 증가시키며 메모리 부족 오류나 캐시 충돌 경고가 발생할 때까지 시도하세요. 좋은 성능을 보장하는 값을 선택하세요. enable-chunked-prefill을 사용하는 경우, 128과 같은 작은 값부터 시도하세요. 아래 설명 참조.
- 이 파라미터는 토큰 수를 나타내지 않고, 배치 크기를 나타냅니다.
- 각 요청은 사전 채우기(pre-fill) 단계(입력 토큰의 KV 값 계산 및 KV 캐시 블록 배치)와 디코딩 단계(토큰을 하나씩 순차적으로 계산하는 재귀적 직접 계산)를 거칩니다.
- 따라서 이 파라미터의 최소값은 설정한 모델의 최대 길이와 동일하며, chunked-prefill을 사용하지 않는 경우(후술)에 해당합니다.
- 배치 크기가 클수록 사전 채우기가 더 많이 발생하므로 첫 번째 토큰이 더 빠르게 생성됩니다. vLLM의 기본 스케줄러는 사전 채우기를 선호합니다.
- 따라서 큰 배치 크기는 처리량을 증가시킬 수 있지만, 모든 경우에 효과적이지는 않습니다. 처리량과 지연은 그래픽 처리 장치(GPU)의 계산 자원과 메모리 비율에 따라 달라지며(후술), 일반적으로 사전 채우기는 큰 계산 자원을 요구하므로, 가능한 최대 토큰 수를 빠르게 달성합니다.
- 따라서 max-model-len에서 시작하여, 이를 두 배로 증가시키고 성능 변화를 확인하며 메모리 부족 오류나 위에서 언급된 경고가 발생할 때까지 시도하여 적절한 배치 토큰 수를 선택하세요. 이후 이 이론을 적용하여 시스템의 작동 방식을 이해하세요.
enable-prefix-caching:
요약 enable-chunked-prefill을 사용하지 않는 경우에만 활성화하세요.
- 이 기능은 계산된 KV 값을 재사용하여 시간을 절약합니다.
- 입력 데이터가 대부분 동일한 경우, 성능 향상이 더 두드러집니다. 반대로, 요청 내 토큰의 일부만 변경되는 경우 성능 향상이 덜 나타납니다.
- enable-chunked-prefill을 사용하는 경우, 이 파라미터는 사용 불가능합니다(본 글 작성 시 기준).
gpu-memory-utilization:
요약 메모리 부족 오류가 발생하지 않는 한, 값이 클수록 좋습니다. 기본값은 0.9입니다.
- GPU 메모리에 할당된 KV 캐시 공간이 클수록 성능이 향상됩니다.
- 메모리 부족 오류가 발생하거나 GPU가 다른 작업을 수행해야 할 경우, 이 값을 줄이세요.
enforce-eager:
요약 메모리 부족 시 이 기능을 활성화하세요.
- CUDA 그래프를 생성하지 않으므로 성능에 영향을 줄 수 있지만, 그래프 생성에 필요한 메모리를 절약할 수 있습니다.
- 일부 설정에서는 CUDA 그래프가 성능에 큰 영향을 주지 않으며, 절약된 메모리는 gpu-memory-utilization, max-num-batched-tokens 등 다른 파라미터의 값을 증가시키는 데 유용할 수 있습니다.
enable-chunked-prefill:
요약 이 기능을 활성화하고, 배치 토큰 수를 128부터 시작하여 점진적으로 증가시키세요. 이 기능 없이 설정과 비교하세요. 아래 설명 참조.
- 디코딩 단계는 사전 채우기보다 계산 자원에 덜 의존하지만, 메모리에 더 의존합니다. (벡터와 행렬의 곱셈 대신 행렬과 행렬의 곱셈이 필요하며, KV 값 읽기를 요구합니다.)
- 자세한 내용은 이 논문과 vLLM 문서를 참조하세요.
- 앞서 언급된 바와 같이, vLLM의 기본 스케줄러는 계산 자원이 많이 필요한 사전 채우기를 선호하며, 디코딩 단계는 메모리가 제한적인 요소가 되어, 저 계산 자원 요구량과 높은 메모리 요구량을 동시에 처리하는 디코딩을 완전히 활용할 수 없습니다. (KV 값 읽기를 요구하기 때문)
- Chunk prefill은 사전 채우기를 조각으로 나누어, 배치 토큰 수를 줄이고, 디코딩 요청을 먼저 모아 배치하고, 사전 채우기 요청을 조각으로 나누어 처리함으로써 GPU 자원을 효율적으로 활용합니다. (고 계산 자원 요구량의 사전 채우기 조각과, 저 계산 자원 요구량이나 높은 메모리 요구량의 디코딩 요청을 결합)
- 다시 이 기능을 활성화하고, 작은 배치 토큰 수(예: 128)부터 시작하여 증가시키며, 필요한 처리량과 지연을 얻을 때까지 시도하세요.
- 이 방법은 토큰 간 지연을 줄일 수 있으며, 작은 배치 크기로 인해 메모리 부하가 낮아 디코딩이 우선순위를 갖게 되지만, 처리량에 영향을 줄 수 있으므로 다양한 배치 크기로 시도하고, 이 기능 없을 때의 결과와 비교하세요.
예시:
- 우리는 vLLM API 엔트리 포인트를 사용할 것이며, OpenAI와 호환되는 서버 대신 사용합니다.
- 사전 채우기 조각화를 사용하지 않는 서버를 실행하려면 다음 예시를 사용하세요:
python3 -m vllm.entrypoints.api_server — model MaziyarPanahi/Meta-Llama-3–8B-Instruct-GPTQ — gpu-memory-utilization 0.95 — port 5000 — dtype half — enforce-eager — max-model-len 4096 — max-num-batched-tokens 8192 — enable-prefix-caching
- 사전 채우기 조각화를 사용하는 경우, 명령어는 다음과 같이 보일 수 있습니다:
python3 -m vllm.entrypoints.api_server — model MaziyarPanahi/Meta-Llama-3–8B-Instruct-GPTQ — gpu-memory-utilization 0.95 — port 5000 — dtype half — enforce-eager — max-model-len 4096 — max-num-batched-tokens 256 — enable-chunked-prefill
- 위 서버의 엔드포인트로 요청을 보내어 다양한 파라미터 설정에서의 성능을 확인하세요.
- 성능을 측정하려면 vLLM에서 제공하는 스크립트를 사용하거나, 제가 유사한 스크립트를 작성하여 여기에 공유할 예정입니다.