
一次训练跑几百轮,模型权重、指标图、中间产物散落在每台机器的本地盘,换机器就找不回上次的实验。MLflow 把 artifact(产物文件)落到对象存储就能解决这个问题。RustFS 是 100% 兼容 S3 的存储,官方集成目录(docs.rustfs.com/zh/developer/integration)的 AI 类目里 MLflow 有专门的指南,用 Docker Compose 以 RustFS 当 S3 制品存储验证过,本文把接线和几个前置坑讲清楚。

MLflow 的 artifact 默认就走 S3
MLflow 的 artifact 存储后端原生支持 S3,客户端用 boto3 直传,不经过 tracking server。这一节先说清分工,后面不再重复:tracking server 只存参数和指标的元数据,产物由客户端经 MLFLOW_S3_ENDPOINT_URL 直接传进对象存储。
import mlflow
mlflow.set_tracking_uri("http://mlflow-host:5000")
mlflow.set_experiment("rustfs-demo")
with mlflow.start_run(run_name="rustfs-verify") as run:
mlflow.log_params({"model": "demo-regressor", "alpha": 0.5})
mlflow.log_metric("rmse", 0.9, step=0)
with open("model-summary.txt", "w") as f:
f.write("demo model trained against RustFS artifact store\n")
mlflow.log_artifact("model-summary.txt", artifact_path="reports")
print("artifact_uri:", run.info.artifact_uri)
artifact_uri 会打印成 s3://my-bucket/mlflow-artifacts/<experiment-id>/<run-id>/artifacts,按上面说的分工,这份产物就是从训练脚本直接落进 RustFS 的。
四个环境变量
在跑训练脚本的环境里设置这四个变量(前三个分别是 endpoint 和一对凭据,第四个给区域),MLflow 就会把 artifact 写到 RustFS:
export MLFLOW_S3_ENDPOINT_URL=http://rustfs-host:9000
export AWS_ACCESS_KEY_ID=<your-access-key>
export AWS_SECRET_ACCESS_KEY=<your-secret-key>
export AWS_DEFAULT_REGION=us-east-1
MLFLOW_S3_ENDPOINT_URL 是核心,它告诉 boto3 把请求发到 RustFS 而不是真实 AWS S3——官方故障排查一节专门写了这条:少了它,客户端会直奔 s3.amazonaws.com。区域按官方指南填 us-east-1(RustFS 的默认区域),boto3 的 SigV4 签名需要它,缺了会在上传时报区域相关错误。path-style 寻址由 MLFLOW_S3_ENDPOINT_URL 驱动,不用额外配。凭据用访问密钥管理里创建的专用 Access Key,别拿管理员密钥。把同一组变量配到 CI 流水线和本地开发机,两边落的是同一个 RustFS 桶,本地复现线上实验不用搬数据。
两个前置坑先排掉
第一,artifact 桶必须先在 RustFS 里建好,再启动 MLflow server。MLflow 不会自己建桶,桶不存在 server 起不来。官方指南用 rc 建桶,--ignore-existing 让命令重复执行不报错,CI 里反复跑也不会炸:
rc alias set rustfs http://rustfs-host:9000 <key> <secret>
rc mb --ignore-existing rustfs/mlflow-artifacts
第二,跑训练脚本的那个 Python 环境必须装了 boto3,因为 log_artifact 是客户端直传 S3 的。分布式训练时每个节点都跑训练脚本、都会调 log_artifact,所以 boto3 和那四个环境变量要在所有节点一致地存在,不能只配在调度机或 server 上。报 ModuleNotFoundError: No module named 'boto3' 时,在训练环境里装 boto3 即可,不必把依赖塞进 MLflow server 镜像。
还有一条官方提醒专门给 CI 场景:凭据放在 .env 文件里管理时,不要把 .env 提交到版本控制,compose 里已经用 ${RUSTFS_ACCESS_KEY} 这种占位符引用,仓库里只留模板。CI 里反复起停部署时也留意 docker compose down 只停容器、数据都留着(RustFS 卷存产物、MLflow 卷存元数据库),要连数据一起删得显式加 --volumes,这条能省一次误删。

多人协作时元数据与产物分离
artifact_uri 指向 s3://bucket/mlflow-artifacts/ 之后,tracking server 的元数据可以放在 SQLite(demo)或托管数据库,而所有产物都在 RustFS,两样东西各归各的持久化:runs、参数、指标靠后端库在 server 重启后保留,产物靠对象存储不依赖 server 的本地磁盘。多人共享同一个 RustFS 桶,实验结果天然集中,换机器、换容器都能从同一批 artifact 接着训。
Ray、vLLM、SGLang 是同一个套路
RustFS 集成目录的 AI 类目下,MLflow 之外还有 Ray、vLLM、SGLang 三篇指南,存储都走 S3 接口,接线方式和上面四个变量一致:把客户端的 endpoint 指到 RustFS,凭据用专用 Access Key。比如 vLLM 的模型权重和推理缓存、Ray 的训练回传产物、SGLang 直接流式加载的模型权重,都能落同一个 RustFS 桶。一套 S3 兼容底座,可以同时托住训练、调参、推理三类产物的存储,不用为每个工具各接一套存储后端。
跑 MLflow server 时 RustFS 就是后端存储
官方指南的接线方式是把 RustFS、MLflow server、建桶初始化三个服务一起拉起(官方用 ghcr.io/mlflow/mlflow:v2.22.1 和 rustfs/rustfs-x86-musl:v2.3.1 验证过),tracking server 的元数据放在本地 SQLite,artifact 全部落在 RustFS。这条架构的启发是:server 可以很轻,真正的重量级产物都在对象存储里,server 挂了重启两样都不丢:元数据有卷里的 SQLite 兜着,产物本来就在桶里。生产里把 SQLite 换成托管数据库(PostgreSQL 之类),artifact 这一侧仍指向 RustFS,扩 server 不用动存储。
给 artifact 桶开版本控制还有一个实用好处:一次坏的 log_artifact 覆盖、或一个误删的实验产物,都能按版本收回来,不用从训练重跑。开启方法与恢复语义见版本控制(rc bucket version enable 一条命令启用,常规删除只打删除标记、旧版本仍可用版本 ID 取回),rc 或任意 S3 客户端都能列版本、取旧版。
产物大小和吞吐要心里有数
MLflow 的产物分两类:模型权重常常是几百 MB 的大文件,指标图、小日志则是海量小文件。大文件走 multipart 上传,RustFS 上和 S3 一样顺;小文件多时列举和上传请求数会上去,合理做法是把同一 run 的小产物打成压缩包再 log_artifact,减少对象数。公开基准里没有 MLflow 在 RustFS 下的端到端吞吐数字,这个值取决于你的网络和设备,先用真实产物大小压一轮再决定要不要切。RustFS 自托管、没有按量出口费,产物在集群内网来回传也不会产生云厂商那笔出网账单,长期跑实验这笔账也该算进去。
多实验、多团队的桶规划
实验一多,artifact 桶不能只有一个扁平的 mlflow-artifacts/。按团队或按项目分桶(比如 mlflow-team-a、mlflow-team-b),每个桶用专用 Access Key,权限天然隔离;同一团队内再用 artifact_uri 里的实验名和 run id 自然分层,找历史产物时路径清晰。RustFS 的桶级权限和 S3 一致,分桶是最省心的隔离手段,不用在对象前缀上做复杂策略。
生命周期也要想清楚:有些中间产物跑完就没用了,按生命周期管理给桶配过期规则(rc bucket lifecycle rule add --expiry-days)定期清,避免桶无限膨胀;真正要留的模型权重单独放一个保留桶,不做自动清理。这套分层等产物堆积到 TB 级再补就晚了,建桶时顺手做掉。
落地顺序先跑一个 dummy run
先建好 artifact 桶,再在训练环境装上 boto3,设好那四个环境变量,然后跑一个最小的 dummy run,确认 artifact_uri 真的指向 s3://my-bucket/... 且能在 RustFS 里 rc ls 到对象,再正式接训练流水线。两个中性边界:官方给的是单机 docker-compose 指南(本地集成测试用,官方自己标注了不适用于生产),生产要把 tracking 元数据挪到托管数据库、artifact 桶用专用凭据并开版本控制;公开基准里没有 MLflow 在 RustFS 下的吞吐数字,要不要切进来先拿自己的产物大小和并发压一轮再定。
MLflow、Ray、vLLM、SGLang 四篇指南的端点与寻址要求都在集成目录的 AI 类目下,存储引擎仓库在 rustfs/rustfs,Apache 2.0,1.0.0 已经 GA。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/rustfs_contrib/article/details/169169141




