Arganzheng's Blog

stay hungry, stay foolish

LLM 时代的经典机器学习(01):什么是学习——划分、泛化、过拟合与偏差-方差

What Is Learning: Splits, Generalization, Overfitting and the Bias-Variance Decomposition

“机器学习”三个字里最重要的是”学习”,而学习的定义只有一句话:从有限的样本推断没见过的样本。一个模型把训练数据全背下来不叫学习,能在没见过的数据上表现好才叫——这个能力叫泛化。这一篇用一个能画出来的例子(30 个点拟合一条正弦曲线)建立整个算法地图最基础的四个概念:数据怎么划分、什么是过拟合与欠拟合、误差从哪来(偏差-方差)、什么是正则化。然后把它们对到 LLM 上:benchmark 污染是测试集泄漏,reward hacking 是在一个过拟合的评估器上做优化。 全篇的核心问题是: benchmark 涨了 5 个点,怎么知道不是测试题泄漏?1 奖励模型的准确率 80%,为什么 RL 还会钻空子?2 一、总览 1. 四个概念一张图 本文按”一...

LLM 时代还要学经典机器学习吗:只讲它在哪里重现(总纲)

Classical Machine Learning in the LLM Era: What Survives and Where It Reappears

内容简介 《LLM 时代的经典机器学习:只讲它在哪里重现》是一组共十篇正文的系列文章,对应《AI 算法工程师学习地图》的第 L2 层(机器学习基础)。它面向读完 L0 数学与 L1 工具箱、准备进入深度学习与 LLM 的读者,讲的是经典机器学习里那些在大模型时代仍然每天在用的概念——它们是什么、在 LLM 工作里以什么形态重现、以及一个能算出来的数字。每个概念都从一个具体的小例子讲起、配一张图、给出十几行能跑的核心代码、再对到 LLM 上——假设读者没有学过任何机器学习。 它回答的问题是: LLM 工作里的哪些问题其实是经典机器学习的老问题?它们的经典解法在 LLM 上还成立吗?1 “经典机器学习”——线性模型、SVM、决策树、K-Means、交叉验...

PyTorch 深度实践(11):系列总结与通关自测

Deep Dive into PyTorch: Series Recap and Final Self-Test

十篇正文回答了一个问题:PyTorch 如何把 Python 里写下的张量计算,变成可求导、可扩展、可优化、可分布式执行的运行时系统。第一篇画全局地图,第二到四篇讲编程模型(Tensor、Autograd、nn.Module 与训练系统),第五、六篇讲算子运行时(Dispatcher 与自定义算子),第七篇讲编译,第八篇讲性能,第九篇讲多卡,第十篇讲这个系统靠什么一直正确、一直可用。十篇合起来,是从 loss.backward() 一路追问到硬件与集群的一张图。 本文不讲新内容,做三件事:把十篇压成一张表与十段回顾,把贯穿全系列的几条线拎出来,然后给一套三段式的通关自测——判断与计算、跨篇综合、面试题。各篇末尾的自测检验的是”这一篇读懂了没有”,这里检验的是”十篇...

PyTorch 深度实践(10):PyTorch 的工程体系——一次改动如何安全地到达用户

The Engineering System of PyTorch: How a Change Travels Safely from Commit to Production

前九篇讲的是 PyTorch 是什么、怎么运行:Tensor 怎么存、Autograd 怎么记、算子怎么分发、Kernel 怎么写、编译器怎么融合、性能怎么测、多卡怎么通信。每一篇都在描述一个已经存在、并且正确运行的系统。 这一篇换一个问题:它是怎么做到一直正确、一直可用的?1 PyTorch 有两千多个算子、每个算子有十几种 dtype、两个以上后端、无数种 shape 和 stride 组合,还要在 eager、torch.compile、Meta、Autograd、分布式等模式下行为一致。每天有几十个 PR 合入主干,每个 PR 都可能碰到其中任何一层;每三四个月发一个版本,几百万用户的代码、几十个硬件后端、无数已保存的 checkpoint 都要在新版本...

PyTorch 深度实践(09):分布式 PyTorch

Distributed Training in PyTorch: Collectives, DDP, FSDP, TP, PP, CP and EP

前八篇都在一张卡上。第八篇末尾算过一笔账:Adam 训练下每个参数的静态显存是 16 字节,7B 参数的模型仅参数、梯度和优化器状态就要 112 GB,激活值还没算。一张 80 GB 的卡放不下。即使放得下,第八篇案例里那个 38M 参数的小模型在单卡上跑到 2207 samples/s 之后,GPU 已经饱和——再要快,只能加卡。 这一篇回答加卡之后的问题: 当一张卡放不下模型或跑不完数据时,PyTorch 如何把计算和状态切分到多个设备,并让通信与计算重叠?1 分布式训练的资料通常按 API 组织:DDP 一章、FSDP 一章、张量并行一章、流水线并行一章。这样读完会记住一堆包装类,却答不出”FSDP 比 DDP 多的那份通信从哪来、什么条件下才多...

PyTorch 深度实践(08):性能优化与调试

Performance Optimization and Debugging in PyTorch

前面七篇建立了 PyTorch 的执行模型:Tensor 如何存储(第二篇),Autograd 如何记录反向(第三篇),算子如何分发到 Kernel(第五篇),编译器如何把多个算子融合成更少的 Kernel(第七篇)。每一篇都在某处留下一句”性能问题第八篇讨论”。 这一篇兑现这些承诺。它围绕一个问题展开: 如何判断一个 PyTorch 程序慢,以及如何定位它为什么慢?1 这个问题比”如何让它变快”更基础。AI-Infra 工作中大量的性能优化失败,不是因为不知道优化手段,而是因为没有正确地测量,或者对着错误的瓶颈用力:GPU 利用率只有 30% 时去优化 Kernel,显存碎片导致 OOM 时去减 batch,Python 开销占主导时去换更快的 cu...

PyTorch 深度实践(07):编译执行与图优化

Compilation and Graph Optimization in PyTorch

前两篇讨论的是单个算子:第五篇解释一次 torch.add 调用如何经过入口、分发、执行;第六篇把一个自定义算子接入了同样的路径。无论原生还是自定义,每个算子都是独立走完这条路的。 这一篇把视角从单个算子拉远到一段程序。写下: def f(x, weight, bias): y = x @ weight + bias if x.shape[0] > 64: return torch.relu(y) return torch.tanh(y) compiled_f = torch.compile(f) torch.compile 到底做了什么?1 它不是把 Python 翻译成 CUDA——这个说法既不准确,也会让...

PyTorch 深度实践(06):C++ 扩展与自定义算子

C++ Extensions and Custom Operators in PyTorch

上一篇把算子系统拆成两个维度:开发者在构建时定义 → 注册 → 实现,用户在运行时入口 → 分发 → 执行,两者通过 Operator Table 交汇。那一篇站在使用者的角度观察原生算子 add。 这一篇换到开发者的位置:自己写一个算子,把它接入 PyTorch 的算子系统1 。 这是从“阅读框架”走向“扩展框架”的关键一步。AI-Infra 工作中大量的实际需求都落在这里:一个融合 Kernel、一个新硬件的后端适配、一个推理引擎的定制算子,最终都要经过同样的路径。 本文用一个刻意简单的算子贯穿全文:scale_shift(x, alpha, beta) = alpha * x + beta。它简单到不会分散注意力,又足够涉及 Tensor 元数据、dty...

PyTorch 深度实践(05):Dispatcher 与算子系统

The Dispatcher and Operator System in PyTorch

上一篇讨论了 nn.Module 与训练系统:Module 如何组织子模块、Parameter 和 Buffer,Optimizer 如何更新参数,DataLoader 如何把数据送入训练循环。 但写下: z = x + y 到底是谁决定了这个操作对应哪个算子、x 和 y 位于哪个设备、当前是否需要 Autograd、最终应该调用哪个 Kernel?1 这些问题属于 PyTorch 的算子系统(Operator System)。本文不会一开始分析复杂的 Attention,而是选择最简单的 add 算子,从两个视角把算子系统拆开:算子开发者在构建时做了什么,以及算子使用者在调用时发生了什么。 Dispatcher 解决的不是“调用哪个 Python...

PyTorch 深度实践(04):nn.Module 与训练系统

nn.Module and Training Systems in PyTorch

上一篇讨论了 Autograd:Tensor 运算如何形成动态计算图,backward() 如何沿图传播梯度,以及梯度状态和计算图生命周期之间有什么关系。 但一个真实的模型不会只是几个散落的 Tensor 运算。它通常包含: 多层嵌套的网络结构; 需要训练的参数; 不参与梯度更新但属于模型状态的 Buffer; 优化器和优化器状态; 训练、验证和推理三种不同阶段; 数据集、采样器和 DataLoader; CPU 到 GPU 的数据搬运; checkpoint、恢复训练和混合精度。 PyTorch 用 nn.Module 把这些对象组织起来,再通过 Optimizer、Dataset 和 DataLoader 将它们连接成训...

×