Connect with us

NVIDIA GPU와 CUDA를 사용한 LLM 훈련, 미세 조정 및 추론 설정

AI 도구 101

NVIDIA GPU와 CUDA를 사용한 LLM 훈련, 미세 조정 및 추론 설정

mm
Nvidia GPU in Ubuntu Basics of GPU Parallel Computing GPU Based LLM Training Machine

인공지능(AI) 분야는 최근 몇 년 동안 놀라운 발전을 이루었으며, 그 중심에는 그래픽 처리 장치(GPU)와 병렬 컴퓨팅 플랫폼의 강력한 조합이 있습니다.

GPT, BERT 및 최근에 발표된 Llama, Mistral과 같은 모델은 인간과 같은 텍스트를 이해하고 생성할 수 있으며, 이러한 모델을 훈련시키는 데에는 방대한 양의 데이터와 컴퓨팅 자원이 필요합니다. 따라서 GPU와 CUDA는 이러한 작업에 필수적인 도구입니다.

이 всесторон한 가이드에서는 우분투에서 NVIDIA GPU를 설정하는 과정을 설명하며, 필수적인 소프트웨어 구성 요소인 NVIDIA 드라이버, CUDA Toolkit, cuDNN, PyTorch 등을 설치하는 방법을 다룹니다.

CUDA 가속 AI 프레임워크의 부상

GPU 가속 딥 러닝은 CUDA를 사용하여 효율적인 계산을 제공하는 인기 있는 AI 프레임워크의 개발에 의해 주도되고 있습니다. TensorFlow, PyTorch, MXNet과 같은 프레임워크는 CUDA를 지원하여 GPU 가속을 딥 러닝 파이프라인에无缝하게 통합할 수 있습니다.

NVIDIA의 데이터 센터 딥 러닝 제품 성능 연구에 따르면, CUDA 가속 딥 러닝 모델은 CPU 기반 구현보다 최대 100배 빠른 성능을 달성할 수 있습니다.

NVIDIA의 Multi-Instance GPU(MIG) 기술은 암페어 아키텍처에서 도입되었으며, 단일 GPU를 여러 개의 보안 인스턴스로 분할할 수 있습니다. 각 인스턴스에는 전용 리소스가 있으며, 이는 GPU 리소스를 여러 사용자 또는 워크로드 간에 효율적으로 공유할 수 있도록 해줍니다.

NVIDIA TensorRT를 사용한 LLM 추론 가속

GPU는 LLM을 훈련하는 데 중요하지만, 효율적인 추론도 생산 환경에서 이러한 모델을 배포하는 데 중요합니다. NVIDIA TensorRT는 CUDA 활성화된 GPU에서 LLM 추론을 가속화하는 데 중요한 역할을 합니다.

NVIDIA의 벤치마크에 따르면 TensorRT는 대형 언어 모델인 GPT-3와 같은 모델에서 최대 8배 빠른 추론 성능과 5배 낮은 총 소유 비용을 제공할 수 있습니다.

설치

AI 개발을 설정할 때 최신 드라이버와 라이브러리를 사용하는 것이 항상 최선의 선택은 아닙니다. 예를 들어, 최신 NVIDIA 드라이버(545.xx)는 CUDA 12.3을 지원하지만, PyTorch와 다른 라이브러리는 아직 이 버전을 지원하지 않을 수 있습니다. 따라서 이 가이드에서는 드라이버 버전 535.146.02와 CUDA 12.2를 사용하여 호환성을 보장합니다.

설치 단계

1. NVIDIA 드라이버 설치

먼저 GPU 모델을 식별합니다. 이 가이드에서는 NVIDIA GPU를 사용합니다. NVIDIA 드라이버 다운로드 페이지를 방문하여 적절한 드라이버를 선택하고 드라이버 버전을 기록합니다.

우분투에서 사전 빌드 GPU 패키지를 확인하려면 다음 명령을 실행합니다.


sudo ubuntu-drivers list --gpgpu

컴퓨터를 재부팅하고 설치를 확인합니다.


nvidia-smi

2. CUDA Toolkit 설치

CUDA Toolkit은 고성능 GPU 가속 응용 프로그램을 생성하는 개발 환경을 제공합니다.

비-LLM/딥 러닝 설정의 경우 다음을 사용할 수 있습니다.


sudo apt install nvidia-cuda-toolkit

그러나 BitsAndBytes와의 호환성을 보장하려면 다음 단계를 따르십시오.

[code language="BASH"]

git clone https://github.com/TimDettmers/bitsandbytes.git
cd bitsandbytes/
bash install_cuda.sh 122 ~/local 1

설치를 확인합니다.


~/local/cuda-12.2/bin/nvcc --version

환경 변수를 설정합니다.


export CUDA_HOME=/home/roguser/local/cuda-12.2/
export LD_LIBRARY_PATH=/home/roguser/local/cuda-12.2/lib64
export BNB_CUDA_VERSION=122
export CUDA_VERSION=122

3. cuDNN 설치

cuDNN 패키지를 NVIDIA 개발자 웹사이트에서 다운로드하여 설치합니다.


sudo apt install ./cudnn-local-repo-ubuntu2204-8.9.7.29_1.0-1_amd64.deb

키링을 추가하기 위한 지침을 따릅니다.


sudo cp /var/cudnn-local-repo-ubuntu2204-8.9.7.29/cudnn-local-08A7D361-keyring.gpg /usr/share/keyrings/

cuDNN 라이브러리를 설치합니다.


sudo apt update
sudo apt install libcudnn8 libcudnn8-dev libcudnn8-samples

4. Python 가상 환경 설정

우분투 22.04에는 Python 3.10이 포함되어 있습니다. venv를 설치합니다.


sudo apt-get install python3-pip
sudo apt install python3.10-venv

가상 환경을 생성하고 활성화합니다.


cd
mkdir test-gpu
cd test-gpu
python3 -m venv venv
source venv/bin/activate

5. BitsAndBytes 소스에서 설치

BitsAndBytes 디렉토리로 이동하여 소스에서 빌드합니다.


cd ~/bitsandbytes
CUDA_HOME=/home/roguser/local/cuda-12.2/ \
LD_LIBRARY_PATH=/home/roguser/local/cuda-12.2/lib64 \
BNB_CUDA_VERSION=122 \
CUDA_VERSION=122 \
make cuda12x

CUDA_HOME=/home/roguser/local/cuda-12.2/ \
LD_LIBRARY_PATH=/home/roguser/local/cuda-12.2/lib64 \
BNB_CUDA_VERSION=122 \
CUDA_VERSION=122 \
python setup.py install

6. PyTorch 설치

PyTorch를 설치합니다.


pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

7. Hugging Face 및 Transformers 설치

변환기 및 가속 라이브러리를 설치합니다.


pip install transformers
pip install accelerate

병렬 처리의 힘

GPU의 핵심은 효율적으로 수천 개의 동시 스레드를 처리할 수 있는 고도로 병렬 처리 가능한 프로세서입니다. 이 아키텍처는 딥 러닝 모델을 훈련하는 데 필요한 계산 집약적인 작업에 적합합니다. CUDA 플랫폼은 NVIDIA에서 개발되었으며 개발자가 이러한 GPU의 전체 잠재력을 활용할 수 있는 소프트웨어 환경을 제공합니다.
LLM 훈련을 GPU와 CUDA로 가속화합니다.

대형 언어 모델을 훈련하는 것은 방대한 양의 텍스트 데이터를 처리하고 수많은 행렬 연산을 수행해야 하는 계산 집약적인 작업입니다. GPU는 수천 개의 코어와 높은 메모리 대역폭을 갖추고 있어 이러한 작업에 이상적으로 적합합니다. CUDA를 활용하면 개발자는 코드를 최적화하여 GPU의 병렬 처리 기능을 활용할 수 있으며, 이는 LLM을 훈련하는 데 필요한 시간을 크게 줄일 수 있습니다.

예를 들어, GPT-3와 같은 대형 언어 모델의 훈련은 CUDA 최적화된 코드를 실행하는 수천 개의 NVIDIA GPU를 사용하여 가능했습니다. 이는 모델이 이전에 없던 양의 데이터에서 훈련될 수 있도록 해줬으며, 자연어 작업에서 뛰어난 성능을 발휘했습니다.


import torch
import torch.nn as nn
import torch.optim as optim
from transformers import GPT2LMHeadModel, GPT2Tokenizer

# 사전 훈련된 GPT-2 모델 및 토크나이저 로드
model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')

# 모델을 GPU로 이동(사용 가능할 경우)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)

# 훈련 데이터 및 하이퍼파라미터 정의
train_data = [...] # 훈련 데이터
batch_size = 32
num_epochs = 10
learning_rate = 5e-5

# 손실 함수 및 최적화 정의
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

# 훈련 루프
for epoch in range(num_epochs):
for i in range(0, len(train_data), batch_size):
# 입력 및 대상 시퀸스 준비
inputs, targets = train_data[i:i+batch_size]
inputs = tokenizer(inputs, return_tensors="pt", padding=True)
inputs = inputs.to(device)
targets = targets.to(device)

# 전방 패스
outputs = model(**inputs, labels=targets)
loss = outputs.loss

# 역방향 패스 및 최적화
optimizer.zero_grad()
loss.backward()
optimizer.step()

print(f'에포크 {epoch+1}/{num_epochs}, 손실: {loss.item()}')

이 예제 코드에서 우리는 PyTorch와 CUDA 활성화된 GPU를 사용하여 GPT-2 언어 모델을 훈련하는 것을 보여줍니다. 모델은 GPU(사용 가능할 경우)에 로드되고, 훈련 루프는 GPU의 병렬성을 활용하여 효율적인 전방 및 역방향 패스를 수행합니다.

CUDA 가속 라이브러리

CUDA 자체 외에도 NVIDIA와 오픈 소스 커뮤니티는 딥 러닝 모델을 효율적으로 구현할 수 있는 CUDA 가속 라이브러리를 개발했습니다. 이러한 라이브러리는 행렬 곱셈, 컨볼루션 및 활성화 함수와 같은 일반적인 연산의 최적화된 구현을 제공하여 개발자가 모델 아키텍처와 훈련 과정에 집중할 수 있도록 합니다.

이러한 라이브러리 중 하나는 cuDNN(CUDA 딥 뉴럴 네트워크 라이브러리)입니다. cuDNN은 딥 뉴럴 네트워크에서 사용되는 표준 루틴의 최적화된 구현을 제공하여 개발자가 모델의 훈련 및 추론을 크게 가속화할 수 있습니다.


import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.cuda.amp import autocast

class ResidualBlock(nn.Module):
def __init__(self, in_channels, out_channels, stride=1):
super().__init__()
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(out_channels)
self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(out_channels)
self.shortcut = nn.Sequential()
if stride != 1 or in_channels != out_channels:
self.shortcut = nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, bias=False),
nn.BatchNorm2d(out_channels)
)

def forward(self, x):
with autocast():
out = F.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
out += self.shortcut(x)
out = F.relu(out)
return out

이 코드에서 우리는 PyTorch를 사용하여 CNN의 잔차 블록을 정의합니다. PyTorch의 Automatic Mixed Precision(AMP)에서 autocast 컨텍스트 관리자를 사용하여 混합 정밀도 훈련을 활성화하여 CUDA 활성화된 GPU에서 성능을 크게 향상시킬 수 있습니다.

다중 GPU 및 분산 훈련

LLM 및 딥 러닝 모델의 크기와 복잡성이 증가함에 따라 이러한 모델을 훈련하는 데 필요한 컴퓨팅 요구 사항도 증가합니다. 이러한 문제를 해결하기 위해 연구자와 개발자는 다중 GPU 및 분산 훈련 기술을 사용하여 여러 기계의 여러 GPU의 결합된 처리 능력을 활용할 수 있습니다.

CUDA 및 관련 라이브러리인 NCCL(NVIDIA Collective Communications Library)은 다중 GPU 간에 효율적인 데이터 전송 및 동기화를 가능하게 하는 통신 기본 요소를 제공하여 분산 훈련을 이전에 없던 규모로 가능하게 합니다.


import torch.distributed as dist

from torch.nn.parallel import DistributedDataParallel as DDP

# 분산 훈련 초기화
dist.init_process_group(backend='nccl', init_method='...')
local_rank = dist.get_rank()
torch.cuda.set_device(local_rank)

# 모델 생성 및 GPU로 이동
model = MyModel().cuda()

# 모델을 DDP로 래핑
model = DDP(model, device_ids=[local_rank])

# 훈련 루프(분산)
for epoch in range(num_epochs):
for data in train_loader:
inputs, targets = data
inputs = inputs.cuda(non_blocking=True)
targets = targets.cuda(non_blocking=True)

outputs = model(inputs)
loss = criterion(outputs, targets)

optimizer.zero_grad()
loss.backward()
optimizer.step()

이 예제에서는 PyTorch의 DistributedDataParallel(DDP) 모듈을 사용하여 분산 훈련을 보여줍니다. 모델은 DDP로 래핑되어 데이터 병렬성, 그래디언트 동기화 및 NCCL을 사용한 여러 GPU 간의 통신을 자동으로 처리합니다. 이는 여러 기계에 걸쳐 훈련 과정을 효율적으로 확장할 수 있게 해줍니다.

CUDA를 사용한 딥 러닝 모델 배포

GPU와 CUDA는 주로 딥 러닝 모델을 훈련하는 데 사용되지만, 효율적인 배포 및 추론에도 중요합니다. 딥 러닝 모델이 더욱 복잡하고 리소스 집약적인 모델로 발전함에 따라, GPU 가속은 생산 환경에서 실시간 성능을 달성하는 데 필수적입니다.

NVIDIA의 TensorRT는 CUDA 활성화된 GPU에서 낮은 지연 시간과 높은 처리량을 제공하는 고성능 딥 러닝 추론 최적화 및 런타임입니다. TensorRT는 TensorFlow, PyTorch, MXNet과 같은 프레임워크에서 훈련된 모델을 최적화하고 가속화하여 다양한 플랫폼에서 효율적인 배포를 가능하게 합니다.


import tensorrt as trt

# 사전 훈련된 모델 로드
model = load_model(...)

# TensorRT 엔진 생성
logger = trt.Logger(trt.Logger.INFO)
builder = trt.Builder(logger)
network = builder.create_network()
parser = trt.OnnxParser(network, logger)

# 모델 파싱 및 최적화
success = parser.parse_from_file(model_path)
engine = builder.build_cuda_engine(network)

# GPU에서 추론 실행
context = engine.create_execution_context()
inputs, outputs, bindings, stream = allocate_buffers(engine)

# 입력 데이터 설정 및 추론 실행
set_input_data(inputs, input_data)
context.execute_async_v2(bindings=bindings, stream_handle=stream.ptr)

# 출력 처리
# ...

이 예제에서는 TensorRT를 사용하여 사전 훈련된 딥 러닝 모델을 CUDA 활성화된 GPU에서 배포하는 것을 보여줍니다. 모델은 TensorRT에 의해 파싱되고 최적화되어 특정 모델과 하드웨어에 최적화된 고성능 추론 엔진을 생성합니다. 이 엔진은 이후 GPU에서 효율적인 추론을 위해 사용될 수 있습니다.

결론

GPU와 CUDA의 조합은 대형 언어 모델, 컴퓨터 비전, 음성 인식 및 딥 러닝의 다른 영역에서 발전을 이끌어 왔습니다. GPU의 병렬 처리 능력과 CUDA에서 제공하는 최적화된 라이브러리를 활용하면 연구자와 개발자는 점점 더 복잡한 모델을 높은 효율성을 갖고 훈련하고 배포할 수 있습니다.

AI 분야가 계속 발전함에 따라 GPU와 CUDA의 중요성은 더욱 증가할 것입니다. 더욱 강력한 하드웨어와 소프트웨어 최적화를 통해 AI 시스템의 개발과 배포의 경계를 더욱 넓히는 것을 기대할 수 있습니다.

지난 5년 동안私は Machine Learning과 Deep Learning의 매력적인 세계에 몰두해 왔습니다.私の情熱と専門知識は、AI/ML에 중점을 둔 50개 이상의 다양한 소프트웨어 엔지니어링 프로젝트에 기여했습니다.私の継続的な 호기심은 또한 자연어 처리 분야로私の 관심을 끌었고, 더 깊이 탐구하고 싶은 분야입니다.