环境搭建与工具选型:让你的实验有个家
说实话,很多同学做实验最头疼的不是模型调参,而是环境乱七八糟。今天跑通的代码,明天换个机器就崩了。我刚开始带团队的时候,就吃过这个亏——一个实习生花了两周复现的基线,结果因为 Python 版本不对,全白干了。
所以这一章,咱们把地基打牢。环境搭好了,后面才能安心做实验。
Python 虚拟环境:每个项目一个独立小窝
为什么要用虚拟环境?说白了,就是隔离依赖。你同时做三个项目,一个用 TensorFlow 1.x,一个用 PyTorch 2.0,还有一个用 JAX。如果没有虚拟环境,它们会互相打架,你信不信?
我个人习惯用 venv,它是 Python 自带的,轻量又好用。当然 conda 也不错,尤其在 Windows 上。这里我推荐一个原则:团队统一用同一个工具,别一半人用 venv,一半人用 conda,否则后面共享环境文件时会很痛苦。
核心要点:每个实验项目都应该有独立的虚拟环境,并且把依赖锁死在 requirements.txt 或 environment.yml 里。
创建虚拟环境的步骤很简单:
# 创建虚拟环境
python -m venv mlflow_env
# 激活(Windows)
mlflow_env\Scripts\activate
# 激活(macOS/Linux)
source mlflow_env/bin/activate
# 退出
deactivate
嗯,这里要注意:虚拟环境不要放在项目代码目录里。我见过有人把虚拟环境直接放在项目根目录,结果不小心删了项目代码,环境也没了。建议统一放在 ~/envs/ 或者 /opt/venvs/ 下。
安装 MLflow:实验追踪的核心工具
MLflow 是目前最流行的开源实验管理平台。它轻量、灵活,而且跟框架无关。你用 PyTorch、TensorFlow 还是 Scikit-learn,它都能接。
安装 MLflow 只需要一行命令:
pip install mlflow
但别急着跑。我建议你同时安装一些常用插件:
pip install mlflow[extras] # 包含常用扩展
pip install boto3 # 如果要用 S3 存储
pip install azure-storage-blob # 如果要用 Azure
小技巧:安装完成后,跑一下 mlflow --version 确认版本。我遇到过好几次因为 pip 源的问题,装了个旧版本,结果某些 API 用不了。
验证安装是否成功:
mlflow --version
# 输出类似:mlflow, version 2.12.1
安装 Weights & Biases:云端实验看板
W&B 是另一个我非常喜欢的工具。它跟 MLflow 不冲突,反而可以互补。MLflow 更偏向本地和自托管,W&B 则强在云端协作和可视化。
安装同样简单:
pip install wandb
然后需要登录:
wandb login
它会让你输入 。这个 Key 在 wandb.ai 网站上注册后就能拿到。我曾经犯过一个错——把 Key 直接写在代码里,结果不小心提交到了 GitHub。嗯,那之后我都是用环境变量来管理:
export WANDB_=your__here
警告:永远不要把 、密码、 硬编码在代码里。用环境变量或者 .env 文件,并且把 .env 加到 .gitignore 中。
配置本地与远程存储后端
实验数据存哪里?这是个关键问题。本地开发时存在磁盘上没问题,但团队协作时,你需要一个共享的存储后端。
MLflow 支持多种存储后端:
| 存储类型 | 适用场景 | 配置方式 |
|---|---|---|
| 本地文件系统 | 个人开发、小规模实验 | 默认,无需额外配置 |
| Amazon S3 | 团队协作、云端部署 | 设置 MLFLOW_S3_ENDPOINT_URL |
| Azure Blob Storage | Azure 生态用户 | 设置连接字符串 |
| Google Cloud Storage | GCP 用户 | 设置凭据文件路径 |
| NFS / 共享文件系统 | 内部服务器集群 | 挂载后指定路径 |
我个人习惯这样配置:本地开发用文件系统,正式实验用 S3。这样既保证开发速度,又确保数据不丢。
配置 S3 后端的示例:
export MLFLOW_TRACKING_URI=http://localhost:5000
export MLFLOW_S3_ENDPOINT_URL=https://s3.amazonaws.com
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
然后启动 MLflow 服务时指定后端存储:
mlflow server \
--backend-store-uri sqlite:///mlflow.db \
--default-artifact-root s3://my-bucket/mlflow-artifacts \
--host 0.0.0.0 \
--port 5000
这里 --backend-store-uri 存的是实验的元数据(参数、指标、标签等),--default-artifact-root 存的是模型文件、日志、图片等大文件。两者分开存,管理起来更清晰。
最佳实践:元数据用 SQLite 或 PostgreSQL,工件用对象存储(S3、GCS、Azure Blob)。这样既保证查询性能,又保证存储容量。
整体架构一览
说了这么多,你可能有点晕。没关系,我画了一张图帮你理清关系:
你看,整个架构其实就三层:你的代码调用 MLflow/W&B,它们把数据写到存储后端。就这么简单。
避坑指南
最后,分享几个我踩过的坑:
- 路径问题:MLflow 的 artifact URI 如果写相对路径,在不同机器上可能解析不一致。建议始终用路径或云存储 URI。
- 端口冲突:MLflow 默认用 5000 端口,但 macOS 的 AirPlay 接收器也占这个端口。我一般改成 5001 或 8080。
- 版本兼容:MLflow 2.x 和 1.x 的 API 有变化。如果你看网上的教程,注意确认版本。我曾经照着 1.x 的文档配 2.x 的环境,折腾了半天。
- 权限问题:用 S3 做后端时,记得检查 IAM 权限。不只是读写权限,还要有
s3:ListBucket权限,否则 MLflow 会报错。
我的习惯:每次搭建新环境,我都会先跑一个最简单的实验——记录一个参数和一个指标,然后去 UI 上确认能看到。这一步花不了 5 分钟,但能避免后面跑了一整天发现数据没存进去的悲剧。