跳转至

笔记

AI 辅助写作与幻觉风险

本站大部分博客和笔记会借助 GPT 等先进模型辅助撰写,包括但不限于资料整理、结构梳理、表达润色和草稿生成。AI 能降低写作成本,但也可能引入事实错误、概念混淆、引用缺失和看似合理的幻觉内容。

因此,除非特别标注,我不保证文中内容完全准确。如果你将这些内容用于学习、工作或决策,请务必自行查证原始资料,并结合上下文判断其可靠性。

劝退指南:不是博客,而是笔记,甚至是草稿

写笔记是为了让自己看懂,写博客是为了让别人看懂,不一样的,认真做好后者对自己各方面能力的提升会非常大(比如表达能力),其实很多时候记笔记就是写几段自己能看懂的表达,很随性,但写博客更像是写一篇论文,需要自己先彻底搞明白一个东西后才能输出1

我一直努力将内容写成博客。但是后来发现,根本没有时间和心思,来为别人解释很多事情。我的想法最多是解释给多年后忘记一切的自己听,让我还能快速看懂。能达到这点,这些内容的意义对于我就已经足够。

现在拥抱 AI 之后,我更愿意把这些内容理解为 AI 时代的阶段性理解产出。AI 降低了知识获取、信息筛选和文本生成的门槛,但它并不会自动替代人的理解:一个概念为什么重要、如何与已有知识连接、在哪些边界条件下成立,仍然需要自己反复判断、实践和修正。

所以,我仍然会继续更新这些文档。它们不是面向所有读者的完整教程,而是我在某个阶段借助 AI、资料阅读和个人实践,对相关概念形成的理解快照。未来的我可能会推翻、重写或补充其中很多内容,这也是笔记存在的意义。

从读者的角度,我并不会推荐任何人阅读这个网站的内容:因为你会遇到以下令人烦躁的场景

  1. 完整性差:某些笔记写着写着就没有了,内容是残缺的。甚至只有一个标题。(这是因为我没有时间填充内容,或者我的研究和注意力转变方向了,弃坑了弃坑了~)
  2. 可读性一般:很少有起承转合的解释语句,笔记的内容逻辑几乎全部靠多级标题维持.
  3. 笔记间关联性低:从读者的角度是看不到本人是如何使用多级文件夹,来组织划分笔记间的内容逻辑。如果你在搜索栏找不到你想要的关键词,那大概率我没接触到这方面的内容。
知识是自然聚类和融合的,但需要两级的文档来过滤内容和撰写正文。小而全、无懈可击的内容应该是所追求的

导致这种情况,其实和我对知识产出过程的理解有关,我认为过程是 知识是自然聚类和融合的

  1. 接触到领域对象(新建文件夹)
  2. 阅读各种文献网站(零散的知识进行简单的聚类)
  3. 上手实践和研究(踩了许多坑,有或多或少的感悟)。

而且三者的占比是前面远大于后面,这样看来我这网站大部分的内容岂不是都是笔记的草稿

我以这样的方式撰写我的正式的毕业论文时,发现这样的处理有利有弊:

  1. 优势:
    1. 速度?:能快速的罗列出内容,填充了大量垃圾内容
    2. 完备性:保留所有必要的相关信息,
  2. 劣势:
    1. 对工作进度的误判:罗列的大量页数迷惑了自己,以为进度很快。其实仔细思路内容的有效性、逻辑关联性。核心观点的提炼。遣词造句都极其耗费时间。
      1. 最重要是导致只看页数的领导对你工作速度的误判导致的嫌弃:一周前就看见里论文写了60页了,怎么两周了还没写完。或者你都60页了快结束了,来帮帮我弄这个~阿米诺斯~
    2. 需要返工:重新整理罗列的垃圾内容,至少需要三倍以上的时间才能整理好。

总结:知识是自然聚类和融合的思想是没错的,但是在实际生产应用时需要两级的信息筛选过滤体系:区分出正文内的todo内容和未整理的archived信息。通过将罗列的完备信息初步分类归档(有基础的逻辑)以待后续使用,正文精心撰写每一句话保证不需要大量返工。

Building Large-Scale AI Systems on Ascend: Training, Inference, and Multimodal Optimization

导言

谭邵杰,中国科学技术大学本硕毕业,现任华为昇腾训练开发工程师,专注于 Ascend NPU 上的大模型训练推理框架优化、多模态模型迁移、分布式并行训练、RL 优化与量化推理加速。

AI 训练推理框架与异构加速优化工程师,长期聚焦 Ascend NPU 生态下的大模型训练、推理、多模态迁移、分布式并行、RL 训练与量化优化。

Mooncake KV Metadata

导言

最初的问题很直接:Mooncake 管理 KV Cache,那么“KV Cache 的元数据”能否选择放在内存或 SSD?继续追问后才发现,元数据这个词把几种完全不同的东西揉在了一起:PagedAttention 的 Block Table、Master 保存的全局副本目录、SSD backend 保存的文件位置索引,以及为了故障恢复生成的 snapshot。

只有先回答“哪一种元数据真正负责定位 KV Cache 数据页”,才有可能讨论它应该放在哪里。本文基于 Mooncake 固定版本 0518784d,沿代码中的两级定位链路展开,再解释 Master snapshot 如何以较短在线停顿保存控制面状态,以及它为什么不能替代 KV payload 的持久化。

导言

一台服务器装有八张 400 Gbps NIC,不等于任意一张 GPU 都能拿到八张网卡的总带宽。现有 GPU 集群通常把 GPU 与“最近的”NIC 静态绑定;当 LLM 推理请求、MoE token 或推荐模型 embedding 产生不均衡流量时,热点 GPU 会堵在一张 NIC 上,旁边的 NIC 却可能空闲。

OSDI 2025 论文 FuseLink 的核心思想,是把 NVLink/NVSwitch 从“服务器内部的 GPU 互连”重新解释为“跨服务器网络的数据路径延伸”:流量先经 NVLink 到达更适合访问空闲 NIC 的中继 GPU,再通过 RDMA 发往远端。本文沿论文 Figure 1、2、3、4、5、8 还原这条设计链,并用其余实验结果说明收益、代价与边界。

NVIDIA SCADA

导言

GPUDirect Storage 已经能让 NVMe 和 GPU Memory 直接 DMA,为什么 NVIDIA 还要再做一套 SCADA?答案藏在“谁在运行时才知道下一块数据在哪里”这个问题里。

cuFile 适合由 CPU 或上层运行时提交已经成形的文件 I/O;图遍历、GNN 采样和磁盘型向量索引却可能让数十万个 GPU 线程各自发现下一个 offset。SCADA(SCaled Accelerated Data Access)试图把这些细粒度、数据依赖型请求留在 GPU 内核中:先经过 HBM 软件缓存与请求合并,再交给可信服务器访问本地或远端 NVMe。

一句话判断:SCADA 改变的首先是存储控制路径,其次才是数据路径。 它不是 GDS 的新名字,也还不是一个可直接下载部署的通用产品。公开论文已经证明 GPU-initiated storage 的基本机制,2024—2026 年的演讲和硬件演示展示了 SCADA 的扩展方向;但 API、部署要求和端到端生产数据仍处于有限公开阶段。

GPU-Centric Communication

导言

“GPU-aware” 很容易让人产生一个错觉:只要通信库能够接收 GPU buffer,数据就会完全绕开 CPU,通信也已经由 GPU 自主推进。现实并没有这么整齐。API 可能从 CPU 发起,数据却直接流向 NIC;GPU 也可能负责触发传输,但报文仍由 CPU 预先构造。

The Landscape of GPU-Centric Communication 给出的关键视角,是把通信拆成 API、报文构造、触发和数据路径,再观察每项责任究竟落在 CPU、GPU 还是 NIC。沿着这套坐标回看二十年演进,会发现主线不是“带宽越来越高”,而是先消除冗余拷贝,再缩短数据路径,最后把控制权逐步迁到 GPU

GPU-Initiated I/O

导言

把 SSD 数据送进 GPU,最直观的优化似乎是“绕过 CPU”。但这句话混合了两个不同问题:数据是否经过 CPU 内存,以及 I/O 请求究竟由 CPU 还是 GPU 发起。NVIDIA GDS 解决前者,BaM 进一步改变后者;代价是原本由 CPU 承担的队列管理、并发和缓存压力转移到了 GPU。

本文整理 DaMoN 2025 论文 Path to GPU-Initiated I/O for Data-Intensive Systems:先沿 Figure 1 比较五条 GPU-centric Storage 路径,再还原 BaM、GDS 与 SPDK 的实验边界。核心结论不是“GPU 发起一定更快”,而是系统应根据 CPU、GPU、PCIe、SSD 与数据复用状态,选择由谁支付 I/O 控制成本。

Mooncake File vs Block Device

导言

我最开始想确认的是一个很具体的问题:Mooncake Classic TE 和 TENT 打开的究竟都是文件系统普通文件,还是也能把 /dev/nvme0n1 这样的 SSD 裸块设备交给 GDS?源码里两边都会调用 open(path, O_DIRECT),NVIDIA cuFile 又确实接受 device fd,看起来答案应该是“可以”。继续向上追到 Segment 层后,结论却发生了分叉。

这篇文章把这条调用链从头串起来:先解释普通文件、块设备、S_ISREGS_ISBLK,再看 GDS 提供了什么 API、Mooncake 实际用了什么,最后落到 cuFileBatchIOSubmit 的同一组参数为什么在两个场景里具有不同含义。核心判断是:GDS 统一了 I/O 接口,却没有替 Mooncake 补上块设备的容量、对齐、越界和独占语义。

Mooncake Classic vs TENT Engine

导言

看到“应用必须持有 Transport*”时,我真正卡住的是:持有到底是什么意思?为什么直接保存一个后端指针就能工作,统一的 TransferEngine 反而走不通?

把这个词拆开后,Classic 与 TENT 的差异就不再只是两套接口。Classic 的公共 Batch 先于后端选择而创建,后端私有状态缺少稳定的安放位置;TENT 则在选定后端后,为每个 transport 创建独立 SubBatch,再由统一运行时协调提交、状态与回收。

因此,判断一个 Engine 是否容易扩展多个后端,不能只数有多少个 Transport 子类。真正要问的是:后端的私有状态放在哪里,由谁创建,又由谁保证它完成整个异步生命周期。

Mooncake Classic NVMeoF Transport

导言

在分析 Mooncake 的 NDS 接入位置时,经典 NVMeoFTransport 很容易被误认为 TENT GdsTransport 的前一版:二者都注册 buffer 和文件 handle,都使用 cuFile Batch API,也都维护异步完成事件。

但这条旧路径真正特殊的地方不在 cuFile,而在 Batch 所有权。可运行的调用必须直接持有 Transport*,并始终走 xport->allocateBatchID → xport->submitTransfer → xport->getTransferStatus → xport->freeBatchID。一旦换成 engine->allocateBatchID → engine->submitTransfer,批次便由 MultiTransport 创建,NVMeoFTransport 无法附加私有 descriptor,最终返回 NotImplemented

本文把这条旧路径单独展开:先给出从 NVMe-oF 挂载到专用测试的 SOP,再画出可运行路径与断路分支,最后按执行顺序逐句解释 Batch 分配、请求切片、cuFile 提交、完成事件聚合与资源回收。

Mooncake Codebase Architecture

导言

上一篇文章从 FAST'25 论文出发,解释了 P/D 解耦、分布式 KV Cache 与调度机制。论文读懂以后,打开代码仓却很容易再次迷路:Connector、Mooncake Store、Transfer Engine、TENT 看起来像四个并列组件,实际却跨越 vLLM 与 Mooncake 两个仓库,并分别承担框架适配、对象管理、字节搬运和新传输内核

本文固定在 Mooncake 6a00c353 与 vLLM 5bbc58c0,从仓库结构、请求流、时序和关键类关系重新组织这些概念,最后给出一套可重复的源码走读与开发 SOP。