我的设置
我为ML实验开发了一个环境,如下所示:使用SageMaker training Jobs在AWS云中进行培训。训练后的模型存储在/opt/ml/model
目录中,该目录由SageMaker保留,用于将模型打包为SageMaker自己的S3存储桶中的.tar.gz
。在训练和测试期间计算几个评估度量,并将其记录到由基于S3的工件存储组成的MLflow基础设施中(请参见场景4(。请注意,这是一个不同于SageMaker的S3存储桶。
MLflow的一个非常有用的功能是,任何模型工件都可以记录到训练运行中,因此数据科学家可以通过UI访问度量和更复杂的输出。这些输出包括(但不限于(经过训练的模型本身。
一个限制是,据我所知,用于记录工件的MLflow API只接受工件本身的本地路径作为输入,并总是将其上传到工件存储。当工件存储在MLflow之外的某个地方时,这是次优的,因为您必须将它们存储两次。变压器型号的重量可能超过1GB。
我的问题
- 有没有一种方法可以将S3路径传递给MLflow,并将其视为工件,而不必首先在本地下载
- 有没有一种方法可以避免将工件的副本推送到工件存储?如果我的工件已经位于另一个远程位置,那么最好只在MLflow中有一个到该位置的链接,而不是MLflow存储中的副本
您可以使用带有S3的跟踪服务器作为后端
基于这种动机
将始终将其上传到其工件存储中。当工件存储在MLflow之外的某个地方时,这是次优的,因为您必须将它们存储两次
我把这个问题理解为请求通过引用处理未由MLTracking管理的外部对象的伪影。我担心这可能很棘手,因为MLFlow被设计为以自己的结构化方式(模式(管理工件(读/写(。
你可以做
- [Partial integration]将路径记录为工件(这样您就可以运行指向对象的指针/引用(,并使用自定义代码管理它们。此外,在不久的将来,我们可以期待MLFlow模型API的更多功能,该模型正在积极开发中,并具有支持从轻量级sklearn到Transformers等各种库的变体
- [完全集成]原则上,您的用例可以通过遵循预先存在的模型的工作流来解决,在那里您需要定义自己的数据加载器(例如,它们可以从远程位置反序列化pickle对象,转换为MLFlow兼容的格式,等等(。但这是一种高级设置,很少推荐使用