核心要点

  • 能定义可复现:同代码+数据+环境→同结果

  • 列举依赖、随机种子、硬件等非确定性因素

  • 知道 lockfile、容器、conda/uv 等实践

  • 理解训练-推理环境一致的重要性

简要回答

环境可复现要求依赖、系统库、CUDA、随机种子与硬件行为被锁定;挑战来自「在我机器上能跑」、隐式依赖与 GPU 非确定性。

标准回答

可复现性定义:固定代码版本 + 数据版本 + 环境配置 → 训练得到可接受的相同指标与模型行为。

主要挑战

  1. 依赖地狱:pip 未锁版本、系统库差异(glibc、CUDA driver)
  2. 隐式状态:未记录的 notebook 单元格顺序、全局随机种子
  3. 硬件差异:不同 GPU 架构、混合精度非确定性(atomicAdd 顺序)
  4. 数据漂移:「同版本」数据实际已变(上游表更新)
  5. 训练-推理 skew:Python 3.9 训练、3.11 推理;特征计算库版本不同

最佳实践

  • 容器化:Docker 镜像 pin 基础镜像 + requirements.lock
  • 依赖锁定:poetry/uv/pip-tools conda-lock
  • 种子管理:Python/NumPy/Torch/CUDA deterministic flags
  • 数据版本DVC / LakeFS 绑定数据 hash
  • 实验记录:环境 snapshot 写入 MLflow metadata

详见 MLOps 入门环境管理

回答思路

  • 【定义】用一句话说清「MLOps 中的环境可复现性是什么?有哪些挑战」

  • 【原理】讲清关键机制或步骤(2~3 点)

  • 【例子】举一个真实项目、论文或产品中的例子

  • 【对比】与易混淆概念或替代方案比较(如有)

  • 【收尾】总结适用场景 + 一个局限或风险

延伸学习

延伸阅读:MLOps 入门环境管理。术语:DVCMLOpsCheckpoint

常见误区

⚠️ 常见踩坑

只锁 pip 不锁 CUDA/系统库;忽视特征工程代码版本;不说训练与 serving 环境对齐

追问

追问 1GPU 训练如何尽量确定性?

torch.use_deterministic_algorithms(True)、CUBLAS_WORKSPACE_CONFIG 设置、避免非确定性算子;可能牺牲性能。完全 bitwise 一致难,通常容忍微小数值差。

追问 2Notebook 为何破坏可复现?

乱序执行、未保存中间状态、魔法命令改全局状态。应用脚本化(.py)+ 参数化(Hydra/argparse)+ CI 跑端到端。

追问 3如何验证环境可复现?

CI 中两次独立构建镜像跑同训练脚本,对比 metric 与模型 hash(容忍阈值)。定期回归测试 golden pipeline。

🔗 相似问题

同一考点的不同问法,换着练更稳

没找到想看的面试题?把你想看的告诉我们 →

延伸学习

按主题分类的相关资源,便于系统复习