Ubuntu使用 NVIDIA GPU 和 CUDA 设置 LLM 的训练、微调和推理

0.引言

近年来,人工智能领域取得了令人瞩目的进步,其核心是图形处理单元(GPU)和并行计算平台的强大组合。
大模型如 GPT、BER能够理解和生成具有前所未有的流畅性和连贯性的类人文本。然而,训练这些模型需要大量的数据和计算资源,因此 GPU 和 CUDA 是这一努力中不可或缺的工具。
这个博客演示了在 Ubuntu 上设置 NVIDIA GPU 的过程,涵盖 NVIDIA 驱动程序、CUDA 工具包、cuDNN、PyTorch 等基本软件组件的安装。
在这里插入图片描述

1.CUDA 加速 AI 框架的兴起

GPU 加速的深度学习得益于流行的 AI 框架的发展,这些框架利用 CUDA 实现高效计算。常用的深度学习框架如 TensorFlow, PyTorch及 MX网 都内置对 CUDA 的支持,可将 GPU 加速无缝集成到深度学习管道中。

据 NVIDIA 数据中心深度学习产品性能研究,CUDA加速的深度学习模型与基于CPU的实现相比可以实现高达数百倍的性能提升。

NVIDIA 的多实例 GPU (MIG) 技术是随 Ampere 架构引入的,该技术允许将单个 GPU 划分为多个安全实例,每个实例都有自己的专用资源。此功能可在多个用户或工作负载之间高效共享 GPU 资源,从而最大限度地提高利用率并降低总体成本。
在这里插入图片描述

2. 使用 NVIDIA TensorRT 加速 LLM 推理

虽然 GPU 在训练 LLM 方面发挥了重要作用,但高效的推理对于在生产环境中部署这些模型也同样重要。 英伟达 TensorRT,一种高性能深度学习推理优化器和运行时,在加速支持 CUDA 的 GPU 上的 LLM 推理方面发挥着至关重要的作用。

根据 NVIDIA 的基准测试与基于 CPU 的 GPT等大型语言模型推理相比,TensorRT 可以提供高达 5 倍的推理性能和 3 倍的总体拥有成本。

NVIDIA 对开源计划的承诺一直是 AI 研究界广泛采用 CUDA 的推动力。以下项目 神经网络, 立方玻璃及 国家控制中心 以开源库的形式提供,使研究人员和开发人员能够充分利用 CUDA 的潜力进行深度学习。
在这里插入图片描述

3.配置

在进行 AI 开发时,使用最新的驱动程序和库可能并不总是最好的选择。例如,虽然最新的 NVIDIA 驱动程序 (545.xx) 支持 CUDA 12.3,但 PyTorch 和其他库可能尚不支持此版本。因此,一般情况下都是使用 驱动程序版本 535.146.02,带有 CUDA 12.2 以确保兼容性。

安装步骤

3.1.安装NVIDIA驱动程序

首先,要确定的 GPU 型号。在这个演示博客中所使用是NVIDIA GPU,(NVIDIA GPU,俗称N卡,是于A卡,则别外找相关的指导文档)。关于NVIDIA GPU驱动请访问 NVIDIA 驱动程序下载页面,选择适合当前的 GPU的驱动程序,并记下驱动程序版本。

(1)在 Ubuntu 上检查预构建的 GPU 包,在命令行终端请输入:

sudo ubuntu-drivers list --gpgpu

(2)然后重新启动计算机并验证安装:

nvidia-smi

在这里插入图片描述

3.2.安装 CUDA 工具包

CUDA 工具包提供了创建高性能 GPU 加速应用程序的开发环境。

对于非 LLM/深度学习设置,您可以使用:

sudo apt install nvidia-cuda-toolkit
However, to ensure compatibility with BitsAndBytes, we will follow these steps:
[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.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

3.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

3.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

3.6.安装PyTorch

使用以下命令安装 PyTorch:

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

3.7.安装 Hugging Face 和 Transformers

安装变压器和加速库:

pip install transformers
pip install accelerate

4. 并行处理的威力

从本质上讲,GPU 是高度并行的处理器,旨在高效处理数千个并发线程。这种架构使其非常适合训练深度学习模型(包括 LLM)所涉及的计算密集型任务。NVIDIA 开发的 CUDA 平台提供了一个软件环境,使开发人员能够充分利用这些 GPU 的潜力,使他们能够编写能够利用硬件并行处理功能的代码。

训练大型语言模型是一项计算要求很高的任务,需要处理大量文本数据并执行大量矩阵运算。GPU 拥有数千个核心和高内存带宽,非常适合执行这些任务。通过利用 CUDA,开发人员可以优化代码以利用 GPU 的并行处理能力,从而显著减少训练 LLM 所需的时间。

例如,要训练 GPT-3 是迄今为止最大的语言模型之一,它通过使用数千个运行 CUDA 优化代码的 NVIDIA GPU 实现。这使得该模型能够在前所未有的数据量上进行训练,从而在自然语言任务中表现出色。

import torch
import torch.nn as nn
import torch.optim as optim
from transformers import GPT2LMHeadModel, GPT2Tokenizer
# Load pre-trained GPT-2 model and tokenizer
model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
# Move model to GPU if available
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
# Define training data and hyperparameters
train_data = [...] # Your training data
batch_size = 32
num_epochs = 10
learning_rate = 5e-5
# Define loss function and optimizer
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
# Training loop
for epoch in range(num_epochs):
for i in range(0, len(train_data), batch_size):
# Prepare input and target sequences
inputs, targets = train_data[i:i+batch_size]
inputs = tokenizer(inputs, return_tensors="pt", padding=True)
inputs = inputs.to(device)
targets = targets.to(device)
# Forward pass
outputs = model(**inputs, labels=targets)
loss = outputs.loss
# Backward pass and optimization
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f'Epoch {epoch+1}/{num_epochs}, Loss: {loss.item()}')

在此示例代码片段中,演示了 GPT-2使用 PyTorch 和支持 CUDA 的 GPU 构建语言模型。该模型被加载到 GPU 上(如果可用),训练循环利用 GPU 的并行性执行高效的前向和后向传递,从而加速训练过程。

5.用于深度学习的 CUDA 加速库

除了 CUDA 平台本身,NVIDIA 和开源社区还开发了一系列 CUDA 加速库,可高效实现深度学习模型,包括 LLM。这些库提供了常见运算(例如矩阵乘法、卷积和激活函数)的优化实现,使开发人员能够专注于模型架构和训练过程,而不是低级优化。

其中一个库是 cuDNN(CUDA 深度神经网络库),它提供了深度神经网络中使用的标准例程的高度优化实现。通过利用 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

在此代码片段中,我们使用 PyTorch 为卷积神经网络 (CNN) 定义残差块。PyTorch 的自动混合精度 (AMP) 中的 autocast 上下文管理器用于实现混合精度训练,这可以在支持 CUDA 的 GPU 上显著提高性能,同时保持高精度。F.relu 函数由 cuDNN 优化,确保在 GPU 上高效执行。

6.多 GPU 和分布式训练以实现可扩展性

随着 LLM 和深度学习模型的规模和复杂性不断增长,训练这些模型的计算要求也随之增加。为了应对这一挑战,研究人员和开发人员已转向多 GPU 和分布式训练技术,这使他们能够利用多台机器上多个 GPU 的综合处理能力。

CUDA 和相关库(例如 NCCL(NVIDIA 集体通信库))提供了高效的通信原语,可实现跨多个 GPU 的无缝数据传输和同步,从而实现前所未有的规模的分布式训练。

</pre>
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP
# Initialize distributed training
dist.init_process_group(backend='nccl', init_method='...')
local_rank = dist.get_rank()
torch.cuda.set_device(local_rank)
# Create model and move to GPU
model = MyModel().cuda()
# Wrap model with DDP
model = DDP(model, device_ids=[local_rank])
# Training loop (distributed)
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 中,它使用 NCCL 自动处理数据并行、梯度同步和跨多个 GPU 的通信。这种方法可以高效地在多台机器上扩展训练过程,使研究人员和开发人员能够在合理的时间内训练更大、更复杂的模型。

使用 CUDA 部署深度学习模型

虽然 GPU 和 CUDA 主要用于训练深度学习模型,但它们对于高效部署和推理也至关重要。随着深度学习模型变得越来越复杂和资源密集,GPU 加速对于 在生产环境中实现实时性能.

NVIDIA 的 TensorRT 是一款高性能深度学习推理优化器和运行时,可提供 低延迟和高吞吐量 在支持 CUDA 的 GPU 上进行推理。TensorRT 可以优化和加速在 TensorFlow、PyTorch 和 MXNet 等框架中训练的模型,从而实现在从嵌入式系统到数据中心的各种平台上的高效部署。

import tensorrt as trt
# Load pre-trained model
model = load_model(...)
# Create TensorRT engine
logger = trt.Logger(trt.Logger.INFO)
builder = trt.Builder(logger)
network = builder.create_network()
parser = trt.OnnxParser(network, logger)
# Parse and optimize model
success = parser.parse_from_file(model_path)
engine = builder.build_cuda_engine(network)
# Run inference on GPU
context = engine.create_execution_context()
inputs, outputs, bindings, stream = allocate_buffers(engine)
# Set input data and run inference
set_input_data(inputs, input_data)
context.execute_async_v2(bindings=bindings, stream_handle=stream.ptr)
# Process output
# ...

在此示例中,我们演示了如何使用 TensorRT 在支持 CUDA 的 GPU 上部署预训练的深度学习模型。首先由 TensorRT 解析和优化模型,生成针对特定模型和硬件定制的高度优化推理引擎。然后可以使用该引擎在 GPU 上执行高效推理,利用 CUDA 加速计算。

7. 结论

GPU 与 CUDA 的结合在推动大型语言模型、计算机视觉、语音识别和其他各种深度学习领域的进步方面发挥了重要作用。通过利用 GPU 的并行处理能力和 CUDA 提供的优化库,研究人员和开发人员可以高效地训练和部署日益复杂的模型。

随着人工智能领域的不断发展,GPU 和 CUDA 的重要性将日益凸显。借助更强大的硬件和软件优化,我们可以期待看到人工智能系统的开发和部署取得进一步突破,突破可能的界限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/32112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SAP ME 42】关于SAP ME自定义开发中NWDS中配置JDK

1、NWDS启动配置JDK -vm C:/Java/jdk1.8.0_361/bin 2、开发组件配置JDK

基于Python+Flask+MySQL+HTML的B站数据可视化分析系统

FlaskMySQLVue 基于PythonFlaskMySQLHTML的B站数据可视化分析系统 项目采用前后端分离技术&#xff0c;项目包含完整的前端HTML&#xff0c;以及Flask构成完整的前后端分离系统 爬虫文件基于selenium&#xff0c;需要配合登录账号 简介 主页 登录页面&#xff0c;用户打开浏…

YIA主题侧边栏如何添加3D旋转标签云?

WordPress站点侧边栏默认的标签云排版很一般&#xff0c;而3D旋转标签云就比较酷炫了。下面boke112百科就以YIA主题为例&#xff0c;跟大家说一说如何将默认的标签云修改成3D旋转标签云&#xff0c;具体步骤如下&#xff1a; 1、点此下载3d标签云文件&#xff08;密码&#xf…

氢氧化铝佐剂,完美替代进口品牌明矾佐剂

氢氧化铝佐剂 氢氧化铝佐剂是使用历史最为悠久的疫苗佐剂&#xff0c;已有近百年历史&#xff0c;广泛用于各种人用疫苗和兽用疫苗。氢氧化铝佐剂能够极大地促进体液免疫&#xff08;抗体&#xff09;反应和TH2类细胞免疫反应。 用途 1、免疫各种实验动物制备多克隆或单克隆抗…

数据挖掘与分析——特征选择

数据读取 wine葡萄酒数据集是来自UCI的公开数据集&#xff0c;也scikit-learn库自带的数据集&#xff0c;它是对意大利同一地区种植的葡萄酒进行化学分析的结果&#xff0c;这些葡萄酒来自三个不同的品种。该分析确定了三种葡萄酒中每种葡萄酒中含有的13种成分的数量。 每行代…

【Java面试】二十、JVM篇(上):JVM结构

文章目录 1、JVM2、程序计数器3、堆4、栈4.1 垃圾回收是否涉及栈内存4.2 栈内存分配越大越好吗4.3 方法内的局部变量是否线程安全吗4.4 栈内存溢出的情况4.5 堆和栈的区别是什么 5、方法区5.1 常量池5.2 运行时常量池 6、直接内存 1、JVM Java源码编译成class字节码后&#xf…

Open3D点云处理学习

Color ICP Colored point cloud registration — Open3D 0.11.0 documentation Colored point cloud registration - Open3D 0.18.0 documentation 展示了使用color-icp结果 对比gicp错误处理结果 intel自己的论文 Colored Point Cloud Registration Revisited 优化方程 参…

临时关闭Windows安全中心

在使用WindowsOS是&#xff0c;微软安全中心是我们必不可少的安全防护&#xff0c;但有时我们也会产生想要将其关闭的需求&#xff0c;下面将要介绍如何临时关闭Windows的安全中心 一、打开安全中心、选择“病毒与威胁防护”&#xff0c;点击“管理设置” 之后将其实时保护关闭…

PPT的精细化优化与提升策略

&#x1f44f;&#x1f44f;&#x1f44f;欢迎来到我的博客 ! 亲爱的朋友们&#xff0c;欢迎您们莅临我的博客&#xff01;这是一个分享知识、交流想法、记录生活的温馨角落。在这里&#xff0c;您可以找到我对世界独特视角的诠释&#xff0c;也可以与我一起探讨各种话题&#…

轻量级日志系统——Loki

目录 一、loki简介 二、Loki 快速上手 第一步安装 Loki 第二步安装 Promtail 第三步安装granafa 三、LogQL 语法 四、Loki收集nginx日志 1、修改nginx配置 2、nginx服务器上安装promtail 3、添加doshbarod 一、loki简介 Loki是 Grafana Labs 团队最新的开源项目&am…

【Springcloud微服务】Docker上篇

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Springcloud微服务 &#x1f320; 首发时间&#xff1a;2024年6月22日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f4…

新闻管理与推荐系统Python+Django+协同过滤推荐算法+管理系统

一、介绍 新闻管理与推荐系统。本系统使用Python作为主要开发语言开发的一个新闻管理与推荐的网站平台。 网站前端界面采用HTML、CSS、BootStrap等技术搭建界面。后端采用Django框架处理用户的逻辑请求&#xff0c;并将用户的相关行为数据保存在数据库中。通过Ajax技术实现前后…

【ARMv8/v9 GIC 系列 2.2 -- GIC SPI 中断的 GICD_ISACTIVER 和 GICD_ICACTIVER 配置】

文章目录 GIC 中断 Active 状态的配置中断状态分类GICD_ISACTIVER<n>GICD_ICACTIVER<n>参数 n 编号解释中断设置举例设置中断ID 68为活动状态清除中断ID 68的活动状态 小结 GIC 中断 Active 状态的配置 在ARMv8/ARMv9 体系结构中&#xff0c;GICD_ISACTIVER<n&…

2021数学建模C题目– 生产企业原材料的订购与运输

C 题——生产企业原材料的订购与运输 思路&#xff1a;该题主要是通过对供应商的供货能力和运送商的运货能力进行估计&#xff0c;给出合适的材料订购方案 程序获取 第一题问题思路与结果&#xff1a; 对 402 家供应商的供货特征进行量化分析&#xff0c;建立反映保障企业生…

jeecg-boot项目的部署-windows系统

一、基础环境的准备&#xff1a; 1、后台基础环境&#xff1a;JDK、redis、数据库&#xff1a;sqlserver 2、前端基础环境&#xff1a;nginx redis和nginx的安装都很方便&#xff0c;直接去对应的官网&#xff0c;下载zip压缩包&#xff0c;然后解压&#xff0c;执行.exe文件…

一、docker简介及卸载、安装

目录 一、Docker 简介 二、dockers三要素 1、Docker镜像&#xff08;image&#xff09; 2、Docker仓库 3、Docker容器 三、docker架构图 四. Docker 运行的基本流程 五、docker 卸载 1、停止docker服务 2、查看yum安装的docker文件包 3、查看docker相关的rpm源文件 …

【Pandas驯化-11】一文搞懂Pandas中的分组函数groupby与qcut、fillna使用

【Pandas驯化-11】一文搞懂Pandas中的分组函数groupby与qcut、fillna使用 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获…

基于STM32的智能工厂环境监测系统

目录 引言环境准备智能工厂环境监测系统基础代码实现&#xff1a;实现智能工厂环境监测系统 4.1 数据采集模块4.2 数据处理4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;智能工厂管理与优化问题解决方案与优化收尾与总结 1. 引言 智能工厂环境监测系统通过…

数据库系统概论——数据库恢复技术

文章目录 数据库恢复技术事务的基本概念什么是事务如何定义事务&#xff1a;事务的特性 数据库恢复概述故障的种类恢复的实现技术恢复策略事务故障的恢复系统故障的恢复介质故障的恢复 数据库恢复技术 事务的基本概念 什么是事务 事务使用户定义的一个数据库操作序列&#x…

kotlin类

一、定义 1、kotlin中使用关键字class 声明类,如果一个类没有类体&#xff0c;也可以省略花括号&#xff0c; 默认为public 类型的&#xff1a; // 这段代码定义了一个公开的、不可被继承的Test类 class Test{} // 没有类体&#xff0c;可以省略花括号 class Test 底层代码&…