Проблема масштабирования широкой и глубокой модели для обучения на Google Cloud ML

Я пытаюсь построить широкую и глубокую модель тензорного потока и обучить ее в облаке Google.

Я смог сделать это и обучить меньшие версии разработчиков.

Однако сейчас я пытаюсь увеличить количество данных и больше этапов обучения, и мои рабочие места онлайн-обучения продолжают падать.

Это работает в течение 5 минут или около того, а затем я получаю следующую ошибку:

The replica worker 2 exited with a non-zero status of 1. Termination reason: Error. 
To find out more about why your job exited please check the logs: https://console.cloud.google.com/logs/viewer?project=642488228368&resource=ml_job%2Fjob_id%2Fclickmodel_train_20171023_123542&advancedFilter=resource.type%3D%22ml_job%22%0Aresource.labels.job_id%3D%22clickmodel_train_20171023_123542%22

Когда я смотрю на журналы, я вижу, что эти ошибки кажутся проблемой:

Command '['gsutil', '-q', 'cp', u'gs://pmc-ml/clickmodel/vy/output/packages/4fc20b9f4b7678fd97c8061807d18841050bd95dbbff16a6b78961303203e032/trainer-0.0.0.tar.gz', u'trainer-0.0.0.tar.gz']' returned non-zero exit status 1

Я не совсем уверен, что здесь происходит. У меня есть ощущение, что это может быть связано с типами машин, на которых я тренирую модель. Но я попытался перейти от "STANDARD_1" к "PREMIUM_1", и я также попытался использовать пользовательские типы машин "complex_model_l" и "large_model" для сервера параметров.

В моих данных около 1400 функций, которые я использую.

Я тренирую его только на один день данных за 1000 шагов, и я значительно уменьшил размер пакета. Я могу обучать его локально, как это, но когда я пытаюсь обучить его в облаке (даже с таким небольшим количеством шагов), я сталкиваюсь с этой ошибкой.

Я не совсем уверен, что попробовать дальше...

Похоже, что команда gsutil, возможно, копирует упакованную версию модели на локального работника, и это вызывает проблему. Я не думал, что 1400 функций для широкой и глубокой модели будет достаточно для меня, чтобы беспокоиться о слишком большой модели. Так что не совсем уверен, что я нахожусь прямо здесь в том, что, как мне кажется, происходит, как я и ожидал, используя другие типы машин, и пользовательская конфигурация могла бы решить эту проблему.

ps вот yaml для пользовательской конфигурации, которую я использую:

trainingInput:
  scaleTier: CUSTOM
  masterType: large_model
  workerType: large_model
  parameterServerType: large_model
  workerCount: 15
  parameterServerCount: 10

И мой призыв обучить модель:

  gcloud ml-engine jobs submit training $JOB_NAME \
    --stream-logs \
    --job-dir $OUTPUT_PATH \
    --runtime-version 1.2 \
    --config $CONFIG \
    --module-name trainer.task \
    --package-path $PACKAGE_PATH \
    --region $REGION \
    --scale-tier CUSTOM \
    -- \
    --train-files $TRAIN_DATA \
    --eval-files $EVAL_DATA \
    --train-steps 1000 \
    --verbosity DEBUG  \
    --eval-steps 100 \
    --num-layers 2 \
    --first-layer-size 200 \
    --scale-factor 0.99

$ OUTPUT_PATH выше - это всего лишь один день данных - так что я уверен, что моя проблема не в слишком большом количестве данных в виде строк ввода и шагов. Мой размер партии также составляет 100.

ОБНОВЛЕНИЕ Я выполнил работу по настройке гиперпарама, так как на самом деле это работало на меня раньше. Вот информация о работе:

clickmodel_train_20171023_154805

 Failed (10 min 19 sec)
Creation time   
Oct 23, 2017, 4:48:08 PM
Start time  
Oct 23, 2017, 4:48:12 PM
End time    
Oct 23, 2017, 4:58:27 PM
Logs    
View logs
Error message   
Hyperparameter Tuning Trial #1 Failed before any other successful trials were completed. The failed trial had parameters: num-layers=11, scale-factor=0.47899098586647881, first-layer-size=498, . The trial's error message was: The replica worker 4 exited with a non-zero status of 1. Termination reason: Error. Traceback (most recent call last): File "/usr/lib/python2.7/runpy.py", line 174, 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/trainer/task.py", line 193, in <module> tf.gfile.DeleteRecursively(args.job_dir) File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/lib/io/file_io.py", line 432, in delete_recursively pywrap_tensorflow.DeleteRecursively(compat.as_bytes(dirname), 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)) PermissionDeniedError: could not fully delete dir To find out more about why your job exited please check the logs: https://console.cloud.google.com/logs/viewer?project=642488228368&resource=ml_job%2Fjob_id%2Fclickmodel_train_20171023_154805&advancedFilter=resource.type%3D%22ml_job%22%0Aresource.labels.job_id%3D%22clickmodel_train_20171023_154805%22
Training input  
{
  "scaleTier": "CUSTOM",
  "masterType": "large_model",
  "workerType": "standard_gpu",
  "parameterServerType": "large_model",
  "workerCount": "10",
  "parameterServerCount": "5",
  "packageUris": [
    "gs://pmc-ml/clickmodel/vy/output/packages/326616fb7bab86d0d534c03f3260a0ff38c86112850b478ba28eca1e9d12d092/trainer-0.0.0.tar.gz"
  ],
  "pythonModule": "trainer.task",
  "args": [
    "--train-files",
    "gs://pmc-ml/clickmodel/vy/data/train_data_20170901*.csv",
    "--eval-files",
    "gs://pmc-ml/clickmodel/vy/data/dev_data_20170901*.csv",
    "--train-steps",
    "1000",
    "--verbosity",
    "DEBUG",
    "--eval-steps",
    "100",
    "--num-layers",
    "2",
    "--first-layer-size",
    "200",
    "--scale-factor",
    "0.99",
    "--train-batch-size",
    "100",
    "--eval-batch-size",
    "100"
  ],
  "hyperparameters": {
    "goal": "MAXIMIZE",
    "params": [
      {
        "parameterName": "first-layer-size",
        "minValue": 50,
        "maxValue": 500,
        "type": "INTEGER",
        "scaleType": "UNIT_LINEAR_SCALE"
      },
      {
        "parameterName": "num-layers",
        "minValue": 1,
        "maxValue": 15,
        "type": "INTEGER",
        "scaleType": "UNIT_LINEAR_SCALE"
      },
      {
        "parameterName": "scale-factor",
        "minValue": 0.1,
        "maxValue": 1,
        "type": "DOUBLE",
        "scaleType": "UNIT_REVERSE_LOG_SCALE"
      }
    ],
    "maxTrials": 12,
    "maxParallelTrials": 2,
    "hyperparameterMetricTag": "accuracy"
  },
  "region": "us-central1",
  "runtimeVersion": "1.2",
  "jobDir": "gs://pmc-ml/clickmodel/vy/output"
}

но я получаю ниже ошибки сейчас:

16:58:06.188
The replica worker 4 exited with a non-zero status of 1. Termination reason: Error. Traceback (most recent call last): File "/usr/lib/python2.7/runpy.py", line 174, 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/trainer/task.py", line 193, in <module> tf.gfile.DeleteRecursively(args.job_dir) File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/lib/io/file_io.py", line 432, in delete_recursively pywrap_tensorflow.DeleteRecursively(compat.as_bytes(dirname), 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)) PermissionDeniedError: could not fully delete dir To find out more about why your job exited please check the logs: https://console.cloud.google.com/logs/viewer?project=642488228368&resource=ml_job%2Fjob_id%2Fclickmodel_train_20171023_154805&advancedFilter=resource.type%3D%22ml_job%22%0Aresource.labels.job_id%3D%22clickmodel_train_20171023_154805%22
Expand all | Collapse all {
 insertId:  "w77g2yg1zqa5fl"  
 logName:  "projects/pmc-analytical-data-mart/logs/ml.googleapis.com%2Fclickmodel_train_20171023_154805"  
 receiveTimestamp:  "2017-10-23T15:58:06.188221966Z"  
 resource: {…}  
 severity:  "ERROR"  
 textPayload:  "The replica worker 4 exited with a non-zero status of 1. Termination reason: Error. 
Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 174, 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/trainer/task.py", line 193, in <module>
    tf.gfile.DeleteRecursively(args.job_dir)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/lib/io/file_io.py", line 432, in delete_recursively
    pywrap_tensorflow.DeleteRecursively(compat.as_bytes(dirname), 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))
PermissionDeniedError: could not fully delete dir

To find out more about why your job exited please check the logs: https://console.cloud.google.com/logs/viewer?project=642488228368&resource=ml_job%2Fjob_id%2Fclickmodel_train_20171023_154805&advancedFilter=resource.type%3D%22ml_job%22%0Aresource.labels.job_id%3D%22clickmodel_train_20171023_154805%22"  
 timestamp:  "2017-10-23T15:58:06.188221966Z"  
}

Так что, похоже, действительно, разрешение. Я добавил cloud-logs@google.com, cloud-ml-service@pmc-analytical-data-mart-8c548.iam.gserviceaccount.com, cloud-ml@google.com в качестве администраторов в корзину pmc-ml. Интересно, есть что-то еще, что я пропускаю.

ДРУГОЕ ОБНОВЛЕНИЕ

Я также вижу эти ошибки в журналах, но не уверен, что они связаны или нет:

{
 insertId:  "1986fw7g2uya0b9"  
 jsonPayload: {
  created:  1508774246.95985   
  levelname:  "ERROR"   
  lineno:  335   
  message:  "2017-10-23 15:57:26.959642: E tensorflow/stream_executor/cuda/cuda_driver.cc:924] failed to allocate 11.17G (11995578368 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY"   
  pathname:  "/runcloudml.py"   
 }
 labels: {
  compute.googleapis.com/resource_id:  "7863680028519935658"   
  compute.googleapis.com/resource_name:  "worker-f13b3addb0-7-s6dxq"   
  compute.googleapis.com/zone:  "us-central1-c"   
  ml.googleapis.com/job_id:  "clickmodel_train_20171023_154805"   
  ml.googleapis.com/job_id/log_area:  "root"   
  ml.googleapis.com/task_name:  "worker-replica-7"   
  ml.googleapis.com/trial_id:  "1"   
 }
 logName:  "projects/pmc-analytical-data-mart/logs/worker-replica-7"  
 receiveTimestamp:  "2017-10-23T15:57:32.288280956Z"  
 resource: {
  labels: {
   job_id:  "clickmodel_train_20171023_154805"    
   project_id:  "pmc-analytical-data-mart"    
   task_name:  "worker-replica-7"    
  }
  type:  "ml_job"   
 }
 severity:  "ERROR"  
 timestamp:  "2017-10-23T15:57:26.959845066Z"  
}

А также

{
 insertId:  "11qijbbg2nchav0"  
 jsonPayload: {
  created:  1508774068.64571   
  levelname:  "ERROR"   
  lineno:  335   
  message:  "2017-10-23 15:54:28.645519: E tensorflow/stream_executor/cuda/cuda_driver.cc:924] failed to allocate 11.17G (11995578368 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY"   
  pathname:  "/runcloudml.py"   
 }
 labels: {
  compute.googleapis.com/resource_id:  "2962580336091050416"   
  compute.googleapis.com/resource_name:  "worker-a28b8b5d9c-8-ch8kg"   
  compute.googleapis.com/zone:  "us-central1-c"   
  ml.googleapis.com/job_id:  "clickmodel_train_20171023_154805"   
  ml.googleapis.com/job_id/log_area:  "root"   
  ml.googleapis.com/task_name:  "worker-replica-8"   
  ml.googleapis.com/trial_id:  "2"   
 }
 logName:  "projects/pmc-analytical-data-mart/logs/worker-replica-8"  
 receiveTimestamp:  "2017-10-23T15:54:59.620612418Z"  
 resource: {
  labels: {
   job_id:  "clickmodel_train_20171023_154805"    
   project_id:  "pmc-analytical-data-mart"    
   task_name:  "worker-replica-8"    
  }
  type:  "ml_job"   
 }
 severity:  "ERROR"  
 timestamp:  "2017-10-23T15:54:28.645709991Z"  
}

Я мог бы лишить мои входные файлы данных сразу до 10 или около того функций, так что это на одну переменную меньше. А затем я перезапущу ту же работу с гиперпарамом, чтобы увидеть, вижу ли я просто ошибки разрешения в следующий раз, и если да, то мы можем сосредоточиться только на этом. Похоже, что два других - мемориальные, так что, может быть, мне просто нужны большие машины или меньшие партии - считай, я бы сам смог выбраться из этого... Я думаю...:)

ЧАСТИЧНОЕ РЕШЕНИЕ

Хорошо, так что после большого количества возни я думаю, что у меня было две проблемы.

  1. я повторно использовал один и тот же выходной каталог заданий (gs://pmc-ml/clickmodel/vy/output) каждый раз, когда выполнял задание - думаю, это вызывало некоторые проблемы, когда задание не выполнялось, а следующее задание не могло быть полностью удалите некоторые оставшиеся файлы по любой причине. Не уверен на 100%, если это действительно было проблемой, но лучше иметь новую папку вывода для каждой работы.
  2. я передавал "--scale-tier STANDARD_1" в качестве аргумента, и, похоже, именно это и вызывает проблемы (я только что выдвинул этот аргумент? - если это так, то это странно, что не выдает ошибку при проверке задания).

Так что это работает:

gcloud ml-engine jobs submit training test_023 \
--job-dir gs://pmc-ml/clickmodel/vy/output_test_023 \
--runtime-version 1.2 \
--module-name trainer.task \
--package-path /home/andrew_maguire/localDev/codeBase/pmc-analytical-data-mart/clickmodel/trainer/ \
--region us-central1 \
-- \
--train-files gs://pmc-ml/clickmodel/vy/rand_data/train_data_20170901_*.csv \
--eval-files gs://pmc-ml/clickmodel/vy/rand_data/dev_data_20170901_*.csv \
--train-steps 100 \
--verbosity DEBUG

Но это не удается

gcloud ml-engine jobs submit training test_024 \
--job-dir gs://pmc-ml/clickmodel/vy/output_test_024 \
--runtime-version 1.2 \
--module-name trainer.task \
--package-path /home/andrew_maguire/localDev/codeBase/pmc-analytical-data-mart/clickmodel/trainer/ \
--region us-central1 \
--scale-tier STANDARD_1 \
-- \
--train-files gs://pmc-ml/clickmodel/vy/rand_data/train_data_20170901_*.csv \
--eval-files gs://pmc-ml/clickmodel/vy/rand_data/dev_data_20170901_*.csv \
--train-steps 100 \
--verbosity DEBUG

Поэтому я думаю, что моя проблема заключалась в том, что когда я пытался начать масштабирование с более широкой моделью и большим количеством данных, я начал передавать некоторые вещи типа конфигурации машины через аргументы командной строки. Я не уверен, правильно ли я поступил. Похоже, что мне лучше всего оставить их в файле hptuning_config.yaml и попытаться уменьшить масштаб с помощью такого вызова:

gcloud ml-engine jobs submit training test_022 \
--job-dir gs://pmc-ml/clickmodel/vy/output_test_022 \
--runtime-version 1.2 \
--module-name trainer.task \
--package-path /home/andrew_maguire/localDev/codeBase/pmc-analytical-data-mart/clickmodel/trainer/ \
--region us-central1 \
--config /home/andrew_maguire/localDev/codeBase/pmc-analytical-data-mart/clickmodel/hptuning_config.yaml \
-- \
--train-files gs://pmc-ml/clickmodel/vy/rand_data/train_data_20170901_*.csv \
--eval-files gs://pmc-ml/clickmodel/vy/rand_data/dev_data_20170901_*.csv \
--train-steps 100 \
--verbosity DEBUG

где hptuning_config.yaml выглядит так:

trainingInput:
  scaleTier: CUSTOM
  masterType: large_model
  workerType: standard_gpu
  parameterServerType: large_model
  workerCount: 10
  parameterServerCount: 5
  hyperparameters:
    goal: MAXIMIZE
    hyperparameterMetricTag: accuracy
    maxTrials: 5
    maxParallelTrials: 2
    params:
      - parameterName: first-layer-size
        type: INTEGER
        minValue: 20
        maxValue: 500
        scaleType: UNIT_LINEAR_SCALE
      - parameterName: num-layers
        type: INTEGER
        minValue: 1
        maxValue: 15
        scaleType: UNIT_LINEAR_SCALE
      - parameterName: scale-factor
        type: DOUBLE
        minValue: 0.01
        maxValue: 1.0
        scaleType: UNIT_REVERSE_LOG_SCALE

Итак, я постараюсь сейчас добавить все свои функции и тренироваться в течение 1 дня, а затем постараюсь увеличить количество дней до этапов обучения и т. Д.

Что касается прохождения "--scale-tier STANDARD_1", я не совсем уверен, в чем здесь основная причина, может ли быть ошибка или нет. Первоначально я думал скорее, чем беспокоиться, сосчитать различные типы машин и т. Д. Я просто передал бы "--scale-tier PREMIUM_1" при отправке работы, и поэтому (надеюсь) не нужно беспокоиться о фактических типах машин и т. Д. все еще может быть какая-то проблема здесь, может быть.

1 ответ

Похоже, здесь есть несколько проблем:

  1. Недостающие пакеты
  2. Ошибка рекурсивного удаления
  3. GPU не хватает памяти

Недостающие пакеты. Похоже, вы ссылаетесь на package-path это происходит в выходной папке задания. Вероятно, что выходная папка удаляется (см. #2). Чтобы предотвратить это, поместите свои пакеты в их собственную папку независимо от любых заданий. Вы можете сделать это с помощью --staging-dir опция gcloud при отправке работ и предоставлении локального --package-path,

Ошибка рекурсивного удаления. task.py Вы отправляете пытается удалить каталог - скорее всего, выходной каталог. Причиной этого сбоя могут быть различные причины, вероятно, недостаточно прав для службы CloudML для удаления одного или нескольких существующих файлов. Проверьте ACL или рассмотрите возможность создания нового выходного каталога при каждом запуске.

Ошибка нехватки памяти графического процессора. K80s имеет только 12 ГБ оперативной памяти. Так что либо уменьшите размер вашей модели (например, меньше входных объектов, меньшие слои и т. Д.). В этом случае вы могли бы рассмотреть возможность размещения начальных поисков на CPU, так как они, вероятно, в любом случае не выигрывают от GPU. Это может быть более сложным, если вы используете "консервированный" оценщик (например, DNNEstimator), что может не дать вам достаточного контроля для этого. В этом случае либо не используйте графические процессоры, либо вам придется написать собственный код модели.

Другие вопросы по тегам