机器学习 / A LEAF IN THE GARDEN

深度学习硬件

机器学习 · 动手深度学习。来自 Daily Learning 的学习笔记。

CPU

分区

  • 集成显卡
  • CPU 核心
  • 内存 I/O
  • 三级缓存

内存访问

计算前需要准备数据

主内存→L3→L2→L1→寄存器主内存 \rightarrow L3 \rightarrow L2 \rightarrow L1 \rightarrow 寄存器

数据传输很耗时,所以要提升内存本地性

  • 时间: 重用数据,使它们保持在缓存中
  • 空间: 按序读写数据,使得可以预读取

eg.

矩阵,按行访问可以预读取,比按列访问快很多

并行

  • 并行来利用 CPU 的多个核心
  • 超线程共享寄存器,不一定提升性能

eg.

串行:

for i in range(len(a)):
    c[i] = a[i] + b[i]

并行:

c = a + b

numpy、torch 等框架底层并行度较高,不要傻傻用 for loop

GPU

GPU 核心数远大于 CPU,但核心更简单,适合大规模并行计算,每个单元计算任务量小。

CPU vs GPU

不知道哪来的数据,但大体是这个意思

CPUGPU
核心数6-642K-10K
TFLOPS0.2-110-150
内存16GB-1TB16GB-128GB
内存带宽30-100 GB /s400GB - 1TB /s

提升 GPU 利用率

  • 并行: 使用数千数万个线程
  • 内存本地性: 缓存更小,架构更简单
  • 少用控制语句(if/loop): 同步开销大

带宽

不要频繁在 CPU 和 GPU 之间传输数据。

  • CPU-内存: 30 GB/s
  • GPU-内存: 480 GB/s
  • CPU-GPU: 16 GB/s(PCIe 3.0)

带宽有限制,且同步开销大

高性能计算编程

  • CPU: C++ 或 Fortran 等高性能语言
  • GPU
    • Nvidia 上用 CUDA
    • 其他用 OpenCL

TPU 与其他