12 Lab 与材料逐项导读
这里把“运行了什么”“它对应什么原理”“怎样检验理解”连起来。单元格编号按notebook原始cell数组从1开始,包含markdown cell;与编辑器显示的执行计数In[7]不同。
12.1 Lecture01/02/03:重复内容应该怎样读
Lecture01前部介绍历史、深度学习基础、分词与embedding;中部attention;后部现代架构与模型发展。Lecture02大量重叠,Lecture03先讲历史再讲架构差异。重复不是需要背三份相同定义,而是用不同呈现检查你是否理解相同机制。
学习历史时按“瓶颈→改变→代价”组织:
| 演变 | 之前的困难 | 机制变化 | 新增代价/未解决问题 |
|---|---|---|---|
| n-gram→neural LM | 稀疏、有限窗口 | 连续表示共享统计 | 训练与优化成本 |
| RNN/LSTM→attention | 长依赖、递归瓶颈 | 按内容访问历史 | attention存算成本 |
| 2017 Transformer→decoder-only LM | 任务架构与生成目标需要统一 | 因果next-token、预训练迁移 | 生成序列依赖仍存在 |
| post-LN→pre-norm/RMSNorm | 深层优化和归一化开销 | 更直接残差路径、简化norm | 仍需初始化/学习率管理 |
| 绝对PE→RoPE | 位置关系与长度处理 | Q/K旋转、相对点积 | 超长外推仍有限 |
| MHA→GQA/MQA | KV显存/带宽 | 共享KV头 | 质量与自由度折中 |
| ReLU FFN→SwiGLU | 特征变换表达/效率 | 平滑门控乘法 | 三投影参数预算 |
| dense→MoE | 总容量与活跃compute捆绑 | 条件专家激活 | 路由、均衡和通信 |
| 重复全前缀→KV cache | 历史重复计算 | 缓存因果不变状态 | cache内存增长 |
| 连续KV预分配→PagedAttention | 碎片和预留浪费 | 块映射与按需分配 | 表、引用、kernel复杂度 |
| 朴素attention→FlashAttention | 中间T²矩阵HBM读写 | 分块+online softmax | 更复杂kernel和重计算 |
| 预训练→SFT→RL | 续写与人类任务目标不一致 | 示范与奖励优化 | 数据偏差、奖励投机 |
| PPO→GRPO | critic成本与估值困难 | 组内奖励baseline | 多rollout、组退化与归一化偏差 |
课程中的模型榜单、产品名、开放程度、价格、CUDA安装建议具有时点性;本包按课件语境保留,不作为2026-11-01实时榜单或安装保证。GPT-4参数等带“supposedly”的说法不应写成公开已证实事实。
12.2 Tutorial01:Coding agent 与软件工程练习
37页主要内容:工具/套餐、环境、CLI与IDE、音乐播放器、薪资系统三个层级。学习重点不是记某产品价格,而是把自然语言任务变成数据结构、计算规则、可验证输出。
音乐播放器任务让你练习界面、播放状态、事件、音轨与资源组织;薪资Level1管理部门/岗位/职级/员工关系;Level2把基础工资、规则、扣款等变成配置化计算;Level3在同岗/部门分布等依据上形成建议。生成代码后需要检验业务逻辑和边界,不能只看页面能打开。
legacy/lab/lab01与Lab01_alternated中的HTML/CSS/JS、工资服务、tests、音乐文件是你已有的应用作品/生成资源;不是新的LLM理论讲义,不把每首音频当考试材料。它们可用于理解agent循环:读需求→规划→调用工具/改代码→测试→根据错误修正。
真正应能解释:模型参数负责输出策略,工具执行发生在外部环境;工具返回作为新context进入下一轮。工具调用不是模型凭空获得终端执行能力,也不是一次生成JSON就完成业务验证。
12.3 Tutorial02 与 PyTorch/LLM notebook
环境层次:硬件→驱动→CUDA运行库/框架→Python环境→模型代码→权重/tokenizer→应用。nvidia-smi显示的CUDA版本通常是驱动支持上限,nvcc --version查toolkit编译器版本,torch.version.cuda反映该PyTorch构建所用CUDA版本,三者不是同一对象。
uv/venv隔离包和解释器;Jupyter kernel决定notebook实际使用哪个环境。终端装了torch不等于当前kernel能import。GPU可用还需模型张量、输入张量放同一兼容device。
week2 notebook Cells3–4检查环境;Cells5–8用合成回归训练TinyMLP,重点是forward→loss→zero_grad→backward→step;Cells9–14下载/加载tokenizer和模型、运行生成;Cells15–20对比greedy、temperature/top-p/top-k、beam;Cells21–24看运行信息和故障提示。
AutoConfig给结构,AutoModelForCausalLM加载模型/权重,AutoTokenizer处理输入。模型文件目录通常需要config、权重分片/索引、tokenizer词表与特殊token/chat template配置;只拷贝一个权重文件不保证可加载。HF/ModelScope是分发来源,不是不同的注意力原理。
device_map解决设备放置,不意味着自动开启任何期望的并行训练;torch_dtype控制主要数值格式,不保证每个内部算子同dtype。安装命令依版本而变,不应机械执行课件中的驱动卸载步骤来复习原理。
legacy Lab02与新版notebook主要有OpenMP环境设置差异;legacy Lab03的(1)版本比新版多三行tqdm显示相关导入/重绑定,提取的其余源cell内容一致。notebook文件字节差异也可能包含执行输出/元数据,不能都解释成课程知识变化。
uv_tutorial_2.pdf另有14页:pip兼容接口直接操作环境,项目接口维护pyproject.toml与uv.lock。uv add记录项目依赖并更新锁;uv pip install主要安装到环境,不自动记录项目声明;sync使环境与锁/依赖文件对齐,run在项目环境执行;uvx用于隔离运行CLI工具。Python解释器、包依赖、系统驱动是不同层,锁Python包不等于锁住所有GPU系统依赖。
12.4 Tutorial03:本地推理与聊天机器人
15页流程:加载→generate→pipeline→采样参数→prompt组成→聊天项目。第10页“do_sample=False与temperature/top-p/top-k配合”表述容易误解:常见Transformers用法中,关闭采样会令这些采样参数不生效或警告,应按具体配置分支判断;greedy与beam也要看num_beams。
chat template通常通过apply_chat_template把messages转成模型认识的角色/轮次字符串或IDs;add_generation_prompt提示开始assistant输出。必须核对是否重复添加special tokens。多轮历史会变长,需要明确截断/摘要策略;仅在Python列表保存history不是跨请求KV自动复用。
输出截断可能来自max_new_tokens/上下文长度/EOS/服务端限制,不能只判断模型“不知道答案”。思考型模型可能把输出预算先用于reasoning,导致最终可见回复为空。模型特定thinking参数不是所有模型通用开关。
Hands-on Project_ Build a Local Chatbot.md要求理解代码、记录实验;用它检查输入管道、history、生成设置、异常处理与device管理。不要把任何“生成成功一次”的日志当成所有任务正确率。
12.5 Tutorial04:最重要的从零实现
| Cells | 内容 | 精读时要回答 |
|---|---|---|
| 2–7 | QKV与scaled attention | 为什么最后一维softmax?为什么Q/K末维相同? |
| 8–10 | causal mask | 上三角还是下三角被屏蔽?包括自己吗? |
| 11–12 | split/combine heads | view和transpose如何改变索引对应? |
| 13–19 | MHA、FFN、sinusoidal PE | 子层内是否已经包含residual/norm? |
| 20–25 | padding、encoder | Q/K长度不同怎么造mask? |
| 26–33 | decoder与完整Transformer | self-attention和cross-attention分别读谁? |
| 34–43 | 现代架构、RMSNorm、RoPE、GQA | 哪里cast FP32?KV头如何共享? |
| 44–51 | SwiGLU与现代LM组装 | 每个子层的residual/norm是否重复? |
| 52–57 | 周期序列训练与生成 | 标签如何shift?推理为何取最后位置? |
课件组件有的把residual/norm包在模块内部,有的统一放block外部;复用前先检查,重复加残差就换了网络。周期序列准确率高仅证明学会该玩具规律,不能证明具备一般语言理解。
12.6 Tutorial05/06:服务和实验
Tutorial05 PPTX共23页:云资源→IP/port→SSH→vLLM→模型下载/部署→调用。week6的Tutorial05 PDF共29页,新增/扩展纯CPU安装、glibc兼容、Python升级、WSL等环境路径,并调整了示例启动参数。这是跨格式的实质补充,不能因同名PPTX逐字节未变就忽略PDF。服务器IP区分主机,port区分服务端点;私有地址172.18…需要对应路由,不是任何互联网环境都可达。
环境排查应先定位层级:包安装失败可能是Python版本/平台wheel/glibc不兼容,GPU不可用可能是驱动/运行时不兼容,服务启动失败可能是模型架构/参数/依赖。关闭某个采样后端只绕开那条后端路径,不能普遍修复所有CUDA版本不兼容。原课件具体版本数字是当时示例,不当成永久要求。
部署链条:确认GPU/框架→模型文件完整→启动服务并加载成功→检查模型列表→客户端请求→解析状态/输出/usage→基准实验。服务端与客户端是两个进程,不能把客户端安装SDK当成服务端已启动。
Chapter_4_vllm_lab.md的完整主线是logits→decoding→自回归→cache→服务→benchmark→日志。手写decoder每次model(generated)未显式传回past_key_values,因此跨调用重复前缀计算;模型在某次调用内部创建了cache,也不代表下一次调用自动复用。
已有远端结果中的一个重要不一致:results/notes.md写“共享前缀尚无结果”,但目录里实际存在prefix_cache_results.csv。CSV是较直接的观测证据,摘要可能较旧。
该CSV六行shared组prompt约1036–1038tokens,different组611–613tokens,输出也不同且无内部cache指标。因此不能仅凭shared更慢得出prefix cache无效;输入长度与输出长度都混杂。并发CSV中短答并发4吞吐高于8、长答8更高,只支持本轮负载下的描述;每组8请求不足以刻画稳定p95。
12.7 Lab6 Qwen3-Next:逐段精读
| Cells | 内容 | 需要警惕 |
|---|---|---|
| 3–16 | attention与causal mask | 缩放与mask次序;全mask行 |
| 17–45 | 标准Transformer组件 | 原始encoder-decoder与decoder-only别混 |
| 47–50 | gated attention | sigmoid gate调节attention输出,不等于SwiGLU |
| 51–64 | dense→MoE→sparse/hybrid | 检查是否真的只执行选中专家;缺失组件定义 |
| 66–68 | 字符词表与加法batch | 输入/标签/答案mask的位置必须逐索引画出来 |
| 69–70 | toy backbone与MTP heads | aux hidden detach;多偏移target mask |
| 71 | 训练与优化 | Muon/AdamW参数分组;warmup/cosine;clip;CPU数据生成 |
| 72–74 | greedy验证/benchmark | 逐个验证不省forward;真答案长度已知;样本集对齐 |
| 76–84 | 0.01B模型配置/tokenizer | 参数预算、头维约束、special tokens |
| 85–91 | DeepSpeed与vLLM | 训练checkpoint导出为可服务格式,版本兼容需验证 |
gated attention示意:output=Wo(sigmoid(g)⊙Attn(q,k,v))。gate是输入相关调节,softmax仍在attention内部;它并非MoE专家选择。
两组tiny配置比较:Option1 vocab8000、routed F96/shared F64;Option2 vocab8192、routed F128/shared F128;其他多个参数一致。Option2宽度更利于某些硬件对齐,但更多总参数和活跃计算,数据有限时也可能更难训练,不能只凭8192是2的幂就断言全面更好。
仅算8专家SwiGLU+一个共享专家,每层Option1 3×256×(8×96+64)=638,976;Option2 3×256×(8×128+128)=884,736。Top2活跃expert部分分别196,608和294,912参数。再加router、mixer、embedding/head、norm等才能得总量;是否共享LM head影响V×D是否算两次。
<pad>占位补齐,mask掉无效位置;<eos>表示结束,应在有效结束处学习;<unk>表示词表无法编码单元。完整byte-level方案往往不依赖unk处理普通文本,但保留special token仍可能用于兼容;special token必须训练/保存/加载一致。
12.8 Tutorial07:把已学现代模块再接到MoE
Cells4–19重建RMSNorm、RoPE、mask、GQA、SwiGLU、现代block与LM head;Cells21–25周期序列训练/生成;Cells27–30 TopK路由与梯度;Cells31–35共享专家/练习;Cells37–47替换FFN,组装MoE LM、训练和路由观察。
重点沿一条loss路径追踪:CE→LM head→层间残差/attention→MoE输出→连续路由权重和被选中专家。未被选中专家在该token上没有FFN计算路径;不同token可选不同专家,所以整个batch中很多专家仍会更新。
12.9 Assignment1:粒度标尺
Q1要求推理/解码实验;Q2要求RoPE手算、bf16实现、相对位置证明与固定内容验证;Q3要求明确矩阵的attention手算、稳定softmax、batch实现与未来扰动实验。考试若“考得很细”,至少应能在不复制notebook的情况下复现这些原理和变式。
GPT_Generated_Assignment1与refine是既有解答草稿,不是独立真值;以正式题面、推导和数值验证为准。Assignment1_try/q2.ipynb与q3.ipynb为0字节空文件,不能算已完成学习材料。
12.10 视频和两站怎样纳入内容地图
本地两份同大小vLLM视频需按hash去重。抽帧可见主题:KV cache、vLLM LLM API、I/O插件、多硬件、PyTorch生态、hybrid allocator、compiler优化、piecewise CUDA graph、sleep mode等。后半更偏服务工程扩展:减少CPU launch开销、混合状态分配、训练/rollout切换资源,而非新的attention数学公式。
本包未逐句转写音轨,故不能以抽帧代替完整视频精读。TA站5001的照片显示从机器学习/深度学习基础到文本表示、Attention/Transformer的目录;5000照片显示“知习”练习站登录页。站内完整章节和题目没有实际读取,本次直接请求与浏览器均空响应。待可达后应按本包主题对照补充,不能预先声称站内只包含这些内容。