Arganzheng's Blog

stay hungry, stay foolish

算法工程师的工具箱(04):PyTorch 使用层(下)——混合精度、显存的账与多卡启用

PyTorch in Use, Part 2: Mixed Precision, the Memory Ledger and Turning On Multi-GPU

上一篇的二十行训练循环写出来之后,第一个撞上的问题几乎总是 CUDA out of memory。这一篇把”跑得动跑不动”从试出来变成算出来:训练时每个参数在显存里有几份东西、各多少字节;激活为什么与参数量无关却可能是大头;混合精度省的是哪一块;LoRA 为什么能把 128 GB 变成 17 GB;一张卡放不下时 DDP 与 FSDP 各做了什么。这是 L5 里”全量还是 LoRA、几张卡”这个决策的第一道约束,先于任何效果上的考虑。 全篇的核心问题是: 能不能算出一个 8B 模型全量微调要多少显存、为什么 LoRA 能放进一张卡?1 OOM 的时候知道看哪一块?2 一、总览 1. 一张账 混合精度训练的显存账:每参数字节、全量、LoRA、QLoR...

算法工程师的工具箱(03):PyTorch 使用层(上)——五个对象与二十行训练循环

PyTorch in Use, Part 1: Five Objects and a Twenty-Line Training Loop

PyTorch 的使用层只需要掌握五个对象: Tensor:数据与形状。上一篇的 ndarray 加上”在哪个设备上”和”要不要求导”。 Autograd:自动求导。前向时记下计算图,backward() 沿图反向算出每个参数的梯度。 nn.Module:参数的容器与前向逻辑。一个模型、一层、一个 MLP 都是它。 Dataset / DataLoader:取数与组 batch。前者定义”第 \(i\) 条是什么”,后者负责打乱、拼 batch、多进程预取。 Optimizer:用梯度更新参数。step() 读每个参数的 .grad 做一次更新。 把它们拼起来就是一个训练循环,二十行。所有高层封装——transformers 的 Trai...

算法工程师的工具箱(02):数据科学三剑客——NumPy 的形状直觉、Pandas 的错误分析、Matplotlib 的曲线

The Scientific Python Stack: Shapes and Broadcasting in NumPy, Error Analysis in Pandas, Reading Curves in Matplotlib

算法工作里的代码,十行里有八行在跟形状打交道:这个张量是 [batch, seq, hidden] 还是 [seq, batch, hidden](后者不是错的——RNN 时代与 nn.MultiheadAttention(batch_first=False) 的默认布局把序列维放在最前面,两种布局都在用,本系列统一用前者)、softmax 沿哪一维、mask 怎么加到 score 上、多头 attention 的 reshape 与 transpose 是什么顺序。PyTorch 的 Tensor 语义与 NumPy 的 ndarray 一致,所以形状直觉先在 NumPy 上建立——它没有 GPU、没有自动求导、没有任何干扰,只有形状。本篇用 NumPy 把 L0...

算法工程师的工具箱(01):Python 使用层——读懂训练代码的语法、流式过一遍语料、把实验写成脚本

Python in Use for Algorithm Engineers: The Syntax Behind Training Code, Streaming a Corpus, and Scripting an Experiment

算法工程师每天写的 Python 不多,读的很多:transformers 的 Trainer、别人的数据脚本、论文附带的训练代码。这些代码里反复出现同一小撮语法——__getitem__、yield、@torch.no_grad()、with torch.autocast(...)、**kwargs、@dataclass——它们不是 PyTorch 发明的,是 Python 的协议:PyTorch 只是约定”你按这个形状写,我就能用”。本篇从要做的四件事出发——过一遍语料、写配置、读懂训练代码、把预处理跑快——把这一小撮语法带出来,讲到会读会用为止。Python 的机制(这些语法在解释器里怎么实现、GIL 是什么、装饰器怎么改函数)是 Infra 地图 01 系列...

算法工程师的工具箱:从一个想法到一次能跑的实验(总纲)

Tooling for AI Algorithm Engineers: NumPy, PyTorch, Hugging Face and the GPU in Your Head

内容简介 《算法工程师的工具箱:从一个想法到一次能跑的实验》是一组共六篇的系列文章,对应《AI 算法工程师学习地图》的第 L1 层(编程与工具)。它面向读完 L0 数学、会一门编程语言、准备第一次亲手训一个模型的读者,讲的是把一个想法变成一次能跑、能复现、能与 baseline 对比的实验,要经过哪些工具、每个工具用到什么程度。 它回答的问题是: 能不能在一天之内,把一篇论文里的方法变成一次能跑、能复现、能与 baseline 对比的实验? 算法工程师的日常是把一个想法变成一次实验:读到一篇论文说”把 DPO 的 sigmoid 换成 hinge 会更稳”,当天下午就要在一个 1B 模型、一万条偏好对上跑出对比曲线。这条路上要经过的东西很固定——Nu...

算法工程师的数学(09):系列总结与通关自测

Mathematics for AI Algorithm Engineers: Series Recap and Final Self-Test

八篇正文回答了一个问题:拿到一篇 LLM 论文能不能读懂它的每一个公式,给一个建模假设能不能推出它的训练 loss,给一个评测结果能不能判断差异是真的还是噪声。前三篇是线性代数(形状与成本、向量的比较、正交与低秩),第四、五篇是概率(语言模型是一个条件分布、从最大似然推出交叉熵),第六篇是信息论(熵、交叉熵、KL 到 DPO),第七篇是微积分与优化(链式法则、\(p - y\)、策略梯度),第八篇是统计推断(置信区间与 scaling law 的拟合)。八篇合起来,是《AI 算法工程师学习地图》的 L0 层——后面每一层的公式都建在这一小块数学上。 本文不讲新内容,做三件事:把八篇压成一张表与八段回顾,把贯穿八篇的几条线拎出来,然后给一套三段式的通关自测——判断与...

算法工程师的数学(08):统计推断与拟合——评测的置信区间与 scaling law

Statistical Inference and Curve Fitting: Confidence Intervals for Benchmarks and How Scaling Laws Are Fit

“我们的模型在 HumanEval 上比基线高 3 个点。”这句话是不是一个结论?这一篇给出判断它的工具:置信区间与显著性。它们来自第四篇的两条性质——样本均值的标准差是 \(\sigma / \sqrt{n}\)、大量独立量之和近似高斯——加上一个数字 1.96。然后讲另一件”从一组数字里找规律”的事:拟合。scaling law 那些漂亮的曲线是怎么从几十个实验点拟出来的、为什么画在双对数坐标上、以及 Chinchilla 的”每个参数配 20 个 token”是怎么算出来的。 这一篇的每个概念都用模拟来看:统计里”标准误”、”95%”、”p 值”这些词说的都是”如果把同一件事重复做一万次会怎样”——那就真的重复一万次,画出来。全部数字与图由 math-for...

算法工程师的数学(07):导数、梯度与链式法则——softmax 的梯度与策略梯度

Derivatives, Gradients and the Chain Rule: The Softmax Gradient and the Policy Gradient

前两篇给了目标:交叉熵、KL、DPO 的 loss。这一篇讲怎么让参数朝着目标变好——求导,然后往导数的反方向走一小步。全部工具只有三件:导数(一个数变一点,函数变多少)、梯度(很多个数一起变时的导数)、链式法则(复合函数的导数是局部导数的乘积)。用它们推两个后面反复出现的结果:softmax + 交叉熵的梯度是 \(p - y\)(简洁到令人怀疑),以及目标是期望时的梯度——策略梯度,RL 的全部算法都建立在它上面。最后讲用梯度更新参数的最简单方法与学习率。 这一篇是机器学习的发动机:没有梯度就没有训练。所以每个概念都配一张图、一个能手算的数字例子和一段能跑的代码——文中的全部数字与图由 math-for-ai/07_gradients_and_policy_g...

算法工程师的数学(06):熵、交叉熵与 KL——从困惑度到 DPO

Entropy, Cross-Entropy and KL Divergence: From Perplexity to the DPO Loss

信息论在这张地图上看起来最”理论”,却是后训练的主语言:SFT 的 loss 是交叉熵,RLHF 与 DPO 的约束项是 KL,蒸馏的目标是 KL,投机解码的接受率是两个分布的总变差。它们全部建立在三个量上——熵、交叉熵、KL 散度——以及一条把三者连起来的等式。这一篇从定义讲起,讲清 KL 的两个方向为什么行为完全不同,然后走完一条完整的推导链:从”最大化奖励且不偏离参考模型”的目标,推出它的闭式最优解,再推出 DPO 的 loss。 全篇的核心问题是: 能不能分清熵、交叉熵、KL 各是什么?1 能不能从 KL 约束的最优策略推出 DPO 的 loss?2 一、总览 1. 三个量一条等式 熵、交叉熵与 KL 的定义、含义与 LLM 里的角色 ...

算法工程师的数学(05):从最大似然到交叉熵——第一个要会推的 loss

From Maximum Likelihood to Cross-Entropy: The First Loss You Should Be Able to Derive

训练日志里跳动的那个数字——loss 从 11 降到 2 点几——是什么?它从哪来?为什么是那个公式?这一篇给出完整的答案:从上一篇”语言模型是条件分布”的定义出发,用一个自然的原则(让训练数据出现的概率最大),三步推出它。这三步是后面所有 loss 的模板:SFT、奖励模型、DPO 都是同一个式子换一个概率。然后讲模型是怎么把一堆实数变成概率的(softmax),以及温度、top-k、top-p 在这个分布上做了什么。 这一篇是全系列最重要的一篇之一:loss 是训练的全部驱动力——模型的每一次参数更新,都是朝着”让这个数变小”的方向走的。不理解它,就看不懂训练曲线、看不懂 SFT 为什么要 mask、看不懂奖励模型和 DPO 的公式为什么长那样。所以本文不吝篇...

×