本文介绍在 mlrun 中通过 mlrun.get_dataitem().as_df() 方式读取已记录的 csv artifact 的标准方法,解决直接使用 pd.read_csv("s3://...") 因权限、认证或路径不匹配导致的访问失败问题。
本文介绍在 mlrun 中通过 mlrun.get_dataitem().as_df() 方式读取已记录的 csv artifact 的标准方法,解决直接使用 pd.read_csv("s3://...") 因权限、认证或路径不匹配导致的访问失败问题。
在 MLRun 中,Artifact(如 CSV 表格)并非简单地“上传到 S3 并暴露原始路径”,而是经过项目上下文、版本控制、元数据绑定和统一数据访问层(DataItem)封装后持久化的资源。因此,直接拼接 S3 路径并用 pandas 读取通常会失败——原因包括:S3 桶未配置公共访问、缺少 IAM 权限、路径中含动态 UUID 或 project-namespace 映射不一致(例如示例中误写为 {project_name}-jovyan 而非实际项目名),以及未启用 MLRun 的 credential passthrough 机制。
✅ 正确做法是使用 MLRun 提供的 mlrun.get_dataitem() 接口获取一个 DataItem 对象,再调用其 .as_df() 方法自动处理底层存储协议(S3、V3IO、filesystem 等)、认证、格式解析与类型推断:
import mlrun
# ✅ 推荐:使用 get_dataitem + as_df(自动处理认证与格式)
dataitem = mlrun.get_dataitem(
"s3://mlrun/projects/test-pipeline/artifacts/data-prep-test-data-generator/0/mydf.csv"
)
df = dataitem.as_df(format="csv") # format 可显式指定,CSV 为默认值⚠️ 注意事项:
- 路径必须准确:projects/{project-name}/artifacts/{artifact-name}/{uid}/{filename} 中的 {project-name} 必须与实际创建该 artifact 的 MLRun Project 名称完全一致(区分大小写、无额外后缀如 -jovyan,除非你确实在项目名中定义了它);
- UID 不可省略:Artifact 路径中的 0 是本次运行的 UID(即 context.uid),若 artifact 来自历史运行,请从 UI 或 context.get_artifact("mydf") 获取对应 UID;
- 无需手动配置 S3 客户端:get_dataitem 自动复用 MLRun 集群配置的存储访问凭证(如 AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY 或 IRSA 角色),避免硬编码密钥;
- 支持多种格式扩展:除 CSV 外,.as_df() 同样适用于 Parquet、JSON、Excel(需安装 openpyxl)等,MLRun 会根据文件扩展名或 format= 参数智能解析;
-
调试技巧:若路径不确定,可在 notebook 或函数中先列出项目下所有 artifacts:
project = mlrun.get_project("test-pipeline") artifacts = project.list_artifacts(name="mydf") for a in artifacts: print(f"Path: {a.target_path}, UID: {a.uid}")
? 总结:MLRun 的核心设计原则是“抽象存储细节,聚焦数据语义”。永远优先使用 mlrun.get_dataitem(...).as_df() 替代原生 pandas.read_csv("s3://...") ——它不仅保障安全性与可移植性,还天然兼容本地开发、Kubernetes 集群及跨云环境。将 artifact 视为“可解析的数据引用”而非“静态文件路径”,是构建健壮 MLOps 流水线的关键实践。










