# CMU 15-779 讲义代码的依赖（全部在 CPU 上运行，不需要 GPU）
# 第 1 讲：01、04 和 hw_specs.py / perf_model.py 只用 Python 标准库；02 需要 numpy 和 torch；03 需要 torch（用到 torch.fx）。
# 第 2 讲：minigraph.py 只用 numpy；01、03 还用 torch（对照梯度、torch.compile 抓图、checkpoint_sequential）。
# 第 3、4 讲：只用 numpy（GPU 行为由 code/lecture03/gpusim.py 模拟，不需要 GPU 或 CUDA）。
# 第 5 讲：tiny_transformer.py、01、02、04、05 用 torch（第一次运行训练小模型约 1 分钟，缓存到 code/lecture05/.cache/）；03 只用 numpy。
# 第 6、7 讲：只用 Python 标准库（07 的 03 号脚本用 numpy）。
# 第 8 讲：只用 numpy（minitriton.py 用 NumPy 解释执行类 Triton 的内核，不需要安装 triton）。
# 第 9–12 讲：只用 numpy（第 9 讲的代价模型是自己写的迷你 XGBoost，不需要安装 xgboost；第 10 讲不需要 Z3）。
# 第 13–16 讲：只用 numpy（多卡、集群、LLM 服务都在模拟器里运行；第 15 讲不需要 ILP 求解器）。
# 第 17、18、20 讲：numpy + torch（用第 5 讲的小 Transformer；第 17 讲第一次运行训练两个草稿模型约 40 秒，第 20 讲第一次微调源模型约 15 秒，都缓存起来）；第 18 讲的量化不需要 bitsandbytes / scipy（NF4 的分位数用标准库 statistics.NormalDist）。
# 第 19 讲：只用 numpy（RL 后训练的调度、重分片、放置都在模拟器里）。
# 第 21 讲：numpy + torch（04 号脚本第一次运行训练两个 MoE 小模型约 2.5 分钟，缓存到 code/lecture21/.cache/；03、05 只用 numpy）。
# 附加讲 A1：numpy + torch（用 torch.utils.checkpoint 和 saved_tensors_hooks 实测激活；03 号脚本只用标准库）。
# 附加讲 A2：numpy + torch（压缩第 5 讲的小模型；GPTQ / SparseGPT 自己实现，不需要 auto-gptq 等库）。
# 附加讲 A3：numpy + torch（01 号脚本全部是本机实测，每次运行的数字都不同）。
# 计时类脚本（标 ⏱ 的输出）在不同机器上数字不同，这是正常的。
numpy>=1.24
torch>=2.1        # CPU 版即可：pip install torch --index-url https://download.pytorch.org/whl/cpu
