대규모 언어 모델 추론에서 100배 속도 향상을 위한 희소 기법. 활성화 희소성의 마법을 발견하세요: 재학습 불필요, 저비용, 고효율로 GPU 추론 속도를 획기적으로 증가시킵니다!
이전 논의인 “LLM이 희소성을 통해 추론을 가속하는 방법”에서는 첫 번째 파트 “[대규모 모델 가지치기](Unveiling LLM-Pruner Techniques: Doubling Inference Speed)”를 살펴보았습니다. 이번에는 두 번째 파트인 “활성화 희소성을 사용하여 추론 속도를 높이는 방법”을 계속해서 다루고, 다음 논의에서는 세 번째 파트인 “희소 컴파일러가 LLM 추론에 미치는 영향”을 검토하겠습니다.
우리는 다음과 같은 여러 요구 사항을 충족할 수 있는 방법이 있는지 탐구해 왔습니다: 모델 재학습이 필요하지 않고 미세 조정만으로 가능하며(낮은 모델 전이 비용), 모델 성능을 유지하고(좋은 효과), 최신 하드웨어(GPU/CPU)에서 높은 지원을 받으며, GPU 계산 및 I/O를 크게 줄여 지연 시간을 최적화(빠른 추론 속도)하는 방법 말이죠.
실제로 그러한 방법이 존재하며, 활성화 희소성은 이러한 모든 요구 사항을 충족하는 방법 중 하나입니다.
주목할 점은 신경망에서 ReLU 활성화 함수를 사용하면 활성화 희소성이 유도되며 이전 여러 연구에서 채택되었다는 것입니다. 평균적으로 모든 레이어에서 이러한 활성화 희소성은 GPU와 CPU 간의 가중치 전송(I/O)을 크게 절약하여 투영 레이어 가중치의 약 95% 행에 영향을 미칩니다. 이러한 감소는 직접적으로 계산 비용 절감으로 이어집니다. 해당 행에 대한 행렬 곱셈 연산 결과가 0이 되기 때문입니다.
또한 비구조적 희소성(예: 비구조적 가중치 희소성)과 달리, 이러한 유형의 희소성은 더 크고 구조화된 블록(예: 행 또는 열)을 0으로 만들기 때문에 하드웨어 친화적입니다.
마찬가지로 아래 그림을 참조하여 활성화 희소성이 추론 가속화에 미치는 효과를 간략히 설명합니다.
활성화 희소성의 경우 추론 중에는 희소 벡터-밀집 행렬 곱셈이 수행되고, 학습 중에는 희소 행렬-밀집 행렬 곱셈으로 조정됩니다.
- 계산 작업량 감소: 이 반구조적 희소성(가중치 가지치기의 비구조적 희소성과 달리)은 특정 행을 건너뛸 수 있게 하여 계산을 줄입니다. 예를 들어 cusparse와 같은 라이브러리는 이미 해당 연산을 지원합니다.
- IO 전송 감소: 추론 중 GPU I/O는 병목 현상입니다(예: GPU 캐시에서 CPU 캐시로 또는 GPU DRAM에서 GPU 캐시로). 이 방법은 불필요한 행을 건너뛰어 I/O를 줄입니다.
활성화 희소성의 실현 가능성
다음 내용은 주로 [5]의 데이터를 참조하여 LLM에 ReLU 활성화를 적용하는 실현 가능성을 보여줍니다.
활성화 희소 모델과 비활성화 희소 모델의 비교
세 가지 모델(OPT 6.7B, Llama 7B(SiLU 활성화), Falcon 7B(GELU 활성화))의 FFN(Feed-Forward Network) 측정 및 분석을 통해 다음 세 가지 결론을 도출했습니다.
a. Llama 7B(SiLU 활성화), Falcon 7B(GELU 활성화), OPT 6.7B(ReLU 활성화)를 비교한 결과, ReLU는 90% 이상의 활성화 희소성을 유도하는 반면 SiLU와 GELU는 10% 미만의 활성화 희소성을 유도하여 ReLU가 희소 활성화를 유도할 수 있음을 보여줍니다.
b. 활성화 희소성은 가중치 전송(I/O)을 크게 절약하여 다운스트림 투영 레이어 가중치의 약 95% 행에 영향을 미칩니다.
c. 활성화 함수의 선택은 정확도에 큰 영향을 미치지 않습니다. GELU, SiLU 또는 ReLU는 동일한 정밀도 수준에 있기 때문입니다. 그러나 ReLU는 32%의 계산 작업량(FLOPS)을 절약할 수 있습니다.
학습 비용 절감
많은 최신 LLM(예: Llama 및 Falcon)은 비-ReLU 활성화 함수를 사용하여 학습되었습니다. 처음부터 학습하는 것은 비용 효율적이지 않으므로 미세 조정을 통해 ReLU 활성화를 구현하는 방안을 고려해야 합니다. 모델은 다음 두 단계를 통해 미세 조정됩니다.
- 첫 번째 단계에서는 기존 ReLU 활성화(OPT의 경우)를 유지하거나 업-프로젝션과 다운-프로젝션 레이어 사이의 활성화 함수를 ReLU로 대체합니다(Falcon 및 Llama의 경우 GELU 및 SiLU 사용).
- 두 번째 단계에서는 정규화 레이어 뒤에 새로운 ReLU 활성화를 삽입합니다.
1단계 — 비-ReLU 활성화 대체
FFN 레이어에서 비-ReLU 활성화 함수를 ReLU로 대체합니다. Falcon 및 Llama 모델의 경우 각각 GELU 및 SiLU를 대체합니다. OPT 모델은 이미 ReLU 활성화를 사용하므로 변경하지 않습니다. RefinedWeb의 300억 토큰으로 미세 조정 후 모델은 활성화에서 상당한 희소성을 보입니다.
2단계 — 새로운 ReLU 삽입
이전 단계에서 비-ReLU 활성화를 대체하여 더 많은 희소성을 얻었습니다. 그 결과 다운-프로젝션 레이어에 대한 입력이 희소해져 전체 계산 비용의 약 30%를 차지하게 되었습니다. 그러나 다운-프로젝션 외에도 트랜스포머의 디코드 레이어에는 FFN 레이어의 업-프로젝션 및 어텐션 레이어의 QKV 프로젝션과 같은 다른 행렬-벡터 곱셈이 있습니다. 이러한 행렬-벡터 곱셈은 전체 계산 비용의 약 55%를 소비합니다.
최신 트랜스포머 레이어에서 어텐션 및 FFN 레이어에 대한 입력은 모두 정규화 레이어(LayerNorm 또는 RMSNorm 등)에서 가져옵니다. 이러한 레이어는 MLP의 특정 형태로 볼 수 있으며 임의의 학습 가능한 매개변수를 적용하지 않고 입력을 스케일링하는 방법을 학습합니다. 따라서 정규화 레이어 이후에 ReLU를 적용하여 희소 활성화를 얻음으로써 두 번째 단계의 목표를 달성합니다.
측정 결과
미세 조정 비용: 1단계와 2단계에서 각각 300억 및 500억 토큰으로 미세 조정을 완료했습니다. Llama의 1조 토큰 학습 비용과 비교하면 약 3~5%에 불과합니다.
효과: Llama 및 Falcon에 대한 미세 조정 후 추론 지연 시간을 비교한 결과 모델 성능의 눈에 띄는 저하가 없었습니다. 그러나 추론 속도는 30% 이상 크게 개선되었습니다.
전반적으로 결과는 미세 조정을 통한 활성화 희소성 달성이 다양한 단계와 속도에서 추론 FLOPS를 줄이면서 다양한 작업에서 유사한 성능을 유지할 수 있음을 확인합니다. 해당 희소 활성화 모델은 프로젝트에서 확인할 수 있습니다: https://huggingface.co/SparseLLM.
추론 속도를 높이는 방법
참조 논문 [1]에 설명된 DejaVu의 컨텍스트 희소성 예측은 훌륭한 접근 방식입니다.
구조화된 희소성을 최대한 활용하여 속도 향상
컨텍스트 희소성은 사전 학습된 모델이 컨텍스트 희소성을 나타낸다고 가정합니다. 즉, 어텐션 및 MLP에 대한 희소화 계산이 전체 계산과 동일한 효과를 낸다는 의미입니다. 이러한 전제 하에 구조화된 희소 모델의 평균 컨텍스트 희소성 85%는 각 특정 입력에 대해 매개변수를 7배 줄이면서 정확도를 유지하여 추론 성능을 크게 향상시킬 수 있습니다.
위 그림과 같이 컨텍스트 희소성을 기반으로 비동기 희소 예측기를 설계하여 다음 레이어의 어텐션 및 MLP 희소성을 미리 예측합니다. 이 접근 방식은 추론 효율성을 보장할 뿐만 아니라 계산 및 I/O 오버헤드를 크게 줄입니다.
컨텍스트 희소성 존재 검증
OPT-175B, 66B 및 30B 모델을 대상으로 OpenBookQA, Wiki-Text 등 다양한 다운스트림 데이터셋으로 테스트를 수행했습니다. 방법은 각 입력 예제에 대한 컨텍스트 희소성을 식별하기 위해 모델을 두 번 순방향 전파하는 것입니다. 첫 번째 패스에서는 큰 출력 노름을 생성하는 어텐션 헤드 및 MLP 뉴런과 관련된 매개변수 하위 집합을 기록했습니다. 두 번째 패스에서는 기록된 매개변수 하위 집합만 사용하여 각 입력 예제를 계산했습니다. 놀랍게도 두 순방향 전파 모두 모든 컨텍스트 학습 및 언어 모델링 작업에서 유사한 예측 또는 성능을 보였습니다.
관찰 결과: 평균적으로 어텐션 헤드는 최대 80%의 희소성을 부과할 수 있고, MLP 뉴런은 최대 95%의 희소성을 달성할 수 있어 전체 희소성은 약 85%로 7배 속도 향상을 가져올 수 있습니다. 구체적인 참조 데이터는 아래 그림을 참조하세요.
엔지니어링 영향
속도 향상 효과: GPU는 블록 지향 장치이므로 단일 바이트 메모리를 로드하는 데 걸리는 시간은 동일한 주소 주변의 메모리 블록을 로드하는 시간과 동일합니다. NVIDIA GPU의 블록 크기는 일반적으로 128바이트입니다. 따라서 메모리 퓨전 및 연산자 퓨전과 같은 최적화가 수행되었습니다. batch_size=1이라는 전제 하에 FasterTransformer와 비교하여 속도가 2배 향상되었습니다.
처리량 영향: 활성화는 각 토큰의 함수이므로 유효 희소성도 토큰 간에 무작위로 분포됩니다. 따라서 희소 최적화의 효과는 배치 크기가 증가함에 따라 기하급수적으로 감소합니다. 이는 논문의 절제 실험에서 확인할 수 있습니다.
추론 임계값 낮추기
현재의 부분 오프로딩 방법과 DejaVu 방법을 아래 표와 같이 정리했습니다.
활성화 희소성과 오프로딩 방법을 결합하여 GPU-CPU 하이브리드 추론 엔진을 설계할 수 있을까요? 즉, 핫 활성화 뉴런은 GPU에 미리 로드하여 빠르게 접근하고, 콜드 활성화 뉴런은 CPU에서 계산하여 GPU 메모리 요구 사항과 CPU-GPU 데이터 전송을 크게 줄이는 것입니다.
당연히 '그렇다’입니다.
한 가지 솔루션은 PowerInfer[10]로, 단일 NVIDIA RTX 4090 GPU에서 OPT-175B를 실행할 수 있으며 최고급 A100 GPU 서버보다 토큰 생성 속도가 18%만 낮습니다. 오프로딩 및 활성화 희소성 외에도 Brainstorm[9], SparTA[15], Flash-llm[16]과 같은 다른 측면도 참고할 가치가 있습니다.
개요:
PowerInfer는 자주 활성화되는 뉴런의 가중치를 GPU에 미리 로드하고, 덜 활성화되는 뉴런의 가중치는 CPU에 유지합니다.
추론 지연 시간을 줄이기 위해 추론 엔진은 온라인 예측기가 활성화될 것으로 예측한 뉴런만 계산하고 대부분의 비활성 뉴런을 건너뜁니다. 또한 사전 로드 전략을 통해 PowerInfer는 GPU에 로드된 핫 활성화 뉴런이 활성화의 대부분을 차지하므로 추론 작업의 상당 부분을 GPU에 할당할 수 있습니다. GPU 메모리에 없는 콜드 활성화 뉴런의 경우 PowerInfer는 CPU에서 계산을 수행하므로 가중치를 GPU로 전송할 필요가 없습니다.
PowerInfer의 아키텍처 개요 및 추론 워크플로우
PowerInfer는 오프라인 및 온라인 구성 요소로 구성됩니다. LLM마다 지역성 속성이 다르기 때문에 오프라인 구성 요소는 LLM의 활성화 희소성을 분석하여 핫 뉴런과 콜드 뉴런을 구분합니다. 온라인 단계에서 추론 엔진은 두 유형의 뉴런을 GPU와 CPU에 로드하고 런타임에 낮은 지연 시간으로 LLM 요청을 처리합니다. 사용자 요청을 처리하기 전에 온라인 엔진은 오프라인 솔버의 출력을 기반으로 두 유형의 뉴런을 각각의 처리 장치에 할당합니다. 런타임에 엔진은 GPU 및 CPU 실행기를 생성합니다. 이는 CPU 측에서 실행되는 스레드로, 동시 CPU-GPU 계산을 관리합니다. 엔진은 또한 뉴런 활성화를 예측하고 비활성 뉴런을 건너뜁니다. 활성화된 뉴런은 처리를 위해 GPU 메모리에 미리 로드되고, CPU는 자체 뉴런에 대한 결과를 계산하여 통합을 위해 GPU로 전송합니다. 엔진은 CPU와 GPU 모두에서 희소 뉴널 인식 연산자를 사용하며, 행렬 내 개별 뉴런 행/열에 초점을 맞춥니다.
프로젝트 링크: https://github.com/SJTU-IPADS/PowerInfer
단일 레이어 계산 최적화
PowerInfer가 하나의 LLM 레이어에 대해 다른 뉴런을 계산하는 방법을 보여주는 예시
PowerInfer는 오프라인 데이터를 기반으로 뉴런을 분류하여 레이어의 뉴런을 처리하기 위해 GPU와 CPU를 조정합니다. 핫 뉴런(예: 인덱스 3, 5, 7)을 GPU 메모리에 할당하고 다른 뉴런은 CPU 메모리에 할당합니다.
입력을 받으면 예측기는 현재 레이어에서 활성화될 가능성이 높은 뉴런을 식별합니다. 예를 들어 뉴런 3, 4, 5의 활성화를 예측합니다. 오프라인 통계 분석을 통해 식별된 핫 뉴런이 런타임 활성화 동작과 항상 일치하지는 않을 수 있습니다. 예를 들어 뉴런 7은 핫으로 표시되었지만 특정 시나리오에서는 비활성화될 수 있습니다.
그런 다음 CPU와 GPU 모두 예측된 활성 뉴런을 처리하고 비활성 뉴런은 무시합니다. GPU는 뉴런 3과 5를 계산하고 CPU는 뉴런 4를 처리합니다. 뉴런 4의 계산이 완료되면 그 출력이 GPU로 전송되어 결과를 통합합니다.
온라인 추론 (뉴런 인식 추론 엔진)
- 적응형 희소 예측기
PowerInfer의 온라인 추론 엔진은 활성화될 것으로 예측된 뉴런만 처리하여 계산 부하를 줄입니다. 이 접근 방식은 DejaVu에서도 사용되며 고정 크기 MLP 예측기 집합을 학습하는 방법을 옹호합니다. 각 트랜스포머 레이어에서 DejaVu는 두 개의 독립적인 예측기를 사용하여 셀프 어텐션 및 MLP 블록에서 뉴런의 활성화를 예측합니다.
그러나 제한된 리소스로 로컬 배포에 효과적인 예측기를 설계하는 것은 어려우며 예측 정확도와 모델 크기 간의 균형이 필요합니다.
PowerInfer는 각 트랜스포머 레이어에 대해 고정되지 않은 크기의 예측기를 위한 반복 학습 방법을 사용합니다. 이 프로세스는 먼저 레이어의 희소성 프로필을 기반으로 기준 모델 크기를 설정합니다. 그런 다음 내부 활성화 편향을 고려하여 정확도를 유지하기 위해 모델 크기를 반복적으로 조정합니다. MLP 예측기는 일반적으로 입력, 은닉 및 출력 레이어로 구성됩니다. 입력 및 출력 레이어의 크기는 트랜스포머 레이어의 구조에 의해 결정되므로 수정은 주로 은닉 레이어를 대상으로 합니다. 반복 조정 프로세스 중에 관찰된 편향 정도에 따라 은닉 레이어의 크기가 수정됩니다. 큰 편향을 보이는 레이어의 경우 정확도가 95% 미만으로 떨어질 때까지 은닉 레이어의 크기가 점차 감소합니다. 반대로 편향이 적은 레이어의 경우 정확도를 높이기 위해 차원이 증가합니다. 이 접근 방식을 통해 PowerInfer는 예측기 매개변수를 전체 LLM 매개변수의 10%로 효과적으로 제한할 수 있습니다.
- GPU-CPU 하이브리드 실행
추론 전에 PowerInfer는 계산 방향성 비순환 그래프(DAG)를 구성합니다. 여기서 각 노드는 LLM 추론 연산자를 나타내며 CPU 메모리의 전역 큐에 저장됩니다. 큐의 각 연산자는 필요한 연산자로 레이블이 지정됩니다. 추론 중에 두 가지 유형의 실행기(호스트 운영 체제 pthread에서 생성)가 CPU 및 GPU에서 계산을 관리합니다. 전역 큐에서 연산자를 추출하고 종속성을 확인한 후 적절한 처리 장치에 할당합니다. GPU와 CPU는 자체 뉴런 인식 연산자를 사용하며, GPU 실행기는 cudaLaunchKernel과 같은 API를 사용하여 GPU 연산자를 시작하고 CPU 실행기는 사용되지 않은 CPU 코어를 조정하여 계산을 수행합니다.
실험 결론
성능 비교
FP16 형식 PC-High에서 다양한 모델의 속도 향상. X축은 출력 길이, Y축은 llama.cpp 대비 속도 향상 비율입니다. 각 막대 위의 숫자는 종단 간 생성 속도(토큰/초)입니다. 그래프 첫 번째 행에 구성된 입력 길이는 약 64, 두 번째 행은 약 128입니다.
NVIDIA RTX 4090이 장착된 PC-High에서 다양한 모델과 입력-출력 구성이 다른 생성 속도를 보입니다. 평균적으로 PowerInfer는 8.32 토큰/초의 생성 속도를 달성하며 최고 16.0 토큰/초로 llama.cpp보다 현저히 우수하며 평균 속도 향상은 7.23배, Falcon-40B는 최대 11.69배에 달합니다. 출력 토큰 수가 증가할수록 PowerInfer의 성능 이점이 더 두드러집니다. 생성 단계가 전체 추론 시간에서 더 중요한 역할을 하기 때문입니다. 이 단계에서는 CPU와 GPU 모두에서 소수의 뉴런만 활성화되어 llama.cpp에 비해 불필요한 계산을 줄입니다. 예를 들어 OPT-30B의 경우 생성된 토큰당 약 20%의 뉴런만 활성화되며 대부분이 GPU에서 처리되어 PowerInfer의 뉴런 인식 추론 엔진의 장점을 보여줍니다.
배치 크기 영향:
배치 크기가 32 미만일 때 PowerInfer는 현저한 이점을 보이며 llama.cpp에 비해 평균 6.08배 향상됩니다. 배치 크기가 증가함에 따라 PowerInfer가 제공하는 속도 향상 비율은 감소합니다. 이러한 감소는 모델에서 결합 활성화의 희소성이 감소하기 때문입니다. 그러나 배치 크기를 32로 설정하더라도 PowerInfer는 여전히 상당한 속도 향상 비율인 4.38배를 유지합니다.
PC-High에서 Falcon-40B의 배치 추론 속도 향상. X축은 요청 배치 크기, Y축은 종단 간 토큰 생성 속도(토큰/초)입니다. 각 막대 위의 숫자는 llama.cpp 대비 속도 향상을 나타냅니다.
부하 비교
추론 중 CPU 및 GPU의 뉴런 부하 분포. 노란색 블록은 llama.cpp, 파란색 블록은 PowerInfer를 나타냅니다.
PowerInfer와 llama.cpp에서 CPU와 GPU 간의 뉴런 부하 분포를 비교합니다. 뉴런 부하는 각 처리 장치가 수행하는 활성화된 뉴런 계산의 비율을 의미합니다. PC-High 시스템에서 PowerInfer는 GPU의 뉴런 부하 비율을 평균 20%에서 70%로 크게 증가시킵니다. 이는 GPU가 활성화된 뉴런의 70%를 처리함을 나타냅니다. 그러나 모델의 메모리 요구 사항이 GPU 용량을 훨씬 초과하는 경우(예: 60GB 모델을 11GB 2080Ti GPU에서 실행) GPU의 뉴런 부하는 42%로 감소합니다. 이 감소는 GPU의 제한된 메모리로 인해 모든 핫 활성화 뉴런을 수용할 수 없어 일부 뉴런을 CPU에서 계산해야 하기 때문입니다.
입력 프롬프트가 길고 출력 길이가 상대적으로 짧은 시나리오에서 PowerInfer는 제한된 성능 향상만 보입니다. 이러한 경우 많은 수의 토큰을 동시에 처리하는 단계가 추론 속도를 결정하는 핵심 요소가 됩니다. 결과적으로 각 토큰은 고유한 뉴런 집합을 활성화하여 활성화 희소성을 크게 줄입니다. 이로 인해 CPU는 많은 수의 콜드 활성화 뉴런을 처리해야 하지만 계산 능력이 제한되어 추론 과정의 주요 병목 현상이 됩니다.
결론
활성화 희소성 기술은 대규모 언어 모델에 혁명적인 돌파구를 가져왔습니다. 신경망의 활성화를 희소화하여 추론 과정을 가속화하고 GPU 계산 및 I/O 부하를 줄임으로써 추론 속도와 성능을 향상시킵니다. 이 접근 방식은 재학습이 필요하지 않으며 미세 조정만으로 활성화 희소성을 달성하여 비용을 크게 줄이면서 모델 성능을 유지합니다. 활성화 희소성 기술의 응용 전망은 매우 흥미로우며 딥러닝 분야에 더 많은 가능성을 제시합니다. 이 기술의 추가 개발과 광범위한 적용을 기대합니다.
참고 논문
[5]ReLU Strikes Back:Exploiting Activation Sparsity in Large Language Models
[7]Inducing and exploiting activation sparsity for fast inference on deep neural networks
[8]Sparse is enough in scaling transformers
novita.ai 는 Stable Diffusion API와 10,000개 모델을 위한 수백 개의 빠르고 저렴한 AI 이미지 생성 API를 제공합니다. 🎯 최소 2초 만에 생성 가능, 종량제, 표준 이미지당 최소 $0.0015, 자체 모델 추가 가능, GPU 유지보수 불필요. 오픈소스 확장 기능을 무료로 공유하세요.
추천 자료
