常见硬件关系
- CPU内存(ARM):通常为DDR4类型,用来存储需要随时访问的数据。当训练程序开始运行时,数据首先从磁盘被加载到主机的随机访问内存中。
free -h #查看CPU内存大小
- GPU内存:由于处理单元比CPU多得多,对于内存带宽的要求更高。所以一方面增加内存总线的宽度,另一方面使用特定的高性能内存,通常为GDDR6模块。另外,GPU内存一般比CPU要小得多,比如常见的GPU显存4G~16G。
- PCIe总线:高速串行计算机扩展总线标准,用于计算机内部硬件设备之间的连接和通信。
数据流转路径
在深度学习模型训练过程中,训练数据通常会经历以下路径:
-
存储介质(如硬盘或SSD):初始训练数据通常存储在磁盘或其他持久化存储介质中。
-
主机内存(RAM):当训练程序开始运行时,数据首先被加载到主机的随机访问内存(RAM)中。这一步通常涉及到从磁盘读取数据到内存的过程。
-
CPU:在数据被加载到内存之后,CPU 可能会对数据进行预处理,比如数据增强、归一化、类型转换等操作。
-
GPU:一旦数据预处理完成,数据会通过 PyTorch 的
DataLoader
被传输到 GPU 的内存中。DataLoader
是 PyTorch 中的一个类,它负责以批次的方式迭代地加载数据,并支持多线程数据预处理,这可以大大加速数据的准备过程。 -
GPU 内存:数据最终被加载到 GPU 的内存中,在这里进行模型的训练。GPU 内存通常比 CPU 内存更快,更适合进行大规模并行计算。
具体到 PyTorch 中,这个过程可以细化为:
-
使用
Dataset
类来定义数据集。这个类负责管理数据的获取方式,比如从文件中读取数据、从数据库中查询数据等。 -
使用
DataLoader
类来创建一个数据加载器。这个加载器会使用多个工作线程(由num_workers
参数指定)来并行地加载和预处理数据,然后将数据以批次的形式发送给训练循环。如果CPU的内存比较大,可将pin_memory
设置为True
,原因在这里。 -
在训练循环中,数据通过
DataLoader
迭代器逐批次地被加载,并使用.to(device)
方法将数据和目标(labels)传输到 GPU 上。 -
模型也被传输到 GPU 上(使用
.to(device)
方法),然后在 GPU 上进行前向传播、计算损失、反向传播和参数更新。 -
在推理(或评估)阶段,模型同样在 GPU 上进行计算,但是数据的加载可能不会使用
DataLoader
的多线程特性,以保证数据的顺序。
这里需要注意的是,数据从磁盘到 CPU 再到 GPU 的过程是分步骤进行的,而不是一次性全部加载。DataLoader
会根据设定的 batch_size
来分批次地加载数据,这样可以有效地管理内存使用,避免因一次性加载过多数据而导致的内存溢出。
此外,现代深度学习框架和硬件通常具备高效的数据传输机制,比如使用 PCIe(高速串行计算机扩展总线标准)来加速 CPU 和 GPU 之间的数据传输。