AWS - Step 函数,在 TuningStep 中使用执行输入

Shl*_*rtz 6 python machine-learning state-machine hyperparameters aws-step-functions

我用一个步骤编写了一个简单的 AWS 步骤函数工作流程:

from stepfunctions.inputs import ExecutionInput
from stepfunctions.steps import Chain, TuningStep
from stepfunctions.workflow import Workflow
import train_utils


def main():
    workflow_execution_role = 'arn:aws:iam::MY ARN'
    execution_input = ExecutionInput(schema={
        'app_id': str
    })
    estimator = train_utils.get_estimator()
    tuner = train_utils.get_tuner(estimator)

    tuning_step = TuningStep(state_id="HP Tuning", tuner=tuner, data={
        'train': f's3://my-bucket/{execution_input["app_id"]}/data/'},
                             wait_for_completion=True,
                             job_name='HP-Tuning')

    workflow_definition = Chain([
        tuning_step
    ])

    workflow = Workflow(
        name='HP-Tuning',
        definition=workflow_definition,
        role=workflow_execution_role,
        execution_input=execution_input
    )
    workflow.create()


if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

我的目标是从运行时提供的执行 JSON 中提取训练输入。当我执行工作流(从步骤函数控制台)时,提供 JSON{"app_id": "My App ID"}调整步骤不会获得正确的数据,而是获得stepfunctions.inputs.placeholders.ExecutionInput. 此外,在查看生成的 ASL 时,我可以看到执行输入被呈现为字符串:

... 
"DataSource": {
   "S3DataSource": {
   "S3DataType": "S3Prefix",
   "S3Uri": "s3://my-bucket/<stepfunctions.inputs.placeholders.ExecutionInput object at 0x12261f7d0>/data/",
    "S3DataDistributionType": "FullyReplicated"
    }
},
...
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

更新: 正如@yoodan 提到的,SDK 可能落后了,所以我必须在调用 create 之前编辑定义。我可以看到有一种方法可以在调用 create 之前查看定义,但是我可以修改图形定义吗?如何?

小智 2

用于步骤函数的Python SDK会生成相应的代码,我们需要亚马逊状态语言中内置的字符串连接/格式来完成您想要的。

最近在 2020 年 8 月,Amazon States Language 在其语言规范中引入了字符串格式等内置功能。https://states-language.net/#appendix-b

不幸的是,python SDK 不是最新的并且不支持新的更改。

作为解决方法,也许可以在调用工作流创建之前手动修改定义?