Desarrolle y depure un procesador de Python personalizado. Después, cárguelo junto con su archivo de modelo a OSS para el despliegue del servicio.
Flujo de trabajo
Para desarrollar un procesador de Python personalizado, complete los siguientes pasos:
-
Step 1: Set up the development environment
El SDK de Python de EAS es compatible con diversos frameworks de aprendizaje automático en Python. Además, se integra con frameworks de procesamiento de datos como Pandas. Configure un entorno local de Python, desarrolle los procesadores personalizados y, por último, empaquete y cargue el entorno.
-
Step 2: Write the prediction logic
El SDK de Python de EAS proporciona un framework RPC de alto rendimiento e interfaces internas para interactuar con el clúster de EAS. Escriba la lógica de predicción e implemente una interfaz sencilla para desplegar su servicio de modelo en EAS.
-
Step 3: Test the service locally
Pruebe el servicio de forma local para comprobar que la lógica de predicción sea correcta. Así garantiza que el servicio funcione según lo esperado tras el despliegue.
-
Step 4: Package the code and Python environment
Empaquete el código y el entorno para el despliegue del servicio.
-
Step 5: Upload the processor package and model file
Cargue por separado el paquete y los archivos de modelo a Object Storage Service (OSS).
-
Step 6: Deploy and test the service
Despliegue su procesador personalizado como un servicio de modelo y compruebe que funcione correctamente.
Separe el archivo de modelo del procesador para reutilizar el paquete del procesador cuando aplique fine-tune y vuelva a desplegar el modelo. En la lógica de predicción, utilice el método
get_model_path()para obtener la ruta de almacenamiento del modelo. De este modo, la lógica podrá cargarlo.Si su procesador personalizado tiene muchas dependencias o genera un paquete muy grande, utilice una imagen para desplegar el servicio. Para comparar ambos métodos de despliegue, consulte How it works (Image deployment).
Requisitos previos
Prepare un archivo de modelo.
Desarrolle el archivo de modelo y el procesador personalizado por separado. Cárguelos a OSS de forma individual para poder montarlos durante el despliegue del servicio.
Paso 1: Configuración del entorno de desarrollo
Utilice herramientas de gestión de paquetes de Python, como Pyenv, para configurar un entorno de desarrollo. EAS proporciona la herramienta cliente EASCMD, la cual encapsula el proceso de inicialización del SDK de Python. Tras descargar la herramienta, ejecute un solo comando para inicializar el entorno del SDK de Python y generar las plantillas de archivos. EASCMD solo es compatible con Linux. A continuación se muestra un ejemplo:
# Install and initialize EASCMD. This example shows how to install the EASCMD client for Linux.
$ wget https://eas-data.oss-cn-shanghai.aliyuncs.com/tools/eascmd/v2/eascmd64
# After the download is complete, modify the access permissions and configure your Alibaba Cloud AccessKey pair.
$ chmod +x eascmd64
$ ./eascmd64 config -i <access_id> -k <access_key>
# Initialize the environment.
$ ./eascmd64 pysdk init ./pysdk_demo
Cuando el sistema lo solicite, introduzca una versión de Python (la versión predeterminada es la 3.6). El sistema creará un directorio de entorno de Python llamado ENV, una plantilla de código de servicio de predicción llamada app.py y una plantilla de despliegue de servicio llamada app.json dentro del directorio ./pysdk_demo.
Paso 2: Escritura de la lógica de predicción
En el mismo directorio que ENV, cree el archivo principal del servicio de predicción con el nombre app.py. Por ejemplo:
Si utiliza EASCMD para inicializar el entorno de Python, el archivo app.py se genera automáticamente. Modifique el contenido del archivo según sus necesidades.
# -*- coding: utf-8 -*-
import allspark
class MyProcessor(allspark.BaseProcessor):
""" MyProcessor is an example
you can send mesage like this to predict
curl -v http://127.0.0.1:8080/api/predict/service_name -d '2 105'
"""
def initialize(self):
""" load module, executed once at the start of the service
do service initialization and load models in this function.
"""
self.module = {'w0': 100, 'w1': 2}
# model_dir = self.get_model_path().decode()
# You must implement the load_model function yourself. For example, to load a model.pt file, you can implement it as torch.load(model_dir + "/model.pt").
# self.model = load_model(model_dir)
def pre_process(self, data):
""" data format pre process
"""
x, y = data.split(b' ')
return int(x), int(y)
def post_process(self, data):
""" process after process
"""
return bytes(data, encoding='utf8')
def process(self, data):
""" process the request data
"""
x, y = self.pre_process(data)
w0 = self.module['w0']
w1 = self.module['w1']
y1 = w1 * x + w0
if y1 >= y:
return self.post_process("True"), 200
else:
return self.post_process("False"), 400
if __name__ == '__main__':
# allspark.default_properties().put('rpc.keepalive', '10000')
# Set the service timeout to 10s. The default is 5s.
# The worker_threads parameter indicates the processing concurrency.
runner = MyProcessor(worker_threads=10)
runner.run()
Este ejemplo hereda la clase base BaseProcessor proporcionada por EAS e implementa las funciones initialize() y process().
|
Método |
Descripción |
Uso |
|
initialize() |
Método de inicialización del procesador. Ejecuta tareas de inicialización, como la carga del modelo, cuando se inicia el servicio. |
Agregue el siguiente código a
|
|
get_model_path() |
Devuelve el directorio de almacenamiento del archivo de modelo como un objeto bytes. |
Cuando se especifica el parámetro |
|
process(data) |
Método de manejo de solicitudes. Para cada solicitud, el cuerpo de la petición se pasa a process(). El valor devuelto se envía al cliente. |
data: cuerpo de la solicitud, de tipo BYTES. Los valores de retorno son BYTES e INT, que corresponden a response_data y status_code. Para una solicitud normal, status_code puede ser 0 o 200. |
|
_init_(worker_threads=5, worker_processes=1,endpoint=None) |
Constructor del procesador. |
|
|
run() |
Inicia el servicio. |
Ninguna. |
Paso 3: Prueba local del servicio
-
En el directorio que contiene app.py, ejecute el siguiente comando para iniciar la aplicación.
./ENV/bin/python app.pySalida esperada si la ejecución es correcta:
[INFO] waiting for service initialization to complete... [INFO] service initialization complete [INFO] create service [INFO] rpc binds to predefined port 8080 [INFO] install builtin handler call to /api/builtin/call [INFO] install builtin handler eastool to /api/builtin/eastool [INFO] install builtin handler monitor to /api/builtin/monitor [INFO] install builtin handler ping to /api/builtin/ping [INFO] install builtin handler prop to /api/builtin/prop [INFO] install builtin handler realtime_metrics to /api/builtin/realtime_metrics [INFO] install builtin handler tell to /api/builtin/tell [INFO] install builtin handler term to /api/builtin/term [INFO] Service start successfully -
Abra una nueva terminal y ejecute el siguiente comando para probar la aplicación.
Con base en el código de ejemplo de Step 2, envíe datos de solicitud a la aplicación. El resultado devuelto refleja la lógica del código.
curl http://127.0.0.1:8080/test -d '10 20'
Paso 4: Empaquetado del código y del entorno
EASCMD ofrece un comando de empaquetado en un solo paso. Si no utiliza EASCMD, empaquete el entorno manualmente. A continuación se describen ambos métodos.
-
Comando de empaquetado de EASCMD (solo para Linux):
$ ./eascmd64 pysdk pack ./pysdk_demoSalida esperada si la ejecución es correcta:
[PYSDK] Creating package: /home/xi****.lwp/code/test/pysdk_demo.tar.gz -
Empaquetado manual
Requisito
Detalles
Formato del paquete
El paquete debe ser un archivo comprimido en formato .zip o .tar.gz.
Contenido del paquete
-
El directorio raíz debe ser /ENV y debe contener app.py.
-
Ejemplo de paquete: ejemplo de paquete .tar.gz.
-
Paso 5: Carga del paquete y de los archivos de modelo
Cargue por separado el archivo del paquete (.zip o .tar.gz) y el archivo de modelo a OSS. Esto permite montarlos durante el despliegue del servicio. Para más información, consulte Quick start for ossutil.
Paso 6: Despliegue y prueba del servicio
Despliegue el servicio de modelo mediante PAI console o EASCMD.
-
Despliegue el servicio.
PAI console
Inicie sesión en PAI console. Seleccione una región en la parte superior de la página. Luego, seleccione el espacio de trabajo deseado y haga clic en Enter Elastic Algorithm Service (EAS).
Haga clic en Deploy Service. En la sección Custom Model Deployment, haga clic en Custom Deployment.
-
En la página Custom Deployment, configure los siguientes parámetros. Para el resto de los parámetros, consulte Custom deployment.
Parámetro
Descripción
Deployment Method
Seleccione Processor-based Deployment.
Model Settings
Para Type, seleccione OSS y elija la ruta de OSS del archivo de modelo.
Processor Type
Seleccione Custom Processor.
Processor Language
Seleccione python.
Processor Package
Para Type, seleccione OSS y elija la ruta de OSS del archivo de paquete del paso anterior.
Processor Main File
Introduzca
./app.py. -
(Opcional) En la sección Service Configurations, agregue el parámetro data_image y establézcalo con la ruta de la imagen configurada durante el empaquetado.
NotaEste parámetro solo es obligatorio si utilizó una imagen para empaquetar el entorno en Step 4.
Haga clic en Deploy.
EASCMD
Despliegue el servicio en Linux:
Descargue y autentique EASCMD. Para más información, consulte Download and authenticate the client.
-
En el directorio de EASCMD, cree un archivo JSON llamado app.json. Por ejemplo:
{ "name": "pysdk_demo", "processor_entry": "./app.py", "processor_type": "python", "processor_path": "oss://examplebucket/exampledirectory/pysdk_demo.tar.gz", "model_path": "oss://examplebucket/exampledirectory/model", "cloud": { "computing": { "instance_type": "ecs.c7.large" } }, "metadata": { "instance": 1, } } -
En el directorio que contiene app.json, ejecute el siguiente comando para desplegar el servicio.
$ ./eascmd64 create app.jsonSalida esperada si la ejecución es correcta:
[RequestId]: 1202D427-8187-4BCB-8D32-D7096E95B5CA +-------------------+-------------------------------------------------------------------+ | Intranet Endpoint | http://182848887922****.vpc.cn-beijing.pai-eas.aliyuncs.com/api/predict/pysdk_demo | | Token | ZTBhZTY3ZjgwMmMyMTQ5OTgyMTQ5YmM0NjdiMmNiNmJkY2M5ODI0**** | +-------------------+-------------------------------------------------------------------+ [OK] Waiting task server to be ready [OK] Fetching processor from [oss://eas-model-beijing/195557026392****/pysdk_demo.tar.gz] [OK] Building image [registry-vpc.cn-beijing.aliyuncs.com/eas/pysdk_demo_cn-beijing:v0.0.1-20190806082810] [OK] Pushing image [registry-vpc.cn-beijing.aliyuncs.com/eas/pysdk_demo_cn-beijing:v0.0.1-20190806082810] [OK] Waiting [Total: 1, Pending: 1, Running: 0] [OK] Service is running
-
Pruebe el servicio.
Inicie sesión en PAI console. Seleccione una región en la parte superior de la página. Luego, seleccione el espacio de trabajo deseado y haga clic en Enter Elastic Algorithm Service (EAS).
Busque el servicio de destino y haga clic en Invocation Information en la columna Service Type para obtener el endpoint público y el Token.
-
Ejecute el siguiente comando para invocar el servicio con el endpoint y el token obtenidos en el paso anterior.
$ curl <service_url> -H 'Authorization: <token>' -d '10 20'Parámetros:
<service_url>: endpoint público obtenido en el paso anterior. Por ejemplo:
http://182848887922****.vpc.cn-beijing.pai-eas.aliyuncs.com/api/predict/pysdk_demo.<token>: token obtenido en el paso anterior. Por ejemplo:
ZTBhZTY3ZjgwMmMyMTQ5OTgyMTQ5YmM0NjdiMmNiNmJkY2M5ODI0****.-d: datos de entrada para el servicio.
Referencias
Problemas comunes de desarrollo: FAQ
Desarrollo de procesadores personalizados en Java: Develop a custom processor by using Java