Connect with us

Настройка обучения, тонкой настройки и вывода моделей LLM с помощью NVIDIA GPU и CUDA

Инструменты ИИ 101

Настройка обучения, тонкой настройки и вывода моделей LLM с помощью NVIDIA GPU и CUDA

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

Область искусственного интеллекта (ИИ) в последние годы пережила значительные достижения, и в ее основе лежит мощная комбинация графических процессоров (GPU) и платформы параллельных вычислений.

Модели, такие как GPT, BERT, и более недавно Llama, Mistral способны понимать и генерировать текст, похожий на человеческий, с беспрецедентной плавностью и связностью. Однако обучение этих моделей требует огромных объемов данных и вычислительных ресурсов, что делает GPU и CUDA незаменимыми инструментами в этом начинании.

Этот всесторонний гид проведет вас через процесс установки NVIDIA GPU на Ubuntu, охватывая установку необходимых программных компонентов, таких как драйвер NVIDIA, CUDA Toolkit, cuDNN, PyTorch и многое другое.

Рост CUDA-ускоренных фреймворков ИИ

GPU-ускоренное глубокое обучение было стимулировано разработкой популярных фреймворков ИИ, которые используют CUDA для эффективных вычислений. Фреймворки, такие как TensorFlow, PyTorch и MXNet, имеют встроенную поддержку CUDA, что позволяет легко интегрировать ускорение GPU в конвейеры глубокого обучения.

Согласно изучению производительности продуктов глубокого обучения NVIDIA Data Center, модели глубокого обучения, ускоренные CUDA, могут достигать производительности, в 100 раз превышающей производительность реализации на основе ЦП.

Технология Multi-Instance GPU (MIG) от NVIDIA, представленная с архитектурой Ampere, позволяет разделить один GPU на несколько безопасных экземпляров, каждый из которых имеет свои собственные выделенные ресурсы. Эта функция позволяет эффективно делиться ресурсами GPU между несколькими пользователями или рабочими нагрузками, максимизируя использование и снижая общую стоимость.

Ускорение вывода LLM с помощью NVIDIA TensorRT

Хотя GPU были инструментальными в обучении LLM, эффективный вывод также имеет решающее значение для развертывания этих моделей в производственных средах. NVIDIA TensorRT, высокопроизводительный оптимизатор и среда выполнения вывода глубокого обучения, играет важную роль в ускорении вывода LLM на GPU с поддержкой CUDA.

Согласно бенчмаркам NVIDIA, TensorRT может обеспечить производительность вывода, в 8 раз превышающую производительность вывода на основе ЦП, и в 5 раз снижать общую стоимость владения для крупных языковых моделей, таких как GPT-3.

Коммит NVIDIA к открытым инициативам был движущей силой широкого внедрения CUDA в сообществе исследователей ИИ. Проекты, такие как cuDNN, cuBLAS и NCCL, доступны в качестве открытых библиотек, что позволяет исследователям и разработчикам использовать весь потенциал CUDA для своих приложений глубокого обучения.

Установка

При настройке разработки ИИ использование последних драйверов и библиотек не всегда является лучшим выбором. Например, хотя последний драйвер NVIDIA (545.xx) поддерживает CUDA 12.3, PyTorch и другие библиотеки могут еще не поддерживать эту версию. Поэтому мы будем использовать драйвер версии 535.146.02 с CUDA 12.2, чтобы обеспечить совместимость.

Шаги установки

1. Установка драйвера NVIDIA

Сначала определите модель вашего GPU. Для этого руководства мы используем GPU NVIDIA. Посетите страницу загрузки драйвера NVIDIA, выберите подходящий драйвер для вашего GPU и запишите версию драйвера.

Чтобы проверить предварительно собранные пакеты GPU на Ubuntu, выполните:


sudo ubuntu-drivers list --gpgpu

Перезагрузите компьютер и проверьте установку:


nvidia-smi

2. Установка CUDA Toolkit

CUDA Toolkit предоставляет среду разработки для создания высокопроизводительных приложений, ускоренных GPU.

Для неклассифицированной установки/глубокого обучения вы можете использовать:


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 Developer. Установите его с помощью:


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 являются высокопараллельными процессорами, предназначенными для эффективной обработки тысяч одновременных потоков. Эта архитектура делает их хорошо подходящими для вычислительно интенсивных задач, связанных с обучением моделей глубокого обучения, включая LLM.
Ускорение LLM обучения с помощью GPU и CUDA.

Обучение крупных языковых моделей является вычислительно требовательной задачей, которая требует обработки огромных объемов текстовых данных и выполнения многочисленных матричных операций. GPU, с их тысячами ядер и высокой пропускной способностью памяти, идеально подходят для этих задач. Используя CUDA, разработчики могут оптимизировать свой код, чтобы использовать возможности параллельной обработки GPU, значительно снижая время, необходимое для обучения LLM.

Например, обучение GPT-3, одной из крупнейших языковых моделей на сегодняшний день, было возможно благодаря использованию тысяч GPU NVIDIA, работающих с кодом, оптимизированным для 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+1}/{num_epochs}, Потеря: {loss.item()}')

В этом примере мы демонстрируем обучение модели GPT-2 с помощью PyTorch и GPU, поддерживающего CUDA. Модель загружается на GPU (если доступно), и цикл обучения использует параллелизм GPU для эффективного выполнения прямых и обратных проходов, ускоряя процесс обучения.

Библиотеки CUDA для глубокого обучения

Помимо самой платформы CUDA, NVIDIA и сообщество открытого исходного кода разработали ряд библиотек, ускоренных CUDA, которые позволяют эффективно реализовывать модели глубокого обучения, включая LLM. Эти библиотеки предоставляют оптимизированные реализации общих операций, таких как умножение матриц, свертки и функции активации, что позволяет разработчикам сосредоточиться на архитектуре модели и процессе обучения, а не на низкоуровневой оптимизации.

Одной из таких библиотек является cuDNN (CUDA Deep Neural Network library), которая предоставляет высоко настроенные реализации стандартных процедур, используемых в глубоких нейронных сетях. Используя 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

В этом примере мы определяем блок остатка для свёрточной нейронной сети (CNN) с помощью PyTorch. Менеджер контекста autocast из PyTorch’s Automatic Mixed Precision (AMP) используется для включения смешанной точности обучения, которая может обеспечить значительный прирост производительности на GPU, поддерживающих CUDA, сохраняя при этом высокую точность. Функция F.relu оптимизируется cuDNN, обеспечивая эффективное выполнение на 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()

В этом примере мы демонстрируем распределенное обучение с помощью модуля DistributedDataParallel (DDP) из PyTorch. Модель обернута в DDP, который автоматически обрабатывает параллелизм данных, синхронизацию градиентов и коммуникацию между несколькими GPU с помощью NCCL. Этот подход позволяет эффективно масштабировать процесс обучения на несколько машин, позволяя исследователям и разработчикам обучать более крупные и сложные модели за разумное время.

Развертывание моделей глубокого обучения с CUDA

Хотя GPU и CUDA в основном использовались для обучения моделей глубокого обучения, они также имеют решающее значение для эффективного развертывания и вывода. Поскольку модели глубокого обучения становятся все более сложными и требовательными к ресурсам, ускорение GPU является необходимым для достижения производительности в режиме реального времени в производственных средах.

NVIDIA’s TensorRT является высокопроизводительным оптимизатором и средой выполнения вывода глубокого обучения, который обеспечивает низкую задержку и высокую пропускную способность вывода на GPU, поддерживающих CUDA. 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 для развертывания предварительно обученной модели глубокого обучения на GPU, поддерживающем CUDA. Модель сначала проанализирована и оптимизирована TensorRT, который генерирует высоко оптимизированный движок вывода, адаптированный для конкретной модели и аппаратного обеспечения. Этот движок может затем использоваться для эффективного вывода на GPU, используя CUDA для ускорения вычислений.

Заключение

Комбинация GPU и CUDA сыграла решающую роль в стимулировании достижений в области крупных языковых моделей, компьютерного зрения, распознавания речи и различных других областей глубокого обучения. Используя возможности параллельной обработки GPU и оптимизированные библиотеки, предоставляемые CUDA, исследователи и разработчики могут обучать и развертывать все более сложные модели с высокой эффективностью.

По мере продолжения эволюции области ИИ важность GPU и CUDA будет только расти. С еще более мощным аппаратным и программным обеспечением мы можем ожидать дальнейших прорывов в разработке и развертывании систем ИИ, расширяя границы того, что возможно.

Я провел последние пять лет, погружаясь в увлекательный мир Machine Learning и Deep Learning. Моя страсть и экспертиза привели меня к участию в более чем 50 различных проектах по разработке программного обеспечения, с особым акцентом на AI/ML. Мое непрекращающееся любопытство также привело меня к Natural Language Processing, области, которую я с нетерпением жду возможности изучить более подробно.