LLM 처리량 향상을 위한 고급 기술

게시 됨: 2024-04-02
목차 표시
LLM의 더 높은 처리량을 달성하는 데 따른 과제
메모리 요구 사항
자동 회귀 및 메모리 바인딩 작업
처리량 문제를 극복하기 위한 혁신적인 솔루션
지속적인 일괄 처리
페이징된 관심
플래시 주의
플래시 주의의 주요 특징:
사례 연구 – 추론적 디코딩을 통한 추론 최적화
결론

빠르게 변화하는 기술 세계에서 LLM(대형 언어 모델)은 우리가 디지털 정보와 상호 작용하는 방식에 있어 핵심 역할을 하고 있습니다. 이러한 강력한 도구는 기사를 작성하고, 질문에 답하고, 심지어 대화를 나눌 수도 있지만, 어려움이 없는 것은 아닙니다. 우리가 이러한 모델에 더 많은 것을 요구함에 따라, 특히 모델을 더 빠르고 효율적으로 작동시키는 데 있어서 장애물에 직면하게 됩니다. 이 블로그는 이러한 장애물을 정면으로 해결하는 방법에 관한 것입니다.

우리는 출력 품질을 저하시키지 않으면서 이러한 모델의 작동 속도를 높이기 위해 고안된 몇 가지 현명한 전략을 연구하고 있습니다. 경주용 자동차의 속도를 향상시키면서 경주용 자동차가 좁은 코너를 완벽하게 탐색할 수 있도록 노력한다고 상상해 보십시오. 이것이 우리가 대규모 언어 모델을 통해 목표로 하는 것입니다. 정보를 보다 원활하게 처리하는 데 도움이 되는 연속 일괄 처리와 같은 방법과 LLM의 디지털 추론을 더욱 세심하고 빠르게 만드는 Paged 및 Flash Attention과 같은 혁신적인 접근 방식을 살펴보겠습니다.

따라서 거대 AI가 할 수 있는 일의 한계를 뛰어넘는 데 관심이 있다면 잘 찾아오셨습니다. 이러한 고급 기술이 어떻게 LLM의 미래를 형성하고 이전보다 더 빠르고 더 좋게 만드는지 함께 살펴보겠습니다.

LLM의 더 높은 처리량을 달성하는 데 따른 과제

LLM(대형 언어 모델)에서 더 높은 처리량을 달성하는 것은 몇 가지 중요한 과제에 직면해 있으며, 각 과제는 이러한 모델이 작동할 수 있는 속도와 효율성에 장애물로 작용합니다. 주요 장애물 중 하나는 이러한 모델이 작동하는 방대한 양의 데이터를 처리하고 저장하는 데 필요한 엄청난 메모리 요구 사항입니다. LLM의 복잡성과 규모가 커짐에 따라 계산 리소스에 대한 수요가 증가하여 처리 속도를 향상시키는 것은 물론 유지하는 것도 어려워집니다.

또 다른 주요 과제는 특히 텍스트 생성에 사용되는 모델에서 LLM의 자동 회귀 특성입니다. 이는 각 단계의 출력이 이전 출력에 의존하여 작업 실행 속도를 본질적으로 제한하는 순차적 처리 요구 사항을 생성한다는 것을 의미합니다. 이러한 순차적 종속성으로 인해 각 단계가 진행되기 전에 이전 단계가 완료될 때까지 기다려야 하므로 병목 현상이 발생하여 더 높은 처리량을 달성하려는 노력이 방해를 받는 경우가 많습니다.

또한 정확성과 속도 사이의 균형은 섬세합니다. 출력 품질을 저하시키지 않고 처리량을 향상시키는 것은 줄타기이므로 계산 효율성과 모델 효율성의 복잡한 환경을 탐색할 수 있는 혁신적인 솔루션이 필요합니다.

이러한 과제는 LLM 최적화의 발전이 이루어지는 배경을 형성하여 자연어 처리 영역과 그 이상 영역에서 가능한 것의 경계를 넓힙니다.

메모리 요구 사항

디코드 단계는 각 시간 단계에서 단일 토큰을 생성하지만 각 토큰은 모든 이전 토큰의 키 및 값 텐서(사전 채우기에서 계산된 입력 토큰의 KV 텐서 및 현재 시간 단계까지 계산된 모든 새 KV 텐서 포함)에 따라 달라집니다. .

따라서 매번 중복 계산을 최소화하고 각 시간 단계에서 모든 토큰에 대해 이러한 모든 텐서를 다시 계산하지 않도록 GPU 메모리에 캐시하는 것이 가능합니다. 모든 반복에서 새 요소가 계산되면 다음 반복에서 사용하기 위해 실행 중인 캐시에 추가됩니다. 이는 본질적으로 KV 캐시로 알려져 있습니다.

이는 필요한 계산을 크게 줄이지만 대규모 언어 모델에 대한 이미 높은 메모리 요구 사항과 함께 메모리 요구 사항을 도입하여 상용 GPU에서 실행하기 어렵게 만듭니다. 모델 매개변수 크기(7B ~ 33B)가 증가하고 정밀도(fp16 ~ fp32)가 높아짐에 따라 메모리 요구 사항도 증가합니다. 필요한 메모리 용량의 예를 살펴보겠습니다.

우리가 알고 있듯이 두 가지 주요 메모리 점유자는

  1. 모델 자신의 체중이 메모리에 포함되어 있지 않습니다. 7B와 같은 매개변수 및 각 매개변수의 데이터 유형 예: fp16의 7B(2바이트) ~= 메모리의 14GB
  2. KV 캐시: 중복 계산을 피하기 위해 self-attention 단계의 키 값에 사용되는 캐시입니다.

토큰당 KV 캐시 크기(바이트) = 2 * (num_layers) * (hidden_size) * Precision_in_bytes

첫 번째 요소 2는 K 및 V 행렬을 설명합니다. 이러한 Hidden_size 및 Dim_head는 모델의 카드 또는 구성 파일에서 얻을 수 있습니다.

위 공식은 토큰별이므로 입력 시퀀스의 경우 seq_len * size_of_kv_per_token이 됩니다. 따라서 위의 공식은 다음과 같이 변환됩니다.

KV 캐시의 총 크기(바이트) = (sequence_length) * 2 * (num_layers) * (hidden_size) * Precision_in_bytes

예를 들어 fp16의 LLAMA 2를 사용하면 크기는 (4096) * 2 * (32) * (4096) * 2, 즉 ~2GB가 됩니다.

위의 내용은 단일 입력에 대한 것이며 여러 입력을 사용하면 빠르게 증가하므로 이러한 이동 중 메모리 할당 및 관리는 메모리 부족 및 조각화 문제가 발생하지 않더라도 최적의 성능을 달성하는 데 중요한 단계가 됩니다.

때로는 메모리 요구 사항이 GPU 용량보다 높을 수 있습니다. 이 경우 여기서는 다루지 않지만 모델 병렬성, 텐서 병렬성을 조사해야 하지만 해당 방향으로 탐색할 수 있습니다.

자동 회귀 및 메모리 바인딩 작업

보시다시피 대규모 언어 모델의 출력 생성 부분은 본질적으로 자동 회귀적입니다. 는 생성될 새 토큰을 나타내며 모든 이전 토큰과 중간 상태에 따라 달라집니다. 출력 단계에서는 추가 계산에 모든 토큰을 사용할 수 없고 하나의 벡터(다음 토큰용)와 이전 단계의 블록만 있으므로 이는 다음과 같은 경우 GPU 계산 능력을 충분히 활용하지 못하는 행렬-벡터 연산과 같습니다. 프리필 단계와 비교. 데이터(가중치, 키, 값, 활성화)가 메모리에서 GPU로 전송되는 속도가 실제 계산 속도가 아니라 지연 시간을 좌우합니다. 즉, 이는 메모리 바인딩된 작업입니다.

처리량 문제를 극복하기 위한 혁신적인 솔루션

지속적인 일괄 처리

디코드 단계의 메모리 바인딩 특성을 줄이는 매우 간단한 단계는 입력을 일괄 처리하고 한 번에 여러 입력에 대한 계산을 수행하는 것입니다. 그러나 간단한 상수 일괄 처리는 생성되는 다양한 시퀀스 길이의 특성으로 인해 성능이 저하되었으며 여기서 일괄 처리의 대기 시간은 일괄 처리에서 생성되는 가장 긴 시퀀스에 따라 달라지며 여러 입력이 필요하므로 메모리 요구 사항도 증가합니다. 이제 한 번에 처리됩니다.

따라서 단순한 정적 일괄 처리는 효과가 없으며 연속 일괄 처리가 발생합니다. 그 본질은 들어오는 요청 일괄 처리를 동적으로 집계하고, 변동하는 도착 속도에 적응하고, 가능할 때마다 병렬 처리 기회를 활용하는 데 있습니다. 이는 또한 각 배치에서 비슷한 길이의 시퀀스를 그룹화하여 더 짧은 시퀀스에 필요한 패딩 양을 최소화하고 과도한 패딩으로 인한 계산 리소스 낭비를 방지함으로써 메모리 활용을 최적화합니다.

현재 메모리 용량, 계산 리소스 및 입력 시퀀스 길이와 같은 요소를 기반으로 배치 크기를 적응적으로 조정합니다. 이를 통해 모델은 메모리 제약을 초과하지 않고 다양한 조건에서 최적으로 작동할 수 있습니다. 페이징 주의(아래 설명)에 대한 도움은 대기 시간을 줄이고 처리량을 높이는 데 도움이 됩니다.

추가 읽기: 연속 일괄 처리를 통해 LLM 추론에서 처리량을 23배로 늘리면서 p50 대기 시간을 줄이는 방법

페이징된 관심

처리량을 향상시키기 위해 일괄 처리를 수행하면 이제 여러 입력을 동시에 처리하므로 KV 캐시 메모리 요구 사항이 증가합니다. 이러한 시퀀스는 사용 가능한 계산 리소스의 메모리 용량을 초과할 수 있으므로 전체를 처리하는 것이 비현실적입니다.

또한 KV 캐시의 순진한 메모리 할당은 고르지 않은 메모리 할당으로 인해 컴퓨터 시스템에서 관찰되는 것과 마찬가지로 많은 메모리 조각화를 초래하는 것으로 관찰되었습니다. vLLM은 증가하는 KV 캐시 요구 사항을 효율적으로 처리하기 위해 운영 체제의 페이징 및 가상 메모리 개념에서 영감을 얻은 메모리 관리 기술인 Paged Attention을 도입했습니다.

Paged Attention은 Attention 메커니즘을 각각 입력 시퀀스의 하위 집합을 다루는 더 작은 페이지 또는 세그먼트로 나누어 메모리 제약 조건을 해결합니다. 전체 입력 시퀀스에 대한 주의 점수를 한 번에 계산하는 대신 모델은 한 번에 한 페이지에 집중하여 순차적으로 처리합니다.

추론 또는 훈련 중에 모델은 입력 시퀀스의 각 페이지를 반복하여 주의 점수를 계산하고 그에 따라 출력을 생성합니다. 페이지가 처리되면 결과가 저장되고 모델은 다음 페이지로 이동합니다.

주의 메커니즘을 페이지로 나누면 Paged Attention을 통해 대형 언어 모델이 메모리 제약을 초과하지 않고 임의 길이의 입력 시퀀스를 처리할 수 있습니다. 긴 시퀀스를 처리하는 데 필요한 메모리 공간을 효과적으로 줄여 대규모 문서 및 배치 작업이 가능해집니다.

추가 자료: vLLM 및 PagedAttention을 사용한 빠른 LLM 제공

플래시 주의

주의 메커니즘은 대규모 언어 모델의 기반이 되는 변환기 모델에 중요하므로 모델이 예측할 때 입력 텍스트의 관련 부분에 집중하는 데 도움이 됩니다. 그러나 변환기 기반 모델이 더 크고 복잡해짐에 따라 self-attention 메커니즘은 점점 더 느려지고 메모리 집약적이 되어 앞서 언급한 것처럼 메모리 병목 현상 문제가 발생합니다. Flash Attention은 주의 작업을 최적화하여 더 빠른 훈련과 추론을 가능하게 하여 이 문제를 완화하는 것을 목표로 하는 또 다른 최적화 기술입니다.

플래시 주의의 주요 특징:

커널 퓨전: GPU 컴퓨팅 사용량을 극대화하는 것뿐만 아니라 효율적인 작업이 가능하도록 만드는 것도 중요합니다. Flash Attention은 여러 계산 단계를 단일 작업으로 결합하여 반복적인 데이터 전송의 필요성을 줄입니다. 이러한 간소화된 접근 방식은 구현 프로세스를 단순화하고 계산 효율성을 향상시킵니다.

타일링: Flash Attention은 로드된 데이터를 더 작은 블록으로 나누어 병렬 처리를 지원합니다. 이 전략은 메모리 사용을 최적화하여 입력 크기가 더 큰 모델에 대한 확장 가능한 솔루션을 가능하게 합니다.

(타일링 및 융합이 계산에 필요한 시간을 줄이는 방법을 설명하는 융합 CUDA 커널, 이미지 출처: FlashAttention: IO 인식을 통한 빠르고 메모리 효율적인 Exact Attention)

메모리 최적화: Flash Attention은 최근에 계산된 토큰의 활성화를 재사용하여 지난 몇 개의 토큰에 대해서만 매개변수를 로드합니다. 이 슬라이딩 윈도우 접근 방식은 가중치를 로드하기 위한 IO 요청 수를 줄이고 플래시 메모리 처리량을 최대화합니다.

데이터 전송 감소: Flash Attention은 HBM(고대역폭 메모리) 및 SRAM(정적 랜덤 액세스 메모리)과 같은 메모리 유형 간의 앞뒤 데이터 전송을 최소화합니다. 모든 데이터(쿼리, 키, 값)를 한 번만 로드하여 반복적인 데이터 전송에 따른 오버헤드를 줄입니다.

사례 연구 – 추론적 디코딩을 통한 추론 최적화

자동 회귀 언어 모델에서 텍스트 생성을 가속화하기 위해 사용되는 또 다른 방법은 추론적 디코딩입니다. 추론적 디코딩의 주요 목적은 생성된 텍스트의 품질을 대상 배포의 품질과 비슷한 수준으로 유지하면서 텍스트 생성을 가속화하는 것입니다.

추측적 디코딩은 시퀀스의 후속 토큰을 예측하는 소규모/초안 모델을 도입하며, 사전 정의된 기준에 따라 기본 모델에 의해 승인/거부됩니다. 더 작은 초안 모델을 대상 모델과 통합하면 텍스트 생성 속도가 크게 향상됩니다. 이는 메모리 요구 사항의 특성 때문입니다. 초안 모델이 작기 때문에 no가 덜 필요합니다. 로드할 뉴런 가중치와 no. 이제 메인 모델에 비해 계산량이 적어 대기 시간이 줄어들고 출력 생성 프로세스가 빨라집니다. 그런 다음 메인 모델은 생성된 결과를 평가하고 그것이 다음 가능한 토큰의 목표 분포 내에 맞는지 확인합니다.

본질적으로 추측적 디코딩은 더 작고 빠른 초안 모델을 활용하여 후속 토큰을 예측함으로써 텍스트 생성 프로세스를 간소화합니다. 이를 통해 생성된 콘텐츠의 품질을 대상 배포에 가깝게 유지하면서 텍스트 생성의 전체 속도를 가속화합니다.

더 작은 모델에서 생성된 토큰이 항상 지속적으로 거부되지 않는 것이 매우 중요합니다. 이 경우 성능이 향상되기는커녕 저하됩니다. 실험과 사용 사례의 특성을 통해 더 작은 모델을 선택하고 추론 프로세스에 추론적 디코딩을 도입할 수 있습니다.

결론

LLM(대형 언어 모델) 처리량을 향상하기 위한 고급 기술을 통한 여정은 자연어 처리 영역에서 앞으로 나아갈 길을 조명하여 과제뿐만 아니라 이를 정면으로 해결할 수 있는 혁신적인 솔루션을 보여줍니다. Continuous Batching에서 Paged 및 Flash Attention에 이르기까지 이러한 기술과 추측성 디코딩의 흥미로운 접근 방식은 단순한 점진적인 개선 그 이상입니다. 이는 대규모 언어 모델을 더 빠르고 효율적으로 만들고 궁극적으로 광범위한 응용 프로그램에 더 쉽게 액세스할 수 있도록 하는 능력에서 중요한 도약을 나타냅니다.

이러한 발전의 중요성은 아무리 강조해도 지나치지 않습니다. LLM 처리량을 최적화하고 성능을 향상시키는 과정에서 우리는 이러한 강력한 모델의 엔진을 조정하는 것에만 그치지 않습니다. 우리는 처리 속도와 효율성 측면에서 가능한 것을 재정의하고 있습니다. 이는 대화의 속도로 작동할 수 있는 실시간 언어 번역 서비스부터 전례 없는 속도로 방대한 데이터 세트를 처리할 수 있는 고급 분석 도구에 이르기까지 대규모 언어 모델 적용에 대한 새로운 지평을 열어줍니다.

또한 이러한 기술은 속도, 정확성 및 계산 리소스 간의 상호 작용을 신중하게 고려하는 대규모 언어 모델 최적화에 대한 균형 잡힌 접근 방식의 중요성을 강조합니다. LLM 기능의 한계를 확장함에 따라 이러한 모델이 다양한 산업 분야에서 다양하고 안정적인 도구 역할을 계속할 수 있도록 하려면 이러한 균형을 유지하는 것이 중요합니다.

대규모 언어 모델 처리량을 향상시키는 고급 기술은 단순한 기술 성과 그 이상입니다. 이는 인공 지능의 지속적인 진화에 있어 이정표입니다. 그들은 LLM을 더욱 적응력 있고 효율적이며 강력하게 만들어 우리의 디지털 환경을 지속적으로 변화시킬 미래 혁신을 위한 길을 닦을 것을 약속합니다.

최근 블로그 게시물에서 대규모 언어 모델 추론 최적화를 위한 GPU 아키텍처에 대해 자세히 알아보세요.