01. Ollama & 一些小问题

为什么可以用 GPU 也可以用 CPU 跑模型

  • CPU(Central Processing Unit)
    • 核心少(4~16 核),但通用性强
    • 每个核心性能强,适合串行逻辑和复杂控制
    • 跑推理速度慢,但兼容性高
  • GPU(Graphics Processing Unit)
    • 核心多(数千个 CUDA 核/Metal Core)
    • 专为并行计算设计,擅长矩阵乘法
    • 深度学习推理速度远高于 CPU

框架(Ollama / PyTorch / TensorFlow 等)都能在 CPU 或 GPU 跑,GPU 有驱动时速度提升显著。

  • RAM 是“系统内存”,CPU 和 GPU 都可以访问
  • 显存(VRAM)是 GPU 专用的内存
  • 运行大模型时的流程:
    1. 从硬盘(SSD)读取模型 → RAM
    2. 如果用 GPU → 从 RAM 复制到显存
    3. 计算在 GPU 上进行(显存和 GPU 核心之间高速交互)
    4. 结果返回到 RAM,再传给应用

模型规模与量化精度

  • B(Billion):模型参数weights数量(4B=约40亿参数,7B≈70亿…)
  • 量化精度:每个参数weights占用的字节数
    • FP32:4B/param
    • FP16:2B/param
    • INT8:1B/param
    • INT4:0.5B/param
  • 显存需求 = 参数量 × 每参数字节数 显存(GB) ≈ 参数个数 × 每个参数字节数 / 1024^3
    • 示例(4B 模型):
      • FP32 (32 bit) ≈ 16 GB
      • FP16 ≈ 8 GB
      • INT8 ≈ 4 GB
      • INT4 ≈ 2 GB
  • 量化作用:减少显存占用、加快推理,让大模型在小显存设备运行
  • 权衡:INT4 占用最小但精度损失最大;INT8 精度高但占用较多

以上为权重占用理论值,实际推理需额外显存存放缓存、激活值等,训练显存需求更高。


ollama run 确实提供了开箱即用的自动上下文管理


为什么需要 CUDA?CPU vs GPU

要理解 CUDA 的价值,首先要明白 CPU 和 GPU 的设计区别:

  • CPU (中央处理器):被设计为“通才”。它拥有少量但非常强大的核心,擅长处理复杂的逻辑、判断和串行任务(一步接一步执行的任务)。就像一个经验丰富、能处理任何难题的教授,但一次只能专注一件事。

  • GPU (图形处理器):被设计为“专才”。它拥有成百上千个相对简单的小核心。它不擅长复杂的逻辑判断,但极其擅长将一个巨大的、可以拆分的任务,同时分发给这成百上千个核心去并行处理。就像一个由成百上千名小学生组成的队伍,虽然每个学生只会简单的加减法,但让他们同时计算 1000 道独立的加法题,速度会远超那位教授。

在 CUDA 出现之前,GPU 的这种强大并行计算能力主要被限制在图形渲染领域。开发者很难直接利用它来加速科学计算、数据分析等通用任务。

CUDA 的诞生,就是为了打破这一限制,为开发者提供一把“钥匙”,让他们能够用标准的编程语言(如 C++, Python 等)来直接调用和控制 GPU 的海量核心,从而实现通用计算的惊人加速。


CUDA 的核心组成部分

CUDA 平台主要由以下几个部分构成:

  1. 支持 CUDA 的 NVIDIA GPU (硬件层):这是基础。只有 NVIDIA 的显卡(如 GeForce, Quadro, Tesla, RTX 系列等)才内置了支持 CUDA 指令集的计算核心。

  2. CUDA 驱动程序 (Driver):连接硬件和操作系统的桥梁,确保上层软件可以和 GPU 正常通信。

  3. CUDA 工具包 (Toolkit):这是开发者最常接触的部分,是一个包含了所有开发所需工具的软件包,主要包括:

    • 编译器 (NVCC):一种特殊的编译器,可以编译包含 C/C++ 和 CUDA C++ 扩展语言的代码,将其转换为 GPU 可以执行的指令。

    • GPU 加速库 (Libraries):NVIDIA 提供了大量预先优化好的函数库,覆盖了各个领域的计算需求。开发者无需从零开始编写复杂的并行算法,直接调用这些库函数即可获得巨大性能提升。例如:

      • cuBLAS: 用于线性代数计算(矩阵乘法等)。

      • cuDNN: 用于深度神经网络计算,是 AI 框架的基石。

      • cuFFT: 用于快速傅里叶变换。

    • 调试和性能分析工具:如 cuda-gdbNVIDIA Nsight,帮助开发者调试代码、分析性能瓶颈。

  4. CUDA API (应用程序编程接口):一套函数接口,让开发者可以管理 GPU 设备、分配和传输内存等。


CUDA 是如何工作的?

一个典型的 CUDA 程序工作流程如下:

  1. 数据拷贝:程序首先将需要处理的数据从 CPU 的主内存 (RAM) 拷贝到 GPU 的显存 (VRAM) 中。

  2. CPU 指令:CPU 发出指令,告诉 GPU 去执行一个特定的计算任务。这个在 GPU 上并行执行的函数被称为**“核心” (Kernel)**。

  3. GPU 并行计算:GPU 启动成百上千个线程 (Thread),每个线程都并行执行相同的 Kernel 函数,但处理的数据是不同的(例如,一个线程负责计算一个像素的颜色,或一个矩阵中的一个元素)。

  4. 结果拷贝:所有 GPU 线程完成计算后,程序将最终的计算结果从 GPU 显存拷贝回 CPU 的主内存。

通过这种方式,原本需要 CPU 耗费数小时的计算任务,在 GPU 的并行加速下可能仅需几分钟就能完成。