更新时间:2024-02-08 GMT+08:00

使用案例

主要包含三种场景的用例:

  • 新增在线服务
  • 更新在线服务
  • 服务部署输出推理地址

新增在线服务

import modelarts.workflow as wf
# 通过ServiceStep来定义一个服务部署节点,输入指定的模型进行服务部署

# 定义模型名称参数
model_name = wf.Placeholder(name="placeholder_name", placeholder_type=wf.PlaceholderType.STR)

service_step = wf.steps.ServiceStep(
    name="service_step", # 服务部署节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复
    title="新增服务",  # 标题信息
    inputs=wf.steps.ServiceInput(name="si_service_ph", data=wf.data.ServiceInputPlaceholder(name="si_placeholder1", 
                                                                                  # 模型名称的限制/约束,在运行态只能选择该模型名称;一般与模型注册节点中的model_name使用同一个参数对象
                                                                                  model_name=model_name)),# ServiceStep的输入列表
    outputs=wf.steps.ServiceOutput(name="service_output") # ServiceStep的输出
)

workflow = wf.Workflow(
    name="service-step-demo",
    desc="this is a demo workflow",
    steps=[service_step]
)

更新在线服务

使用场景:使用新版本的模型对已有的服务进行更新,需要保证新版本的模型与已部署服务的模型名称一致。

import modelarts.workflow as wf
# 通过ServiceStep来定义一个服务部署节点,输入指定的模型对已部署的服务进行更新

# 定义模型名称参数
model_name = wf.Placeholder(name="placeholder_name", placeholder_type=wf.PlaceholderType.STR)

# 定义服务对象
service = wf.data.ServiceUpdatePlaceholder(name="placeholder_name")

service_step  = wf.steps.ServiceStep(
    name="service_step", # 服务部署节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复
    title="服务更新", # 标题信息
    inputs=[wf.steps.ServiceInput(name="si2", data=wf.data.ServiceInputPlaceholder(name="si_placeholder2", 
                                                                                  # 模型名称的限制/约束,在运行态只能选择该模型名称
                                                                                  model_name=model_name)),
           wf.steps.ServiceInput(name="si_service_data", data=service) # 已部署的服务在运行时配置;data也可使用wf.data.ServiceData(service_id="fake_service")表示
    ], # ServiceStep的输入列表
    outputs=wf.steps.ServiceOutput(name="service_output") # ServiceStep的输出
)

workflow = wf.Workflow(
    name="service-step-demo",
    desc="this is a demo workflow",
    steps=[service_step]
)

服务部署输出推理地址

服务部署节点支持输出推理地址,通过get_output_variable("access_address")方法获取输出值,并在后续节点中使用。

  • 针对部署在公共资源池的服务,可以通过access_address属性从输出中获取注册在公网的推理地址。
  • 针对部署在专属资源池的服务,除了可以获取注册在公网的推理地址,还能通过cluster_inner_access_address属性从输出中获取内部使用的推理地址,并且该地址只能在其他推理服务中进行访问。
    import modelarts.workflow as wf
    
    # 定义模型名称参数
    sub_model_name = wf.Placeholder(name="si_placeholder1", placeholder_type=wf.PlaceholderType.STR)
    
    sub_service_step = wf.steps.ServiceStep(
        name="sub_service_step", # 服务部署节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复
        title="子服务",  # 标题信息
        inputs=wf.steps.ServiceInput(
            name="si_service_ph",
            data=wf.data.ServiceInputPlaceholder(name="si_placeholder1", model_name=sub_model_name)
        ),# ServiceStep的输入列表
        outputs=wf.steps.ServiceOutput(name="service_output") # ServiceStep的输出
    )
    
    
    main_model_name = wf.Placeholder(name="si_placeholder2", placeholder_type=wf.PlaceholderType.STR)
    
    # 获取子服务输出的推理地址,并通过envs传递给主服务
    main_service_config = wf.steps.ServiceConfig(
        infer_type="real-time", 
        envs={"infer_address": sub_service_step.outputs["service_output"].get_output_variable("access_address")} # 获取子服务输出的推理地址,并通过envs传递到主服务中
    )
    
    main_service_step = wf.steps.ServiceStep(
        name="main_service_step", # 服务部署节点的名称,命名规范(只能包含英文字母、数字、下划线(_)、中划线(-),并且只能以英文字母开头,长度限制为64字符),一个Workflow里的两个step名称不能重复
        title="主服务",  # 标题信息
        inputs=wf.steps.ServiceInput(
            name="si_service_ph",
            data=wf.data.ServiceInputPlaceholder(name="si_placeholder2", model_name=main_model_name)
        ),# ServiceStep的输入列表
        outputs=wf.steps.ServiceOutput(name="service_output", service_config=main_service_config), # ServiceStep的输出
        depend_steps=sub_service_step
    )
    
    workflow = wf.Workflow(
        name="service-step-demo",
        desc="this is a demo workflow",
        steps=[sub_service_step, main_service_step]
    )