Oct 21, 2026 · 2379 words · 5 mins
最近在看 MIT 6.S191 Lecture 9 的时候,反复听到一句话:Data Movement Matters。
之前写过 Arithmetic Intensity 和 Compute/Memory Bound,也刚写完 FlashAttention 的分块和 Online Softmax。这些文章里"HBM"和"片上存储"出现了很多次,但我发现自己其实一直没有认真想过一个问题:HBM 到底是什么?它全称叫 High Bandwidth Memory——高带宽内存——既然带宽已经很高了,为什么还要费这么大劲减少对它的访问?
Oct 21, 2026 · 4480 words · 9 mins
之前的几篇把 Self-Attention 的公式拆得比较清楚了,从 QKV 的计算含义到 Multi-Head 的分工。另一条线是 GPU 性能——Arithmetic Intensity、memory bound、HBM 带宽这些概念也已经聊过。关于 HBM 和片上存储的物理区别,可以参考GPU 存储层级那篇。
Oct 20, 2026 · 6899 words · 14 mins
起因 # 过去几篇笔记一直在 Lecture 6 的范围里打转。Distribution Shift 那篇让我意识到离线测试集的 98% 准确率没法平移到生产环境,Algorithmic Bias 那篇又告诉我总体准确率可以掩盖群体间的巨大差异,对抗攻击那篇则让我看到泛化好的模型仍然可以被微小扰动骗过。
Oct 18, 2026 · 11108 words · 23 mins
起因 # 之前在量化团队做 ML Infra 相关工作时,我曾参与过期货预测模型的特征重要度评估与特征筛选系统。
在那套系统里,Permutation Importance(置换重要度)是最核心的算子之一。当时我们面临的工作负载非常庞大:针对上千维的输入特征,要在多个交易日的数据上反复进行特征随机置换、模型前向推理以及评价指标的计算。在很长一段时间里,我的注意力几乎完全被系统层面的工程瓶颈吸引——如何降低内存拷贝、如何把推理批次打满、如何避免在不同特征扰动之间重复扫描数据。计算耗时被压下来之后,整套流水线跑得很顺,我也就习惯性地把这套指标当作特征评价的标准答案。
Oct 18, 2026 · 12364 words · 25 mins
起因 # 上一篇聊分布偏移与外推的时候,我把关注点放在了训练数据与生产环境之间的不一致上:模型在离线测试集上哪怕拿到了 98% 的高分,一旦现实环境发生 Covariate Shift 或者流形外推,线上的预测能力依然可能迅速滑坡。
Oct 17, 2026 · 9525 words · 20 mins
起因 # 上一篇聊随机标签实验的时候,我把注意力放在了模型容量和假设空间上:一个参数量巨大、完全有能力死记硬背随机噪声的神经网络,为什么在面对真实规律的数据时,依然能找到泛化良好的解。
Sep 26, 2026 · 3628 words · 8 mins
一个部署工程师的困惑 # 几年前我在做计算机视觉模型的部署,用的是 TensorRT 4 和 5。每次把训练好的模型转成 TensorRT engine,都绕不开一个参数:maxBatchSize。
Sep 16, 2026 · 4405 words · 9 mins
在 2022 年的年终总结里,我提过当时做的一个“动态算力”项目。那一年,我和另一位同事一起推进了这套系统,陆续接入腾讯新闻、QQ 音乐、全民 K 歌等业务,部分场景节省了约 30% 的成本。
Sep 14, 2026 · 6338 words · 13 mins
起因 # 三年前我参与维护过一个多人共享的训练集群。集群上跑着各业务线的训练任务,用户通过一个队列系统提交,每个用户有自己的资源 Quota。
Sep 12, 2026 · 3139 words · 7 mins
起因 # 在上一篇《从进程视角重新理解 Docker》中,我总结了 Docker 最核心的价值:它通过 namespace 和 cgroup 给进程构造了独立的视图和资源限制,并把这套运行环境固化成了可以直接分发的 artifact。
Sep 11, 2026 · 5605 words · 12 mins
起因 # 最近在团队内部重新整理 Python 项目的打包、发布和依赖管理规范,逐渐把各个工程统一收敛到:
1pyproject.toml 2uv 3uv.lock 4wheel 5src layout 6internal package registry 在这个过程中,大家交流最多的往往是一些具体的工具用法:私有源怎么配、build backend 选哪一个、uv 的命令参数怎么写。但我越梳理越发现,这些工程细节很容易盖住一个更基础的问题:
Sep 10, 2026 · 4643 words · 10 mins
起因 # 写训练代码的时候,经常从这里开始:
1dataset = load_dataset(...) 2model = build_model(...) 3train(model, dataset) dataset 像是一个天然存在的东西。打开一个 benchmark,下载一个压缩包,解压,加载,开始训练。ML 课程、论文、demo 大多也是从这一步开始。
Sep 9, 2026 · 7429 words · 15 mins
起因 # 最近偶然看到一篇文章,里面提到一个 Linux 和 Windows 的差异:在 Linux 下,即使机器实际上没有足够的物理内存,一个很大的 malloc 仍然可能成功返回。而 Windows 对 committed memory 的管理要严格得多,类似的 allocation 更容易被直接拒绝。
Sep 9, 2026 · 3814 words · 8 mins
起因 # 最近在继续 CS336 和 MIT 6.S191。
之前那篇写了 BPE tokenizer——从训练到编解码,关注的是 raw text 怎么变成 token,token 怎么映射成 token ID。做完之后,对这条链路的前半段算是搞清楚了:
Sep 6, 2026 · 2902 words · 6 mins
起因 # CS336 的 training loop 里,loss.backward() 和 optimizer.step() 挨在一起。前者计算 gradient,后者更新 parameter;但 gradient 存在哪里、什么时候清零、optimizer 还维护什么状态,需要分开看。于是结合 MIT 6.S191 的 Lecture 1,把一次训练迭代重新过了一遍。
Sep 5, 2026 · 2607 words · 6 mins
推理任务能放下,为什么训练任务放不下 # 上一篇讨论了模型调度中的 Capacity Constraint:一组模型到底能不能同时放进一张 GPU。
Sep 3, 2026 · 6012 words · 12 mins
起因 # 这是 CS336 系列的又一篇。
之前那篇讨论了 FLOPs 到 Latency 之间的鸿沟:FLOPs 相同的两个 GEMM,latency 可能差几倍甚至十几倍。那篇文章的核心结论是 FLOPs 是 workload metric,不是 performance metric,并且引入了 Arithmetic Intensity 和 Roofline Model 作为分析工具。
Aug 27, 2026 · 6243 words · 13 mins
起因 # 最近在做 CS336(Language Modeling from Scratch)的 Transformer 实现,代码里反复出现这种写法:
1rearrange(X, "... seq (heads d) -> ... heads seq d", heads=self.num_heads) 第一次看到时,它甚至比 x.view(...).transpose(...) 更加陌生——至少后者你知道它是 PyTorch 原生 API。
Aug 26, 2026 · 6437 words · 13 mins
起因 # 我们的线上推理系统中存在大量模型——MLP、GNN、MoE,以及它们的各种组合。这个 workload 有几个重要特点:
单张 GPU 上可能同时存在多个模型; 很多模型的 architecture 相同或者高度相似; 模型会随着业务时间轴不断上线、下线和切换; 模型切换过程对 latency 比较敏感。 随着模型数量增加以及动态上下线越来越频繁,我们逐渐观察到两个问题:GPU memory fragmentation,以及 model loading / switching latency。
Aug 26, 2026 · 4556 words · 10 mins
起因:一个来自运维同事的问题 # 前阵子运维同事找到我,大意是:
“我们现在训练特征大部分还是 NumPy / Parquet。最近看到 Lance,说是一个更适合 AI 训练、推理的数据格式。我们为什么没有用 Lance?”