M8-054M8: ML Systems, Engineering & ResearchMLOps & CI/CD for AIMedium
Mastery:
MLOps & CI/CD for AI: 解释 ML 环境中环境与依赖的可复现性要求。
📐 Mathematical Definition
⚡ Executive Summary
Core Concept: 用容器镜像 + 精确锁定依赖 + 固定随机种子 + 数据版本 + 硬件与驱动描述,保证同一输入在任意时间地点产生同一输出。
📌 Key Takeaways
- •环境锁定——容器镜像固定 OS/CUDA/cuDNN/框架版本,依赖精确到补丁版本
- •随机性控制——固定 Python/NumPy/框架种子,控制数据加载顺序与多进程随机性
- •确定性算子——关闭非确定性 CUDA 算子(如 atomic 归约)或接受可控非确定性
- •数据版本——快照或内容寻址(哈希),保证训练数据不变
- •硬件与驱动——GPU 型号/驱动/cuDNN 版本影响数值与性能,需记录
📐 Mathematical Derivations
数学机理:<strong>可复现性的五个来源</strong>——(1) <strong>代码(code)</strong>——(a) Git 提交哈希;(b) 训练脚本、数据预处理、评估脚本的版本一致。(2) <strong>数据(data)</strong>——(a) <strong>快照</strong>——DVC/LakeFS 对数据集打快照;(b) <strong>内容寻址</strong>——用数据哈希作为版本(任何改动都变哈希);(c) <strong>时间点正确</strong>——避免用了'当前'的表而数据随时间变化。(3) <strong>环境(env)</strong>——(a) <strong>容器镜像</strong>——固定 OS、glibc、CUDA、cuDNN、框架、编译器;(b) <strong>依赖锁定</strong>——requirements 精确到补丁(<code>==</code> 而非 <code>>=</code>);(c) <strong>ABI 兼容</strong>——CUDA 与驱动、框架与 cuDNN 的兼容矩阵。(4) <strong>随机性(seed)</strong>——(a) <strong>多源随机</strong>——Python random、NumPy、框架(torch/cuda)、数据加载(shuffle/worker)、dropout、初始化;(b) <strong>需逐源固定</strong>(只设一个种子往往不够);(c) <strong>多进程/多线程</strong>——DataLoader worker 的随机性、归约顺序;(d) <strong>非确定性算子</strong>——CUDA 的 atomic 操作、cudnn.benchmark 自动选算法(不同算法结果微异);(e) <strong>对策</strong>——<code>torch.use_deterministic_algorithms(True)</code>、固定 cudnn 算法、设 <code>CUBLAS_WORKSPACE_CONFIG</code>。(5) <strong>硬件(hardware)</strong>——(a) <strong>数值差异</strong>——不同 GPU 架构的浮点归约顺序不同 → 结果在 1e-6 级差异,长训练可放大;(b) <strong>性能差异</strong>——同代码不同硬件耗时不同;(c) <strong>记录</strong>——GPU 型号、驱动版本、cuDNN 版本。(6) <strong>复现等级</strong>——(a) <strong>完全复现</strong>——逐位一致(需确定性算子 + 同硬件);(b) <strong>统计复现</strong>——指标在置信区间内一致(更现实的目标);(c) <strong>实践建议</strong>——追求统计复现,记录足够信息以解释差异。(7) <strong>工程实践</strong>——(a) <strong>镜像即制品</strong>——训练镜像与推理镜像版本化;(b) <strong>配置即代码</strong>——超参用配置文件并版本化;(c) <strong>实验追踪</strong>——记录每次运行的代码/数据/环境/超参/指标(MLflow/W&B);(d) <strong>环境一致性</strong>——训练与推理的环境尽量一致(避免训练用 A100、推理用 T4 导致的数值差异)。<strong>与其他问题的关系</strong>——(a) 与训练-服务一致性(特征与环境的 skew);(b) 与实验管理(追踪);(c) 与调试(复现问题)。<strong>度量</strong>——(a) 复现成功率(重跑指标落在 CI 内的比例);(b) 逐位一致率;(c) 环境漂移事件数。
🏭 Production Trade-offs
深度剖析与工程权衡:① <strong>只设一个种子不够</strong>——随机源有多个(Python/NumPy/框架/DataLoader);面试中能指出这点是深度理解的标志。② <strong>非确定性算子是真凶</strong>——atomic 归约与 cudnn 自动选算法会导致逐位不一致。③ <strong>硬件差异导致数值差异</strong>——不同 GPU 架构的归约顺序不同。④ <strong>统计复现比逐位复现更现实</strong>——应把目标定为指标落在置信区间内。⑤ <strong>环境锁定用容器 + 精确依赖</strong>——<code>==</code> 而非 <code>>=</code>。⑥ <strong>实验追踪是复现的基础设施</strong>——记录代码/数据/环境/超参。⑦ <strong>面试要点</strong>——被问怎么保证可复现,应给出'<strong>代码 + 数据快照 + 容器镜像与依赖锁定 + 逐源固定种子与确定性算子 + 记录硬件驱动 + 实验追踪</strong>';能指出'只设一个种子不够'与'非确定性算子'是深度理解的标志。
⚠️ Common Interview Pitfalls
- ✕只固定一个随机种子(其他随机源未控)
- ✕用>=依赖版本导致环境漂移
🎯 Interviewer Follow-ups
- ?为什么固定了种子仍可能不可复现?
- ?硬件不同为什么会影响可复现性?
📚
Associated Knowledge Base Guides & Mindmaps
Explore the comprehensive technical article, exam cards, and global architecture tree.