Проблема масштабирования широкой и глубокой модели для обучения на 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 или около того функций, так что это на одну переменную меньше. А затем я перезапущу ту же работу с гиперпарамом, чтобы увидеть, вижу ли я просто ошибки разрешения в следующий раз, и если да, то мы можем сосредоточиться только на этом. Похоже, что два других - мемориальные, так что, может быть, мне просто нужны большие машины или меньшие партии - считай, я бы сам смог выбраться из этого... Я думаю...:)
ЧАСТИЧНОЕ РЕШЕНИЕ
Хорошо, так что после большого количества возни я думаю, что у меня было две проблемы.
- я повторно использовал один и тот же выходной каталог заданий (gs://pmc-ml/clickmodel/vy/output) каждый раз, когда выполнял задание - думаю, это вызывало некоторые проблемы, когда задание не выполнялось, а следующее задание не могло быть полностью удалите некоторые оставшиеся файлы по любой причине. Не уверен на 100%, если это действительно было проблемой, но лучше иметь новую папку вывода для каждой работы.
- я передавал "--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 ответ
Похоже, здесь есть несколько проблем:
- Недостающие пакеты
- Ошибка рекурсивного удаления
- GPU не хватает памяти
Недостающие пакеты. Похоже, вы ссылаетесь на package-path
это происходит в выходной папке задания. Вероятно, что выходная папка удаляется (см. #2). Чтобы предотвратить это, поместите свои пакеты в их собственную папку независимо от любых заданий. Вы можете сделать это с помощью --staging-dir
опция gcloud при отправке работ и предоставлении локального --package-path
,
Ошибка рекурсивного удаления. task.py
Вы отправляете пытается удалить каталог - скорее всего, выходной каталог. Причиной этого сбоя могут быть различные причины, вероятно, недостаточно прав для службы CloudML для удаления одного или нескольких существующих файлов. Проверьте ACL или рассмотрите возможность создания нового выходного каталога при каждом запуске.
Ошибка нехватки памяти графического процессора. K80s имеет только 12 ГБ оперативной памяти. Так что либо уменьшите размер вашей модели (например, меньше входных объектов, меньшие слои и т. Д.). В этом случае вы могли бы рассмотреть возможность размещения начальных поисков на CPU, так как они, вероятно, в любом случае не выигрывают от GPU. Это может быть более сложным, если вы используете "консервированный" оценщик (например, DNNEstimator
), что может не дать вам достаточного контроля для этого. В этом случае либо не используйте графические процессоры, либо вам придется написать собственный код модели.