在EAS中,可以通过一个JSON格式的配置文件来定义和部署在线服务。当准备好JSON配置文件后,便可通过EAS控制台、EASCMD客户端或SDK等多种方式完成服务部署。
一、准备JSON配置文件
部署服务的核心是创建一个包含所有必需配置的JSON文件。对于初次使用者,建议在控制台的服务部署页面进行基础配置,系统会自动生成对应的JSON内容,可以在此基础上进行修改和扩展。
示例文件service.json如下,完整的参数列表及详细描述参见附录:JSON参数说明。
{
    "cloud": {
        "computing": {
            "instances": [
                {
                    "type": "ecs.c7a.large"
                }
            ]
        }
    },
    "containers": [
        {
            "image": "****-registry.cn-beijing.cr.aliyuncs.com/***/***:latest",
            "port": 8000,
            "script": "python app.py"
        }
    ],
    "metadata": {
        "cpu": 2,
        "instance": 1,
        "memory": 4000,
        "name": "demo"
    }
}二、使用JSON文件部署服务
控制台
- 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS。 
- 在推理服务页签,单击部署服务。在部署服务页面,选择。 
- 输入准备好的JSON文件,单击部署。等待一段时间,当服务状态变为运行中时,表明服务部署成功。 
EASCMD
通过客户端工具EASCMD,可以在自己服务器上对模型服务进行管理,包括创建、查看、删除及更新服务。具体操作步骤如下:
- 下载并认证客户端 - 如果您使用的是DSW开发环境并使用官方镜像,则已预置EASCMD客户端(路径: - /etc/dsw/eascmd64),否则请下载并认证客户端。
- 执行部署命令 - 在JSON文件所在目录,执行以下命令部署服务。以Windows64版本为例。更多操作请参见命令使用说明。 - eascmdwin64 create <service.json>- 其中:<service.json>需要替换为实际的JSON文件名称。 说明- 如果您使用的是DSW开发环境,需要上传JSON配置文件,请参见上传与下载文件。 - 系统返回如下类似结果。 - [RequestId]: 1651567F-8F8D-4A2B-933D-F8D3E2DD**** +-------------------+----------------------------------------------------------------------------+ | Intranet Endpoint | http://166233998075****.cn-shanghai.pai-eas.aliyuncs.com/api/predict/test_eascmd | | Token | YjhjOWQ2ZjNkYzdiYjEzMDZjOGEyNGY5MDIxMzczZWUzNGEyMzhi**** | +-------------------+--------------------------------------------------------------------------+ [OK] Creating api gateway [OK] Building image [registry-vpc.cn-shanghai.aliyuncs.com/eas/test_eascmd_cn-shanghai:v0.0.1-20221122114614] [OK] Pushing image [registry-vpc.cn-shanghai.aliyuncs.com/eas/test_eascmd_cn-shanghai:v0.0.1-20221122114614] [OK] Waiting [Total: 1, Pending: 1, Running: 0] [OK] Waiting [Total: 1, Pending: 1, Running: 0] [OK] Service is running
Python SDK
您还可以参考使用EAS Python SDK部署模型将训练获得的模型部署为EAS在线服务。
附录:JSON参数说明
| 参数 | 是否必选 | 描述 | 
| metadata | 是 | 服务的Meta信息。具体参数配置,详情请参见metadata参数说明。 | 
| cloud | 否 | 计算资源与专有网络配置,详情请参见cloud参数说明。 | 
| containers | 否 | 镜像配置,详情参见containers参数说明。 | 
| dockerAuth | 否 | 当镜像来源于私有仓库时,需配置dockerAuth,值为镜像仓库的 | 
| networking | 否 | 服务的调用配置。具体参数配置,详情请参见networking参数说明。 | 
| storage | 否 | 表示服务存储挂载等相关信息。详细配置说明,请参见存储挂载。 | 
| token | 否 | 表示访问鉴权的Token字符串。如果未指定,则系统自动生成。 | 
| model_path | 是 | 使用processor部署时必选。model_path和processor_path分别为模型和Processor的输入数据源地址,均支持以下格式的地址: 
 | 
| oss_endpoint | 否 | OSS的Endpoint,例如oss-cn-beijing.aliyuncs.com。其他取值请参见地域和Endpoint。 说明  默认无需指定该参数,会使用当前地域的内网OSS地址,来进行模型文件或Processor文件的下载。当跨地域访问OSS时,需要指定该参数。例如:当您在杭州地域部署服务时,model_path中填写了北京地域的OSS地址,则需要使用该参数来指定北京地域的OSS公网访问地址。 | 
| model_entry | 否 | 表示模型的入口文件,可以包含任意文件。如果未指定,则使用model_path中的文件名。主文件路径会传递给Processor中的initialize()函数。 | 
| model_config | 否 | 表示模型的配置,支持任意文本。该参数值会传递给Processor中initialize()函数的第二个参数。 | 
| processor | 否 | 
 | 
| processor_path | 否 | Processor相关的文件包路径,可以参见model_path参数的描述信息。 | 
| processor_entry | 否 | Processor的主文件。例如libprocessor.so或app.py,其中包含了预测所需的 当processor_type为cpp或python时,必须指定该参数。 | 
| processor_mainclass | 否 | Processor的主文件,JAR包中的mainclass。例如com.aliyun.TestProcessor。 当processor_type为java时,必须指定该参数。 | 
| processor_type | 否 | processor实现的语言,取值如下: 
 | 
| warm_up_data_path | 否 | 用于模型预热的请求文件路径。更多关于模型预热功能的介绍,详情请参见模型服务预热。 | 
| runtime.enable_crash_block | 否 | 当服务实例因Processor代码异常发生Crash后,服务实例是否会自动重启。取值如下: 
 | 
| autoscaler | 否 | 表示模型服务自动水平扩缩容的配置信息。具体参数配置,详情请参见水平自动扩缩容。 | 
| labels | 否 | 为EAS服务配置标签。格式为 | 
| unit.size | 否 | 表示分布式推理配置下单实例部署的机器数。默认值为2。 | 
| sinker | 否 | 支持将服务所有的请求和响应记录持久化保存到大数据MaxCompute或日志服务SLS中。具体参数配置,详情请参见sinker参数说明。 | 
| confidential | 否 | 通过配置系统信任管理服务,保证服务部署和调用的过程中数据、模型和代码等信息可以安全加密,实现安全可验证的推理服务。格式如下: 说明  安全加密环境主要针对您挂载的存储文件,请先完成存储文件的挂载再打开该功能。 参数配置说明如下,更详细的内容介绍,请参见安全加密推理服务。 
 | 
metadata参数说明
高级参数
cloud参数说明
| 参数 | 是否必选 | 描述 | |
| computing | instances | 否 | 使用公共资源组部署服务时,需设置该参数,表示使用的资源规格列表。当实例规格竞价失败或库存不足时,按照配置顺序依次尝试使用下一个实例规格创建服务。 
 | 
| disable_spot_protection_period | 否 | 使用竞价实例时,需设置该参数,取值如下: 
 | |
| networking | vpc_id | 否 | 分别表示为EAS服务绑定的专有网络VPC、交换机和安全组。 | 
| vswitch_id | 否 | ||
| security_group_id | 否 | ||
示例如下:
{
    "cloud": {
        "computing": {
            "instances": [
                {
                    "type": "ecs.c8i.2xlarge",
                    "spot_price_limit": 1
                },
                {
                    "type": "ecs.c8i.xlarge",
                    "capacity": "20%"
                }
            ],
            "disable_spot_protection_period": false
        },
        "networking": {
            "vpc_id": "vpc-bp1oll7xawovg9*****",
            "vswitch_id": "vsw-bp1jjgkw51nsca1e****",
            "security_group_id": "sg-bp1ej061cnyfn0b*****"
        }
    }
}containers参数说明
使用自定义镜像部署服务时,详情请参见自定义镜像。
| 参数 | 是否必选 | 描述 | |
| image | 是 | 使用镜像部署时必填。用于部署模型服务的镜像地址。 | |
| env | name | 否 | 镜像执行时的环境变量名称。 | 
| value | 否 | 镜像执行时的环境变量取值。 | |
| command | 二者必选其一 | 镜像的入口命令,只支持单一命令形式,不支持复杂脚本,如:cd xxx && python app.py,这种形式请使用下面的script参数来指定,command字段适应于镜像中无/bin/sh命令的场景。 | |
| script | 镜像的入口执行的脚本,可指定较为复杂的脚本形式,多行以\n或分号分隔。 | ||
| port | 否 | 容器端口。 重要  
 | |
| prepare | pythonRequirements | 否 | 实例启动前安装的python requirements列表,要求镜像中在系统路径中存在python和pip命令,list格式,如:  | 
| pythonRequirementsPath | 否 | 实例启动前安装的python requirements.txt文件地址,要求镜像中在系统路径中存在Python和pip命令,requirements.txt可直接打在镜像中,也可以由外部存储挂载的方式挂载到服务实例中,如:  | |
networking参数说明
| 参数 | 是否必选 | 描述 | 
| gateway | 否 | 为EAS服务配置的专属网关。 | 
| gateway_policy | 否 | 
 限流配置示例:  | 
sinker参数说明
| 参数 | 是否必选 | 描述 | |
| type | 否 | 支持配置以下两种存储类型: 
 | |
| config | maxcompute.project | 否 | MaxCompute项目名称。 | 
| maxcompute.table | 否 | MaxCompute数据表。 | |
| sls.project | 否 | SLS项目名称。 | |
| sls.logstore | 否 | SLS的Logstore。 | |
配置示例如下:
存储到MaxCompute
"sinker": {
        "type": "maxcompute",
        "config": {
            "maxcompute": {
                "project": "cl****",
                "table": "te****"
            }
        }
    }存储到日志服务SLS
"sinker": {
        "type": "sls",
        "config": {
            "sls": {
                "project": "k8s-log-****",
                "logstore": "d****"
            }
        }
    }附录:JSON配置示例
上述参数在JSON文件中的配置示例如下:
{
  "token": "****M5Mjk0NDZhM2EwYzUzOGE0OGMx****",
  "processor": "tensorflow_cpu_1.12",
  "model_path": "oss://examplebucket/exampledir/",
  "oss_endpoint": "oss-cn-beijing.aliyuncs.com",
  "model_entry": "",
  "model_config": "",
  "processor_path": "",
  "processor_entry": "",
  "processor_mainclass": "",
  "processor_type": "",
  "warm_up_data_path": "",
  "runtime": {
    "enable_crash_block": false
  },
  "unit": {
        "size": 2
    },
  "sinker": {
        "type": "maxcompute",
        "config": {
            "maxcompute": {
                "project": "cl****",
                "table": "te****"
            }
        }
    },
  "cloud": {
    "computing": {
      "instances": [
        {
          "capacity": 800,
          "type": "dedicated_resource"
        },
        {
          "capacity": 200,
          "type": "ecs.c7.4xlarge",
          "spot_price_limit": 3.6
        }
      ],
      "disable_spot_protection_period": true
    },
    "networking": {
            "vpc_id": "vpc-bp1oll7xawovg9t8****",
            "vswitch_id": "vsw-bp1jjgkw51nsca1e****",
            "security_group_id": "sg-bp1ej061cnyfn0b****"
        }
  },
  "autoscaler": {
    "min": 2,
    "max": 5,
    "strategies": {
      "qps": 10
    }
  },
  "storage": [
    {
      "mount_path": "/data_oss",
      "oss": {
        "endpoint": "oss-cn-shanghai-internal.aliyuncs.com",
        "path": "oss://bucket/path/"
      }
    }
  ],
  "confidential": {
        "trustee_endpoint": "xx",
        "decryption_key": "xx"
    },
  "metadata": {
    "name": "test_eascmd",
    "resource": "eas-r-9lkbl2jvdm0puv****",
    "instance": 1,
    "workspace_id": "1405**",
    "gpu": 0,
    "cpu": 1,
    "memory": 2000,
    "gpu_memory": 10,
    "gpu_core_percentage": 10,
    "qos": "",
    "cuda": "11.2",
    "enable_grpc": false,
    "enable_webservice": false,
    "rdma": 1,
    "rpc": {
      "batching": false,
      "keepalive": 5000,
      "io_threads": 4,
      "max_batch_size": 16,
      "max_batch_timeout": 50,
      "max_queue_size": 64,
      "worker_threads": 5,
      "rate_limit": 0,
      "enable_sigterm": false
    },
    "rolling_strategy": {
      "max_surge": 1,
      "max_unavailable": 1
    },
    "eas.termination_grace_period": 30,
    "scheduling": {
      "spread": {
        "policy": "host"
      }
    },
    "resource_rebalancing": false,
    "workload_type": "elasticjob",
    "shm_size": 100
  },
  "features": {
    "eas.aliyun.com/extra-ephemeral-storage": "100Gi",
    "eas.aliyun.com/gpu-driver-version": "tesla=550.127.08"
  },
  "networking": {
    "gateway": "gw-m2vkzbpixm7mo****"
  },
  "containers": [
    {
      "image": "registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz",
      "prepare": {
        "pythonRequirements": [
          "numpy==1.16.4",
          "absl-py==0.11.0"
        ]
      },
      "command": "python app.py",
      "port": 8000
    }
  ],
  "dockerAuth": "dGVzdGNhbzoxM*******"
}