全部产品
云市场

自定义Processor PythonSDK

更新时间:2019-10-01 10:16:19

简介

PAI-EAS提供Python SDK,用于帮助算法同学更快的开发和部署线上模型。Python SDK支持Tensorflow、PyTorch以及scikit-learn等基于Python的开源机器学习框架,也可以集成 Pandas 等数据分析处理框架。

使用EAS Python SDK可快速将本地预测逻辑直接转换成在线服务,Python SDK中内置了EAS为AI Inference场景所订制的高性能的PRC框架,以及与EAS集群中各项高级功能交互所需要的内部接口,用户通过简单的接口实现即可将服务部署到EAS集群中,使用EAS所提供的模型监控,蓝绿发布,弹性伸缩,高速直连等功能。

我们通过一个例子介绍如何快速在 PAI-EAS 上部署一个 Python 模型。

前提

为了保障服务的安全性,自定义processor需要在预付费专属资源组中使用,如果您还没有创建过预付费资源组,可以先在PAI-EAS控制台新建专属资源组

构建开发环境

开发环境可使用pyenv或conda等python包管理工具来构建,EAS提供的客户端工具eascmd将构建过程进行了封装,可以一条命令构建python sdk开发环境,若需求更加定制化,则也可以选择手工的方式来构建开发环境。

使用eascmd初始化

eascmd详细使用文档

eascmd是EAS提供的客户端工具,将python sdk的初始化过程进行了封装,用户下载后可直接通过一条命令来初始化python sdk环境,并生成相关的文件模板。

  1. # 安装并初始化eascmd,示例是安装Linux环境下的eascmd工具
  2. # 其他环境下的eascmd可以从上面的eascmd详细使用文档中下载
  3. $ wget http://eas-data.oss-cn-shanghai.aliyuncs.com/tools/eascmd64
  4. # 下载完成之后继续操作修改访问权限,配置您在阿里云上的AccessKey信息
  5. $ chmod +x eascmd64
  6. $ ./eascmd64 config -i <access_id> -k <access_key> -e pai-eas.cn-beijing.aliyuncs.com
  1. # 初始化环境
  2. $ ./eascmd64 pysdk init ./pysdk_demo

输入python版本,默认为3.6,即会自动创建python环境ENV目录,预测服务代码模板app.py,服务部署模板app.json

手工初始化

如果eascmd不能满足您的需求,或在初始化过程中遇到问题,也可以尝试手工初始化,过程同样很简单,这里推荐使用conda环境来部署,在命令行执行如下命令:

  1. mkdir demo
  2. cd demo
  3. # 使用conda创建python环境,目录需指定固定名字:ENV
  4. conda create -p ENV python=3.6
  5. # 安装EAS python sdk
  6. ENV/bin/pip install http://eas-data.oss-cn-shanghai.aliyuncs.com/sdk/allspark-0.7-py2.py3-none-any.whl
  7. # 安装其它依赖包,以tensorflow1.14为例
  8. ENV/bin/pip install tensorflow==1.14

若本地未安装conda,请先安装conda环境:

  1. $ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
  2. $ sh Miniconda3-latest-Linux-x86_64.sh

编写预测逻辑

在ENV同级目录下创建预测服务主文件app.py,EAS提供了如下SDK封装,使用eascmd初始化环境时会自动生成:

  1. # -*- coding: utf-8 -*-
  2. import allspark
  3. class MyProcessor(allspark.BaseProcessor):
  4. """ MyProcessor is a example
  5. you can send mesage like this to predict
  6. curl -v http://127.0.0.1:8080/api/predict/service_name -d '2 105'
  7. """
  8. def initialize(self):
  9. """ load module, executed once at the start of the service
  10. do service intialization and load models in this function.
  11. """
  12. self.module = {'w0': 100, 'w1': 2}
  13. def pre_proccess(self, data):
  14. """ data format pre process
  15. """
  16. x, y = data.split(b' ')
  17. return int(x), int(y)
  18. def post_process(self, data):
  19. """ proccess after process
  20. """
  21. return bytes(data, encoding='utf8')
  22. def process(self, data):
  23. """ process the request data
  24. """
  25. x, y = self.pre_proccess(data)
  26. w0 = self.module['w0']
  27. w1 = self.module['w1']
  28. y1 = w1 * x + w0
  29. if y1 >= y:
  30. return self.post_process("True"), 200
  31. else:
  32. return self.post_process("False"), 400
  33. if __name__ == '__main__':
  34. # paramter worker_threads indicates concurrency of processing
  35. runner = MyProcessor(worker_threads=10)
  36. runner.run()

上述代码即为python sdk的简单示例,用户需继承EAS提供的基类BaseProcessor,实现initialize()和process()两个函数,其中process()函数的输入输出均为bytes类型,输出两个参数分别为response_data和status_code,正常请求status_code可返回0或200。

本地测试服务

  1. ./ENV/bin/python app.py
  2. curl http://127.0.0.1:8080/test -d '10 20'

发布线上服务

完成 Python代码开发后,可以进行打包部署,分两个步骤,一个是打包上传,一个是部署

  1. # 打包并上传我们开发的代码(包含环境配置)
  2. $ ./eascmd64 pysdk pack -u ./demo
  3. [PYSDK] Creating package: /home/xingke.lwp/code/test/demo.tar.gz
  4. [PYSDK] Uploading package: /home/xingke.lwp/code/test/demo.tar.gz
  5. [OK] oss target path: [oss://eas-model-beijing/1955570263925790/demo.tar.gz]
  6. Succeed: Total num: 1, size: 12,435,932. OK num: 1(upload 1 files).
  7. # 编写服务描述文件app.json,demo如下,将upload命令返回的oss地址填入processor_path中
  8. # 使用eascmd初始化环境时,会自动生成app.json模板
  9. $ ./eascmd64 create app.json
  10. [RequestId]: 1202D427-8187-4BCB-8D32-D7096E95B5CA
  11. +-------------------+-------------------------------------------------------------------+
  12. | Intranet Endpoint | http://pai-eas-vpc.cn-beijing.aliyuncs.com/api/predict/pysdk_demo |
  13. | Token | ZTBhZTY3ZjgwMmMyMTQ5OTgyMTQ5YmM0NjdiMmNiNmJkY2M5ODI0Zg== |
  14. +-------------------+-------------------------------------------------------------------+
  15. [OK] Waiting task server to be ready
  16. [OK] Fetching processor from [oss://eas-model-beijing/1955570263925790/pack.tar.gz]
  17. [OK] Building image [registry-vpc.cn-beijing.aliyuncs.com/eas/pysdk_demo_cn-beijing:v0.0.1-20190806082810]
  18. [OK] Pushing image [registry-vpc.cn-beijing.aliyuncs.com/eas/pysdk_demo_cn-beijing:v0.0.1-20190806082810]
  19. [OK] Waiting [Total: 1, Pending: 1, Running: 0]
  20. [OK] Service is running
  21. # 在vpc环境中测试服务
  22. $ curl http://pai-eas-vpc.cn-beijing.aliyuncs.com/api/predict/pysdk_demo -H 'Authorization: ZTBhZTY3ZjgwMmMyMTQ5OTgyMTQ5YmM0NjdiMmNiNmJkY2M5ODI0Zg==' -d 'hello eas'

服务描述模板app.json

注:resource字段为预付费专用资源组的ID,此处必填,公共资源组中不允许自定义processor
如果还没有创建过预付费资源组,可以先在PAI-EAS控制台新建资源组,请保证资源组所属的region和eascmd配置的endpoint中指定的region一致

  1. {
  2. "name": "pysdk_demo",
  3. "processor_entry": "./app.py",
  4. "processor_type": "python",
  5. "processor_path": "oss://eas-model-beijing/xxxxxxxxxxx/pack.tar.gz",
  6. "metadata": {
  7. "instance": 1,
  8. "memory": 2000,
  9. "resource": "EAS-xxxxxxxxx",
  10. "cpu": 1
  11. }
  12. }