Інструменти ШІ 101
Налаштування навчання, тонкої настройки та висновків моделей LLM з використанням NVIDIA GPU та CUDA
Область штучного інтелекту (AI) пережила значні досягнення в останні роки, і в її центрі лежить потужна комбінація графічних процесорів (GPU) і платформи паралельних обчислень.
Моделі, такі як GPT, BERT, і більш недавно Llama, Mistral здатні розуміти і генерувати текст, подібний до людського, з безпрецедентною плавністю і узгодженістю. Однак навчання цих моделей вимагає великих обсягів даних і обчислювальних ресурсів, що робить GPU і CUDA незамінними інструментами в цьому напрямку.
Цей повний посібник проведе вас через процес налаштування NVIDIA GPU на Ubuntu, охоплюючи встановлення необхідних програмних компонентів, таких як драйвер NVIDIA, CUDA Toolkit, cuDNN, PyTorch та інші.
Рост CUDA-прискорених框rameworks AI
GPU-прискорене глибоке навчання було спровоковано розробкою популярних框rameworks AI, які використовують CUDA для ефективних обчислень. Фреймворки, такі як TensorFlow, PyTorch і MXNet, мають вбудовану підтримку CUDA, що дозволяє безперешкодно інтегрувати прискорення GPU в пайплайни глибокого навчання.
За даними NVIDIA Data Center Deep Learning Product Performance Study, моделі глибокого навчання, прискорені CUDA, можуть досягати швидкості виконання до 100 раз швидше порівняно з реалізацією на основі CPU.
Технологія Multi-Instance GPU (MIG) від NVIDIA, представлена в архітектурі Ampere, дозволяє розділяти один GPU на кілька безпечних екземплярів, кожний з яких має свої власні виділені ресурси. Ця функція дозволяє ефективно розподіляти ресурси GPU серед кількох користувачів або навантажень, максимізуючи використання і знижуючи загальні витрати.
Прискорення висновків LLM з використанням NVIDIA TensorRT
Хоча GPU були інструментальними в навчанні LLM, ефективний висновок є рівноцінно важливим для розгортання цих моделей в продукційних середовищах. NVIDIA TensorRT, високопродуктивний оптимізатор і час виконання глибокого навчання, відіграє важливу роль у прискоренні висновків LLM на GPU, що підтримують CUDA.
За даними NVIDIA, TensorRT може забезпечувати до 8 разів швидшу продуктивність висновків і 5 разів нижчу загальну вартість володіння порівняно з висновком на основі CPU для великих мовних моделей, таких як GPT-3.
Зобов’язання 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 Driver Download, виберіть відповідний драйвер для вашої 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, розробники можуть суттєво прискорити навчання і висновок своїх моделей, досягнувши продуктивності, що в кілька разів перевищує реалізацію на основі CPU.
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.
БагатогPU і розподілене навчання для масштабованість
Поки що моделі LLM і глибокого навчання продовжують зростати в розмірі і складності, обчислювальні вимоги для навчання цих моделей також зростають. Для вирішення цієї проблеми дослідники і розробники звернулися до багатогPU і розподілених методів навчання, які дозволяють їм використовувати об’єднану потужність декількох 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()
У цьому прикладі ми демонструємо розподілене навчання з використанням PyTorch’s DistributedDataParallel (DDP) модуля. Модель обгорнена в 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, дослідники і розробники можуть навчати і розгортати дедалі складніші моделі з високою ефективністю.
Поки що галузь AI продовжує еволюціонувати, важливість GPU і CUDA буде тільки зростати. З ще більш потужним апаратним і програмним забезпеченням, ми можемо очікувати подальших проривів у розробці і розгортанні систем AI, що розширюють межі того, що можливо.










