#
단일 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에 대한 데모를 확인하세요: