第1章:课程概述 — 为什么我们需要可重复计算
说实话,我见过太多因为环境不一致而翻车的情况。刚入行那会儿,我花了两周跑出来的模型,换台机器就报错。原因?Python 版本差了个小版本,Conda 环境没锁住。你想想看,这种问题多冤。
可重复计算(Reproducible Computing)说白了就是:不管谁、不管在哪儿、不管什么时候,拿着同样的代码和数据,就能得到同样的结果。这件事看起来简单,做起来却不容易。
为什么?因为计算环境太复杂了。操作系统、编译器、依赖库、GPU 驱动……任何一个环节变了,结果就可能跑偏。我曾在一个项目中,就因为 CUDA 版本从 11.2 升到 11.3,模型精度掉了 0.3 个点。排查了整整两天。
所以我们需要工具来锁定环境。Conda 和 Docker 是目前最主流的两个方案。
Conda 和 Docker 各自扮演什么角色
Conda 管的是包和 Python 环境。它能把 numpy、pytorch、pandas 这些依赖的版本死死锁住。Docker 管的是整个操作系统环境。它能把 Ubuntu、CUDA 驱动、系统库都给打包进去。
我个人习惯把它们搭配着用。Docker 提供底层系统的确定性,Conda 提供 Python 包的精确控制。两者互补,缺一不可。
简单归纳:
- Docker — 锁定操作系统 + 系统依赖 + GPU 驱动
- Conda — 锁定 Python 版本 + 第三方包 + 私有包
- 两者结合 — 从内核到应用层的完整复现
嗯,这里要注意一点。Docker 和 Conda 不是谁替代谁的关系。我见过有人只用 Docker,然后在里面 pip install 一堆东西 —— 这种做法不可控。也有只用 Conda,结果系统库版本不一致导致编译失败。两个都用,才是正道。
课程目标:学完你能做什么
这门课不是理论课。每章都有实操,每段代码你都能跑起来。学完之后,你应该能:
- 用 Conda 把 Python 环境锁死,保证环境迁移后完全一致
- 用 Docker 打包整个计算环境,包括系统库和 GPU 驱动
- 将 Conda 环境嵌入 Docker 镜像,构建“双重保险”的容器
- 用 Dockerfile 实现可重复的计算流水线
- 在团队或 CI/CD 中共享可重复环境
我的建议: 不用急着把所有命令都背下来。先理解概念,然后跟着每章的代码块敲一遍。环境出问题是正常的,出问题才是学习的机会。
课程结构一览
整个课程分 5 个阶段,共 30 章。我把它画成了一张结构图,你可以直观看到学习路径。
上面这张图就是整门课的骨架。从问题出发,到解决方案,再到动手实践,最后落地的完整流水线。
为什么我选择用 Docker + Conda 而非其他方案
你可能听说过 virtualenv、pipenv、poetry,或者直接裸用 Docker。这些我基本都试过。说说我的感受:
| 工具 | 优势 | 局限性 |
|---|---|---|
| virtualenv / pip | 轻量,上手快 | 不锁系统依赖,跨平台不一致 |
| poetry | 依赖解析强 | 与 Conda 生态有冲突,GPU 支持弱 |
| 纯 Docker | 完整系统级隔离 | 镜像构建慢,Python 包版本控制不便 |
| Conda + Docker | 系统 + 包双重锁定 | 需同时掌握两种工具 |
重要提醒: 本课程假设你已经安装了 Docker 和 Conda(或 Miniconda)。如果你还没装,可以先去看看官方文档。不过别担心,后面章节会带大家一步步把环境搭起来。
整门课 30 章,每章都配了完整的代码和命令。我的建议是:别光看,动手敲一遍。环境崩了不要紧,崩一次就多长一个记性。我刚开始用 Docker 时,一个 Dockerfile 改十几遍才跑通。都是这么过来的。