SNU-ARC/any-precision-llm
요약
Any-precision LLM은 다양한 비트 너비로 양자화된 여러 LLM을 단일 모델의 메모리 공간에 중첩하여 배포하는 효율적인 솔루션입니다. incremental upscaling 기술과 비트플레인 기반의 커스텀 CUDA 커널을 통해 메모리 점유 공간과 비용을 획기적으로 절감합니다.
핵심 포인트
- 다양한 비트 너비의 LLM을 단일 메모리 공간에 중첩 배포 가능
- incremental upscaling을 통한 경량 양자화 기술 적용
- 비트플레인 기반 가중치 표현을 지원하는 커스텀 CUDA 커널 탑재
- Llama, OPT, Mistral 모델에 대한 양자화 검증 완료
Any-precision LLM은 다양한 크기의 여러 LLM을 배포하기 위한 메모리 효율적이고 비용 효율적인 솔루션입니다. 구체적으로, any-precision LLM은 3, 4, ..., n 비트와 같이 다양한 비트 너비(bit-widths)로 양자화(quantized)된 LLM들을 단일 n-비트 LLM과 유사한 메모리 점유 공간(memory footprint)에 중첩함으로써, 다양한 크기의 여러 LLM을 배포할 때 발생하는 메모리 비용을 절감합니다. 여기에는 incremental upscaling이라 불리는 LLM을 위한 경량 any-precision 양자화 기술과, 비트플레인(bitplane) 기반 가중치 표현을 지원하는 커스텀 CUDA 커널이 탑재된 효율적인 서빙(serving)을 위한 특화된 소프트웨어 엔진이 포함됩니다.
[IMG:1] incremental upscaling 방식의 예시
[IMG:2] any-precision LLM을 위한 특화된 소프트웨어 엔진의 예시
-
Python 3.11
-
CUDA Toolkit 12 이상
-
gcc-9 이상
이 저장소(repository)를 클론(Clone)하세요.
필요한 Python 패키지들을 설치하세요.
의존성 관리를 위해 Virtualenv 또는 Conda를 사용하는 Python 3.11 사용을 권장합니다. pip install -r requirements.txt
Any-Precision CUDA 커널을 설치하세요.
cd any_precision/modules/kernels pip install .
CUDA 커널을 빌드하려면 머신에 CUDA toolkit 12 이상이 설치되어 있어야 합니다. 또한 gcc-9 이상이 필요합니다.
모델을 any-precision으로 양자화하려면, 관련 인자(arguments)와 함께 quantize.py를 실행하세요:
python quantize.py <model> [options]
양자화 과정에서 모델이 이미 존재하지 않는 경우, Hugging Face 저장소에서 모델을 자동으로 다운로드합니다.
양자화 과정은 다음 단계들로 구성됩니다:
- 그래디언트 계산 (Gradient calculation): 양자화를 위한 민감도 지표(sensitivity metric)를 위해 모델의 그래디언트(gradients)를 계산합니다.
- 업스케일링 (Upscaling): 모델을 시드 정밀도(seed precision)로 양자화한 다음, 부모 정밀도(parent precision)로 점진적으로 업스케일링합니다.
- 패킹 (Packing): 양자화된 모델을 가중치가 비트플레인(bitplanes)에 저장된 단일 파일로 패킹합니다.
모든 단계는 자동으로 수행됩니다.
중간 파일과 최종 양자화된 모델을 모두 저장하기 위해 cache 디렉토리가 생성됩니다.
최종 양자화된 모델은 cache/packed에서 찾을 수 있습니다.
참고 사항 (Notes):
- Llama, OPT 및 Mistral 모델에 대해 양자화를 테스트했습니다. 다른 모델들도 자동으로 양자화될 수 있지만, 양자화의 정확성을 보장하지는 않습니다.
- 모델을 양자화하려면 RAM, VRAM 및 디스크에 fp16 모델 크기의 약 2배에 해당하는 여유 공간이 필요합니다. Llama 2 7B의 경우, 이는 약 28 GB입니다. 만약 VRAM이 문제가 된다면
--cpu_only플래그를 확인하십시오. - 양자화 프로세스는 CPU와 GPU 리소스를 모두 사용합니다. 주요 양자화 프로세스는 CPU 바운드(CPU-bound)이므로, 더 빠른 양자화를 위해 강력한 멀티코어 성능을 가진 머신을 사용하십시오. 하지만 당사의 양자화 파이프라인은 매우 최적화되어 있어, i9-13900K 머신에서 Llama 2 7B를 2분 이내에 양자화할 수 있습니다. 저사양 머신에서는 이보다 몇 배 더 느려질 수 있습니다.
model : 양자화할 모델입니다. Hugging Face 저장소이거나 모델의 로컬 경로여야 합니다. 예: meta-llama/Llama-2-7b-chat-hf.
--seed_precision : 시드 모델 정밀도 (seed model precision)입니다. 기본값은 3입니다.
--parent_precision : 부모 모델 정밀도 (parent model precision)입니다. 기본값은 8입니다. (최종 양자화된 모델은 [seed_precision, parent_precision] 범위 내의 정밀도를 지원합니다.)
--mode : 동작 모드입니다. 유효한 옵션은 양자화의 세 단계인 gradients, quantize, pack입니다. 양자화 프로세스는 지정된 작업 후에 중단됩니다. 기본값은 전체 양자화 프로세스를 완료하는 pack입니다.
--yaml_path : 아키텍처 설정 yaml 파일의 경로입니다. 지정하지 않으면 모델 아키텍처가 자동으로 추론됩니다.
--cache_dir : 결과를 캐시할 디렉토리입니다. 기본값은 cache입니다.
--dataset : 그래디언트 (gradient) 계산에 사용할 데이터셋입니다. 기본값은 c4입니다.
--seq_len : 그래디언트 계산에 사용할 시퀀스 길이 (sequence length)입니다. 기본값은 512입니다.
--num_examples : 그래디언트 계산에 사용할 예시(examples)의 수입니다. 기본값은 100입니다.
--cpu_count
: 그래디언트 계산에 사용할 코어 (cores)의 수입니다. 기본값은 사용 가능한 코어의 수입니다.
--random_state
: 재현성 (reproducibility)을 위해 사용할 랜덤 상태 (random state)입니다. 설정하지 않으면 랜덤 상태가 고정되지 않습니다. 정수 (integer)를 사용하세요.
--cpu_only
: 그래디언트 계산을 CPU에서만 실행할지 여부입니다. 이는 GPU VRAM이 제한적인 경우에 유용합니다. 이 옵션이 설정되면 모델은 CPU에 로드되며 양자화 (quantization)는 CPU에서 수행됩니다. GPU보다 느립니다.
--overwrite_gradients
: 디스크에 저장된 그래디언트를 덮어쓸지 여부입니다. 설정하지 않으면 사용 가능한 경우 디스크에서 그래디언트를 로드합니다.
--overwrite_quantize
: 디스크에 저장된 부모 모델 (parent model)을 덮어쓸지 여부입니다. 설정하지 않으면 사용 가능한 경우 디스크에서 부모 모델을 로드합니다.
--overwrite_pack
: 디스크에 저장된 팩된 모델 (packed model)을 덮어쓸지 여부입니다. 설정하지 않으면 이미 존재하는 경우 팩된 모델을 덮어쓰지 않습니다.
python quantize.py meta-llama/Llama-2-7b-chat-hf
우리의 양자화 파이프라인 (quantization pipeline)은 양자화를 위한 선형 레이어 (linear layers)를 자동으로 감지함으로써, Hugging Face 저장소에서 로드할 수 있는 모든 모델을 지원하도록 설계되었습니다. 하지만 더 나은 재현성을 위해, any_precision_llm/analyzer/architectures 경로 아래에 Llama, OPT, 그리고 Mistral 모델을 위한 YAML 파일들을 미리 구성해 두었습니다.
Llama 모델을 위한 YAML 파일은 다음과 같은 형태입니다:
architecture: "LlamaForCausalLM"
arch_config:
model_name: "model"
...
architecture 필드는 해당 YAML 파일이 어떤 모델 클래스 (model class)를 위한 것인지 지정합니다. arch_config 아래의 model_name 필드는 모델을 포함하고 있는 모델 속성 (model attribute)의 이름을 지정합니다. layers_name 필드는 모델 아래에서 모델의 레이어 (layers)를 포함하고 있는 속성의 이름을 지정합니다. module_names 필드는 양자화할 선형 레이어들의 이름을 지정합니다.
any_precision_llm/analyzer/architectures 아래에 해당하는 YAML 파일이 없는 모델의 경우
, 양자화 과정 (quantization process)에서 양자화할 선형 레이어 (linear layers)를 자동으로 감지하려고 시도합니다. 이는 작동이 보장되지 않으며, 잘못된 양자화 (incorrect quantization)로 이어질 수 있습니다.
다른 모델 유형을 실험하고 싶다면, 동일한 디렉토리 아래에 직접 YAML 파일을 생성하거나, yaml_path 인자 (argument)를 지정하여 사용자 정의 YAML 파일을 가리킬 수 있습니다. 이 경우 architecture 필드는 불필요합니다.
양자화된 모델을 추론 (inference)에 사용하려면, any_precision 모듈의 AnyPrecisionForCausalLM 클래스를 사용할 수 있습니다.
다음은 양자화된 모델을 로드하고 추론을 수행하는 예시입니다:
from any_precision import AnyPrecisionForCausalLM
from transformers import AutoTokenizer
quanitized_model_path = "./cache/packed/anyprec-(Llama-2-7b-chat-hf)-w8_orig3-gc1-c4_s100_blk512"
...
양자화된 모델의 동적 추론 지연 시간 (dynamic inference latency)을 보여주기 위한 데모 스크립트를 제공합니다. 데모를 실행하려면 다음 명령어를 실행하세요:
python demo.py
데모 스크립트는 캐시 디렉토리에 양자화된 Llama-2-7b-chat-hf 모델이 있어야 함을 유의하십시오.
스크립트 내의 model_path 및 original_model_path 변수를 변경하여 다른 모델을 사용할 수 있습니다.
데모 스크립트는 양자화된 모델을 로드하고, 지정된 정밀도 (precisions)를 사용하여 사용자 정의 프롬프트에 대해 추론을 수행합니다. fp16에서 원본 모델의 지연 시간을 측정하려면 16을 포함하십시오. 각 정밀도에서의 지연 시간이 측정되어 표시됩니다.
데모가 정상적으로 실행되면 다음과 같이 보입니다:
이 데모는 개념 증명 (proof-of-concept) 용도로 제공된다는 점에 유의하십시오. 우리 엔진의 최상의 성능을 달성하기 위해서는 추론 파이프라인 (inference pipeline)에 대한 추가적인 최적화가 필요합니다.
다양한 데이터셋에서 양자화된 모델의 퍼플렉시티 (perplexity)를 평가하기 위한 스크립트를 제공합니다. 평가를 실행하려면 다음 명령어를 실행하세요:
python run_eval.py
스크립트 내의 datasets 변수를 변경하여 평가할 데이터셋을 지정할 수 있습니다.
결과는 자동으로 JSON 파일에 추가됩니다. (기본값은 results.json입니다.)
저희의 작업이 유용하다고 생각되신다면 논문을 인용해 주세요:
@inproceedings{park2024anyprecision,
title={Any-Precision LLM: Low-Cost Deployment of Multiple, Different-Sized LLMs},
author={Yeonhong Park and Jake Hyun and SangLyul Cho and Bonggeun Sim and Jae W. Lee},
...
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub ML Hardware의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기