【问题标题】:Sagemaker Pipelines | Pass list of strings as parameterSagemaker 管道 |将字符串列表作为参数传递
【发布时间】:2022-10-16 02:02:39
【问题描述】:

Sagemaker 管道仅具有单个值(字符串、浮点数等)的参数类,但我如何处理最能由列表表示的参数(例如,从包含许多文件的文件中选择用于训练的特征列表特征)?

【问题讨论】:

    标签: pipeline amazon-sagemaker mlops


    【解决方案1】:

    根据SageMaker documentation,这是参数的已知限制。

    解决方案是改用sagemaker.workflow.functions.Join() 来连接字符串。

    from sagemaker.workflow.functions import Join
    
    my_string = Join(on="", values=[
        "s3://",
        ParameterString(name="MyBucket", default_value=""),
        "/training"]
    )
    

    【讨论】:

    • 我不清楚这有什么帮助。您发布的示例返回一个字符串,我猜它会被 Sagemaker 简单地解释为一个字符串。列表的概念在哪里(即多个项目是分开的,而不是连接成一个长项目)在那里?
    【解决方案2】:

    背景:遵循最佳实践,一般来说,使用特征名称(例如,数据框熊猫的列名),它们之间应该没有空格。

    基本情况

    绕过你的问题,您可以使用字符串作为参数,其中每个元素都是单个特征。

    features = "feature_0 feature_1 feature_2"
    

    然后,与ParameterString 一起正常使用。

    如果不能这样,我建议在名称之间插入特定的分隔模式而不是空格,然后将整个字符串拆分为特征列表。

    此时,在训练脚本中,您将参数传递给 ArgumentParser,您可以将其配置为将空格分隔的单词字符串重新处理为单个单词的列表。

    import argparse
    
    if __name__ == "__main__":
    
        parser = argparse.ArgumentParser()
    
        parser.add_argument(
            "--features",
            nargs="*",
            type=str,
            default=[]
        )
    
        args, _ = parser.parse_known_args()
    

    额外案例

    如果在将参数传递给管道组件(例如,预处理器)时将字符串错误地直接解释为列表,则可以使用输入重新解释函数重新处理后者。

    import itertools
    
    def decode_list_of_strings_input(str_input: str) -> []:
        str_input = [s.split() for s in str_input]
        return list(itertools.chain.from_iterable(str_input))
    

    这是使用此代码的示例:

    features = ['a b c']
    features = decode_list_of_strings_input(features)
    
    print(features)
    >>> ['a', 'b', 'c']
    

    【讨论】:

      猜你喜欢
      • 2015-06-02
      • 1970-01-01
      • 2022-07-27
      • 2019-02-05
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      相关资源
      最近更新 更多