Todos os produtos
Search
Central de documentação

Platform For AI:EasyRec Processor

Última atualização: Aug 26, 2026

Elastic Algorithm Service (EAS) inclui um processador EasyRec integrado que implanta modelos de recomendação treinados com EasyRec ou TensorFlow como serviços de pontuação com engenharia de features integrada. O processador otimiza conjuntamente a engenharia de features e a inferência do modelo para garantir alta performance na pontuação.

Informações gerais

O EasyRec Processor é um service de inferência baseado na especificação de processadores do PAI-EAS (Develop custom processors by using C or C++). Ele oferece suporte a dois cenários:

  • Para modelos de deep learning treinados com feature generation (FG) e EasyRec, o EasyRec Processor aumenta a performance de pontuação ao armazenar features de itens em cache na memória e otimizar a transformação de features e a inferência. O FeatureStore gerencia features online e em tempo real. A PAI-Rec recommendation platform gera código que simplifica o treinamento, a transformação de features e a inferência. Em combinação com o PAI-Rec DPI engine, permite a implantação rápida de modelos e a integração de serviços.

  • O EasyRec Processor também pode servir modelos treinados com EasyRec ou TensorFlow sem o Feature Generator (modo bypass).

Arquitetura de um mecanismo de recomendação baseado no EasyRec Processor:

easyrec

Nota: O processador também oferece suporte a dados offline do MaxCompute.

O EasyRec Processor inclui os seguintes módulos:

  • Item Feature Cache: Armazena features do FeatureStore em cache na memória para reduzir a sobrecarga de rede. Oferece suporte a atualizações incrementais e em tempo real de features.

  • Feature Generator: Módulo de engenharia de features (Feature generation overview and configuration) que utiliza a mesma implementação para processamento offline e online, garantindo consistência. A implementação baseia-se em soluções comprovadas do Taobao. O tópico Concepts of data fields, data features, and FG features in EasyRec aborda a terminologia do FG. É possível estender o FG com custom feature operators.

  • TFModel: Carrega arquivos SavedModel exportados do EasyRec e utiliza o Blade para otimizar a inferência do modelo em CPUs e GPUs.

  • Módulos de Feature Instrumentation e Incremental Model Update: Estes módulos oferecem suporte a cenários de treinamento em tempo real. Consulte Real-time training.

Limitações

A inferência em CPU tem suporte apenas nas famílias de instâncias de uso geral g6, g7 e g8 (apenas CPUs Intel).

A inferência em GPU tem suporte nas GPUs T4, A10, GU30, L20, 3090 e 4090, mas não na P100.

General-purpose (g series).

Versões

Utilize a versão mais recente para obter os melhores recursos e performance.

Lista de versões

Nome do processador

Data de lançamento

Versão do TensorFlow

Novos recursos

easyrec

20230608

2.10

  • Suporte ao FeatureGenerator e ao cache de features de item.

  • Suporte a deep learning online.

  • Suporte à recuperação de vetores Faiss.

  • Suporte a inferência em GPU.

easyrec-1,2

20230721

2.10

  • Otimização de embedding de categorias ponderadas.

easyrec-1,3

20230802

2.10

  • Suporte ao carregamento de features de item do MaxCompute para o cache de features de item.

easyrec-1,6

20231006

2.10

  • Extensão automática de features.

  • Otimização de alocação em GPU.

  • Suporte ao salvamento de requisições no diretório do modelo com save_req.

easyrec-1,7

20231013

2.10

  • Otimização da performance de modelos Keras.

easyrec-1,8

20231101

2.10

  • Suporte à versão cloud do feature store.

easyrec-kv-1,8

20231220

DeepRec

(deeprec2310)

  • Suporte ao DeepRec EmbeddingVariable.

easyrec-1,9

20231222

2.10

  • Correção de problemas de otimização de grafo para TagFeature e RawFeature.

easyrec-2,4

20240826

2.10

  • Suporte ao FeatureDB no SDK C++ do feature store.

  • Suporte a tokens STS no SDK C++ do feature store.

  • Suporte ao tipo de dados double (float64) para requisições.

easyrec-2,9

20250718

2.10

  • Integra a versão 0.7.0 da biblioteca FeatureGenerator.

easyrec-3,0

20251025

2.10

  • Integra a versão 0.7.4 da biblioteca FeatureGenerator.

  • Melhorias de performance.

  • Correção de um problema na análise de novos operadores da biblioteca FG atualizada.

easyrec-3,1

20260116

2.10.1

  • Atualiza a biblioteca FG para a versão 1.0.1.

  • Atualiza o SDK FS para a versão 20251117.

easyrec-3,2

20260209

2.10.1

Atualiza o SDK FS para a versão 20260202.

easyrec-3,3

20260330

2.10.1

Atualiza a biblioteca FG para a versão 1.0.2.

Atualiza o SDK FS para a versão 20260305.

easyrec-3,4

20260415

2.10.1

Atualiza a biblioteca FG para a versão 1.0.3.

easyrec-3,5

20260515

2.10.1

Atualiza a biblioteca FG para a versão 1.0.5.

Etapa 1: Implantar o service

Para implantar um service de modelo EasyRec com eascmd, defina Processor type como easyrec-{version}. O tópico Service deployment: EASCMD detalha todo o processo de implantação. As seções a seguir fornecem exemplos de arquivos de configuração.

Nova biblioteca FeatureGenerator (fg_mode=normal)

Este exemplo utiliza o tipo de nó PyOdps3 com a nova biblioteca FeatureGenerator. Esta biblioteca oferece suporte a operadores de transformação integrados e personalizados, tipos de entrada complexos (arrays, maps) e dependências de features baseadas em DAG.

O exemplo a seguir usa o PAI-FeatureStore para gerenciamento de dados de features. Substitua ${fs_project},${fs_model} pelos valores reais. O tópico Step 2: Create and deploy an EAS model service descreve o procedimento 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')

Substitua os valores de featuredb_username e featuredb_password por credenciais válidas.

Versão com operador TF do FeatureGenerator (fg_mode=tf)

Importante: A versão com operador TF do FeatureGenerator tem suporte apenas a um conjunto limitado de features integradas: id_feature, raw_feature, combo_feature, lookup_feature, match_feature, and sequence_feature. Não há suporte a operadores personalizados do FeatureGenerator.

O script de implantação a seguir inclui o par de AccessKey em texto simples. Ele não utiliza o PAI-FeatureStore nem carrega dados do MaxCompute para reduzir a carga no Hologres.

Utilize o PAI-FeatureStore com MaxCompute para implantações em produção. O tópico Step 2: Create and deploy an EAS model service demonstra um método mais seguro usando um script Python, o objeto o do DataWorks e tokens STS temporários com load_feature_from_offlinestore definido como 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

Bypass do FeatureGenerator (fg_mode=bypass)

Sem o FeatureGenerator, monte a requisição no lado do cliente. Consulte 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

A tabela a seguir descreve os principais parâmetros. O tópico JSON deployment aborda parâmetros adicionais.

Parâmetro

Obrigatório

Descrição

Exemplo

processor

Sim

Nome do processador EasyRec.

"processor": "easyrec"

fg_mode

Sim

Modo de engenharia de features. O modo selecionado determina o sdk e o formato da requisição para invocação do service.

  • normal: (Recomendado)

    • Descrição: Utiliza a biblioteca FeatureGenerator para transformação de features e alimenta o modelo com a saída. Este modo fornece um rico conjunto de operadores FeatureGenerator integrados, além de suportar operadores personalizados e dependências de features baseadas em DAG.

    • Método de invocação: O cliente deve usar o sdk EasyRecRequest e passar apenas features de alto nível, como IDs de usuário e listas de IDs de itens.

  • tf:

    • Descrição: Incorpora o FeatureGenerator como um operador TensorFlow no grafo de computação do TensorFlow e realiza otimização de grafo para maior performance.

    • Método de invocação: Igual ao modo normal. O cliente deve usar o sdk EasyRecRequest.

  • bypass:

    • Descrição: Ignora o FeatureGenerator integrado, e o service atua apenas como um mecanismo de inferência de modelo TensorFlow. Este modo é adequado para cenários em que você utiliza processamento de features personalizado. Neste modo, não é necessário configure parâmetros relacionados ao cache de features de item ou ao acesso do processador ao PAI-FeatureStore.

    • Método de invocação: O cliente deve usar o sdk TFRequest. O chamador deve preparar e montar todos os dados brutos de features exigidos pelo modelo no cliente e organizar os dados no formato Tensor. Este modo é indicado para usuários avançados que possuem um sistema externo de processamento de features.

"fg_mode": "normal"

outputs

Sim

Nomes das variáveis de saída do modelo TensorFlow, como probs_ctr. Separe vários nomes com vírgulas (,). Para encontrar os nomes das variáveis de saída, execute o comando do TensorFlow saved_model_cli.

"outputs":"probs_ctr,probs_cvr"

save_req

Não

Define se os dados da requisição devem ser salvos no diretório do modelo para warm-up e testes de performance. Valores válidos:

  • true: O arquivo é salvo.

  • false (padrão): O arquivo não é salvo. Defina este parâmetro como false em ambientes de produção para evitar degradação de performance.

"save_req": "false"

Parâmetros do cache de features de item

period

Sim

Intervalo de atualização do cache de features de item em minutos. Para features atualizadas diariamente, defina como >1.440 (minutos por dia), como 2.880 (dois dias). Isso evita atualizações redundantes, pois as features também são atualizadas durante implantações de rotina.

"period": 2880

remote_type

Sim

Fonte de dados para features de item. Valores válidos:

  • hologres: Lê e grava dados usando interfaces SQL. Adequado para armazenar e consultar grandes volumes de dados.

  • none: Não utiliza o cache de features de item. As features de item são passadas na requisição. Neste caso, defina tables como [].

"remote_type": "hologres"

tables

Não

Tabela de features de item. Este parâmetro é obrigatório quando remote_type está definido como hologres. Inclui os seguintes subparâmetros:

  • key: Obrigatório. Nome da coluna de ID do item.

  • name: Obrigatório. Nome da tabela de features.

  • value: Opcional. Nomes das colunas a serem carregadas. Separe vários nomes de coluna com vírgula (,).

  • condition: Opcional. Cláusula WHERE usada para filtrar itens. Exemplo: style_id<10000.

  • timekey: Opcional. Especifica o timestamp ou valor inteiro para atualizações incrementais de itens. Formatos suportados: timestamp e int.

  • static: Opcional. Indica uma feature estática que não requer atualizações periódicas.

É possível ler dados de itens de entrada de várias tabelas. A configuração deve estar no seguinte formato:

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

Se as tabelas compartilharem nomes de colunas, as colunas da tabela que aparece posteriormente na lista substituirão as da tabela anterior.

"tables": {

"key": "goods_id",

"name": "public.ali_rec_item_feature"

}

url

Não

Endpoint do Hologres.

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

Parâmetros para acesso do processador ao PAI-FeatureStore

fs_project

Não

Nome do projeto PAI-FeatureStore. Obrigatório ao usar o PAI-FeatureStore. Configure a FeatureStore project.

"fs_project": "fs_demo"

fs_model

Não

Nome da feature do modelo no PAI-FeatureStore.

"fs_model": "fs_rank_v1"

fs_entity

Não

Nome da entidade no PAI-FeatureStore.

"fs_entity": "item"

region

Não

Região onde reside o projeto PAI-FeatureStore.

"region": "cn-beijing"

access_key_id

Não

AccessKey ID usado para acessar o PAI-FeatureStore.

"access_key_id": "xxxxx"

access_key_secret

Não

AccessKey Secret usado para acessar o PAI-FeatureStore.

"access_key_secret": "xxxxx"

featuredb_username

Não

Nome de usuário para o FeatureDB.

"featuredb_username": "xxxxx"

featuredb_password

Não

Senha para o FeatureDB.

"featuredb_password": "xxxxx"

load_feature_from_offlinestore

Não

Define se as features offline devem ser carregadas diretamente do OfflineStore do PAI-FeatureStore. Valores válidos:

  1. True: Lê do MaxCompute via OfflineStore do PAI-FeatureStore.

  2. False (padrão): Lê do OnlineStore do PAI-FeatureStore.

"load_feature_from_offlinestore": True

iterate_featuredb_interval

Não

Intervalo, em segundos, para atualização de features estatísticas em tempo real.

Um intervalo menor melhora a atualização das features, mas aumenta os custos de leitura quando as features mudam frequentemente. Equilibre precisão e custo.

"iterate_featuredb_interval": 5

input_tile: Parâmetros para broadcast automático de features

INPUT_TILE

Não

Defina a variável de ambiente INPUT_TILE como 1 para ative o broadcast automático de features de item. Isso permite passar um único valor para features que permanecem constantes dentro de uma requisição, como user_id. Quando a variável de ambiente INPUT_TILE é definida como 2, a operação tile é adiada até após a recuperação dos embeddings de features, o que reduz ainda mais a carga computacional.

  • Benefícios: Reduz o tamanho da requisição, o tempo de transferência de rede e o tempo de computação.

  • Para ative este recurso, defina a variável de ambiente INPUT_TILE como 1 ou 2.

Nota
  • Esta otimização tem suporte no EasyRec 1,3 e versões posteriores.

  • Quando fg_mode é tf, esta otimização é ativada automaticamente, e você não precisa defina esta variável de ambiente.

  • Quando fg_mode é normal, INPUT_TILE é definido automaticamente como 1 no EasyRec 2,9 e versões posteriores.

"processor_envs":

[

{

"name": "INPUT_TILE",

"value": "2"

}

]

ADAPTE_FG_CONFIG

Não

Ativa compatibilidade com modelos treinados com uma versão mais antiga do FeatureGenerator.

"processor_envs":

[

{

"name": "ADAPTE_FG_CONFIG",

"value": "true"

}

]

DISABLE_FG_PRECISION

Não

Para compatibilidade com modelos treinados com uma versão mais antiga do FeatureGenerator. A versão antiga limita features do tipo float a seis dígitos significativos por padrão, enquanto a nova versão remove esse limite. Para aplicar o comportamento antigo (limite de 6 dígitos), defina esta variável como true.

"processor_envs":

[

{

"name": "DISABLE_FG_PRECISION",

"value": "false"

}

]

Otimização de inferência do processador EasyRec

Parâmetro

Obrigatório

Descrição

Exemplo

TF_XLA_FLAGS

Não

Para inferência em GPU, este parâmetro permite que o XLA compile e otimize o modelo e realize fusão de operadores automaticamente.

"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 agendamento do TF

Não

inter_op_parallelism_threads: Controla o número de threads para executar diferentes operações em paralelo.

intra_op_parallelism_threads: Controla o número de threads usadas dentro de uma única operação.

Para uma CPU de 32 núcleos, definir esses parâmetros como 16 geralmente melhora a performance. Note que a soma das duas contagens de threads não pode exceder o número total de núcleos da CPU.

"model_config": {

"inter_op_parallelism_threads": 16,

"intra_op_parallelism_threads": 16,

}

rpc.worker_threads

Não

Parâmetro sob metadata na configuração do EAS. Defina este parâmetro como o número de núcleos de CPU da instância. Por exemplo, se a instância tiver 15 núcleos de CPU, defina worker_threads como 15.

"metadata": {

"rpc": {

"worker_threads": 15

}

Etapa 2: Chamar o service

2,1 Configuração de rede

O mecanismo PAI-Rec e o service de pontuação executam no PAI-EAS e precisam de uma conexão de rede direta. Na página de instâncias do PAI-EAS, clique em 'VPC' para configure a mesma vpc, vSwitch e grupo de segurança. Consulte Access public or on-premises resources from EAS. Se você usar o Hologres, configure também a mesma vpc. A figura a seguir mostra um exemplo.

image

2,2 Obter informações do service

Após a implantação, acesse a página Elastic Algorithm Service (EAS). Encontre seu service e clique em Invocation Information na coluna Service Method para visualize o endpoint e o token.

2,3 Exemplos de código sdk

O service de modelo EasyRec usa Protocol Buffers (Protobuf) para entrada e saída, portanto, não é possível testá-lo pelo console do PAI-EAS.

Antes de chamar o service, confirme o fg_mode em model_config da Etapa 1. Cada modo requer um sdk de cliente diferente.

Modo (fg_mode)

Classe de requisição

normal ou tf (com engenharia de features integrada)

EasyRecRequest

bypass (sem engenharia de features integrada)

TFRequest

Com FG fg_mode=normal ou tf

Java

A configuração do Maven é abordada no Java SDK guide. O código a seguir envia uma requisição para o service 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

A configuração do ambiente é abordada no Python SDK guide. Use o cliente Java em produção para melhor performance. Exemplo:

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: O endpoint do service. Para obtê-lo, acesse a página Elastic Algorithm Service (EAS), encontre seu service e clique em Invocation Information na coluna Service Method.

  • service_name: O nome do service. Obtenha-o na página Elastic Algorithm Service (EAS).

  • token: O token do service. Encontre-o na caixa de diálogo Invocation Information.

Sem FG fg_mode=bypass

Java

A configuração do Maven é abordada no Java SDK guide. O código a seguir envia uma requisição para o service 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

A configuração do ambiente é descrita no Python SDK guide. O sdk Python é recomendado apenas para depuração; use o sdk Java em produção. O código a seguir envia uma requisição para o service 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 Criar uma requisição de service personalizada

Para linguagens diferentes de Python e Java, gere o código de requisição de previsão a partir dos seguintes arquivos .proto:

  • tf_predict.proto: Definição de requisição para um modelo 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: Definição de requisição para um modelo TensorFlow com 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;
    }