AI 도구 101
NVIDIA GPU와 CUDA를 사용한 LLM 훈련, 미세 조정 및 추론 설정
인공지능 분야는 최근 몇 년 동안 놀라운 발전을 이루었으며, 그 중심에는 그래픽 처리 장치(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 시스템의 개발과 배포의 경계를 확장할 수 있을 것입니다.












