Arganzheng's Blog

stay hungry, stay foolish

Python 在 AI-Infra(01 上):代码如何被执行——执行模型、作用域、导入与异常

How Code Runs — Execution Model, Scopes, Imports and Exceptions

Python 常被认为是一门”简单易学”的语言。但在深度学习框架、推理服务和分布式训练系统里,真正需要掌握的不是语法,而是语法背后的运行时模型。下面这些在 AI-Infra 代码里随处可见的写法,每一行都依赖一个可以被替换、被拦截、被扩展的机制: import torch 触发 .so 扩展加载、算子注册、后端初始化 model(x) 走的是 __call__,中间可能插入 hooks for batch in loader 迭代协议 + 生成器的暂停与恢复 with torch.inference_mode() 上下文管理协...

Python 在 AI-Infra:从语言机制到生产交付(总纲)

Python for AI-Infra, from Language Mechanisms to Production Delivery (Overview)

内容简介 《Python 在 AI-Infra:从语言机制到生产交付》是一组共七讲、九篇的系列文章(第一讲拆成上下两篇、第二讲拆成上中下三篇,其余各一篇),面向有后端工程经验(尤其是 Java 背景)、准备转向 AI-Infra 方向的工程师,系统梳理这个方向真正需要的 Python 能力:语言核心机制、类型系统与数据契约、并发与异步、反射与元编程、内存管理、测试与调试、以及工程化交付。 它同时是《AI 算法工程师学习地图》 L1 工具箱的深入篇:算法侧的《算法工程师的工具箱》只讲训练代码里用到的 Python 子集,把语言机制与运行时交给这里——两张地图共享本系列,算法方向的读者按需读。 这个系列不是 Python 语法教程,也不是技巧集合,而是试图回答一个...

算法工程师的工具箱(07):系列总结与通关自测

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

六篇正文回答了一个问题:把一个想法变成一次能跑、能复现、能与 baseline 对比的实验,要经过哪些工具、每个工具用到什么程度。第一篇讲训练代码里那一小撮 Python 语法与流式过语料,第二篇在 NumPy 上建立形状直觉并用 Pandas、Matplotlib 看结果,第三篇写出二十行训练循环,第四篇算这个循环要多少显存,第五篇用 Hugging Face 的六个库组装一次真实的 LoRA SFT,第六篇解释为什么快为什么慢、怎么让实验三个月后还能复现。六篇合起来,是《算法工程师的工具箱》总纲里 L1 那一层的全部:会到能做实验为止,越过那条线就进 Infra 地图。 本文不讲新内容,做三件事:把六篇压成一张表与六段回顾,把贯穿六篇的几条线拎出来,然后给一套...

算法工程师的工具箱(06):GPU 直觉与实验管理——两个上限、四块显存、能复现

GPU Intuition and Experiment Management: Two Ceilings, Four Memory Buckets, and Reproducibility

不写 kernel 的算法工程师也需要一份 GPU 直觉——不是为了优化它,而是为了解释:一次训练为什么慢、一次推理为什么快不起来、一个 OOM 从哪里来、我改的这个结构把瓶颈推向了哪边。这份直觉只有两个数字(算力、带宽)和一张表(显存的四块)。本篇讲它们,然后讲读 torch.profiler 的表,最后讲一件与 GPU 无关但同样决定实验能不能算数的事:怎么让三个月前的结果能复现。 全篇的核心问题是: 不写 kernel,能不能解释一次训练为什么慢、一次推理为什么快不起来、一个 OOM 从哪里来?1 三个月后能不能复现今天这次实验?2 一、总览 1. 本文的组织方式 前半(二到四章)回答”为什么快为什么慢”:先给 GPU 的两个上限与它们的比值...

算法工程师的工具箱(05):Hugging Face 生态——六个库与一次 LoRA SFT 的组装

The Hugging Face Ecosystem: Six Libraries, a Six-Line LoRA SFT, and Why Reading the Source Is the Fastest Way to Learn

前两篇的训练循环训的是自己写的小模型。真实工作里模型不是自己写的——是从 Hugging Face Hub 下载的 Llama、Qwen、DeepSeek;数据也不是随机切窗口——是 Hub 上的数据集经过 chat template、loss mask、packing;训练器也不是二十行——是 trl 的 SFTTrainer / DPOTrainer / GRPOTrainer。Hugging Face 的六个库把这条路铺好了,六行代码能组装一次 LoRA SFT。这一篇讲六个库各管什么、六行背后发生了什么、以及一个比任何教程都重要的习惯:卡住的时候直接读源码。 全篇的核心问题是: 能不能用 peft + trl 在一小时内跑起一个 LoRA SFT?...

算法工程师的工具箱(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. 一张账 每个可训练参数 bf16 权重 2 + b...

算法工程师的工具箱(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...

×