CS336 LecTure 1 笔记补充

核心理念Maximize Efficiency(效率优先)

在给定固定资源(数据量 + GPU算力)下,我们如何才能训练出最优模型?不仅仅是“跑通代码”,而是要关注 FLOPs(计算量)Memory(显存)Communication(通信带宽) 的极致利用。


概念区分:内存、显存、缓存

我们通过比喻来理解一下这个问题,

  • 内存(系统内存 / RAM) = 厨房的料理台
  • 显存(VRAM) = 厨师(GPU)的专属备料小桌板
  • 缓存(Cache) = 厨师手边最顺手的调料架

内存(RAM)—— 料理台

  • 作用:电脑CPU(中央处理器)的“工作台”。所有正在运行的程序、打开的文档、网页数据都在这里暂存。
  • 特点容量大(通常16GB-128GB),速度较快,但断电后数据清空。
  • 谁在用CPU 直接使用。CPU从硬盘(仓库)取数据,放到内存(料理台)上处理。
  • 如果不够大:程序切换会卡顿,系统会频繁读写硬盘(虚拟内存),导致电脑变慢。

显存(VRAM)—— 厨师的备料小桌板

  • 作用:显卡(GPU)的“专用工作台”。专门用来存放即将要渲染的画面,比如纹理贴图、3D模型、光影数据等。
  • 特点容量相对较小(通常4GB-24GB),但带宽极高(读写速度远超普通内存),专为图形并行计算优化。
  • 谁在用GPU(显卡芯片) 专用。CPU把数据传给显卡,显卡把数据放进显存,然后疯狂运算输出画面。
  • 如果不够大:玩游戏或AI绘图时,会爆显存,导致帧数瞬间暴跌、贴图加载不出来,甚至程序闪退(报错Out of VRAM)。

缓存(Cache)—— 调料架

  • 作用:CPU或GPU内部极高速的小型存储器。用来临时存放刚刚用过或即将用到的指令,避免每次都去速度较慢的内存里取。
  • 特点容量极小(通常几MB到几十MB),但速度极快(比内存快几十倍),成本极高,离计算核心最近。
  • 层级:通常分L1(一级)、L2(二级)、L3(三级)缓存,速度依次递减,容量依次增大。
  • 如果不够大:CPU会频繁去内存“取货”,产生延迟,影响游戏帧率和程序响应速度。

硬盘(仓库)-> 内存(料理台) -> 缓存(调料架) -> CPU/GPU核心(厨师炒菜)

  • 对于显卡:数据从内存复制到显存,显卡直接从显存读取(不经过内存)。
  • 对于CPU:数据从内存读到缓存,CPU核心从缓存中运算(因为缓存最快)。

为了便于区分,扔给 DeepSeek 帮我生成了一个表格

项目 内存(RAM) 显存(VRAM) 缓存(Cache)
归属 主板插槽 显卡板载(焊接) CPU/GPU芯片内部
容量 大(16G~128G) 中(4G~24G) 极小(几MB~几十MB)
速度 较快(几十GB/s) 极快(几百GB/s~TB/s) 最快(TB/s级别)
主要用途 运行系统和所有程序 存放渲染画面和纹理数据 暂存高频使用的指令
瓶颈后果 系统卡顿、多任务慢 游戏降帧、闪退、AI报错 CPU空转、计算延迟高

Tokenization:从字符到整数

这是 Lecture 1 的技术重点。LLM 无法直接处理字符串,必须将文本映射为整数序列。

什么是 Token?

在学 CS336 之前,我也经常没事就玩会 AI,你会发现像智谱这样的它在回答完你的问题之后,会给你回复一下消耗了多少个 Token。而所谓 Token 就是 AI 模仿了我们人类的大脑偷懒机制。

举个例子,我们说话的时候肯定是要经过大脑思考的,但是大脑不会一个字一个字的调用,很多时候是一个词甚至一个句子的调用。比如口谈禅的养成,你经常说口谈禅就是因为大脑发现这个句话你经常用了两三次于是大脑把这句话存了起来(而不是把每一个字单独存起来分批次调用)。同样的,AI 为了提高效率也可以采用这种机制,而所谓 Token,就是 AI 对一些字母或者数字所进行的分组。

为什么需要分词?

  • 固定维度:模型输入必须是固定维度的整数索引。
  • 压缩语义:将高频词组压缩为单个 Token,减少序列长度(Attention 复杂度是 \(O(N^2)\),序列越短越好)。

分词方法的演化史

  1. Character-based (基于字符)
    • 做法:每个字符一个 ID。
    • 缺点:序列太长,语义碎片化,训练效率极低。
  2. Byte-based (基于字节)
    • 做法:直接按 UTF-8 字节切分。
    • 优点:无 OOV(未登录词)问题,词表固定 256。
    • 缺点:序列长度比字符级还长,计算量爆炸。
  3. Word-based (基于单词)
    • 做法:按空格/正则切分。
    • 缺点:词表无限大,无法处理 Morphology(词形变化),大量 <UNK>
  4. Subword-based: BPE (Byte Pair Encoding) 当前主流
    • 来源:GPT-2, Llama, Qwen 均使用此方案。
    • 核心逻辑贪心合并
      1. 初始化:将所有文本拆为单字节。
      2. 统计:计算所有相邻字节对 (pair) 的频率。
      3. 合并:将频率最高的 pair 合并为一个新 Token,加入词表。
      4. 循环:重复直到达到目标词表大小(如 32k 或 150k)。
    • Encode 逻辑:对于新文本,按照训练时的合并优先级,贪心地从左到右合并。

前沿趋势:Tokenizer-free

  • 直接处理原始字节,通过特定架构(如 BitNet 或 State Space Models)避免分词带来的语义割裂,但目前尚未在大规模模型中完全取代 BPE。

工程与系统视角 (Systems Perspective)

  • Precision (精度)
    • FP32:用于存储优化器状态(Momentum/Variance)和主权重,防止累积误差导致训练崩溃。
    • BF16:用于前向/反向计算(矩阵乘法),动态范围大,不易溢出,是 H100/A100 的默认选择。
    • FP16:需配合 Loss Scaling,否则容易 Underflow。
  • Compute Accounting
    • 线性层 FLOPs \(\approx 2 \cdot B \cdot S \cdot D^2\)(前向+反向 \(\approx 6 \cdot B \cdot S \cdot D^2\))。
    • 随着模型变大,MLP 层的计算占比远超 Attention 层,优化重点应转向 MLP 的并行和通信。
  • Tensor 内存
    • view() vs reshape()view 要求内存连续,不拷贝;reshape 可能触发隐式拷贝(contiguous())。
    • 非连续张量(如 transpose 后)不能直接 view,必须先 contiguous()

posted @ 2026-07-06 16:25  PassName  阅读(13)  评论(0)    收藏  举报