단일 GPU에서 효율적인 추론
이 가이드 외에도, 단일 GPU에서의 훈련 가이드와 CPU에서의 추론 가이드에서도 관련 정보를 찾을 수 있습니다.
Better Transformer: PyTorch 네이티브 Transformer 패스트패스
PyTorch 네이티브 nn.MultiHeadAttention
어텐션 패스트패스인 BetterTransformer는 🤗 Optimum 라이브러리의 통합을 통해 Transformers와 함께 사용할 수 있습니다.
PyTorch의 어텐션 패스트패스는 커널 퓨전과 중첩된 텐서의 사용을 통해 추론 속도를 높일 수 있습니다. 자세한 벤치마크는 이 블로그 글에서 확인할 수 있습니다.
optimum
패키지를 설치한 후에는 추론 중 Better Transformer를 사용할 수 있도록 to_bettertransformer()
를 호출하여 관련 내부 모듈을 대체합니다:
model = model.to_bettertransformer()
reverse_bettertransformer()
메소드는 정규화된 transformers 모델링을 사용하기 위해 모델을 저장하기 전 원래의 모델링으로 돌아갈 수 있도록 해줍니다:
model = model.reverse_bettertransformer()
model.save_pretrained("saved_model")
PyTorch 2.0부터는 어텐션 패스트패스가 인코더와 디코더 모두에서 지원됩니다. 지원되는 아키텍처 목록은 여기에서 확인할 수 있습니다.
FP4 혼합 정밀도 추론을 위한 bitsandbytes 통합
bitsandbytes
를 설치하면 GPU에서 손쉽게 모델을 압축할 수 있습니다. FP4 양자화를 사용하면 원래의 전체 정밀도 버전과 비교하여 모델 크기를 최대 8배 줄일 수 있습니다. 아래에서 시작하는 방법을 확인하세요.
이 기능은 다중 GPU 설정에서도 사용할 수 있습니다.
요구 사항
최신
bitsandbytes
라이브러리pip install bitsandbytes>=0.39.0
최신
accelerate
를 소스에서 설치pip install git+https://github.com/huggingface/accelerate.git
최신
transformers
를 소스에서 설치pip install git+https://github.com/huggingface/transformers.git
FP4 모델 실행 - 단일 GPU 설정 - 빠른 시작
다음 코드를 실행하여 단일 GPU에서 빠르게 FP4 모델을 실행할 수 있습니다.
from transformers import AutoModelForCausalLM
model_name = "bigscience/bloom-2b5"
model_4bit = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", load_in_4bit=True)
device_map
은 선택 사항입니다. 그러나 device_map = 'auto'
로 설정하는 것이 사용 가능한 리소스를 효율적으로 디스패치하기 때문에 추론에 있어 권장됩니다.
FP4 모델 실행 - 다중 GPU 설정
다중 GPU에서 혼합 4비트 모델을 가져오는 방법은 단일 GPU 설정과 동일합니다(동일한 명령어 사용):
model_name = "bigscience/bloom-2b5"
model_4bit = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", load_in_4bit=True)
하지만 accelerate
를 사용하여 각 GPU에 할당할 GPU RAM을 제어할 수 있습니다. 다음과 같이 max_memory
인수를 사용하세요:
max_memory_mapping = {0: "600MB", 1: "1GB"}
model_name = "bigscience/bloom-3b"
model_4bit = AutoModelForCausalLM.from_pretrained(
model_name, device_map="auto", load_in_4bit=True, max_memory=max_memory_mapping
)
이 예에서는 첫 번째 GPU가 600MB의 메모리를 사용하고 두 번째 GPU가 1GB를 사용합니다.
고급 사용법
이 방법의 더 고급 사용법에 대해서는 양자화 문서 페이지를 참조하세요.
Int8 혼합 정밀도 행렬 분해를 위한 bitsandbytes 통합
이 기능은 다중 GPU 설정에서도 사용할 수 있습니다.
LLM.int8() : 8-bit Matrix Multiplication for Transformers at Scale
논문에서 우리는 몇 줄의 코드로 Hub의 모든 모델에 대한 Hugging Face 통합을 지원합니다.
이 방법은 float16
및 bfloat16
가중치에 대해 nn.Linear
크기를 2배로 줄이고, float32
가중치에 대해 4배로 줄입니다. 이는 절반 정밀도에서 이상치를 처리함으로써 품질에 거의 영향을 미치지 않습니다.
Int8 혼합 정밀도 행렬 분해는 행렬 곱셈을 두 개의 스트림으로 분리합니다: (1) fp16로 곱해지는 체계적인 특이값 이상치 스트림 행렬(0.01%) 및 (2) int8 행렬 곱셈의 일반적인 스트림(99.9%). 이 방법을 사용하면 매우 큰 모델에 대해 예측 저하 없이 int8 추론이 가능합니다. 이 방법에 대한 자세한 내용은 논문이나 통합에 관한 블로그 글에서 확인할 수 있습니다.
커널은 GPU 전용으로 컴파일되어 있기 때문에 혼합 8비트 모델을 실행하려면 GPU가 필요합니다. 이 기능을 사용하기 전에 모델의 1/4(또는 모델 가중치가 절반 정밀도인 경우 절반)을 저장할 충분한 GPU 메모리가 있는지 확인하세요. 이 모듈을 사용하는 데 도움이 되는 몇 가지 참고 사항이 아래에 나와 있습니다. 또는 Google colab에서 데모를 따라할 수도 있습니다.
요구 사항
bitsandbytes<0.37.0
을 사용하는 경우, 8비트 텐서 코어(Turing, Ampere 또는 이후 아키텍처 - 예: T4, RTX20s RTX30s, A40-A100)를 지원하는 NVIDIA GPU에서 실행하는지 확인하세요.bitsandbytes>=0.37.0
을 사용하는 경우, 모든 GPU가 지원됩니다.- 올바른 버전의
bitsandbytes
를 다음 명령으로 설치하세요:pip install bitsandbytes>=0.31.5
accelerate
를 설치하세요pip install accelerate>=0.12.0
혼합 Int8 모델 실행 - 단일 GPU 설정
필요한 라이브러리를 설치한 후 혼합 8비트 모델을 가져오는 방법은 다음과 같습니다:
from transformers import AutoModelForCausalLM
model_name = "bigscience/bloom-2b5"
model_8bit = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", load_in_8bit=True)
텍스트 생성의 경우:
pipeline()
함수 대신 모델의generate()
메소드를 사용하는 것을 권장합니다.pipeline()
함수로는 추론이 가능하지만, 혼합 8비트 모델에 최적화되지 않았기 때문에generate()
메소드를 사용하는 것보다 느릴 수 있습니다. 또한, nucleus 샘플링과 같은 일부 샘플링 전략은 혼합 8비트 모델에 대해pipeline()
함수에서 지원되지 않습니다.- 입력을 모델과 동일한 GPU에 배치하는 것이 좋습니다.
다음은 간단한 예입니다:
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "bigscience/bloom-2b5"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model_8bit = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", load_in_8bit=True)
prompt = "Hello, my llama is cute"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
generated_ids = model.generate(**inputs)
outputs = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)
혼합 Int8 모델 실행 - 다중 GPU 설정
다중 GPU에서 혼합 8비트 모델을 로드하는 방법은 단일 GPU 설정과 동일합니다(동일한 명령어 사용):
model_name = "bigscience/bloom-2b5"
model_8bit = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", load_in_8bit=True)
하지만 accelerate
를 사용하여 각 GPU에 할당할 GPU RAM을 제어할 수 있습니다. 다음과 같이 max_memory
인수를 사용하세요:
max_memory_mapping = {0: "1GB", 1: "2GB"}
model_name = "bigscience/bloom-3b"
model_8bit = AutoModelForCausalLM.from_pretrained(
model_name, device_map="auto", load_in_8bit=True, max_memory=max_memory_mapping
)
이 예시에서는 첫 번째 GPU가 1GB의 메모리를 사용하고 두 번째 GPU가 2GB를 사용합니다.
Colab 데모
이 방법을 사용하면 이전에 Google Colab에서 추론할 수 없었던 모델에 대해 추론할 수 있습니다. Google Colab에서 8비트 양자화를 사용하여 T5-11b(42GB in fp32)를 실행하는 데모를 확인하세요:
또는 BLOOM-3B에 대한 데모를 확인하세요: