Transformers documentation

단일 GPU에서 효율적인 추론

You are viewing v4.34.1 version. A newer version v4.46.3 is available.
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

단일 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 통합을 지원합니다. 이 방법은 float16bfloat16 가중치에 대해 nn.Linear 크기를 2배로 줄이고, float32 가중치에 대해 4배로 줄입니다. 이는 절반 정밀도에서 이상치를 처리함으로써 품질에 거의 영향을 미치지 않습니다.

HFxbitsandbytes.png

Int8 혼합 정밀도 행렬 분해는 행렬 곱셈을 두 개의 스트림으로 분리합니다: (1) fp16로 곱해지는 체계적인 특이값 이상치 스트림 행렬(0.01%) 및 (2) int8 행렬 곱셈의 일반적인 스트림(99.9%). 이 방법을 사용하면 매우 큰 모델에 대해 예측 저하 없이 int8 추론이 가능합니다. 이 방법에 대한 자세한 내용은 논문이나 통합에 관한 블로그 글에서 확인할 수 있습니다.

MixedInt8.gif

커널은 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)를 실행하는 데모를 확인하세요:

Open In Colab: T5-11b demo

또는 BLOOM-3B에 대한 데모를 확인하세요:

Open In Colab: BLOOM-3b demo