Use o Elastic Algorithm Service (EAS) do PAI para inferência de modelo com o processador EasyRec, sem utilizar o EasyRec no treinamento do modelo.
Use o Elastic Algorithm Service (EAS) do Platform for AI (PAI) para inferência de modelo mesmo quando o EasyRec não for utilizado no treinamento. Para mais informações, consulte Processador EasyRec.
Informações básicas
Se você concluiu o treinamento do modelo em outro ambiente, ainda pode aproveitar os serviços de inferência de alto desempenho do EAS.
Etapa 1: Preparar um modelo
Exporte seu modelo TensorFlow no formato SavedModel e carregue-o em um local de armazenamento acessível, como um bucket do Alibaba Cloud Object Storage Service (OSS).
Etapa 2: Configurar um arquivo de configuração de serviço
Crie um arquivo de configuração de serviço, por exemplo, echo.json. O exemplo a seguir mostra uma configuração de amostra.
bizdate=$1
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-1.9",
"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
Neste exemplo, fg_mode está definido como bypass, o que significa que a geração de recursos (FG) está desativada e apenas o modelo TensorFlow será implantado.
A tabela a seguir descreve os parâmetros principais. Para obter informações sobre outros parâmetros, consulte Implantação JSON.
|
Parâmetro |
Obrigatório |
Descrição |
Exemplo |
|
processor |
Sim |
Nome do processador EasyRec. |
"processor": "easyrec" |
|
fg_mode |
Sim |
Modo de engenharia de recursos. Valores válidos:
|
"fg_mode": "tf" |
|
outputs |
Sim |
Nome da variável de saída do modelo TensorFlow. Exemplo: probs_ctr. Separe vários nomes com vírgulas (,). Para obter o nome da variável de saída, execute o comando do TensorFlow saved_model_cli. |
"outputs":"probs_ctr,probs_cvr" |
|
save_req |
Não |
Define se os arquivos de dados retornados devem ser salvos no diretório do modelo. Esses arquivos podem ser usados para aquecimento e testes de desempenho. Valores válidos:
|
"save_req": "false" |
|
Parâmetros relacionados ao Item Feature Cache |
|||
|
period |
Sim |
Intervalo de atualização dos recursos de item. Unidade: minutos. Se as atualizações ocorrerem a cada poucos dias, defina este parâmetro com um valor superior a um dia (por exemplo, 2880), pois os recursos de item são atualizados diariamente durante a atualização do serviço. |
"period": 2880 |
|
remote_type |
Sim |
Fonte de dados dos recursos de item. Valores válidos:
|
"remote_type": "hologres" |
|
tables |
Não |
Tabela de recursos de item. Necessário apenas quando o parâmetro remote_type estiver definido como hologres. Contém os seguintes campos:
Para ler dados de recursos de item de várias tabelas, configure este parâmetro no seguinte formato: "tables": [{"key":"table1", ...},{"key":"table2", ...}] Se as tabelas possuírem colunas duplicadas, a coluna da tabela subsequente sobrescreverá a da tabela anterior. |
"tables": { "key": "goods_id", "name": "public.ali_rec_item_feature" } |
|
url |
Não |
Endpoint para conexão com o Hologres. |
"url": "postgresql://LTAI:yourAccessKeySecret@hgprecn-cn-xxxxx-cn-hangzhou-vpc.hologres.aliyuncs.com:80/bigdata_rec" |
|
Parâmetros relacionados ao FeatureStore |
|||
|
fs_project |
Não |
Nome do projeto FeatureStore. Obrigatório caso utilize o FeatureStore. Para mais informações, consulte Configurar um projeto FeatureStore. |
"fs_project": "fs_demo" |
|
fs_model |
Não |
Nome do recurso de modelo no FeatureStore. |
"fs_model": "fs_rank_v1" |
|
fs_entity |
Não |
Nome da entidade de recurso no FeatureStore. |
"fs_entity": "item" |
|
region |
Não |
Região onde o serviço FeatureStore está implantado. |
"region": "cn-beijing" |
|
access_key_id |
Não |
AccessKey ID do serviço FeatureStore. |
"access_key_id": "LTAI" |
|
access_key_secret |
Não |
AccessKey secret do serviço FeatureStore. |
"access_key_secret": "yourAccessKeySecret" |
|
load_feature_from_offlinestore |
Não |
Define se os dados de recursos offline devem ser obtidos de um armazenamento de dados offline no FeatureStore. Valores válidos:
|
"load_feature_from_offlinestore": True |
|
Parâmetro relacionado à transmissão automática |
|||
|
INPUT_TILE |
Não |
Ativa a transmissão automática para arrays de recursos de item. Se os valores de um recurso de item (como user_id) forem idênticos em uma solicitação, especifique o valor uma única vez e ele será duplicado no array.
Nota
|
"processor_envs": [ { "name": "INPUT_TILE", "value": "2" } ] |
Etapa 3: Implantar o serviço
Use o EASCMD para implantar o arquivo de configuração de serviço criado na etapa anterior.
# Run the deployment command.
eascmd create echo.json
# eascmd -i <AccessKeyID> -k <AccessKeySecret> -e <endpoint> create echo.json
# Run the update command.
eascmd modify ali_rec_rnk_no_fg -s echo.json
Verifique nos logs de saída se o serviço foi implantado com sucesso. Em seguida, obtenha o endereço de acesso do serviço.
Etapa 4: Chamar o serviço
Chamar o serviço de modelo EasyRec
No modo bypass, use o SDK Java ou o SDK Python para chamar o serviço de modelo conforme o formato de solicitação do processador EasyRec.
Exemplo com o SDK Java
Antes de usar o SDK Java, configure o ambiente Maven. Para saber como configurar o ambiente Maven, consulte SDK Java. Código de exemplo para chamar o serviço 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[]{5}, new String []{ "u0001", "u0001", "u0001"});
request.addFeed("age", TFDataType.DT_FLOAT,
new long[]{5}, new float []{ 18.0f, 18.0f, 18.0f});
// Note: If you set the INPUT_TILE parameter to 2, you can simplify the code in the following manner:
// 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[]{5}, new String []{ "i0001", "i0002", "i0003"});
request.addFetch("probs");
return request;
}
public static void main(String[] args) throws Exception {
PredictClient client = new PredictClient(new HttpConfig());
// Call setDirectEndpoint to access the service by using a virtual private cloud (VPC) direct connection channel.
// client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
// You need to create a VPC direct connection channel on the EAS page of the PAI console.
// Compared to using a gateway, using the direct connection channel improves stability and performance.
client.setEndpoint("yourAccessKeySecretx.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: the name of the output field. You can run the cURL command to view the input and output of the model.
// curl yourAccessKeySecretx.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();
}
}
Exemplo com o SDK Python
Para mais informações sobre como usar o SDK Python, consulte SDK Python. Devido ao desempenho limitado, recomendamos o uso do SDK Python apenas para depuração. Código de exemplo para chamar o serviço ali_rec_rnk_no_fg:
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import StringRequest
from eas_prediction.tf_request_pb2 import TFRequest
if __name__ == '__main__':
client = PredictClient('http://yourAccessKeySecretx.vpc.cn-hangzhou.pai-eas.aliyuncs.com', 'ali_rec_rnk_no_fg')
client.set_token('')
client.init()
req = TFRequest()
req.add_feed('user_id', [3], TFRequest.DT_STRING, ['u0001'] * 3)
req.add_feed('age', [3], TFRequest.DT_FLOAT, [18.0] * 3)
# Note: If you set the INPUT_TILE parameter to 2, you can simplify the code in the following way:
# 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', [5], TFRequest.DT_STRING,
['i0001', 'i0002', 'i0003'])
for x in range(0, 100):
resp = client.predict(req)
print(resp)
Também é possível criar solicitações de serviço personalizadas. Para mais detalhes, consulte 2,4 Criar uma solicitação de serviço personalizada.
Etapa 5: Monitorar e otimizar o desempenho do serviço
Após a implantação do serviço, teste e otimize seu desempenho e estabilidade com base nos resultados obtidos.
Resumo
Ao concluir estas etapas, você poderá usar o EAS para inferência de modelo sem depender do EasyRec para o treinamento.