PAI-Studio提供自定义Python脚本的功能,您可以使用该组件运行自定义的Python函数,并且支持自定义安装依赖包。本文为您介绍该组件的配置详情,包括自定义输入输出桩数量、脚本设置及执行配置。

背景信息

Python脚本组件位于PAI-Studio组件的自定义算法组件文件夹下。

前提条件

  • 由于Python脚本需要依赖于PAI-DLC作为底层计算引擎,因此您需要在AI工作空间关联PAI-DLC引擎,详情请参见添加PAI-DLC计算资源
  • 由于Python脚本依赖OSS作为中间存储环境,因此您需要先创建OSS Bucket,详情请参见创建存储空间
    注意 创建的OSS Bucket必须与PAI-Studio和PAI-DLC在同一地域。

输入输出桩设置

Python组件的输入输出桩为通用桩,可以接受任何来自上游组件的数据连接。在实际使用中,您可以根据实际情况配置输入和输出的数据桩数量。添加输入或输出桩数量的方法如下:
  1. Python脚本的配置面板,单击该组件的输入桩或输出桩。
  2. 在弹出的快捷菜单,单击复制此端口即可添加一个输入桩或输出桩。添加数据桩

脚本设置

代码提交分为以下三种提交模式:
  • 编辑框提交:轻量的代码提交模式,适合单个Python文件的运行。
  • 关联Git:PAI-Studio会自动从您设置的Git Repo中拉取代码并运行。在该模式下,您需要在代码根目录下的requirement.txt文件中指定待安装的相关依赖包。
  • 代码上传:该模式直接运行OSS上的文件。
本文以编辑框提交模式为例,详细介绍Python组件的代码配置。
脚本设置页签的编写代码文本框内,可以输入如下Python代码示例。
# coding: utf-8

import os
print(os.environ)

from pai_running.context import Context

def run():
    context = Context()
    # print input artifacts of the component.
    for art in context.input_artifacts:
        print(art, len(art))

    for sub_art in context.input_artifacts[0]:
        print(sub_art, sub_art.raw_value)
    print(context.input_artifacts[0][0])

    for art in context.output_artifacts:
        print(art)

    # Read/Write data from DataTunnel
    with open("./0.csv", "r") as f:
        for line in f.readline(100):
            print("input_0: ", line)

    with open("./1.csv", "r") as f:
        for line in f.readline(100):
            print("input_1: ", line)

    with open("./output.csv", "w") as writer:
        with open("./0.csv", "r") as reader:
            writer.writelines(reader.readlines())

    context.output_artifacts[0][0].write_oss(
        endpoint="oss-cn-hangzhou.aliyuncs.com",
        key="ExampleOutputKey",
        bucket="YourOssBucket",
    )
if __name__ == "__main__":
    run()
代码解析如下:
  1. context()pai_running的函数,您可以打印context对象,从而了解具体的Artifact构造。如下述代码所示。
        context = Context()
        # print input artifacts of the component.
        for art in context.input_artifacts:
            print(art, len(art))
    
        for sub_art in context.input_artifacts[0]:
            print(sub_art, sub_art.raw_value)
        print(context.input_artifacts[0][0])
    
        for art in context.output_artifacts:
            print(art)
  2. 输入输出桩。
    输入和输出的文件会通过Datatunnel的形式在PAI-DLC镜像中落盘,以下代码为输入桩和输出桩逻辑:
    • 两个输入桩的对接
       with open("./0.csv", "r") as f:
              for line in f.readline(100):
                  print("input_0: ", line)
      
          with open("./1.csv", "r") as f:
              for line in f.readline(100):
                  print("input_1: ", line)
    • 一个输出桩的逻辑
          with open("./output.csv", "w") as writer:
              with open("./0.csv", "r") as reader:
                  writer.writelines(reader.readlines())
    以上输入输出对应的是执行配置页签下的inputDataTunneloutputDataTunnel配置。
    {
      "inputDataTunnel": [
        {
          "name": "input_0", 
          "filePath": "/root/code/0.csv"
        },
        {
          "name": "input_2",
          "filePath": "/root/code/2.csv"
        }
      ],
      "outputDataTunnel": [
        {
          "name": "output_0",
          "filePath": "/root/code/output.csv"
        }
      ],
      "uploadConfig": {
    	"endpoint": "oss-cn-hangzhou.aliyuncs.com",
      	"bucket": "pai-dlc-test",
      	"path": "custom_job/test_case_1/node1_1"
      },
      "jobConfig": {
        "jobType": "generalJob",
        "taskSpec": {
          "instanceType": "ecs.c6.large",
          "imageUri": "registry.cn-hangzhou.aliyuncs.com/paiflow-public/custom-script-py3:v0.1.0"
        }
      }
    }
  3. 定义输出桩的Artifact。
    如果输出桩需要跟下游组件链接,则需要定义输出桩的Artifact。
        context.output_artifacts[0][0].write_oss(
            endpoint="oss-cn-hangzhou.aliyuncs.com",
            key="ExampleOutputKey",
            bucket="YourOssBucket",
        )
  4. 第三方库依赖
    脚本设置页签的第三方依赖库文本框内,您可以通过添加脚本的方式安装第三方依赖包,格式与Python的requirement.txt相同,如下所示。
    cycler==0.10.0            # via matplotlib
    kiwisolver==1.2.0         # via matplotlib
    matplotlib==3.2.1
    numpy==1.18.5
    pandas==1.0.4
    pyparsing==2.4.7          # via matplotlib
    python-dateutil==2.8.1    # via matplotlib, pandas
    pytz==2020.1              # via pandas
    scipy==1.4.1              # via seaborn
  5. 执行命令

    脚本设置页签的执行命令文本框内,输入您需要执行的命令。例如python main.py

执行配置

在执行配置中,主要配置组件的输入输出和运行资源。以下重点介绍运行资源jobConfig的配置。
  "jobConfig": {
    "jobType": "generalJob",
    "taskSpec": {
      "instanceType": "ecs.g6.large",
      "imageUri": "registry.cn-hangzhou.aliyuncs.com/paiflow-public/custom-script-py3:v0.1.0"
    }
  }
参数含义如下所示:
  • jobType:任务类型。目前系统仅支持generalJob,表示单节点任务。
  • instanceType:运行机型。系统支持通过下拉模式选择运行机型,您可以根据实际需要选择。选择运行机型
  • imageUri:容器镜像。系统支持Python 2和Python 3两种镜像,您可以根据实际需要配置镜像。