↓ 跳过正文

Posts

2026

从一次 Forward 到持续生成:LLM Inference 为什么不一样?

最近在从传统模型 Serving 转向 LLM Inference,一个让我停下来想了很久的问题是:为什么 LLM 的推理系统看起来和我之前熟悉的那套完全不一样? 我之前做推荐模型和 CV 模型的部署,排序模型的 Serving 架构虽然在工程上也有不少复杂性(远程 embedding 读取、稀疏参数缓存等),但核心计算模式不难概括:一个请求进来,跑一次 forward,返回结果。LLM Serving 里冒出来一大堆新概念——推理要分成 Prefill 和 Decode 两个阶段,中间要维护 KV Cache,请求调度要做 Continuous Batching,显存管理要用 PagedAttention——我花了些时间才把它们背后的因果链串起来。

从 Dense FFN 到 MoE:Router、Token Dispatch 与 Grouped GEMM

·5127 字·11 分钟
上一篇 MoE 笔记把架构家族理了一遍——稀疏、稠密、Soft MoE,gate 在前还是在后,决定了算力形态和适用场景。 但那篇有一段伪代码一直让我不太舒服: 1for prob, idx in zip(topk_probs.unbind(1), topk_idx.unbind(1)): 2 out += prob.unsqueeze(1) * self.experts[idx](x) 逻辑上没问题。但想象一下真实场景:一个 batch 有几千个 token,每个 token 选 2 个 expert,就是上万个 token-expert 计算任务。用 Python for loop 逐个调 expert 的 forward,GPU 利用率会低得离谱。

为什么 Self-Attention 不能偷看未来?从 Causal Mask 到自回归训练

·4700 字·10 分钟
最近在看 MIT 6.S191 Lecture 9 讲 Context Parallelism 的时候,碰到了一个词:Causal Attention。 我对 Self-Attention 的公式并不陌生——之前那篇已经把 QKV 和 routing score table 拆得比较清楚了。但 Causal Attention 这个概念我一直没有认真想过。回头看,我写 Attention 公式、写 Multi-Head、写 FlashAttention 的时候,脑子里跑的都是"所有 token 都能看到所有 token"的 Full Self-Attention。

预测正确,策略为何仍可能亏钱?——从 Markout 到执行感知回测

上一篇写到,预测对价格方向,不等于交易能赚钱。主动成交要付执行成本,挂单等成交又可能筛出对自己不利的行情。 顺着这个问题往下想,我还有一个疑问:如果把手续费算进去,回测里也只让一部分挂单成交,是不是就离真实收益很近了?

从 RVO 到 Guaranteed Copy Elision:C++ 返回值优化的演进

·4193 字·9 分钟
一道我答错的题 # 最近做了一个 Modern C++ 水平测试,碰到这样一道题: 1#include <utility> 2 3struct Widget { 4 Widget() = default; 5 Widget(const Widget&) = delete; 6 Widget(Widget&&) = delete; 7}; 8 9Widget createA() { return Widget{}; } 10 11Widget createB() { 12 Widget w; 13 return w; 14} 15 16Widget createC() { 17 Widget w; 18 return std::move(w); 19} 问:在 C++17 下,哪些函数能通过编译?