在业务开发过程中,通常存在复杂的环境依赖。如果通过Processor的形式进行模型服务部署,则需要将依赖的共享库统一打包到Processor中,无法通过yum install命令将依赖包直接安装至系统路径下,灵活性较差。因此PAI-EAS推出了使用自定义镜像部署模型服务。本文介绍使用自定义镜像部署模型服务的详细步骤。

前提条件

背景信息

与Processor部署相比,使用自定义镜像部署模型服务的优点主要体现在易用性方面:
  • 部署方式简单,您直接提供镜像进行部署,无需准备相关的参数和配置文件。
  • 线下环境与线上环境完全一致,避免了线下测试通过后,线上因为缺包导致的无法运行情况。
与Processor部署相比,使用自定义镜像部署模型服务的缺点主要体现在以下三方面:
  • 出于安全考虑,平台需要对服务提供认证接口,无法将用户镜像中自带的HTTP接口直接对外提供服务。
  • 认证、监控及流量等相关功能依赖PAI-EAS引擎。例如,流量需要经过PAI-EAS引擎转发到您的镜像中,在高并发、大流量的场景中,存在性能损耗。

使用自定义镜像部署模型服务时,PAI-EAS引擎以Sidecar的形式和您的容器一起运行。

注意事项

使用自定义镜像部署模型服务时,您需要注意以下事项:
  • 由于PAI-EAS不开放公网访问权限,因此您需要将镜像上传至阿里云容器镜像服务ACR中,并使用VPC内网Registry地址进行部署。例如,registry-vpc.cn-shanghai.aliyuncs.com
  • 如果使用PAI-EAS提供的Python SDK作为服务镜像,并使用本文的镜像部署功能,则镜像内的服务需要避开8080端口,端口配置在MyProcessor的构造函数配置项,详情请参见使用Python开发自定义Processor

部署模型服务

  1. 创建服务描述文件image.json,文件内容的示例如下。
    {
        "containers":[
            {
                "image":"registry-vpc.cn-shanghai.aliyuncs.com/easapp/eas-container-deploy-test:20201009****",
                "env":
                [
                    {
                        "name":"VAR_NAME",
                        "value":"var_value"
                    }
                ],
                "command":"/data/eas/ENV/bin/python /data/eas/app1.py",
                "port":8000
            }
        ],
        "dockerAuth":"YWJjZDphYmNkZTEy****",
        "metadata":{
            "cpu":1,
            "instance":1,
            "memory":1000
        },
        "name":"registry_test"
    }
    JSON文件内的参数解释如下表所示。
    参数 是否必选 描述
    containers image 用于部署模型服务的镜像地址。

    由于PAI-EAS不开放公网访问权限,因此您需要使用VPC内网Registry地址进行部署。例如,registry-vpc.cn-shanghai.aliyuncs.com

    env name 镜像执行时的环境变量名称。
    value 镜像执行时的环境变量取值。
    command 镜像的入口命令。
    port 容器端口。
    注意 由于PAI-EAS引擎监听固定的8080端口,因此容器端口需要避开8080端口。
    dockerAuth 如果使用私有仓库中的镜像,则需要通过该参数指定Docker Registry的认证信息。目前,认证信息仅支持username:password的Base 64编码形式。

    例如,username:password取值为abcd:abcde12345时,命令echo -n "abcd:abcde12345" | base64返回YWJjZDphYmNkZTEy****,即为dockerAuth的取值。

    metadata 服务的Meta信息,详细参数请参见表 1
    name 服务名称,必须在同一地域内唯一。
  2. 通过客户端工具的create命令部署模型服务。
    eascmd create image.json
    其中image.json表示上一步中创建的服务描述文件。
    系统返回如下类似结果,包括服务的访问地址和访问Token。
    [RequestId]: BFFFE5F5-1F07-437E-B59A-AF1F2B66****
    +-------------------+-----------------------------------------------------------------------------------+
    | Internet Endpoint | http://1828488879222746.cn-shanghai.pai-eas.aliyuncs.com/api/predict/registry_test     |
    | Intranet Endpoint | http://1828488879222746.vpc.cn-shanghai.pai-eas.aliyuncs.com/api/predict/registry_test |
    |             Token | NjA4MzQxOWQ0MTY2M2Y4OGY0NjgwODkwZTZmYWJmZWU1ZmY0Njhk****                          |
    +-------------------+-----------------------------------------------------------------------------------+
    [OK] Service is now creating
    [OK] Waiting [Total: 2, Pending: 2, Running: 0]
    [OK] Running [Total: 2, Pending: 0, Running: 2]
    [OK] Service is running
  3. 如果需要修改服务配置,则通过客户端工具的modify命令实现。
    修改上述服务的示例命令如下,关于modify命令的详情信息,请参见修改服务配置
    eascmd modify registry_test -s image.json
    其中registry_test表示服务名称,image.json表示服务描述文件。

后续步骤

模型服务部署后,您可以根据create命令返回的访问地址进行在线服务预测。

实际访问服务时,需要在该访问地址后加上镜像中的应用目录。例如create命令返回的访问地址为http://1828488879222746.cn-shanghai.pai-eas.aliyuncs.com/api/predict/registry_test,镜像中的应用目录为/hello/model,则最终访问地址为http://1828488879222746.cn-shanghai.pai-eas.aliyuncs.com/api/predict/registry_test/hello/model。关于如何访问服务,请参见服务调用方式