【问题标题】:Tensorflow object detection train.py fails when running on cloud machine learning engine在云机器学习引擎上运行时,Tensorflow 对象检测 train.py 失败
【发布时间】:2017-10-17 22:11:48
【问题描述】:

我有一个在本地工作的 tensorflow 对象检测 api 的小型工作示例。一切看起来都很棒。我的目标是使用他们的脚本在我过去广泛使用的 Google 机器学习引擎中运行。我正在关注这些docs

声明一些相关变量

declare PROJECT=$(gcloud config list project --format "value(core.project)")
declare BUCKET="gs://${PROJECT}-ml"
declare MODEL_NAME="DeepMeerkatDetection"
declare FOLDER="${BUCKET}/${MODEL_NAME}"
declare JOB_ID="${MODEL_NAME}_$(date +%Y%m%d_%H%M%S)"
declare TRAIN_DIR="${FOLDER}/${JOB_ID}"
declare EVAL_DIR="${BUCKET}/${MODEL_NAME}/${JOB_ID}_eval"
declare  PIPELINE_CONFIG_PATH="${FOLDER}/faster_rcnn_inception_resnet_v2_atrous_coco_cloud.config"
declare  PIPELINE_YAML="/Users/Ben/Documents/DeepMeerkat/training/Detection/cloud.yml"

我的 yaml 看起来像

trainingInput:
  runtimeVersion: "1.0"
  scaleTier: CUSTOM
  masterType: standard_gpu
  workerCount: 5
  workerType: standard_gpu
  parameterServerCount: 3
  parameterServerType: standard

相关路径在配置中设置,例如

  fine_tune_checkpoint: "gs://api-project-773889352370-ml/DeepMeerkatDetection/checkpoint/faster_rcnn_inception_resnet_v2_atrous_coco_11_06_2017/model.ckpt"

我已经使用 setup.py 打包了对象检测和苗条

跑步

gcloud ml-engine jobs submit training "${JOB_ID}_train" \
    --job-dir=${TRAIN_DIR} \
    --packages dist/object_detection-0.1.tar.gz,slim/dist/slim-0.1.tar.gz \
    --module-name object_detection.train \
    --region us-central1 \
    --config ${PIPELINE_YAML} \
    -- \
    --train_dir=${TRAIN_DIR} \
    --pipeline_config_path= ${PIPELINE_CONFIG_PATH}

产生一个张量流(导入?)错误。有点神秘

insertId:  "1inuq6gg27fxnkc"  
 logName:  "projects/api-project-773889352370/logs/ml.googleapis.com%2FDeepMeerkatDetection_20171017_141321_train"  
 receiveTimestamp:  "2017-10-17T21:38:34.435293164Z"  
 resource: {…}  
 severity:  "ERROR"  
 textPayload:  "The replica ps 0 exited with a non-zero status of 1. Termination reason: Error. 
Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/root/.local/lib/python2.7/site-packages/object_detection/train.py", line 198, in <module>
    tf.app.run()
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/platform/app.py", line 44, in run
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
  File "/root/.local/lib/python2.7/site-packages/object_detection/train.py", line 145, in main
    model_config, train_config, input_config = get_configs_from_multiple_files()
  File "/root/.local/lib/python2.7/site-packages/object_detection/train.py", line 127, in get_configs_from_multiple_files
    text_format.Merge(f.read(), train_config)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/lib/io/file_io.py", line 112, in read
    return pywrap_tensorflow.ReadFromStream(self._read_buf, length, status)
  File "/usr/lib/python2.7/contextlib.py", line 24, in __exit__
    self.gen.next()
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/errors_impl.py", line 466, in raise_exception_on_not_ok_status
    pywrap_tensorflow.TF_GetCode(status))
FailedPreconditionError: .

我在其他questions 中看到了这个错误,与机器学习引擎上的预测相关,表明这个错误可能(?)与对象检测代码没有直接关系,但感觉它没有被正确打包,丢失依赖?我已将我的 gcloud 更新到最新版本。

Bens-MacBook-Pro:research ben$ gcloud --version
Google Cloud SDK 175.0.0
bq 2.0.27
core 2017.10.09
gcloud 
gsutil 4.27

在这里很难看出它与这个问题有什么关系

FailedPreconditionError when running TF Object Detection API with own model

为什么代码需要在云中以不同方式初始化?

更新 #1。

奇怪的是 eval.py 工作正常,所以它不能是配置文件的路径,也不能是 train.py 和 eval.py 共享的任何内容。 Eval.py 耐心等待模型检查点的创建。

另一个想法可能是检查点在上传过程中以某种方式损坏。我们可以从头开始测试这种绕过和训练。

在.config中

  from_detection_checkpoint: false

产生相同的前置条件错误,所以它不可能是模型。

【问题讨论】:

  • 尝试打开 train_config 文件时似乎失败了。很难解码,但错误信息有一个“。”这让我觉得它正在尝试将本地目录作为配置文件读取。您的代码如何设置该文件名?
  • 整体的config文件是从命令行设置的--pipeline_config_path=${PIPELINE_CONFIG_PATH},也就是gs://api-project-773889352370-ml/DeepMeerkatDetection/faster_rcnn_inception_resnet_v2_atrous_coco_cloud.config,我也觉得将是路径错误,但 eval.py 脚本也接受此参数并且运行没有问题。好的,但重点是,您不会将此视为 cloudml 错误,而是需要在内部进行调试。
  • 我查看了代码中的逻辑: if FLAGS.pipeline_config_path: model_config, train_config, input_config = get_configs_from_pipeline_file() else: model_config, train_config, input_config = get_configs_from_multiple_files() 并且您发送的堆栈跟踪包含 get_configs_from_multiple_files .但根据您评论中的信息,您正在尝试设置--pipeline_config_path,所以我认为您期望 get_configs_from_pipeline_file() 改为运行。显然,Flags 存在问题。答案如下。

标签: machine-learning tensorflow google-cloud-platform object-detection


【解决方案1】:

根本原因是一个小错误:

--pipeline_config_path= ${PIPELINE_CONFIG_PATH}

有一个额外的空间。试试这个:

gcloud ml-engine jobs submit training "${JOB_ID}_train" \
    --job-dir=${TRAIN_DIR} \
    --packages dist/object_detection-0.1.tar.gz,slim/dist/slim-0.1.tar.gz \
    --module-name object_detection.train \
    --region us-central1 \
    --config ${PIPELINE_YAML} \
    -- \
    --train_dir=${TRAIN_DIR} \
    --pipeline_config_path=${PIPELINE_CONFIG_PATH}

【讨论】:

  • 叹息。对于那些想知道“前提条件”的人将空间作为当前工作目录,因此只解析了“”,因此 train.py 正在寻找一个名为“”的配置。真的很伤心。
猜你喜欢
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
相关资源
最近更新 更多