导读:本期聚焦于唐僧创作的《如何在 MLRun 中安全高效地读取已存储的 CSV 类型 Artifact》,敬请观看详情。MLRun 把数据集、模型文件等内容统一抽象成 Artifact 进行管理,但不少人在读取已存储的 CSV 类型 Artifact 时会遇到路径解析失败、鉴权报错或数据格式错乱等问题。本文围绕 MLRun 的项目数据存储机制展开,先介绍 Artifact 的存储结构与 get_or_create_artifact 等常用接口的关系,再给出通过项目对象读取 CSV Artifact 的标准写法,涵盖本地运行与远程对象存储两种场景,并对 dataitem.get 函数、编码处理、大数据量分块读取等细节做深入分析,最后总结了常见报错的排查思路与最佳实践,帮助你稳定地把 CSV Artifact 加载进内存用于后续训练或分析。

在使用 MLRun 管理机器学习工作流时,我们把数据集、特征表、中间结果都以 Artifact 的形式登记到项目中,这样既方便版本追溯,也方便在不同任务之间共享。不过真正要把一个已经存储的 CSV 类型 Artifact 读回内存时,很多人会发现事情没那么简单:直接用本地路径读会报文件不存在,用 API 拿到的又是一个 ArtifactRecord 对象而不是数据本身。这篇文章就把读取 CSV Artifact 的完整链路讲清楚,并给出几种稳妥的读取方式。

如何在 MLRun 中安全高效地读取已存储的 CSV 类型 Artifact

理解 Artifact 的存储结构与读取入口

MLRun 中的 Artifact 由两部分组成:元数据记录和实际的数据文件。元数据保存在 MLRun 的数据库中,包含 artifact 的 key、tag、路径、类型等信息;而实际数据文件则落在 artifact 路径指向的位置,可能是本地目录,也可能是 S3、Azure Blob、v3io 等对象存储。理解这一点很关键,因为读取时我们必须先通过元数据找到真实路径,再去取数据,两步缺一不可。

常见的误区是把 Artifact 当成数据库里的一行记录直接解析。实际上当你通过 project.get_artifact("my-data") 拿到对象时,得到的是一个描述符,它记录了数据在哪里、是什么格式,但并不包含数据内容。真正的读取动作要借助数据项完成。MLRun 提供了 DataItem 抽象,它会自动处理不同后端的差异,比如本地文件直接读、S3 走 boto3 凭证、http 地址走网络请求,上层代码完全无感知。

还需要注意的是 Artifact 的 tag 机制。同一个 key 可能存在多个版本,默认读取的是 latest 标签。如果你想读取某个历史版本的数据,需要在获取时显式指定 tag,否则可能拿到的是被覆盖后的新数据,这一点在做实验复现时尤其容易踩坑。

标准读取方式:从项目对象出发

最推荐的读取入口是项目对象,因为它能自动带上项目上下文和默认凭证。下面是一段完整示例,演示如何获取 Artifact 并读取其中的数据:

import mlrun

# 获取项目对象
project = mlrun.get_or_create_project("my-project")

# 通过 key 获取已存储的 artifact 对象
artifact = project.get_artifact("my-csv-data")

# 转成 DataItem 后读取为 DataFrame
dataitem = artifact.to_dataitem()
df = dataitem.get()

print(df.head())

这段代码的核心是 to_dataitem() 这一步。它把元数据描述符转换成可读取的 DataItem,随后 get() 方法会根据文件后缀自动选择解析器,CSV 文件会被 pandas 直接读成 DataFrame,省去了手动构造路径的麻烦。如果只想拿原始字节,可以改用 dataitem.get(byte_range=(0, 1024))dataitem.download()

在函数运行时上下文中,读取会更简单。如果你的代码跑在 MLRun 的 function 里,上下文中已经注入了项目信息,直接用 context.get_input("my-csv-data").get() 就能拿到数据,无需重复获取项目对象。两种方式的底层逻辑一致,只是入口不同。

远程存储场景下的鉴权与性能处理

当 Artifact 存在 S3 等远程对象存储上时,鉴权是第一个要处理的问题。MLRun 不会凭空拿到你的云凭证,需要通过环境变量或 secret 注入。常见做法是在项目里配置 secret:

project.set_secrets({
    "AWS_ACCESS_KEY_ID": "your-access-key",
    "AWS_SECRET_ACCESS_KEY": "your-secret-key",
    "S3_ENDPOINT_URL": "https://s3.amazonaws.com"
})

配置完成后,DataItem 读取时会自动复用这些凭证,不需要在业务代码里出现任何明文密钥。如果是团队共享环境,更推荐用 MLRun 的 secret provider 对接 Vault 或 Kubernetes Secret,避免密钥落盘。

性能方面,CSV 本身是文本格式,大文件读取的瓶颈通常在网络传输和反序列化两处。如果 CSV 超过几百兆,建议先用 dataitem.download("local.csv") 把文件完整拉到本地再解析,避免 DataItem 内部走内存缓冲导致占用过高;或者改用分块读取:

import pandas as pd

local_path = dataitem.download("cached_data.csv")

for chunk in pd.read_csv(local_path, chunksize=50000):
    process(chunk)

分块方式可以显著降低内存峰值,对于需要逐批清洗或入库的场景特别合适。另外如果数据会反复使用,最好在第一次读取后把结果转存成 Parquet 格式的 Artifact,列式存储加压缩能让后续读取快一个数量级。

常见报错排查与注意事项

读取失败时可以按顺序检查三个环节。第一看元数据:确认 artifact 的 key 和 tag 是否正确,用 project.list_artifacts(tag="") 列出所有记录可以快速定位;第二看路径:打印 artifact.spec.target_path,确认路径指向的后端是否可达;第三看权限:远程存储报 403 或 AccessDenied 时,基本就是凭证缺失或过期。

编码问题也时有发生,特别是包含中文的 CSV。如果出现乱码,可以在 get() 之后不用默认参数,而是下载后用 pd.read_csv(path, encoding="utf-8") 显式指定编码,必要时尝试 gbk。此外,当 CSV 是通过 log_dataset 记录的,读取时可以优先用 mlrun.get_dataitem(dataset.artifact_url) 的方式,与数据集 API 保持一致,减少版本不匹配的问题。

最后提醒一点,读取历史版本数据时务必锁定 tag 或 producer 信息,不要依赖 latest。流水线反复运行时 latest 会不断变化,实验复现失败多半源于此。把这些细节处理好,MLRun 的 Artifact 体系就能真正成为数据管理的可靠底座。

MLRunArtifactCSV读取修改时间:2026-09-13 10:46:30

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260913/55950.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。