Google ML Engine:通过REST API提交培训工作

时间:2018-05-31 08:22:58

标签: google-cloud-ml

我正在尝试使用来自Googles github的Census示例项目通过REST API请求启动培训工作。我能够提交一份工作,但它总是失败,因为我无法说明培训和评估(测试)文件的保存位置,而且文档真的缺乏 - 只是说明args[]。当我检查Google ML中的日志时,会出现以下错误:

task.py: error: the following arguments are required: --train-files, --eval-files

The replica master 0 exited with a non-zero status of 2.

这是我制定的REST请求:

{
    "jobId": "training_12",
    "trainingInput": {
        "scaleTier": "BASIC",
        "packageUris": ["gs://MY_BUCKET/census.tar.gz"],
        "pythonModule": "trainer.task",
        "args": ["--train_files gs://MY_BUCKET/adult.data.csv", "--eval_files gs://MY_BUCKET/adult.test.csv"],
        "region": "europe-west1",
        "jobDir": "gs://MY_BUCKET/",
        "runtimeVersion": "1.4",
        "pythonVersion": "3.5"
    }
}

args下我尝试了许多不同方式来说明火车和评估文件的位置,但我无法让它工作。为了澄清,我必须为此用例使用REST API - 而不是CLI。

由于

- 更新 -

我试图将args设为--train-files--eval-files,但这仍然不起作用。

- 更新2 - 我已经能够通过将args配置为:

来解决这个问题
"args": [
          "--train-files", 
          "gs://MY_BUCKET/adult.data.csv", 
          "--eval-files", 
          "gs://MY_BUCKET/adult.test.csv", 
          "--train-steps",
          "100",
          "--eval-steps",
          "10"],

现在,我收到一个新错误,日志似乎没有提供更多信息:"The replica master 0 exited with a non-zero status of 1."

日志实际上已经进行了一些培训,我怀疑这是与保存工作有关的事情,但我不确定。

1 个答案:

答案 0 :(得分:2)

我发现在Google Cloud ML Engine中提交培训作业时,您已经找到了args问题的解决方案。但是,让我与您分享一些文档页面,您可以在其中找到有关此主题的所有必需信息。

在关于formatting configuration parameters的第一页(在 Python 标签下),您可以看到'args': ['--arg1', 'value1', '--arg2', 'value2'], 字段的填充方式如下:

args

因此,定义['--my_first_arg', 'first_arg_value', '--my_second_arg', 'second_arg_value'] 的正确方法是将它们作为键值对写为独立字符串。

此外,包含general information about Training jobs的其他页面解释说,培训服务接受参数作为字符串列表,格式为:

"args": [
          "--train-files", 
          "gs://BUCKET/FILE", 
          "--eval-files", 
          "gs://BUCKET/FILE_2", 
          "--train-steps",
          "100",
          "--eval-steps",
          "10"]

这就是为什么你共享的最后一个格式(下面)是正确的格式:

import { camelCase } from 'lodash';

const camelizeKeys = (obj) => {
  if (Array.isArray(obj)) {
    return obj.map(v => camelizeKeys(v));
  } else if (obj !== null && obj.constructor === Object) {
    return Object.keys(obj).reduce(
      (result, key) => ({
        ...result,
        [camelCase(key)]: camelizeKeys(obj[key]),
      }),
      {},
    );
  }
  return obj;
};