环境搭建与工具选型:让你的实验有个家

说实话,很多同学做实验最头疼的不是模型调参,而是环境乱七八糟。今天跑通的代码,明天换个机器就崩了。我刚开始带团队的时候,就吃过这个亏——一个实习生花了两周复现的基线,结果因为 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 / Weights & Biases 存储后端:本地 / S3 / GCS / Azure Blob 实验数据:参数 / 指标 / 模型 / 日志 关键原则 1. 代码与数据分离:代码在 Git,数据在存储后端 2. 元数据与工件分离:元数据用数据库,工件用对象存储

你看,整个架构其实就三层:你的代码调用 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 分钟,但能避免后面跑了一整天发现数据没存进去的悲剧。