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 专用的内存
- 运行大模型时的流程:
- 从硬盘(SSD)读取模型 → RAM
- 如果用 GPU → 从 RAM 复制到显存
- 计算在 GPU 上进行(显存和 GPU 核心之间高速交互)
- 结果返回到 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
- 示例(4B 模型):
- 量化作用:减少显存占用、加快推理,让大模型在小显存设备运行
- 权衡:INT4 占用最小但精度损失最大;INT8 精度高但占用较多
以上为权重占用理论值,实际推理需额外显存存放缓存、激活值等,训练显存需求更高。
ollama run 确实提供了开箱即用的自动上下文管理
为什么需要 CUDA?CPU vs GPU
要理解 CUDA 的价值,首先要明白 CPU 和 GPU 的设计区别:
-
CPU (中央处理器):被设计为“通才”。它拥有少量但非常强大的核心,擅长处理复杂的逻辑、判断和串行任务(一步接一步执行的任务)。就像一个经验丰富、能处理任何难题的教授,但一次只能专注一件事。
-
GPU (图形处理器):被设计为“专才”。它拥有成百上千个相对简单的小核心。它不擅长复杂的逻辑判断,但极其擅长将一个巨大的、可以拆分的任务,同时分发给这成百上千个核心去并行处理。就像一个由成百上千名小学生组成的队伍,虽然每个学生只会简单的加减法,但让他们同时计算 1000 道独立的加法题,速度会远超那位教授。
在 CUDA 出现之前,GPU 的这种强大并行计算能力主要被限制在图形渲染领域。开发者很难直接利用它来加速科学计算、数据分析等通用任务。
CUDA 的诞生,就是为了打破这一限制,为开发者提供一把“钥匙”,让他们能够用标准的编程语言(如 C++, Python 等)来直接调用和控制 GPU 的海量核心,从而实现通用计算的惊人加速。
CUDA 的核心组成部分
CUDA 平台主要由以下几个部分构成:
-
支持 CUDA 的 NVIDIA GPU (硬件层):这是基础。只有 NVIDIA 的显卡(如 GeForce, Quadro, Tesla, RTX 系列等)才内置了支持 CUDA 指令集的计算核心。
-
CUDA 驱动程序 (Driver):连接硬件和操作系统的桥梁,确保上层软件可以和 GPU 正常通信。
-
CUDA 工具包 (Toolkit):这是开发者最常接触的部分,是一个包含了所有开发所需工具的软件包,主要包括:
-
编译器 (NVCC):一种特殊的编译器,可以编译包含 C/C++ 和 CUDA C++ 扩展语言的代码,将其转换为 GPU 可以执行的指令。
-
GPU 加速库 (Libraries):NVIDIA 提供了大量预先优化好的函数库,覆盖了各个领域的计算需求。开发者无需从零开始编写复杂的并行算法,直接调用这些库函数即可获得巨大性能提升。例如:
-
cuBLAS: 用于线性代数计算(矩阵乘法等)。 -
cuDNN: 用于深度神经网络计算,是 AI 框架的基石。 -
cuFFT: 用于快速傅里叶变换。
-
-
调试和性能分析工具:如
cuda-gdb和NVIDIA Nsight,帮助开发者调试代码、分析性能瓶颈。
-
-
CUDA API (应用程序编程接口):一套函数接口,让开发者可以管理 GPU 设备、分配和传输内存等。
CUDA 是如何工作的?
一个典型的 CUDA 程序工作流程如下:
-
数据拷贝:程序首先将需要处理的数据从 CPU 的主内存 (RAM) 拷贝到 GPU 的显存 (VRAM) 中。
-
CPU 指令:CPU 发出指令,告诉 GPU 去执行一个特定的计算任务。这个在 GPU 上并行执行的函数被称为**“核心” (Kernel)**。
-
GPU 并行计算:GPU 启动成百上千个线程 (Thread),每个线程都并行执行相同的 Kernel 函数,但处理的数据是不同的(例如,一个线程负责计算一个像素的颜色,或一个矩阵中的一个元素)。
-
结果拷贝:所有 GPU 线程完成计算后,程序将最终的计算结果从 GPU 显存拷贝回 CPU 的主内存。
通过这种方式,原本需要 CPU 耗费数小时的计算任务,在 GPU 的并行加速下可能仅需几分钟就能完成。