AIツール 101

NVIDIA GPUとCUDAを使用したLLMのトレーニング、ファインチューニング、推論の設定

mm
Unite.AI を Google の優先ソースに追加
Nvidia GPU in Ubuntu Basics of GPU Parallel Computing GPU Based LLM Training Machine

人工知能(AI)の分野は近年著しく進歩しており、その中心にあるのは、グラフィックス処理ユニット(GPU)と並列コンピューティングプラットフォームの強力な組み合わせです。

モデル such as GPT、BERT、および最近のLlamaMistralは、前例のない流暢さと一貫性で人間のようなテキストを理解し生成することができます。しかし、これらのモデルをトレーニングするには膨大な量のデータと計算リソースが必要であり、GPUとCUDAはこの取り組みにおいて不可欠なツールとなっています。

この包括的なガイドでは、UbuntuにNVIDIA GPUを設定するプロセスについて説明し、NVIDIAドライバー、CUDA Toolkit、cuDNN、PyTorchなどの基本ソフトウェアコンポーネントのインストールをカバーします。

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

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

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

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

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

GPUはLLMのトレーニングに不可欠ですが、効率的な推論もプロダクション環境でモデルを展開する上で同様に重要です。NVIDIA TensorRTは、CUDA対応GPU上でのLLM推論を加速するために重要な役割を果たします。

According to NVIDIA’s benchmarks、TensorRTは、GPT-3などの大規模言語モデルに対して、CPUベースの推論と比較して最大8倍の高速化と5倍の総所有コストの削減を実現できます。

NVIDIAのオープンソースイニシアチブへの取り組みは、AI研究コミュニティにおけるCUDAの広範な採用を促進する原動力となっています。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アクセラレーテッドアプリケーションを作成するための開発環境を提供します。

For a non-LLM/deep learning setup、次のコマンドを使用できます。


sudo apt install nvidia-cuda-toolkit

<p>However、BitsAndBytesと互換性を確保するために、次の手順に従います。</p>

[code language=&amp;quot;BASH&amp;quot;]

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

インストールを確認します。


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

環境変数を設定します。


<p>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</p>

3. cuDNNのインストール

cuDNNパッケージをNVIDIA Developerウェブサイトからダウンロードし、次のコマンドでインストールします。


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

キーリングを追加するための手順に従います。


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

cuDNNライブラリをインストールします。


<p>sudo apt update
sudo apt install libcudnn8 libcudnn8-dev libcudnn8-samples</p>

4. Python仮想環境の設定

Ubuntu 22.04にはPython 3.10が付属しています。venvをインストールします。


<p>sudo apt-get install python3-pip
sudo apt install python3.10-venv</p>

仮想環境を作成し、有効にします。


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

5. BitsAndBytesのインストール

BitsAndBytesディレクトリに移動し、ソースからビルドします。


<p>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</p>

<p>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</p>

6. PyTorchのインストール

PyTorchを次のコマンドでインストールします。


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

7. Hugging FaceとTransformersのインストール

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


<p>pip install transformers
pip install accelerate</p>

並列処理の力

GPUは本質的に、高度な並列処理能力を持つプロセッサです。CUDAプラットフォームは、開発者がGPUの並列処理能力を活用できるソフトウェア環境を提供します。LLMのトレーニングに必要な計算集中タスクに適しています。

LLMのトレーニングは、膨大な量のテキストデータを処理し、多数の行列操作を実行する必要がある計算集中タスクです。GPUはそのタスクに最適です。CUDAを活用することで、開発者はコードをGPUの並列処理能力を活用するように最適化できます。

たとえば、GPT-3のトレーニングは、NVIDIA GPUを使用してCUDA最適化されたコードを実行することで実現されました。これにより、モデルは前例のない量のデータでトレーニングされ、自然言語タスクで優れたパフォーマンスを発揮しました。


<p>import torch
import torch.nn as nn
import torch.optim as optim
from transformers import GPT2LMHeadModel, GPT2Tokenizer</p>

<p># Pre-trained GPT-2モデルとトークナイザーのロード
model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')</p>

<p># モデルをGPUに移動(使用可能な場合)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)</p>

<p># トレーニングデータとハイパーパラメータの定義
train_data = [...] # トレーニングデータ
batch_size = 32
num_epochs = 10
learning_rate = 5e-5</p>

<p># 損失関数とオプティマイザーの定義
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)</p>

<p># トレーニングループ
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)</p>

<p># フォワードパス
outputs = model(**inputs, labels=targets)
loss = outputs.loss</p>

<p># バックワードパスと最適化
optimizer.zero_grad()
loss.backward()
optimizer.step()</p>

<p>print(f'Epoch {epoch+1}/{num_epochs}, Loss: {loss.item()}')</p>

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

CUDAアクセラレーテッドライブラリ

CUDAプラットフォーム自体に加えて、NVIDIAとオープンソースコミュニティは、LLMを含むディープラーニングモデルを効率的に実装できるように、CUDAアクセラレーテッドライブラリの範囲を開発しました。これらのライブラリは、行列乗算、畳み込み、活性化関数などの共通操作の最適化された実装を提供し、開発者がモデルアーキテクチャとトレーニングプロセスに集中できるようにします。

cuDNN(CUDA Deep Neural Networkライブラリ)は、ディープニューラルネットワークで使用される標準ルーチンの高度にチューンされた実装を提供します。cuDNNを活用することで、開発者はモデルをトレーニングして推論する際に、CPUベースの実装と比較して数桁のパフォーマンス向上を実現できます。


<p>import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.cuda.amp import autocast</p>

<p>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))</p>

<p>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</p>

このコードスニペットでは、PyTorchを使用して畳み込みニューラルネットワーク(CNN)の残差ブロックを定義します。autocastコンテキストマネージャーを使用して混合精度トレーニングを有効にします。これにより、CUDA対応GPUでパフォーマンスが向上し、精度が維持されます。

スケーラビリティのためのマルチGPUと分散トレーニング

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

CUDAとNCCL(NVIDIA Collective Communications Library)などの関連ライブラリは、複数のGPU間で効率的なデータ転送と同期を可能にするコミュニケーションプリミティブを提供します。これにより、分散トレーニングが大規模なスケールで実行できます。


<p>import torch.distributed as dist</p>

<p>from torch.nn.parallel import DistributedDataParallel as DDP</p>

<p># 分散トレーニングの初期化
dist.init_process_group(backend='nccl', init_method='...')
local_rank = dist.get_rank()
torch.cuda.set_device(local_rank)</p>

<p># モデルを作成し、GPUに移動
model = MyModel().cuda()</p>

<p># モデルをDDPでラップ
model = DDP(model, device_ids=[local_rank])</p>

<p># 分散トレーニングループ
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)</p>

<p>outputs = model(inputs)
loss = criterion(outputs, targets)</p>

<p>optimizer.zero_grad()
loss.backward()
optimizer.step()</p>

この例では、PyTorchのDistributedDataParallel(DDP)モジュールを使用して分散トレーニングを実行する方法を示しています。モデルはDDPでラップされ、データ並列処理、勾配同期、NCCLを使用したコミュニケーションが自動的に処理されます。このアプローチにより、トレーニングプロセスを複数のマシンにわたって効率的にスケールできます。

CUDAを使用したディープラーニングモデルの展開

GPUとCUDAは、ディープラーニングモデルのトレーニングに不可欠ですが、効率的な展開と推論にも重要です。ディープラーニングモデルがより複雑になり、リソースを大量に消費するにつれて、GPUアクセラレーションはプロダクション環境でリアルタイムパフォーマンスを実現するために不可欠になります。

NVIDIAのTensorRTは、CUDA対応GPU上でのディープラーニング推論を最適化および加速する高性能のディープラーニング推論オプティマイザおよびランタイムです。TensorRTは、TensorFlow、PyTorch、MXNetなどのフレームワークでトレーニングされたモデルを最適化および加速し、さまざまなプラットフォームでの効率的な展開を可能にします。


<p>import tensorrt as trt</p>

<p># Pre-trainedモデルをロード
model = load_model(...)</p>

<p># TensorRTエンジンを作成
logger = trt.Logger(trt.Logger.INFO)
builder = trt.Builder(logger)
network = builder.create_network()
parser = trt.OnnxParser(network, logger)</p>

<p># モデルを解析および最適化
success = parser.parse_from_file(model_path)
engine = builder.build_cuda_engine(network)</p>

<p># GPU上で推論を実行
context = engine.create_execution_context()
inputs, outputs, bindings, stream = allocate_buffers(engine)</p>

<p># 入力データを設定し、推論を実行
set_input_data(inputs, input_data)
context.execute_async_v2(bindings=bindings, stream_handle=stream.ptr)</p>

# 出力の処理
# ...

この例では、TensorRTを使用して、CUDA対応GPU上で事前トレーニングされたディープラーニングモデルを展開する方法を示しています。モデルは解析および最適化され、TensorRTエンジンが生成されます。このエンジンは、CUDAを使用して加速された計算を実行し、GPU上での効率的な推論を可能にします。

結論

GPUとCUDAの組み合わせは、LLM、コンピュータビジョン、音声認識、ディープラーニングの他の分野における進歩を推進する上で重要な役割を果たしてきました。GPUの並列処理能力とCUDAの最適化されたライブラリを活用することで、研究者と開発者は、効率性とスケーラビリティの向上により、複雑なモデルをトレーニングして展開できます。

AIの分野が進化するにつれて、GPUとCUDAの重要性はさらに高まっています。さらに強力なハードウェアとソフトウェア最適化により、AIシステムの開発と展開の限界をさらに拡大するブレークスルーが期待されます。

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