【发布时间】:2020-11-10 04:48:00
【问题描述】:
背景 我正在创建一个自主的 Google AutoML 端端系统。我创建了一个云函数,它在训练开始时接收云发布/订阅消息。云函数使用操作ID获取训练的操作状态。如果模型的训练完成(操作元数据 = true),该函数会将模型 ID 发送到部署函数,并发送带有模型 ID 的 pub/sub 消息,以便在预测时调用模型。我从这篇帖子How to programmatically get model id from google-cloud-automl with node.js client library
中找到了一个解决方案问题 我遇到的问题是云功能超时 10 分钟。我在reddit上写了这个关于潜在解决方案的问题。 https://www.reddit.com/r/googlecloud/comments/jqr213/cloud_function_to_compute_engine/ Compute Engine 解决方案对于主要在云功能环境中编写的系统似乎并不实用。在尝试实现 cron 作业解决方案时,我想到了云功能的重试功能。它保留相同的事件,并将重试该功能长达一周。重试的文档是https://cloud.google.com/functions/docs/bestpractices/retries 我如何包含取消该功能以使其重试直到它变为真并完成部署和发布/订阅消息?我的想法是在 if else 语句中包含系统的结尾,我只是在努力寻找这个/如果它真的有效的文档。
代码
const {AutoMlClient} = require('@google-cloud/automl').v1;
// Instantiates a client
const client = new AutoMlClient();
exports.helloPubSub = (event, context) => {
//Imports the Google Cloud AutoML library
const message = event.data
? Buffer.from(event.data, 'base64').toString()
: 'Hello, World';
const model = message;
console.log(model);
const modelpath = message.replace('"','');
const modelID = modelpath.replace('"','');
const message1 = model.replace('projects/170974376642/locations/us-central1/operations/','');
const message2 = message1.replace('"','');
const message3 = message2.replace('"','');
console.log(`Operation ID is: ${message3}`)
getOperationStatus(message3, modelID);
}
// [START automl_vision_classification_deploy_model_node_count]
async function getOperationStatus(opId, message) {
console.log('Starting operation status');
const opped = opId;
const data = message;
const projectId = '170974376642';
const location = 'us-central1';
const operationId = opId;
// Construct request
const request = {
name: `${message}`,
};
console.log('Made it to the response');
const [response] = await client.operationsClient.getOperation(request);
console.log(`Name: ${response.name}`);
console.log(`Operation details:`);
var apple = JSON.stringify(response);
console.log(apple);
console.log('Loop until the model is ready to deploy');
if (apple.includes('True')) {
const appleF = apple.replace((/projects\/[a-zA-Z0-9-]*\/locations\/[a-zA-Z0-9-]*\/models\//,''));
deployModelWithNodeCount(appleF);
pubSub(appleF);
} else {
getOperationStatus(opped, data);
}
}
async function pubSub(id) {
const topicName = 'modelID';
const data = JSON.stringify({foo: `${id}`});
async function publishMessage() {
// Publishes the message as a string, e.g. "Hello, world!" or JSON.stringify(someObject)
const dataBuffer = Buffer.from(data);
try {
const messageId = await pubSubClient.topic(topicName).publish(dataBuffer);
console.log(`Message ${messageId} published.`);
} catch (error) {
console.error(`Received error while publishing: ${error.message}`);
process.exitCode = 1;
}
}
publishMessage();
// [END pubsub_publish_with_error_handler]
// [END pubsub_quickstart_publisher]
process.on('unhandledRejection', err => {
console.error(err.message);
process.exitCode = 1;
});
}
async function deployModelWithNodeCount(message) {
const projectId = 'ireda1';
const location = 'us-central1';
const modelId = message;
// Construct request
const request = {
name: client.modelPath(projectId, location, modelId),
imageClassificationModelDeploymentMetadata: {
nodeCount: 1,
},
};
const [operation] = await client.deployModel(request);
// Wait for operation to complete.
const [response] = await operation.promise();
console.log(`Model deployment finished. ${response}`);
}
// [END automl_vision_classification_deploy_model_node_count]
【问题讨论】:
-
我已经尝试实现firebase.google.com/docs/functions/retries,console.log('函数被停止重试');返回 Promise.reject(错误);这将结束函数并且不记录任何重试
标签: node.js google-cloud-platform google-cloud-functions google-cloud-pubsub automl