Todos los productos
Search
Centro de documentos

Platform For AI:EasyRec Processor

Última actualización: Sep 04, 2026

Elastic Algorithm Service (EAS) incluye un procesador EasyRec integrado que despliega modelos de recomendación entrenados con EasyRec o TensorFlow como servicios de puntuación con ingeniería de características integrada. El procesador optimiza conjuntamente la ingeniería de características y la inference para lograr una puntuación de alto rendimiento.

Contexto

El procesador EasyRec es un servicio de inference basado en la especificación de procesadores de PAI-EAS (Develop custom processors by using C or C++). Admite dos escenarios:

  • Para modelos de aprendizaje profundo entrenados con feature generation (FG) y EasyRec, el procesador EasyRec mejora el rendimiento de la puntuación al almacenar en caché las características de los elementos en memoria y optimizar la transformación de características y la inference. FeatureStore gestiona las características en línea y en tiempo real. El PAI-Rec recommendation platform genera código que simplifica el entrenamiento, la transformación de características y la inference. En combinación con el PAI-Rec DPI engine, permite un despliegue rápido del modelo y la integración del servicio.

  • El procesador EasyRec también puede servir modelos entrenados con EasyRec o TensorFlow sin el generador de características (modo bypass).

Arquitectura de un motor de recomendación basado en el procesador EasyRec:

easyrec

Nota: El procesador también admite datos sin conexión de MaxCompute.

El procesador EasyRec incluye los siguientes módulos:

  • Caché de características de elementos: Almacena en memoria las características de FeatureStore para reducir la sobrecarga de red. Admite actualizaciones de características incrementales y en tiempo real.

  • Generador de características: Módulo de ingeniería de características (Feature generation overview and configuration) que utiliza la misma implementación para el procesamiento sin conexión y en línea, lo cual garantiza la consistencia. La implementación se basa en soluciones comprobadas de Taobao. Concepts of data fields, data features, and FG features in EasyRec cubre la terminología de FG. Puede extender FG con custom feature operators.

  • TFModel: Carga archivos SavedModel exportados desde EasyRec y utiliza Blade para optimizar la inference del modelo en CPU y GPU.

  • Módulos de Instrumentación de características y Actualización incremental del modelo: Estos módulos admiten escenarios de entrenamiento en tiempo real. Entrenamiento en tiempo real.

Limitaciones

La inference en CPU solo es compatible con las familias de instancias de propósito general g6, g7 y g8 (solo CPU Intel).

La inference en GPU es compatible con las GPU T4, A10, GU30, L20, 3090 y 4090, pero no con la P100.

General-purpose (g series).

Versiones

Utilice la versión más reciente para obtener las mejores funciones y el mejor rendimiento.

Lista de versiones

Nombre del procesador

Fecha de lanzamiento

Versión de TensorFlow

Nuevas funciones

easyrec

20230608

2.10

  • Admite FeatureGenerator y la caché de características de elementos.

  • Admite aprendizaje profundo en línea.

  • Admite recuperación de vectores Faiss.

  • Admite inference en GPU.

easyrec-1.2

20230721

2.10

  • Optimiza el embedding de categorías ponderadas.

easyrec-1.3

20230802

2.10

  • Admite la carga de características de elementos desde MaxCompute hacia la caché de características de elementos.

easyrec-1.6

20231006

2.10

  • Extensión automática de características.

  • Optimización de ubicación en GPU.

  • Admite guardar solicitudes en el directorio del modelo con save_req.

easyrec-1.7

20231013

2.10

  • Optimiza el rendimiento del modelo Keras.

easyrec-1.8

20231101

2.10

  • Admite la versión en la nube del almacén de características.

easyrec-kv-1.8

20231220

DeepRec

(deeprec2310)

  • Admite DeepRec EmbeddingVariable.

easyrec-1.9

20231222

2.10

  • Corrige problemas de optimización de grafos para TagFeature y RawFeature.

easyrec-2.4

20240826

2.10

  • Admite FeatureDB en el SDK de C++ del almacén de características.

  • Admite tokens STS en el SDK de C++ del almacén de características.

  • Admite el tipo de datos double (float64) para solicitudes.

easyrec-2.9

20250718

2.10

  • Integra la versión 0.7.0 de la biblioteca FeatureGenerator.

easyrec-3.0

20251025

2.10

  • Integra la versión 0.7.4 de la biblioteca FeatureGenerator.

  • Mejora el rendimiento.

  • Corrige un problema con el análisis sintáctico de nuevos operadores desde la biblioteca FG actualizada.

easyrec-3.1

20260116

2.10.1

  • Actualiza la biblioteca FG a la versión 1.0.1.

  • Actualiza el SDK de FS a la versión 20251117.

easyrec-3.2

20260209

2.10.1

Actualiza el SDK de FS a la versión 20260202.

easyrec-3.3

20260330

2.10.1

Actualiza la biblioteca FG a la versión 1.0.2.

Actualiza el SDK de FS a la versión 20260305.

easyrec-3.4

20260415

2.10.1

Actualiza la biblioteca FG a la versión 1.0.3.

easyrec-3.5

20260515

2.10.1

Actualiza la biblioteca FG a la versión 1.0.5.

Paso 1: Desplegar el servicio

Para desplegar un servicio de modelo EasyRec con eascmd, establezca Processor type en easyrec-{version}. Service deployment: EASCMD cubre el proceso completo de despliegue. Las siguientes secciones proporcionan ejemplos de archivos de configuración.

Nueva biblioteca FeatureGenerator (fg_mode=normal)

Este ejemplo utiliza el tipo de nodo PyOdps3 con la nueva biblioteca FeatureGenerator. Esta biblioteca admite operadores de transformación integrados y personalizados, tipos de entrada complejos (matrices, mapas) y dependencias de características basadas en DAG.

El siguiente ejemplo utiliza PAI-FeatureStore para la gestión de datos de características. Reemplace ${fs_project},${fs_model} con los valores reales. Step 2: Create and deploy an EAS model service proporciona el procedimiento completo.

import json
import os

service_name = 'ali_rec_rnk_with_fg'

config = {
  'name': service_name,
  'metadata': {
    "cpu": 8,
    #"cuda": "11.2",
    "gateway": "default",
    "gpu": 0,
    "memory": 32000,
    "rolling_strategy": {
        "max_unavailable": 1
    },
    "rpc": {
        "enable_jemalloc": 1,
        "max_queue_size": 256
    }
  },
  "processor_envs": [
    {
      "name": "ADAPTE_FG_CONFIG",
      "value": "true"
    }
  ],
  "model_path": "",
  "processor": "easyrec-3.5",
  "storage": [
    {
      "mount_path": "/home/admin/docker_ml/workspace/model/",
      "oss": {
        "path": "oss://easyrec/ali_rec_sln_acc_rnk/20250722/export/final_with_fg"
      }
    }
  ],
  # When you change fg_mode, the invocation method must also be changed.
  # If fg_mode is 'normal' or 'tf', use the EasyRecRequest SDK.
  # If fg_mode is 'bypass', use the TFRequest SDK.
  'model_config': {
    'outputs': 'probs_ctr,probs_cvr',
    'fg_mode': 'normal',
    'steady_mode': True,
    'period': 2880,
    'access_key_id': f'{o.account.access_id}',
    'access_key_secret': f'{o.account.secret_access_key}',
    "load_feature_from_offlinestore": True,
    'region': 'cn-shanghai',
    'fs_project': '${fs_project}',
    'fs_model': '${fs_model}',
    'fs_entity': 'item',
    'featuredb_username': 'guest',
    'featuredb_password': '123456',
    'log_iterate_time_threshold': 100,
    'iterate_featuredb_interval': 5,
    'mc_thread_pool_num': 1,
  }
}

with open('echo.json', 'w') as output_file:
    json.dump(config, output_file)

os.system(f'/home/admin/usertools/tools/eascmd -i {o.account.access_id} -k {o.account.secret_access_key} -e pai-eas.cn-shanghai.aliyuncs.com create echo.json')
# os.system(f'/home/admin/usertools/tools/eascmd -i {o.account.access_id} -k {o.account.secret_access_key} -e pai-eas.cn-shanghai.aliyuncs.com modify {service_name} -s echo.json')

Reemplace los valores de featuredb_username y featuredb_password con credenciales válidas.

Versión con operadores TF de FeatureGenerator (fg_mode=tf)

Importante: La versión con operadores TF de FeatureGenerator solo admite un conjunto limitado de características integradas: id_feature, raw_feature, combo_feature, lookup_feature, match_feature, and sequence_feature. No se admiten operadores personalizados de FeatureGenerator.

El siguiente script de despliegue incluye el par de AccessKey en texto plano. No utiliza PAI-FeatureStore ni carga datos desde MaxCompute para reducir la carga en Hologres.

Utilice PAI-FeatureStore con MaxCompute para despliegues en producción. Step 2: Create and deploy an EAS model service muestra un método más seguro mediante un script de Python, el objeto o de DataWorks y tokens STS temporales con load_feature_from_offlinestore establecido en True.

bizdate=$1
# Change the invocation method based on fg_mode: EasyRecRequest for 'normal'/'tf', TFRequest for 'bypass'
cat << EOF > echo.json
{
  "name":"ali_rec_rnk_with_fg",
  "metadata": {
    "instance": 2,
    "rpc": {
      "enable_jemalloc": 1,
      "max_queue_size": 100
    }
  },
  "cloud": {
    "computing": {
      "instance_type": "ecs.g7.large",
      "instances": null
    }
  },
  "model_config": {
    "remote_type": "hologres",
    "url": "postgresql://<AccessKeyID>:<AccessKeySecret>@<endpoint>:<port>/<database>",
    "tables": [{"name":"<schema>.<table_name>","key":"<index_column_name>","value": "<column_name>"}],
    "period": 2880,
    "fg_mode": "tf",
    "outputs":"probs_ctr,probs_cvr",
  },
  "model_path": "",
  "processor": "easyrec-3.5",
  "storage": [
    {
      "mount_path": "/home/admin/docker_ml/workspace/model/",
      "oss": {
        "path": "oss://easyrec/ali_rec_sln_acc_rnk/20221122/export/final_with_fg"
      }
    }
  ]
}

EOF
# Run the deployment command.
eascmd  create echo.json
# eascmd -i <AccessKeyID>  -k  <AccessKeySecret>   -e <endpoint> create echo.json
# Run the update command.
eascmd update ali_rec_rnk_with_fg -s echo.json

Omitir FeatureGenerator (fg_mode=bypass)

Si no utiliza FeatureGenerator, ensamble la solicitud en el lado del cliente. How to use EAS for inference without training with EasyRec.

bizdate=$1
# Change the invocation method based on fg_mode: EasyRecRequest for 'normal'/'tf', TFRequest for 'bypass'
cat << EOF > echo.json
{
  "name":"ali_rec_rnk_no_fg",
  "metadata": {
    "instance": 2,
    "rpc": {
      "enable_jemalloc": 1,
      "max_queue_size": 100
    }
  },
  "cloud": {
    "computing": {
      "instance_type": "ecs.g7.large",
      "instances": null
    }
  },
  "model_config": {
    "fg_mode": "bypass"
  },
  "processor": "easyrec-3.5",
  "processor_envs": [
    {
      "name": "INPUT_TILE",
      "value": "2"
    }
  ],
  "storage": [
    {
      "mount_path": "/home/admin/docker_ml/workspace/model/",
      "oss": {
        "path": "oss://easyrec/ali_rec_sln_acc_rnk/20221122/export/final/"
      }
    }
  ],
  "warm_up_data_path": "oss://easyrec/ali_rec_sln_acc_rnk/rnk_warm_up.bin"
}

EOF
# Run the deployment command.
eascmd  create echo.json
# eascmd -i <AccessKeyID>  -k  <AccessKeySecret>   -e <endpoint> create echo.json
# Run the update command.
eascmd update ali_rec_rnk_no_fg -s echo.json

La siguiente tabla describe los parámetros clave. JSON deployment cubre parámetros adicionales.

Parámetro

Obligatorio

Descripción

Ejemplo

processor

Sí

Nombre del procesador EasyRec.

"processor": "easyrec"

fg_mode

Sí

Modo de ingeniería de características. El modo seleccionado determina el SDK y el formato de solicitud para la invocación del servicio.

  • normal: (Recomendado)

    • Descripción: Utiliza la biblioteca FeatureGenerator para la transformación de características y alimenta el modelo con la salida. Este modo ofrece un amplio conjunto de operadores integrados de FeatureGenerator, admite operadores personalizados y soporta dependencias de características basadas en DAG.

    • Método de invocación: El cliente debe usar el SDK EasyRecRequest y pasar únicamente características de alto nivel, como ID de usuario y listas de ID de artículos.

  • tf:

    • Descripción: Integra FeatureGenerator como un operador de TensorFlow dentro del grafo de computación de TensorFlow y realiza optimizaciones del grafo para mejorar el rendimiento.

    • Método de invocación: Igual que el modo normal. El cliente debe usar el SDK EasyRecRequest.

  • bypass:

    • Descripción: Omite FeatureGenerator integrado; el servicio actúa solo como motor de inference de modelos de TensorFlow. Este modo es adecuado para escenarios donde se utiliza procesamiento personalizado de características. En este modo, no es necesario configurar parámetros relacionados con la caché de características de artículos ni el acceso del procesador a PAI-FeatureStore.

    • Método de invocación: El cliente debe usar el SDK TFRequest. Quien realiza la llamada debe preparar y ensamblar en el cliente todos los datos de características sin procesar que requiere el modelo, y organizarlos en formato Tensor. Este modo está diseñado para usuarios avanzados que cuentan con un sistema externo de procesamiento de características.

"fg_mode": "normal"

outputs

Sí

Nombres de las variables de salida del modelo de TensorFlow, como probs_ctr. Separe varios nombres con comas (,). Para encontrar los nombres de las variables de salida, ejecute el comando de TensorFlow saved_model_cli.

"outputs":"probs_ctr,probs_cvr"

save_req

No

Indica si se deben guardar los datos de solicitud en el directorio del modelo para pruebas de calentamiento y rendimiento. Valores válidos:

  • true: Se guarda el archivo.

  • false (predeterminado): No se guarda el archivo. Establezca este parámetro en false en entornos de producción para evitar la degradación del rendimiento.

"save_req": "false"

Parámetros de caché de características de artículos

period

Sí

Intervalo de actualización de la caché de características de artículos, en minutos. Para características que se actualizan diariamente, establezca un valor mayor a 1,440 (minutos por día), por ejemplo, 2,880 (dos días). Esto evita actualizaciones redundantes, ya que las características también se refrescan durante los despliegues rutinarios.

"period": 2880

remote_type

Sí

Origen de datos para las características de artículos. Valores válidos:

  • hologres: Lee y escribe datos mediante interfaces SQL. Es adecuado para almacenar y consultar grandes volúmenes de datos.

  • none: No utiliza la caché de características de artículos. Las características de artículos se pasan en la solicitud. En este caso, debe establecer tables en [].

"remote_type": "hologres"

tables

No

Tabla de características de artículos. Este parámetro es obligatorio cuando remote_type se establece en hologres. Incluye los siguientes subparámetros:

  • key: Obligatorio. Nombre de la columna de ID de artículo.

  • name: Obligatorio. Nombre de la tabla de características.

  • value: Opcional. Nombres de las columnas que se cargarán. Separe varios nombres de columna con una coma (,).

  • condition: Opcional. Cláusula WHERE utilizada para filtrar artículos. Ejemplo: style_id<10000.

  • timekey: Opcional. Especifica la marca de tiempo o el valor entero para actualizaciones incrementales de artículos. Formatos admitidos: timestamp e int.

  • static: Opcional. Indica una característica estática que no requiere actualizaciones periódicas.

Puede leer datos de artículos de entrada desde varias tablas. La configuración debe tener el siguiente formato:

"tables": [{"key":"table1", ...},{"key":"table2", ...}]

Si las tablas comparten nombres de columna, las columnas de la tabla que aparece después en la lista sobrescriben las de la tabla anterior.

"tables": {

"key": "goods_id",

"name": "public.ali_rec_item_feature"

}

url

No

Endpoint de Hologres.

"url": "postgresql://LTAI**@hgprecn-cn-xxxxx-cn-hangzhou-vpc.hologres.aliyuncs.com:80/bigdata_rec"

Parámetros de acceso del procesador a PAI-FeatureStore

fs_project

No

Nombre del proyecto de PAI-FeatureStore. Obligatorio al utilizar PAI-FeatureStore. Configure a FeatureStore project.

"fs_project": "fs_demo"

fs_model

No

Nombre de la característica del modelo en PAI-FeatureStore.

"fs_model": "fs_rank_v1"

fs_entity

No

Nombre de la entidad en PAI-FeatureStore.

"fs_entity": "item"

region

No

Región donde reside el proyecto de PAI-FeatureStore.

"region": "cn-beijing"

access_key_id

No

AccessKey ID utilizado para acceder a PAI-FeatureStore.

"access_key_id": "xxxxx"

access_key_secret

No

AccessKey Secret utilizado para acceder a PAI-FeatureStore.

"access_key_secret": "xxxxx"

featuredb_username

No

Nombre de usuario para FeatureDB.

"featuredb_username": "xxxxx"

featuredb_password

No

Contraseña para FeatureDB.

"featuredb_password": "xxxxx"

load_feature_from_offlinestore

No

Indica si se deben cargar características sin conexión directamente desde OfflineStore de PAI-FeatureStore. Valores válidos:

  1. True: Lee desde MaxCompute a través de OfflineStore de PAI-FeatureStore.

  2. False (predeterminado): Lee desde OnlineStore de PAI-FeatureStore.

"load_feature_from_offlinestore": True

iterate_featuredb_interval

No

Intervalo, en segundos, para actualizar características estadísticas en tiempo real.

Un intervalo más corto mejora la frescura de las características, pero incrementa los costos de lectura cuando las características cambian con frecuencia. Encuentre un equilibrio entre precisión y costo.

"iterate_featuredb_interval": 5

input_tile: Parámetros para difusión automática de características

INPUT_TILE

No

Establezca la variable de entorno INPUT_TILE en 1 para habilitar la difusión automática de características de artículos. Esto permite pasar un único valor para características que permanecen constantes dentro de una solicitud, como user_id. Cuando la variable de entorno INPUT_TILE se establece en 2, la operación tile se retrasa hasta después de recuperar las incrustaciones de características, lo que reduce aún más la carga computacional.

  • Beneficios: Reduce el tamaño de la solicitud, el tiempo de transferencia de red y el tiempo de cómputo.

  • Para habilitar esta función, establezca la variable de entorno INPUT_TILE en 1 o 2.

Nota
  • Esta optimización es compatible con EasyRec 1.3 y versiones posteriores.

  • Cuando fg_mode es tf, esta optimización se habilita automáticamente y no es necesario configurar esta variable de entorno.

  • Cuando fg_mode es normal, INPUT_TILE se establece automáticamente en 1 en EasyRec 2.9 y versiones posteriores.

"processor_envs":

[

{

"name": "INPUT_TILE",

"value": "2"

}

]

ADAPTE_FG_CONFIG

No

Habilita la compatibilidad con modelos entrenados con una versión anterior de FeatureGenerator.

"processor_envs":

[

{

"name": "ADAPTE_FG_CONFIG",

"value": "true"

}

]

DISABLE_FG_PRECISION

No

Para compatibilidad con modelos entrenados con una versión anterior de FeatureGenerator. La versión anterior limita las características de tipo float a seis dígitos significativos de forma predeterminada, mientras que la nueva versión elimina este límite. Para aplicar el comportamiento anterior (límite de 6 dígitos), establezca esta variable en true.

"processor_envs":

[

{

"name": "DISABLE_FG_PRECISION",

"value": "false"

}

]

Optimización de inference del procesador EasyRec

Parámetro

Obligatorio

Descripción

Ejemplo

TF_XLA_FLAGS

No

Para inference con GPU, este parámetro habilita XLA para compilar y optimizar el modelo, además de realizar automáticamente la fusión de operadores.

"processor_envs":

[

{

"name": "TF_XLA_FLAGS",

"value": "--tf_xla_auto_jit=2"

},

{

"name": "XLA_FLAGS",

"value": "--xla_gpu_cuda_data_dir=/usr/local/cuda/"

},

{

"name": "XLA_ALIGN_SIZE",

"value": "64"

}

]

Parámetros de programación de TF

No

inter_op_parallelism_threads: Controla el número de hilos para ejecutar diferentes operaciones en paralelo.

intra_op_parallelism_threads: Controla el número de hilos utilizados dentro de una sola operación.

Para una CPU de 32 núcleos, establecer estos parámetros en 16 generalmente mejora el rendimiento. Tenga en cuenta que la suma de ambos recuentos de hilos no puede exceder el número total de núcleos de CPU.

"model_config": {

"inter_op_parallelism_threads": 16,

"intra_op_parallelism_threads": 16,

}

rpc.worker_threads

No

Parámetro ubicado bajo metadata en la configuración de EAS. Establezca este parámetro según el número de núcleos de CPU de la instancia. Por ejemplo, si la instancia tiene 15 núcleos de CPU, establezca worker_threads en 15.

"metadata": {

"rpc": {

"worker_threads": 15

}

Paso 2: Llamar al servicio

2.1 Configuración de red

Tanto el motor PAI-Rec como el servicio de puntuación se ejecutan en PAI-EAS y requieren una conexión de red directa. En la página de instancias de PAI-EAS, haga clic en 'VPC' para configurar la misma VPC, vSwitch y security group. Access public or on-premises resources from EAS. Si utiliza Hologres, configure también la misma VPC. La siguiente figura muestra un ejemplo.

image

2.2 Obtener información del servicio

Después del despliegue, vaya a la página Elastic Algorithm Service (EAS). Busque su servicio y haga clic en Invocation Information en la columna Service Method para consultar el endpoint y el token.

2.3 Ejemplos de código del SDK

El servicio de modelo EasyRec utiliza Protocol Buffers (Protobuf) para la entrada y salida, por lo que no es posible probarlo desde la consola de PAI-EAS.

Antes de llamar al servicio, confirme el fg_mode en model_config del Paso 1. Cada modo requiere un SDK de cliente diferente.

Modo (fg_mode)

Clase de solicitud

normal o tf (con ingeniería de características integrada)

EasyRecRequest

bypass (sin ingeniería de características integrada)

TFRequest

Con FG fg_mode=normal or tf

Java

La configuración de Maven se cubre en Java SDK guide. El siguiente código envía una solicitud al servicio ali_rec_rnk_with_fg:

import com.aliyun.openservices.eas.predict.http.*;
import com.aliyun.openservices.eas.predict.request.EasyRecRequest;

PredictClient client = new PredictClient(new HttpConfig());
// When you access the service through a public gateway, use the endpoint that starts with your user ID (UID). You can obtain this endpoint from the invocation information of the service in the EAS console.
client.setEndpoint("xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com");
client.setModelName("ali_rec_rnk_with_fg");
// Replace this with your service token.
client.setToken("******");

EasyRecRequest easyrecRequest = new EasyRecRequest(separator);
// userFeatures: User features. Features are separated by \u0002 (CTRL_B). Feature names and values are separated by a colon (:).
//  user_fea0:user_fea0_val\u0002user_fea1:user_fea1_val
// For more information about the feature value format, see: https://easyrec.readthedocs.io/en/latest/feature/rtp_fg.html
easyrecRequest.appendUserFeatureString(userFeatures);
// You can also add one user feature at a time:
// easyrecRequest.addUserFeature(String userFeaName, T userFeaValue).
// The data type T of the feature value can be String, float, long, or int.

// contextFeatures: Context features. Features are separated by \u0002 (CTRL_B). Feature names and their values are separated by a colon (:). Multiple values for the same feature are also separated by colons.
//   ctxt_fea0:ctxt_fea0_ival0:ctxt_fea0_ival1:ctxt_fea0_ival2\u0002ctxt_fea1:ctxt_fea1_ival0:ctxt_fea1_ival1:ctxt_fea1_ival2
easyrecRequest.appendContextFeatureString(contextFeatures);
// You can also add one context feature at a time:
// easyrecRequest.addContextFeature(String ctxtFeaName, List<Object> ctxtFeaValue).
// The data type of ctxtFeaValue can be String, Float, Long, or Integer.

// itemIdStr: A list of item IDs to predict, separated by a comma (,).
easyrecRequest.appendItemStr(itemIdStr, ",");
// You can also add one item ID at a time:
// easyrecRequest.appendItemId(String itemId)

easyrecPredictProtos.PBResponse response = client.predict(easyrecRequest);

for (Map.Entry<String, easyrecPredictProtos.Results> entry : response.getResultsMap().entrySet()) {
    String key = entry.getKey();
    easyrecPredictProtos.Results value = entry.getValue();
    System.out.print("key: " + key);
    for (int i = 0; i < value.getScoresCount(); i++) {
        System.out.format("value: %.6g\n", value.getScores(i));
    }
}

// Get the features after FG processing to check for consistency with offline features.
// Set DebugLevel to 1 to return the generated features.
easyrecRequest.setDebugLevel(1);
easyrecPredictProtos.PBResponse response = client.predict(easyrecRequest);
Map<String, String> genFeas = response.getGenerateFeaturesMap();
for(String itemId: genFeas.keySet()) {
    System.out.println(itemId);
    System.out.println(genFeas.get(itemId));
}

Python

La configuración del entorno se cubre en Python SDK guide. Utilice el cliente Java en producción para obtener un mejor rendimiento. Ejemplo:

from eas_prediction import PredictClient

from eas_prediction.easyrec_request import EasyRecRequest
from eas_prediction.easyrec_predict_pb2 import PBFeature
from eas_prediction.easyrec_predict_pb2 import PBRequest

if __name__ == '__main__':
    endpoint = 'http://xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com'
    service_name = 'ali_rec_rnk_with_fg'
    token = '******'

    client = PredictClient(endpoint, service_name)
    client.set_token(token)
    client.init()

    req = PBRequest()
    uid = PBFeature()
    uid.string_feature = 'u0001'
    req.user_features['user_id'] = uid
    age = PBFeature()
    age.int_feature = 12
    req.user_features['age'] = age
    weight = PBFeature()
    weight.float_feature = 129.8
    req.user_features['weight'] = weight

    req.item_ids.extend(['item_0001', 'item_0002', 'item_0003'])
    
    easyrec_req = EasyRecRequest()
    easyrec_req.add_feed(req, debug_level=0)
    res = client.predict(easyrec_req)
    print(res)

Parámetros:

  • endpoint: Endpoint del servicio. Para obtenerlo, vaya a la página Elastic Algorithm Service (EAS), busque su servicio y haga clic en Invocation Information en la columna Service Method.

  • service_name: Nombre del servicio. Obténgalo desde la página Elastic Algorithm Service (EAS).

  • token: Token del servicio. Encuéntrelo en el cuadro de diálogo Invocation Information.

Sin FG fg_mode=bypass

Java

La configuración de Maven se cubre en Java SDK guide. El siguiente código envía una solicitud al servicio ali_rec_rnk_no_fg:

import java.util.List;

import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.request.TFDataType;
import com.aliyun.openservices.eas.predict.request.TFRequest;
import com.aliyun.openservices.eas.predict.response.TFResponse;

public class TestEasyRec {
    public static TFRequest buildPredictRequest() {
        TFRequest request = new TFRequest();
 
        request.addFeed("user_id", TFDataType.DT_STRING, 
                        new long[]{3}, new String []{ "u0001", "u0001", "u0001"});
      	request.addFeed("age", TFDataType.DT_FLOAT, 
                        new long[]{3}, new float []{ 18.0f, 18.0f, 18.0f});
        // Note: If you set INPUT_TILE=2, for features that have the same value, you only need to pass the value once:
        //    request.addFeed("user_id", TFDataType.DT_STRING,
        //            new long[]{1}, new String []{ "u0001" });
        //    request.addFeed("age", TFDataType.DT_FLOAT, 
        //            new long[]{1}, new float []{ 18.0f});
      	request.addFeed("item_id", TFDataType.DT_STRING, 
                        new long[]{3}, new String []{ "i0001", "i0002", "i0003"});  
        request.addFetch("probs");
      	return request;
    }

    public static void main(String[] args) throws Exception {
        PredictClient client = new PredictClient(new HttpConfig());

        // To use a direct network connection, use the setDirectEndpoint method. Example: 
        //   client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
        // You must enable the direct network connection in the EAS console and provide the source vSwitch used to access the EAS service.
        // A direct network connection offers better stability and performance.
        client.setEndpoint("xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com");
        client.setModelName("ali_rec_rnk_no_fg");
        client.setToken("");
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100; i++) {
            try {
                TFResponse response = client.predict(buildPredictRequest());
                // "probs" is an output field of the model. You can use the curl command to view the model's inputs and outputs:
                //   curl xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com -H "Authorization:{token}"
                List<Float> result = response.getFloatVals("probs");
                System.out.print("Predict Result: [");
                for (int j = 0; j < result.size(); j++) {
                    System.out.print(result.get(j).floatValue());
                    if (j != result.size() - 1) {
                        System.out.print(", ");
                    }
                }
                System.out.print("]\n");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("Spend Time: " + (endTime - startTime) + "ms");
        client.shutdown();
    }
}

Python

La configuración del entorno se describe en Python SDK guide. El SDK de Python se recomienda solo para depuración; utilice el SDK de Java en producción. El siguiente código envía una solicitud al servicio ali_rec_rnk_no_fg:

#!/usr/bin/env python

from eas_prediction import PredictClient
from eas_prediction import StringRequest
from eas_prediction import TFRequest

if __name__ == '__main__':
    client = PredictClient('http://xxxxxxx.vpc.cn-hangzhou.pai-eas.aliyuncs.com', 'ali_rec_rnk_no_fg')
    client.set_token('')
    client.init()
    
    # Note: Replace server_default with the actual signature_name of your model. For more information, see the SDK guide mentioned above.
    req = TFRequest('server_default') 
    req.add_feed('user_id', [3], TFRequest.DT_STRING, ['u0001'] * 3)
    req.add_feed('age', [3], TFRequest.DT_FLOAT, [18.0] * 3)
    # Note: After enabling the INPUT_TILE=2 optimization, you can pass a single value for the preceding features.
    #   req.add_feed('user_id', [1], TFRequest.DT_STRING, ['u0001'])
    #   req.add_feed('age', [1], TFRequest.DT_FLOAT, [18.0])
    req.add_feed('item_id', [3], TFRequest.DT_STRING, 
        ['i0001', 'i0002', 'i0003'])
    for x in range(0, 100):
        resp = client.predict(req)
        print(resp)

2.4 Construir una solicitud de servicio personalizada

Para lenguajes distintos a Python y Java, genere el código de solicitud de predicción a partir de los siguientes archivos .proto:

  • tf_predict.proto: definición de solicitud para un modelo de TensorFlow.

    syntax = "proto3";
    
    option cc_enable_arenas = true;
    option go_package = ".;tf";
    option java_package = "com.aliyun.openservices.eas.predict.proto";
    option java_outer_classname = "PredictProtos";
    
    enum ArrayDataType {
      // Not a legal value for DataType. Used to indicate a DataType field
      // has not been set.
      DT_INVALID = 0;
    
      // Data types that all computation devices are expected to be
      // capable to support.
      DT_FLOAT = 1;
      DT_DOUBLE = 2;
      DT_INT32 = 3;
      DT_UINT8 = 4;
      DT_INT16 = 5;
      DT_INT8 = 6;
      DT_STRING = 7;
      DT_COMPLEX64 = 8;  // Single-precision complex
      DT_INT64 = 9;
      DT_BOOL = 10;
      DT_QINT8 = 11;     // Quantized int8
      DT_QUINT8 = 12;    // Quantized uint8
      DT_QINT32 = 13;    // Quantized int32
      DT_BFLOAT16 = 14;  // Float32 truncated to 16 bits.  Only for cast ops.
      DT_QINT16 = 15;    // Quantized int16
      DT_QUINT16 = 16;   // Quantized uint16
      DT_UINT16 = 17;
      DT_COMPLEX128 = 18;  // Double-precision complex
      DT_HALF = 19;
      DT_RESOURCE = 20;
      DT_VARIANT = 21;  // Arbitrary C++ data types
    }
    
    // Dimensions of an array
    message ArrayShape {
      repeated int64 dim = 1 [packed = true];
    }
    
    // Protocol buffer representing an array
    message ArrayProto {
      // Data Type.
      ArrayDataType dtype = 1;
    
      // Shape of the array.
      ArrayShape array_shape = 2;
    
      // DT_FLOAT.
      repeated float float_val = 3 [packed = true];
    
      // DT_DOUBLE.
      repeated double double_val = 4 [packed = true];
    
      // DT_INT32, DT_INT16, DT_INT8, DT_UINT8.
      repeated int32 int_val = 5 [packed = true];
    
      // DT_STRING.
      repeated bytes string_val = 6;
    
      // DT_INT64.
      repeated int64 int64_val = 7 [packed = true];
    
      // DT_BOOL.
      repeated bool bool_val = 8 [packed = true];
    }
    
    // PredictRequest specifies which TensorFlow model to run, as well as
    // how inputs are mapped to tensors and how outputs are filtered before
    // returning to user.
    message PredictRequest {
      // A named signature to evaluate. If unspecified, the default signature
      // will be used
      string signature_name = 1;
    
      // Input tensors.
      // Names of input tensor are alias names. The mapping from aliases to real
      // input tensor names is expected to be stored as named generic signature
      // under the key "inputs" in the model export.
      // Each alias listed in a generic signature named "inputs" should be provided
      // exactly once in order to run the prediction.
      map<string, ArrayProto> inputs = 2;
    
      // Output filter.
      // Names specified are alias names. The mapping from aliases to real output
      // tensor names is expected to be stored as named generic signature under
      // the key "outputs" in the model export.
      // Only tensors specified here will be run/fetched and returned, with the
      // exception that when none is specified, all tensors specified in the
      // named signature will be run/fetched and returned.
      repeated string output_filter = 3;
      
      // Debug flags
      // 0: just return prediction results, no debug information
      // 100: return prediction results, and save request to model_dir 
      // 101: save timeline to model_dir
      int32 debug_level = 100;
    }
    
    // Response for PredictRequest on successful run.
    message PredictResponse {
      // Output tensors.
      map<string, ArrayProto> outputs = 1;
    }
  • easyrec_predict.proto: definición de solicitud para un modelo de TensorFlow con FG.

    syntax = "proto3";
    
    option cc_enable_arenas = true;
    option go_package = ".;easyrec";
    option java_package = "com.aliyun.openservices.eas.predict.proto";
    option java_outer_classname = "EasyRecPredictProtos";
    
    import "tf_predict.proto";
    
    // context features
    message ContextFeatures {
      repeated PBFeature features = 1;
    }
    
    message PBFeature {
      oneof value {
        int32 int_feature = 1;
        int64 long_feature = 2;
        string string_feature = 3;
        float float_feature = 4;
      }
    }
    
    // PBRequest specifies the request for aggregator
    message PBRequest {
      // Debug flags
      // 0: just return prediction results, no debug information
      // 3: return features generated by FG module, string format, feature values are separated by \u0002, 
      //    could be used for checking feature consistency and generating online deep learning samples 
      // 100: return prediction results, and save request to model_dir 
      // 101: save timeline to model_dir
      // 102: for recall models such as DSSM and MIND, not only return Faiss retrieved results
      //      but also return user embedding vectors.
      int32 debug_level = 1;
    
      // user features
      map<string, PBFeature> user_features = 2;
    
      // item ids, static(daily updated) item features 
      // are fetched from the feature cache residing in 
      // each processor node by item_ids
      repeated string item_ids = 3;
    
      // context features for each item, realtime item features
      //    could be passed as context features.
      map<string, ContextFeatures> context_features = 4;
    
      // embedding retrieval neighbor number.
      int32 faiss_neigh_num = 5;
    }
    
    // return results
    message Results {
      repeated double scores = 1 [packed = true];
    }
    
    enum StatusCode {
      OK = 0;
      INPUT_EMPTY = 1;
      EXCEPTION = 2;
    }
    
    // PBResponse specifies the response for aggregator
    message PBResponse {
      // results
      map<string, Results> results = 1;
    
      // item features
      map<string, string> item_features = 2;
    
      // fg generate features
      map<string, string> generate_features = 3;
    
      // context features
      map<string, ContextFeatures> context_features = 4;
    
      string error_msg = 5;
    
      StatusCode status_code = 6;
    
      // item ids
      repeated string item_ids = 7;
    
      repeated string outputs = 8;
    
      // all fg input features
      map<string, string> raw_features = 9;
    
      // output tensors
      map<string, ArrayProto> tf_outputs = 10;
    }