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はこの取り組みにおいて不可欠なツールとなっている。この包括的なガイドでは、UbuntuにNVIDIA GPUを設定するプロセスを説明し、NVIDIAドライバー、CUDA Toolkit、cuDNN、PyTorchなどの基本的なソフトウェアコンポーネントのインストールをカバーする。

CUDAアクセラレーテッドAIフレームワークの台頭

GPUアクセラレーテッドディープラーニングは、CUDAを使用した効率的な計算を提供する人気のあるAIフレームワークの開発によって促進された。TensorFlow、PyTorch、MXNetなどのフレームワークには、CUDAに対する組み込みサポートがあり、GPUアクセレレーションをディープラーニングパイプラインにシームレスに統合できる。

NVIDIA Data Center Deep Learning Product Performance Studyによると、CUDAアクセラレーテッドディープラーニングモデルは、CPUベースの実装と比較して最大100倍の高速化を実現できる。

NVIDIAのマルチインスタンスGPU(MIG)テクノロジーは、Ampereアーキテクチャで導入され、単一のGPUを複数のセキュアインスタンスに分割できるようにする。各インスタンスには専用のリソースがあり、GPUリソースを複数のユーザーまたはワークロード間で効率的に共有できるようになり、利用率を最大化し、全体的なコストを削減できる。

NVIDIA TensorRTを使用したLLM推論の高速化

GPUはLLMのトレーニングに重要である一方で、効率的な推論もプロダクション環境でのデプロイに不可欠である。NVIDIA TensorRTは、CUDA対応GPU上でのLLM推論を高速化するための重要な役割を果たす、高性能ディープラーニング推論オプティマイザーおよびランタイムである。

NVIDIAのベンチマークによると、TensorRTは、GPT-3などの大規模な言語モデルに対して、CPUベースの推論と比較して最大8倍の高速化と5倍の低コストを実現できる。

NVIDIAはオープンソースイニシアチブに尽力しており、CUDAのAI研究コミュニティでの広範な採用を促進している。cuDNN、cuBLAS、NCCLなどのプロジェクトは、オープンソースライブラリとして利用可能であり、研究者と開発者がCUDAの全ポテンシャルをディープラーニングに活用できるようにしている。

インストール

AI開発の際、最新のドライバーとライブラリを使用するのが常であるが、必ずしも最良の選択ではない。たとえば、最新のNVIDIAドライバー(545.xx)はCUDA 12.3をサポートしているが、PyTorchやその他のライブラリはまだこのバージョンをサポートしていない可能性がある。したがって、互換性を確保するために、ドライバーのバージョン535.146.02とCUDA 12.2を使用する。

インストール手順

1. NVIDIAドライバーのインストール

まず、GPUモデルを特定する。 このガイドでは、NVIDIA GPUを使用する。NVIDIAドライバーのダウンロードページにアクセスし、GPUに適したドライバーを選択し、ドライバーのバージョンをメモする。

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 FaceとTransformersのインストール

TransformersとAccelerateライブラリをインストールする。

pip install transformers
pip install accelerate

並列処理の力

GPUは本質的に、高度に並列化されたプロセッサであり、数千のスレッドを効率的に処理できるように設計されている。このアーキテクチャにより、GPUはディープラーニングモデルのトレーニングを含む計算集中型タスクに適している。CUDAプラットフォームは、NVIDIAによって開発されたソフトウェア環境であり、開発者がGPUの並列処理能力をフルに活用できるようにする。

LLMトレーニングをGPUとCUDAで高速化する。

LLMのトレーニングは、膨大な量のテキストデータを処理し、数多くの行列演算を実行する必要があるため、計算集中型タスクである。GPUはその数千のコアと高いメモリ帯域幅により、これらのタスクに最適である。CUDAを利用することで、開発者はコードをGPUの並列処理能力を活用するように最適化できるため、LLMのトレーニング時間を大幅に短縮できる。

たとえば、GPT-3などの大規模な言語モデルのトレーニングは、数千のNVIDIA GPUを使用してCUDA最適化されたコードを実行することで実現された。これにより、モデルのトレーニングに前例のない量のデータを使用でき、自然言語タスクでのその印象的なパフォーマンスにつながった。

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()}')

このコードスニペットでは、PyTorchとCUDA対応GPUを使用してGPT-2言語モデルをトレーニングすることを示している。モデルはGPU(使用可能な場合)にロードされ、トレーニングループはGPUの並列性を活用して効率的なフォワードパスとバックワードパスを実行する。

CUDAアクセラレーテッドライブラリを使用したディープラーニング

CUDAプラットフォーム自体に加えて、NVIDIAとオープンソースコミュニティは、LLMを含むディープラーニングモデルの効率的な実装を可能にする、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)の残差ブロックを定義する。autocastコンテキストマネージャーは、PyTorchのAutomatic Mixed Precision(AMP)から使用され、混合精度トレーニングを有効にする。これにより、CUDA対応GPUで性能が大幅に向上する,同时、高い精度が維持される。F.relu関数はcuDNNによって最適化され、GPUでの効率的な実行が保証される。

マルチGPUおよび分散トレーニングによるスケーラビリティ

LLMやディープラーニングモデルが大きさと複雑さを増すにつれて、これらのモデルをトレーニングするための計算要件も増加する。 この課題に対処するために、研究者や開発者はマルチGPUおよび分散トレーニング技術に注目している。これらの技術により、複数のGPUを使用してモデルをトレーニングでき、複数のマシンを使用してトレーニングを分散させることができる。

CUDAおよび関連ライブラリ(NCCL(NVIDIAコレクティブコミュニケーションライブラリ)など)は、複数の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でラップされ、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によって解析および最適化され、高度に最適化された推論エンジンが生成される。このエンジンは、CUDAを使用した計算を活用して、GPU上で効率的な推論を実行する。

結論

GPUとCUDAの組み合わせは、大規模な言語モデル、コンピュータビジョン、音声認識、ディープラーニングの他の分野における進歩を促進する上で重要な役割を果たしてきた。GPUの並列処理能力とCUDAの最適化されたライブラリを活用することで、研究者や開発者は、効率性が高く、複雑なAIシステムをトレーニングおよびデプロイできる。AI分野がさらに進化するにつれて、GPUとCUDAの重要性はさらに高まると予想される。より強力なハードウェアとソフトウェアの最適化により、AIシステムの開発とデプロイの限界をさらに拡大することができる。

私は過去5年間、機械学習とディープラーニングの魅力的世界に没頭してきました。私の情熱と専門知識は、AI/MLに特に焦点を当てた50以上の多様なソフトウェアエンジニアリングプロジェクトに貢献することにつながりました。私の継続的な好奇心は、私がさらに探究したい分野である自然言語処理にも私を引き寄せました。