AI 도구 101

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

mm
Unite.AI를 Google의 선호 소스에 추가
Nvidia GPU in Ubuntu Basics of GPU Parallel Computing GPU Based LLM Training Machine

인공지능 분야는 최근 몇 년 동안 놀라운 발전을 이루었으며, 그 중심에는 그래픽 처리 장치(GPU)와 병렬 컴퓨팅 플랫폼의 강력한 조합이 있습니다. GPT, BERT 및 최근에 발표된 Llama, Mistral과 같은 모델은 인간과 같은 텍스트를 이해하고 생성할 수 있습니다. 그러나 이러한 모델을 훈련시키는 데에는大量의 데이터와 계산 리소스가 필요하여 GPU와 CUDA는 이러한 작업에서 필수적인 도구입니다.

이 전체 가이드에서는 Ubuntu에서 NVIDIA (NVDA ) GPU를 설정하는 과정을 설명하며, 필수적인 소프트웨어 구성 요소인 NVIDIA 드라이버, CUDA Toolkit, cuDNN, PyTorch 및 기타 라이브러리의 설치 과정을 다룹니다.

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

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

NVIDIA의 다중 인스턴스 GPU(MIG) 기술은 암페어 아키텍처에서 도입되어 단일 GPU를 여러 개의 보안 인스턴스로 분할하여 각 인스턴스에 전용 리소스를 할당할 수 있습니다. 이 기능은 GPU 리소스를 여러 사용자 또는 워크로드 간에 효율적으로 공유할 수 있으므로 사용률을 최대화하고 전체 비용을 줄일 수 있습니다.

NVIDIA TensorRT를 사용한 LLM 추론 가속

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

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

NVIDIA의 오픈 소스 이니셔티브는 AI 연구 커뮤니티에서 CUDA의 광범위한 채택을 주도하는 lực으로 작용했습니다. cuDNN, cuBLAS 및 NCCL과 같은 프로젝트는 오픈 소스 라이브러리로 제공되어 연구자와 개발자가 CUDA의 전체 잠재력을 활용할 수 있습니다.

설치

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

설치 단계

1. NVIDIA 드라이버 설치

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

Ubuntu에서 미리 빌드된 GPU 패키지를 확인하려면:

sudo ubuntu-drivers list --gpgpu

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

nvidia-smi

2. CUDA Toolkit 설치

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

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

sudo apt install nvidia-cuda-toolkit

그러나 BitsAndBytes와의 호환성을 보장하려면 다음 단계를 따르세요:

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 가상 환경 설정

Ubuntu 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 및 Transformers 설치

Transformers 및 Accelerate 라이브러리를 설치합니다.

pip install transformers
pip install accelerate

병렬 처리의 힘

GPU는 본질적으로 병렬 처리를 효율적으로 처리할 수 있는 프로세서입니다. 이 아키텍처는 딥 러닝 모델을 훈련하는 데 필요한 계산 집약적인 작업에 적합합니다. CUDA 플랫폼은 이러한 GPU의 전체 잠재력을 활용할 수 있는 소프트웨어 환경을 제공합니다.

LLM 훈련을 가속화하는 예제 코드를 살펴보겠습니다.

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 {epoch+1}/{num_epochs}, Loss: {loss.item()}')

CUDA 가속 라이브러리

CUDA 자체 외에도 NVIDIA와 오픈 소스 커뮤니티는 CUDA 가속 라이브러리를 개발하여 딥 러닝 모델을 효율적으로 구현할 수 있습니다. 이러한 라이브러리는 표준 루틴의 최적화된 구현을 제공하여 개발자가 모델 아키텍처와 훈련 과정에 집중할 수 있습니다.

cuDNN은 CUDA를 사용하여 딥 뉴럴 네트워크를 구현하는 라이브러리입니다. cuDNN을 사용하면 모델의 훈련과 추론을 가속화할 수 있습니다.

다중 GPU 및 분산 훈련

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

CUDA와 NCCL을 사용하여 다중 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()

딥 러닝 모델 배포

GPU와 CUDA는 딥 러닝 모델을 훈련하는 데 중요하지만, 효율적인 추론도 생산 환경에서 모델을 배포하는 데 중요합니다. NVIDIA의 TensorRT는 CUDA 지원 GPU에서 모델을 최적화하고 가속하는 데 사용됩니다.

TensorRT를 사용하여 모델을 배포하는 예제 코드를 살펴보겠습니다.

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)

# 추론 실행
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)

# 출력 처리
# ...

결론

GPU와 CUDA의 조합은 대규모 언어 모델, 컴퓨터 비전, 음성 인식 및 기타 딥 러닝 분야의 발전에 중요한 역할을 했습니다. CUDA와 관련 라이브러리를 사용하여 개발자는 모델을 효율적으로 훈련하고 배포할 수 있습니다.

AI 분야는 지속적으로 발전하고 있으며, GPU와 CUDA의 중요성도 증가할 것입니다. 더욱 강력한 하드웨어와 소프트웨어 최적화를 통해 AI 시스템의 개발과 배포의 경계를 확장할 수 있을 것입니다.

지난 5년 동안私は Machine Learning과 Deep Learning의 매혹적인 세계에 몰두해 왔습니다.私の熱情と専門知識は私を50以上의多様한 소프트웨어 엔지니어링 프로젝트에 기여하게 했으며, 특히 AI/ML에 중점을 두었습니다.私の継続的な 호기심은 또한私를自然어 처리로 끌어들였습니다.私は이 분야를さらに 탐구하기를熱望합니다.