4、GPU与CPU:计算硬件与大模型训练
GPU与CPU:计算硬件与大模型训练
文章目录
- GPU与CPU:计算硬件与大模型训练
-
- 💡 这节课会带给你
- 一、计算硬件基础
-
- 1. 什么是 CPU?
- 2. 什么是 GPU ?
- 3. GPU vs CPU 类型解析
-
- CPU 类型
- GPU 类型
- 二、 我们为什么要使用GPU?
-
- CUDA®:通用并行计算平台和程序模型
- A Scalable Programming Model
- 三、GPU在大模型训练中的应用
-
-
- 1. 张量的介绍
- 2. 查看设备GPU信息
- 3. 让张量在GPU与CPU之间移动
- 4. Python中使用GPU加速模型
- 5. 创建支持多个GPU数据并行的模型
-
- 四、PyTorch项目GPU加速实例
-
- 线性回归模型训练——示例代码
- 线性回归模型训练——训练批次和loss曲线图
- 五、CPU在大模型训练中的应用
-
- 1. CPU的局限性
-
-
-
- 示例代码
-
-
- 2. 如何优化CPU训练
-
-
-
- 示例代码
-
-
- 六 、推理所需显存和速度
-
- 低配使用(计算资源有限)
- (标配)中配使用(性能与资源平衡用法)
- 高配使用(高级用法,性能优先)
- 七、GPU硬件选择策略
-
- DeepSeek-R1 系列模型硬件需求与适用场景
-
- 1. DeepSeek-R1-1.5B
- 2. DeepSeek-R1-7B
- 3. DeepSeek-R1-8B
- 4. DeepSeek-R1-14B
- 5. DeepSeek-R1-32B
- 6. DeepSeek-R1-70B
- 7. DeepSeek-R1-671B
- 通用建议
💡 这节课会带给你
1.计算机硬件基础
- 什么是CPU?
- 什么是GPU?
- GPU vs CPU 类型解析
- 我们为什么要使用GPU?
- CUDA®:通用并行计算平台和程序模型
- A Scalable Programming Model
- GPU在大模型训练中的应用
- 张量的介绍
- 查看设备GPU信息
- 让张量在GPU与CPU之间移动
- Python中使用GPU加速模型
- 创建支持多个GPU数据并行的模型
-
PyTorch项目GPU加速实例
-
CPU在大模型训练中的应用
-
GPU硬件选择策略
开始上课!
一、计算硬件基础
1. 什么是 CPU?
CPU(中央处理器)是计算机系统中最核心的组件之一,负责执行几乎所有程序运行所需的指令。作为一种通用处理器,旨在处理各种不同类型的任务,从操作系统的运行,到应用程序的执行,再到复杂的计算、文档编辑、播放电影和音乐、网页浏览等。
现代 CPU 通常拥有多个处理核心,每个核心都可以独立处理指令,从而提高多任务处理的能力。这种多核设计使得 CPU 可以在一定程度上同时处理多个任务,虽然每个任务的执行仍然是顺序完成的。
需要注意的是,CPU 的处理方式以“顺序处理”为主。也就是说,CPU 会逐步、一条接一条地执行指令,这与并行处理不同。虽然多核技术和超线程技术可以在一定程度上缓解这种顺序处理的局限,但它并不是为大规模并行计算设计的。相比于能够一次处理大量数据的图形处理器(GPU),CPU 更适合处理复杂且需要精确计算的任务。
在 CPU 架构中,有几个关键的标准组件,它们共同协作,确保中央处理器能够高效完成各种计算任务。这些组件包括内核、缓存、内存管理单元(MMU)以及 CPU 时钟和控制单元等。计算机系统中最核心的组件之一,负责执行几乎所有程序运行所需的指令。作为一种通用处理器,旨在处理各种不同类型的任务,从操作系统的运行,到应用程序的执行,再到复杂的计算、文档编辑、播放电影和音乐、网页浏览等。
现代 CPU 通常拥有多个处理核心,每个核心都可以独立处理指令,从而提高多任务处理的能力。这种多核设计使得 CPU 可以在一定程度上同时处理多个任务,虽然每个任务的执行仍然是顺序完成的。
需要注意的是,CPU 的处理方式以“顺序处理”为主。也就是说,CPU 会逐步、一条接一条地执行指令,这与并行处理不同。虽然多核技术和超线程技术可以在一定程度上缓解这种顺序处理的局限,但它并不是为大规模并行计算设计的。相比于能够一次处理大量数据的图形处理器(GPU),CPU 更适合处理复杂且需要精确计算的任务。
在 CPU 架构中,有几个关键的标准组件,它们共同协作,确保中央处理器能够高效完成各种计算任务。这些组件包括内核、缓存、内存管理单元(MMU)以及 CPU 时钟和控制单元等。
所有这些组件共同协作,创建了一个能够高效执行多任务并行的处理环境。当 CPU 时钟驱动核心活动时,多个核心之间以极高的速度切换任务,从而使得 CPU 能够在数百个不同的任务之间每秒进行快速切换。例如,CPU可 以在后台处理文件操作的同时,运行应用程序、管理网络连接,并保持桌面显示的流畅运行。
总的来说,CPU(中央处理器)是整个计算机系统的核心,协调和管理所有计算任务。从数据输入到最终的输出,每一个步骤都依赖于 CPU 的指令处理和计算能力。无论是打开应用程序、运行复杂的模拟、编译软件,还是处理图形、视频和音频,CPU 都是确保系统能够高效运行的关键角色。
2. 什么是 GPU ?
GPU全称是Graphics Processing Unit,图形处理单元。它的功能最初与名字一致,是专门用于绘制图像和处理图元数据的特定芯片,后来渐渐加入了其它很多功能。
GPU 的架构设计非常独特,由成百上千个小型处理单元组成,每个处理单元能够独立并行执行指令。这种高度并行的处理能力使 GPU 能够同时处理海量数据,这也是其与多核 CPU 的相似之处。CPU 虽然也有多核设计,但每个核心的任务通常是串行执行的。而 GPU 的每个小型处理单元(通常称为“流处理器”或“CUDA 核心”)则可以相互并行执行不同的指令集,使得 GPU 能够在短时间内处理大量计算任务。
在图形渲染领域,GPU 的并行计算能力展现得尤为明显。渲染一个复杂的 3D 场景需要进行大量的数学计算,这些计算通常涉及到诸如光线追踪、阴影处理、纹理贴图和颜色渲染等高复杂度的操作。每个屏幕上显示的画面都由数百甚至数千个几何多边形组成,而每个多边形都有其独立的颜色、光照反射、运动轨迹等物理特性。所有这些计算都需要在极短的时间内完成,尤其是在图形密集型应用(如视频游戏、3D动画制作等)中,每秒钟画面的刷新和渲染速度要求非常高。
CPU(中央处理器)虽然在逻辑处理和一般计算任务上表现出色,但它并非为这种海量并行处理设计的。图形渲染的复杂性超出了 CPU 的处理能力,因为它必须在极短的时间内完成大量涉及数学、几何和光线计算的操作。为了保证游戏、影视特效、虚拟现实等应用能够流畅运行,GPU 通过其强大的并行计算架构接管了这些复杂的任务。务。
3. GPU vs CPU 类型解析
CPU 类型
CPU(中央处理器) 是计算机的“大脑”,负责执行各种指令。目前市场上主要有以下几种类型的 CPU,具体可参考:
-
英特尔酷睿(Intel Core)处理器: 作为 PC 市场的老牌霸主,英特尔酷睿系列处理器以其出色的性能和广泛的兼容性而闻名。无论是办公、娱乐还是专业创作,酷睿处理器都能胜任。
-
AMD Ryzen 处理器: AMD 的 Ryzen 系列处理器凭借出色的性价比和多核性能,近年来迅速崛起。在游戏、内容创作等领域,Ryzen 处理器与酷睿处理器不相上下,甚至在某些方面表现更佳。
-
ARM 处理器: ARM 处理器以低功耗、高性能的特点而著称,广泛应用于智能手机、平板电脑、物联网设备等移动设备中。ARM 架构的能效比使其成为移动设备的首选。
此外,值得一提的是 APU(加速处理单元)。APU 将 CPU 和 GPU 集成到一个芯片上,可以提供更平衡的性能,特别适合对图形性能要求不高但又需要一定计算能力的设备。力的设备。r 核心能够高效处理矩阵运算,加速神经网络的训练和推理。
GPU 类型
GPU(图形处理单元) 是专门设计用于处理图形和图像的硬件,在游戏、视频编辑、3D 建模、科学计算等领域发挥着越来越重要的作用。目前市场上主要有以下几种类型的 GPU,具体可参考:
-
NVIDIA GeForce Cards: NVIDIA 的 GeForce 系列显卡以其强大的游戏性能和丰富的驱动支持而深受游戏玩家喜爱。在高端游戏市场,GeForce 显卡一直处于领先地位。其采用 CUDA 核心,支持实时光线追踪、DLSS 等先进技术,为玩家带来逼真的视觉体验。
-
AMD Radeon Cards: AMD 的 Radeo n显卡在游戏性能和专业图形应用方面表现出色,同时价格相对亲民。Radeon 显卡在专业领域也有一定的市场份额。其采用 RDNA 架构,在游戏和内容创作方面具有竞争力。
-
集成 GPU: 集成 GPU 通常内置于 CPU 中,体积小、功耗低,适合笔记本电脑、平板电脑等移动设备。虽然性能不及独立显卡,但对于日常办公、上网等任务已经足够。
-
人工智能专用 GPU: 随着人工智能技术的快速发展,专门针对 AI 计算任务设计的 GPU 应运而生。例如,NVIDIA 的 Tesla 系列和 AMD 的 Radeon Instinct 系列 GPU 在深度学习、机器学习等领域具有强大的加速能力。这些 GPU 拥有大量的 CUDA 核心或计算单元,以及高带宽的内存,能够高效处理大规模并行计算任务。
此外,GPU 的分类还可以从架构上进行划分,具体:
-
流处理器架构: NVIDIA 的 CUDA 架构和 AMD 的 RDNA 架构都是典型的流处理器架构。流处理器是 GPU 的基本计算单元,它们并行处理大量的线程。
-
Tensor 核心架构: 专为深度学习设计的 Tensor 核心能够高效处理矩阵运算,加速神经网络的训练和推理。
CPU和GPU详细对比
二、 我们为什么要使用GPU?
GPU(Graphics Processing Unit)在相同的价格和功率范围内,比CPU提供更高的指令吞吐量和内存带宽。许多应用程序利用这些更高的能力,使得自己在 GPU 上比在 CPU 上运行得更快 (参见GPU应用程序) 。其他计算设备,如FPGA,也非常节能,但提供的编程灵活性要比GPU少得多。
GPU和CPU之间的主要区别在于设计思想的不同。CPU的设计初衷是为了实现在执行一系列操作时达到尽可能高的性能,其中每个操作称之为一个thread,同时可能只能实现其中数十个线程的并行化,GPU的设计初衷是为了实现在在并行执行数千个线程时达到尽可能高的性能(通过分摊较慢的单线程程序以实现更高的吞吐量)。
为了能够实现更高强度的并行计算,GPU将更多的晶体管用于数据计算而不是数据缓存或控制流。 下图显示了 CPU 与 GPU 的芯片资源分布示例。
一般来说,应用程序有并行和串行部分,所以系统可以利用GPU和CPU的混搭来获得更高的整体性能。对于并行度高的程序也可以利用GPU的大规模并行特性来实现比CPU更高的性能。
CUDA®:通用并行计算平台和程序模型
2006 年 11 月,NVIDIA® 推出了 CUDA®,这是一种通用并行计算平台和程序模型,它利用 NVIDIA GPU 中的并行计算引擎以比 CPU 更有效的方式解决许多复杂的计算问题。
CUDA的软件环境允许开发者使用C++等高级编程语言开发程序。 如下图所示,支持其他语言、应用程序编程接口或基于指令的方法,例如 FORTRAN、DirectCompute、OpenACC。
A Scalable Programming Model
多核 CPU 和超多核 (manycore) GPU 的出现,意味着主流处理器进入并行时代。当下开发应用程序的挑战在于能够利用不断增加的处理器核数实现对于程序并行性透明地扩展,例如 3D 图像应用可以透明地拓展其并行性来适应内核数量不同的 GPUs 硬件。
CUDA并行程序模型主要为克服这一挑战而设计,其对于程序员具有较小的学习难度,因为其使用了标准编程语言。
其核心是三个关键抽象——线程组的层次结构、共享内存和屏障同步——它们只是作为最小的语言扩展集向程序员公开。
这些抽象提供了细粒度的数据并行性和线程并行性,并将嵌套在粗粒度的数据并行和任务并行中。它们指导程序员将主问题拆解为可以线程块独立并行解决的粗粒度子问题,同时每个子问题可以被进一步细分为更小的组成部分,其可以被每个线程块中的线程通过并行合作的方式解决。
这种拆解通过运行线程在解决子问题时使用合作机制,保留了语言的表达能力,同时也为系统提供了自动的可拓展性。实际上,每个线程块可以被异步或同步地调度给 GPU 上任意一个多处理器 (Multiprocessors)。故 CUDA 程序可以被执行在具有任意 kernel 数据的 GPU 中,如下图所示,同时在运行时阶段,系统只需要给出物理多处理器地个数。
这种可扩展的程序模型允许 GPU 架构通过简单地扩展多处理器和内存分区的数量来跨越广泛的市场范围:高性能发烧友 GeForce GPU ,专业的 Quadro 和 Tesla 计算产品
三、GPU在大模型训练中的应用
Pytorch使用GPU训练模型加速
深度学习 神经网络 训练经常很耗时,耗时主要来自两个部分,数据准备和自参数迭代。
当数据准备是主要耗时原因时,采用多进程准备数据。当迭代过程是训练耗时主力时,采用GPU加速。
安装Pytorch
安装参考: https://pytorch.org/get-started/locally
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
查看cuda的版本
1. 张量的介绍
几何代数中定义的张量是基于向量和矩阵的推广,比如我们可以将标量视为零阶张量,矢量可以视为一阶张量,矩阵就是二阶张量。
张量维度 | 代表含义 |
---|---|
0维张量 | 代表的是标量(数字) |
1维张量 | 代表的是向量 |
2维张量 | 代表的是矩阵 |
3维张量 | 时间序列数据 股价 文本数据 单张彩色图片(RGB) |
张量是现代机器学习的基础。它的核心是一个数据容器,多数情况下,它包含数字,有时候它也包含字符串,但这种情况比较少。因此可以把它想象成一个数字的水桶。
这里有一些存储在各种类型张量的公用数据集类型:
- 3维 = 时间序列
- 4维 = 图像
- 5维 = 视频
例子:
一个图像可以用三个字段表示:
(width, height, channel) = 3D
在机器学习工作中,我们经常要处理不止一张图片或一篇文档——我们要处理一个集合:
(batch_size, width, height, channel) = 4D
在PyTorch中,torch.Tensor 是存储和变换数据的主要工具。如果你之前用过NumPy,你会发现 Tensor 和NumPy的多维数组非常类似。然而,Tensor 提供GPU计算和自动求梯度等更多功能,这些使 Tensor 这一数据类型更加适合深度学习。
创建Tensor
import torch
x = torch.rand(4, 3)
print(x)
tensor([[0.6213, 0.4814, 0.9188],
[0.6716, 0.6718, 0.0079],
[0.9178, 0.0065, 0.9370],
[0.7742, 0.1519, 0.6123]])
全0矩阵的构建
x = torch.zeros(4, 3, dtype=torch.long)
print(x)
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
直接构建张量
x = torch.tensor([5.5, 3])
print(x)
tensor([5.5000, 3.0000])
基于已有Tensor创建
x = x.new_ones(4, 3, dtype=torch.double)
print(x)
x = torch.randn_like(x, dtype=torch.float)
print(x.size()) # 输出维度信息