【发布时间】:2022-10-16 02:02:39
【问题描述】:
Sagemaker 管道仅具有单个值(字符串、浮点数等)的参数类,但我如何处理最能由列表表示的参数(例如,从包含许多文件的文件中选择用于训练的特征列表特征)?
【问题讨论】:
标签: pipeline amazon-sagemaker mlops
Sagemaker 管道仅具有单个值(字符串、浮点数等)的参数类,但我如何处理最能由列表表示的参数(例如,从包含许多文件的文件中选择用于训练的特征列表特征)?
【问题讨论】:
标签: pipeline amazon-sagemaker mlops
根据SageMaker documentation,这是参数的已知限制。
解决方案是改用sagemaker.workflow.functions.Join() 来连接字符串。
from sagemaker.workflow.functions import Join
my_string = Join(on="", values=[
"s3://",
ParameterString(name="MyBucket", default_value=""),
"/training"]
)
【讨论】:
背景:遵循最佳实践,一般来说,使用特征名称(例如,数据框熊猫的列名),它们之间应该没有空格。
至绕过你的问题,您可以使用字符串作为参数,其中每个元素都是单个特征。
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']
【讨论】: