ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง

๋Œ€ํ˜• ์–ธ์–ด ๋ชจ๋ธ ์ถ”๋ก  ๊ฐ€์†: ํšจ์œจ์ ์ธ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ๊ธฐ์ˆ 

mm
LLM Inference Speed up

대형 언어 모델(LLM)인 GPT-4, LLaMA, 및 PaLM은 자연어 처리의 가능성을 넓히고 있습니다. 그러나 이러한 거대한 모델을 프로덕션 환경에 배포하는 것은 계산 요구, 메모리 사용, 지연, 및 비용 측면에서 상당한 도전을 제기합니다. LLM이 더 크고 강력해짐에 따라 실세계 응용 프로그램을 위한 추론 성능 최적화를 крит적으로 고려해야 합니다.

이 기술적인 심층 분석에서 우리는 LLM 추론을 가속화하기 위한 최신 기술을 탐구하여 더 빠른 응답 시간, 더 높은 처리량, 및 하드웨어 자원 사용의 효율성을 가능하게 할 것입니다. 우리는 수치 정밀도 기술 및 새로운 주의 메커니즘에서부터 효율적인 텍스트 생성을 위해 특별히 설계된 아키텍처 혁신까지 다양한 방법을 다룰 것입니다.

まず, 왜 LLM 추론이 전통적인 NLP 모델에 비해 इतन 어렵는지 이해해 봅시다.

대형 언어 모델의 추론 도전

LLM이 등장하기 전에 자연어 처리는 텍스트 분류, 명명된 实体 인식, 및 감성 분석과 같은 특정 작업에 중점을 둔 작은 모델에 의존했습니다. 이러한 모델은 상대적으로 간단한 추론 프로세스를 따랐으며, 조건부 하드웨어에서 배포될 수 있었습니다.

반면에, LLM은 패러다임의 전환을 나타냅니다. 이러한 모델은 수십억 개의 매개변수와 함께 거대한 데이터셋을 사용하여 훈련되며, 다양한 언어 작업을 놀라운 숙련도로 수행할 수 있습니다. 그러나 이러한 힘은 비용을 지불합니다 – 훈련 및 추론 모두에서 계산 요구가 크게 증가합니다.

한 가지 주요 도전은 LLM의 자동 재생성 특성입니다. 인간과 같은 텍스트를 생성하기 위해, 이러한 모델은 이전에 생성된 출력에 따라 하나씩 토큰(단어 또는 서브워드)을 예측합니다. 이 순차적 종속성으로 인해 효율적인 병렬화가 방해되고, 계산 요구는 시퀀스 길이와 함께 다항식으로 증가합니다.

또한, LLM은 높은 품질의 텍스트 생성을 위한 적절한 컨텍스트를 설정하기 위해 긴 입력 시퀀스(프롬프트)를 종종 필요로 합니다. 더 긴 입력 길이는 중간 상태 및 주의 행렬을 저장하기 위해 더 많은 메모리를 요구하며, 하드웨어 자원을 더욱 부담시키게 됩니다.

이러한 고유한 도전으로 인해, 정적 계산 그래프와 같은 전통적인 최적화 기술은 성능을 유지하면서 의미 있는 속도 향상을 제공하는 데 어려움을 겪을 수 있습니다. 이제 LLM 추론을 가속화하기 위한 몇 가지 주요 전략을 살펴보겠습니다.

수치 정밀도 기술

From 32-Bit to 16-Bit Precision

From 32-Bit to 16-Bit Precision

LLM 추론을 가속화하기 위한 하나의 방법은 모델 가중치 및 활성화에 대해 감소된 수치 정밀도를 활용하는 것입니다. 현대적인 딥 러닝 프레임워크는 PyTorch 및 TensorFlow와 같은 32비트 부동소수점(FP32) 정밀도를 기본적으로 사용합니다. 그러나 연구에 따르면 LLM은 낮은 정밀도에서 높은 정확도를 유지할 수 있습니다. 예를 들어 16비트(FP16), 8비트 정수(INT8), 또는 4비트 정수(INT4)와 같은 정밀도입니다.

수치 정밀도를 감소시키는 것은 여러 가지 이점을 제공합니다:

  • 감소된 메모리 풋프린트: 낮은 정밀도 표현은 menos 메모리를 필요로 하며, 동일한 하드웨어 제약 내에서 더 큰 모델 또는 배치 크기를 허용합니다.
  • 더 빠른 계산: 많은 현대적인 CPU 및 GPU는 낮은 정밀도 산술을 위한 특수한 명령어 및 하드웨어 가속을 제공하며, 이는 상당한 속도 향상을 가능하게 합니다.
  • 개선된 에너지 효율성: 더 작은 메모리 요구 사항 및 더 빠른 계산으로 인해, 낮은 정밀도 추론은 에지 및 모바일 배포에서 중요합니다.

수치 정밀도 기술은 강력하지만, FP32 작동과 비교하여 일부 정확도 손실을 도입합니다. 주요한 것은 특정 사용 사례에 대한 계산적 이익과 잠재적인 성능 저하 사이의 트레이드오프를 주의 깊게 평가하는 것입니다.

LLM에서 양자화에는 두 가지 주요 접근 방식이 있습니다:

포스트 훈련 양자화(PTQ): 이 방법에서, LLM은 먼저 표준 FP32 정밀도로 훈련됩니다. 훈련 후, 모델 가중치는 낮은 정밀도 형식으로 양자화됩니다. PTQ는 구현하기 쉽지만 더 큰 정확도 손실을 유발할 수 있습니다.

양자화 인식 훈련(QAT): QAT에서, 양자화 프로세스는 훈련 단계에서 시뮬레이션됩니다. 이는 모델이 양자화 오류를 보상하도록 학습할 수 있으므로, 최종 양자화된 모델을 배포할 때 정확도 저하를 최소화합니다. QAT는 더 복잡하지만 일반적으로 PTQ보다 더好的 결과를 제공합니다.

실제 적용을 위해, 사용자는 Hugging Face와 같은 플랫폼에서 미리 양자화된 모델을 활용할 수 있습니다. 예를 들어, Auto-GPTQ를 사용하여 양자화된 모델을 로드하려면 Hugging Face의 변환기 라이브러리를 사용할 수 있습니다. 또한, 모델을 양자화하려면 AutoGPTQ와 같은 도구를 사용할 수 있습니다. 이 도구는 기존 라이브러리와无缝하게 통합되어 모델을 효율적으로 압축합니다.

여기에는 Hugging Face 변환기 라이브러리를 사용하여 미리 양자화된 LLaMA-2-7b 모델을 로드하는 예가 있습니다:

from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = "TheBloke/Llama-2-7b-Chat-GPTQ"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)

사용자 정의 양자화를 위해, 다음 단계를 AutoGPTQ 툴킷을 사용하여 수행할 수 있습니다:

from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

model_id = “llama-2-7b-original”
tokenizer = AutoTokenizer.from_pretrained(model_id)
quantization_config = GPTQConfig(bits=4, dataset=”your-dataset”, tokenizer=tokenizer)
model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=quantization_config)

[/code]

양자화를 수행한 후, 모델 품질을 유지하기 위해 양자화 후 미세 조정을 수행하거나 프롬프트 엔지니어링이 필요할 수 있습니다. 새로운 양자화를 위해, 사용자는 양자화된 모델을 Hugging Face와 같은 플랫폼에 기여할 수 있습니다.

항상 특정 사용 사례에 대한 모델 크기, 계산 요구, 및 성능 사이의 균형을 양자화 전략을 선택할 때 고려해야 합니다.

 

플래시 주의 알고리즘

다중 헤드 주의 메커니즘은 트랜스포머 기반 LLM의 핵심 구성 요소로, 모델이 장거리 의존성 및 컨텍스트화된 표현을 캡처할 수 있도록 합니다. 그러나 이 주의 작동은 자동 재생성 텍스트 생성을 위한 계산적으로 비효율적입니다. 왜냐하면 각 새로운 토큰에 대해 많은 동일한 값을 재계산해야 하기 때문입니다.

Flash 주의 알고리즘은 FlashAttention 논문에서 도입되었으며, 주의 작동에 대해 더 메모리 효율적이고 병렬화에 친화적인 접근 방식을 제공합니다. 각 토큰에 대해 주의 값을 재계산하는 대신, Flash 주의는 중간 키/값 행렬을 캐싱 및 재사용하여冗余 계산을 피합니다.

이 최적화는 계산 오버헤드를 감소시키는 것 외에도 메모리 액세스 패턴을 개선하여 GPU 메모리 대역폭 및 병렬성을 더 잘 활용할 수 있습니다.

Flash 주의의 세부 사항은 매우 복잡하지만, 높은 수준의 아이디어는 주의 작동을 두 단계로 분해하는 것입니다:

  1. 프리픽스 합성 임베딩: 이 단계에서는 모든 입력 토큰에 대한 키/값 임베딩을 계산 및 캐싱하여 생성 중에 효율적으로 재사용할 수 있도록 합니다.
  2. 인과적 주의: 실제 주의 작동으로, 첫 번째 단계에서 캐싱된 키/값 임베딩을 활용하여 최적화됩니다.

이러한 단계를 분리함으로써, Flash 주의는 높은 병렬성 GPU 작동을 활용하여 LLM 추론의 주의 병목 현상을 크게 가속화할 수 있습니다.

여기에는 LLM에서 Flash 주의를 구현하는 개념적 설명이 있습니다:

from transformers import AutoModelForCausalLM
import torch
from flash_attention import flash_attention

# OctoCoder와 같은 LLM 로드
model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder")

# 샘플 시스템 프롬프트가 모델을 더好的 코딩 어시스턴트로 안내합니다
system_prompt = """... (시스템 프롬프트 세부 정보) ..."""

# 더 긴 입력을 시스템 프롬프트와 함께 준비
long_prompt = system_prompt + "질문: 바이트를 기گابایت로 변환하는 파이썬 함수를 작성해 주세요."

# 모델을 Flash 주의 최적화로 변환
model.to_bettertransformer()

# Flash 주의와 함께 모델 실행
start_time = time.time()
with torch.backends.cuda.sdp_kernel(enable_flash=True):
result = model.generate(long_prompt, max_new_tokens=60)
print(f"생성된 시간: {time.time() - start_time} 초.")

Flash 주의는 인상적인 성능 향상을 제공하지만, 기존 트랜스포머 아키텍처 내에서 작동합니다. LLM 추론의 잠재력을 완전히 발휘하기 위해, 우리는 효율적인 텍스트 생성을 위해 특별히 설계된 아키텍처 혁신을 탐구해야 합니다.

LLM 가지치기

LLM 가지치기는 모델 크기를 줄이면서 기능을 유지하는 기술입니다. 데이터 종속적 추정기를 사용하여 헤시안 행렬 근사에 기반한 가중치 중요도를 결정합니다. 가지치기에서는 중요도가 낮은 가중치 그룹을 제거하고, 모델을 미세 조정하여 정확도를 회복합니다. LLM-Pruner 패키지는 다양한 전략을 지원하는 스크립트를 제공합니다. 가지치기는 종속성을 발견하는 것, 그룹 기여도를 추정하는 것, 및 모델을 미세 조정하는 것을 포함하는 회복 단계를 포함합니다.

LLM-Pruner를 사용하여 LLaMa 모델을 가지치키는 다음의 간소화된 Python 코드 예시입니다:

from transformers import AutoModelForSequenceClassification
from pruning import LLMPruner

# 미리 훈련된 LLaMa 모델 로드
model = AutoModelForSequenceClassification.from_pretrained("llama-base")

# 가지치기를 위한 원하는 구성으로 프루너 초기화
pruner = LLMPruner(
model,
pruning_ratio=0.25,
block_mlp_layers=(4, 30),
block_attention_layers=(4, 30),
pruner_type='taylor'
)

# 가지치기 실행
pruned_model = pruner.prune()

# 가지치기된 모델 미세 조정
pruned_model.fine_tune(training_data)

이 코드 스케치는 미리 훈련된 LLaMa 모델을 로드하고, 가지치기를 위한 구성으로 프루너를 초기화하고, 가지치기 프로세스를 실행하고, 가지치기된 모델을 미세 조정하는 것을 나타냅니다.

실제 구현을 위해, 사용자는 모델 이름, 데이터 경로, 미세 조정 프로세스에 대한 추가 매개변수와 같은 세부 정보를 채워야 합니다. 또한, 코드는 개념적 표현이며, 실제 구현은 사용하는 라이브러리 및 버전에 따라 다를 수 있습니다.

효율적인 텍스트 생성을 위한 아키텍처 혁신

트랜스포머 아키텍처는 언어 모델링 작업에 매우 효과적이지만, 일반적인 시퀀스-시퀀스 모델로 설계되었습니다. 긴 입력 컨텍스트가 있는 텍스트 생성 작업에 LLM을 배포할 때, 연구자들은 더 전문적인 아키텍처가 추론 효율성을 크게 개선할 수 있음을 발견했습니다.

여기에는 효율적인 LLM 추론을 가능하게 하는 몇 가지 주요 아키텍처 혁신이 있습니다:

알리바이: PAL-Instruction 논문에서 도입된 Alibi 아키텍처는 긴 입력 컨텍스트의 모델링을 텍스트 생성 프로세스 자체에서 분리합니다. 입력 컨텍스트의 압축된 표현(“알리바이”)을 사용하여 생성 프로세스를 초기화하여, 자동 재생성 중에 전체 입력 시퀀스를 반복적으로 처리할 필요가 없습니다.

로터리 임베딩: 표준 위치 임베딩 대신 로터리 임베딩 기법은 위치 정보를 더 효율적으로 인코딩하기 위해 회전 행렬을 사용합니다. 이 접근 방식은 성능을 개선하고 더 긴 입력 시퀀스를 처리할 수 있습니다.

다중 쿼리 주의(MQA): 전통적인 주의에서 각 출력 토큰은 전체 입력 시퀀스를 주의합니다. 이는冗余 계산을 유발합니다. MQA는 주의 작동을 재구성하여 여러 출력 토큰에 대한 계산을 공유하여 전체 복잡성을 감소시킵니다.

Multiquery attention

Multiquery attention

그룹화된 쿼리 주의(GQA): MQA를 기반으로 하여, GQA는 출력 토큰을 클러스터로 그룹화하고 각 클러스터에 대한 주의를 공동으로 계산하여 계산 요구를さらに 감소시킵니다.

まだ 연구 및 개발이 진행 중이지만, 이러한 아키텍처 혁신은 특히 Flash 주의 및 수치 정밀도 최적화와 결합했을 때, LLM 추론 작업에서 인상적인 속도 향상을 보여주었습니다.

실제 배포 고려 사항

핵심 알고리즘 및 아키텍처를 넘어서, 프로덕션 환경에 LLM을 배포할 때 몇 가지 실제 고려 사항과 트레이드오프가 있습니다:

하드웨어 가속: CPU는 LLM 추론을 처리할 수 있지만, GPU 및 Google의 TPUs와 같은 가속기는 높은 처리량 및 낮은 지연을 달성하기 위해 필수적입니다. 올바른 하드웨어를 선택하고 메모리 사용을 최적화하는 것이 중요합니다.

배칭 및 병렬성: 하드웨어 병렬성을 완전히 활용하기 위해, 일괄 처리 및 모델 병렬성과 같은 전략을 사용하여 처리량을 크게 향상시킬 수 있습니다.

양자화 대 품질 트레이드오프: 양자화의 정도(8비트, 4비트 등)는 추론 속도 및 메모리 사용에 직접적인 영향을 미치지만, 출력 품질에도 영향을 미칩니다. 이 트레이드오프는 각 사용 사례에서 주의 깊게 평가되어야 합니다.

모델 증류: 양자화의 대안으로, 모델 증류 기술은 큰 LLM을 더 작고 효율적인 학생 모델로 압축하여 높은 정확도를 유지할 수 있습니다.

캐싱 및 최적화된 런타임: NVIDIA의 TensorRT와 같은 최적화된 딥 러닝 런타임 및 MosaicML의 Composable Inference Suite와 같은 프레임워크는 연산자 퓨전, 커널 최적화, 및 지능형 캐싱 전략을 통해 상당한 성능 향상을 제공할 수 있습니다.

최적의 LLM 배포를 달성하는 경로는 종종 여러 기술을 결합하는 것을 포함하며, 특정 응용 프로그램의 요구 사항, 인프라 제약, 및 성능 목표를 주의 깊게 고려해야 합니다.

결론

대형 언어 모델이 빠르게 발전함에 따라, 추론 성능을 가속화하는 것이 실제 세계 응용 프로그램을 가능하게 하고, 이러한 강력한 AI 기능에 대한 접근성을 민주화하는 데越来越 중요해지고 있습니다.

이 기술 가이드에서, 우리는 수치 정밀도 최적화, Flash 주의와 같은 새로운 주의 알고리즘, 및 효율적인 텍스트 생성을 위한 아키텍처 혁신을 포함하여 최신 기술을 탐구했습니다. 각 접근 방식에는其自己的 장점이 있지만, 실제 힘은 여러 전략을 결합하고, 속도, 메모리 사용, 및 출력 품질 사이의 복잡한 트레이드오프를 탐색하는 데 있습니다.

앞으로, 우리는 이 분야에서 지속적인 연구 및 개발을 기대할 수 있습니다. 하드웨어 가속, 모델 압축, 및 완전히 새로운 아키텍처와 같은 요구에 의해 주도됩니다. 효율적인 LLM 추론을 위한 탐색은 자연어 처리 및 인공지능의 세계에서 흥미로운 전방으로 남아 있습니다.

์ง€๋‚œ 5๋…„ ๋™์•ˆ็งใฏ Machine Learning๊ณผ Deep Learning์˜ ๋งค๋ ฅ์ ์ธ ์„ธ๊ณ„์— ๋ชฐ๋‘ํ•ด ์™”์Šต๋‹ˆ๋‹ค.็งใฎๆƒ…็†ฑใจๅฐ‚้–€็Ÿฅ่ญ˜ใฏใ€AI/ML์— ์ค‘์ ์„ ๋‘” 50๊ฐœ ์ด์ƒ์˜ ๋‹ค์–‘ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.็งใฎ็ถ™็ถš็š„ใช ํ˜ธ๊ธฐ์‹ฌ์€ ๋˜ํ•œ ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ ๋ถ„์•ผ๋กœ็งใฎ ๊ด€์‹ฌ์„ ๋Œ์—ˆ๊ณ , ๋” ๊นŠ์ด ํƒ๊ตฌํ•˜๊ณ  ์‹ถ์€ ๋ถ„์•ผ์ž…๋‹ˆ๋‹ค.