将 Keras 训练作业提交到 Google 云端
Submit a Keras training job to Google cloud
我正在尝试按照本教程进行操作:
https://medium.com/@natu.neeraj/training-a-keras-model-on-google-cloud-ml-cb831341c196
在 Google Cloud Platform 上上传和训练 Keras 模型,但我无法让它工作。
现在我已经从GitHub下载了包,并且我已经创建了一个带有AI-Platform的云环境和一个存储桶。
我正在将文件(具有建议的文件夹结构)上传到我的云存储桶(基本上是我存储的根目录),然后在云终端中尝试以下命令:
gcloud ai-platform jobs submit training JOB1
--module-name=trainer.cnn_with_keras
--package-path=./trainer
--job-dir=gs://mykerasstorage
--region=europe-north1
--config=gs://mykerasstorage/trainer/cloudml-gpu.yaml
但我遇到错误,首先找不到 cloudml-gpu.yaml 文件,显示 "no such folder or file",然后尝试将其删除,我得到错误,因为它说 --init--.py 文件丢失,但它不是,即使它是空的(当我从教程下载时GitHub)。我猜我没有以正确的方式上传它。
有什么关于我应该如何做的建议吗?教程本身确实没有这方面的信息。
我在另一篇指南中读到可以让 gcloud 打包并直接上传作业,但我不确定如何在我的终端中使用 gcloud
执行此操作或在何处编写命令命令?还是在浏览器中的云端 Shell?我如何定义我的 python 文件所在的路径?
应该提到我正在使用 Mac,并且是使用 Keras 和 Python 的新手。
我现在通过不上传文件而只是 运行在我的本地终端从云中执行上传命令,使它工作了一半...但是在它 运行ning 期间出现了一个错误以 "job failed"
结尾
似乎它试图从名为 "from tensorflow.python.eager import context" 的 TensorFlow 后端导入一些东西,但是出现了一个 ImportError: No module named eager
我已经尝试了"pip install tf-nightly",这是在另一个地方建议的,但是它说我没有权限或者我正在失去与云的连接shell(正是在我尝试 运行 命令时)。
我还尝试在本地创建一个虚拟环境以匹配 gcloud 上的虚拟环境(使用 Conda),并使用 Python=3.5,Tensorflow=1.14.0 创建了一个 Conda 环境 和 Keras=2.2.5,gcloud 应该支持。
python 程序在本地环境中工作正常,但我在尝试 运行 gcloud 上的作业时仍然得到(导入错误:没有名为 eager 的模块)。
我在提交作业时放了标志--python-version 3.5,但是当我在google云shell中写命令"Python -V"时,它说 Python=2.7。这可能是问题所在吗?我没有找到使用云 shell 提示更新 python 版本的方法,但它说 google 云应该支持 python 3.5。如果这是问题所在,关于如何在 google 云上升级 python 版本有什么建议吗?
也可以在 google 云 Web 界面中手动创建一个新作业,这样做时,我收到不同的错误消息:错误:找不到满足要求的版本要求 cnn_with_keras.py(来自版本:none) 和 未找到 cnn_with_keras.py 的匹配分布。其中 cnn_with_keras.py 是教程中我的 python 代码,运行 在本地没问题。
真的不知道接下来要做什么。任何建议或提示都会非常有帮助!
我能够成功地遵循您提到的教程,并在此过程中进行了一些修改。
我会提到所有的步骤,虽然你提到了一半。
首先为作业创建一个云存储桶:
gsutil mb -l europe-north1 gs://keras-cloud-tutorial
要回答您应该在哪里编写这些命令的问题,取决于您要存储将从 GitHub 下载的文件的位置。在您发布的教程中,作者使用他自己的计算机 运行 命令,这就是他使用 gcloud init
初始化 gcloud 命令的原因。但是,您也可以从云端 Shell 提交作业,前提是您需要在云端下载所需的文件。
repository 中我们需要的唯一文件是 trainer
文件夹和 setup.py
文件。因此,如果我们将它们放在名为 keras-cloud-tutorial
的文件夹中,我们将具有以下文件结构:
keras-cloud-tutorial/
├── setup.py
└── trainer
├── __init__.py
├── cloudml-gpu.yaml
└── cnn_with_keras.py
现在,ImportError: No module named eager
错误的一个可能原因是您可能更改了 cloudml-gpu.yaml
文件中的 runtimeVersion
。我们可以读到 here,eager
是在 Tensorflow 1.5 中引入的。如果您指定了较早的版本,则预计会遇到此错误。所以cloudml-gpu.yaml
的结构应该是这样的:
trainingInput:
scaleTier: CUSTOM
# standard_gpu provides 1 GPU. Change to complex_model_m_gpu for 4 GPUs
masterType: standard_gpu
runtimeVersion: "1.5"
注:"standard_gpu"是一个legacy machine type。
此外,setup.py
文件应如下所示:
from setuptools import setup, find_packages
setup(name='trainer',
version='0.1',
packages=find_packages(),
description='Example on how to run keras on gcloud ml-engine',
author='Username',
author_email='user@gmail.com',
install_requires=[
'keras==2.1.5',
'h5py'
],
zip_safe=False)
注意:如您所见,我已经指定我想要 keras
的 2.1.5
版本。这是因为如果我不这样做,将使用最新版本,它与早于 2.0
的 Tensorflow 版本存在兼容性问题。
如果一切都已设置,您可以通过 运行 在文件夹 keras-cloud-tutorial
中执行以下命令来提交作业:
gcloud ai-platform jobs submit training test_job --module-name=trainer.cnn_with_keras --package-path=./trainer --job-dir=gs://keras-cloud-tutorial --region=europe-west1 --config=trainer/cloudml-gpu.yaml
注意:我使用 gcloud ai-platform
而不是 gcloud ml-engine
命令,尽管两者都可以。不过在未来的某个时候,gcloud ml-engine
将被弃用。
注意:选择提交作业的区域时要小心。某些区域不支持 GPU,如果选择会抛出错误。例如,如果在我的命令中将 region
参数设置为 europe-north1
而不是 europe-west1
,我将收到以下错误:
ERROR: (gcloud.ai-platform.jobs.submit.training) RESOURCE_EXHAUSTED:
Quota failure for project . The request for 1 K80
accelerators exceeds the allowed maximum of 0 K80, 0 P100, 0 P4, 0 T4,
0 TPU_V2, 0 TPU_V3, 0 V100. To read more about Cloud ML Engine quota,
see https://cloud.google.com/ml-engine/quotas.
- '@type': type.googleapis.com/google.rpc.QuotaFailure violations:
- description: The request for 1 K80 accelerators exceeds the allowed maximum of
0 K80, 0 P100, 0 P4, 0 T4, 0 TPU_V2, 0 TPU_V3, 0 V100.
subject:
编辑:
训练工作完成后,您指定的存储桶中应该有 3 个文件夹:logs/
、model/
和 packages/
。该模型保存在 model/
文件夹中的一个 .h5
文件中。请记住,如果您为目的地设置了一个特定的文件夹,您应该在末尾包含“/”。例如,您应该设置 gs://my-bucket/output/
而不是 gs://mybucket/output
。如果你选择后者,你最终会得到文件夹 output
、outputlogs
和 outputmodel
。在 output
里面应该有 packages
。作业页面 link 应指向 output
文件夹,因此请确保也检查存储桶的其余部分!
此外,在 AI-Platform 作业页面中,您应该能够看到有关 CPU
、GPU
和 Network
利用率的信息:
此外,我想澄清一点,因为我看到你发布了一些相关问题作为答案:
您的本地环境,无论是您个人的 Mac 还是云端 Shell 都与实际的训练工作无关。您不需要在本地安装任何特定的包或框架。您只需要安装 Google Cloud SDK(在 Cloud Shell 当然已经安装)到 运行 适当的 gcloud
和 gsutil
命令。您可以阅读更多关于 AI 平台上的训练作业如何工作的信息 here。
希望我的回答对您有所帮助。
GPU 问题现已解决,问题很简单,我的 google 云帐户禁用了 GPU 设置,需要升级。
我正在尝试按照本教程进行操作: https://medium.com/@natu.neeraj/training-a-keras-model-on-google-cloud-ml-cb831341c196
在 Google Cloud Platform 上上传和训练 Keras 模型,但我无法让它工作。
现在我已经从GitHub下载了包,并且我已经创建了一个带有AI-Platform的云环境和一个存储桶。
我正在将文件(具有建议的文件夹结构)上传到我的云存储桶(基本上是我存储的根目录),然后在云终端中尝试以下命令:
gcloud ai-platform jobs submit training JOB1
--module-name=trainer.cnn_with_keras
--package-path=./trainer
--job-dir=gs://mykerasstorage
--region=europe-north1
--config=gs://mykerasstorage/trainer/cloudml-gpu.yaml
但我遇到错误,首先找不到 cloudml-gpu.yaml 文件,显示 "no such folder or file",然后尝试将其删除,我得到错误,因为它说 --init--.py 文件丢失,但它不是,即使它是空的(当我从教程下载时GitHub)。我猜我没有以正确的方式上传它。
有什么关于我应该如何做的建议吗?教程本身确实没有这方面的信息。
我在另一篇指南中读到可以让 gcloud 打包并直接上传作业,但我不确定如何在我的终端中使用 gcloud
执行此操作或在何处编写命令命令?还是在浏览器中的云端 Shell?我如何定义我的 python 文件所在的路径?
应该提到我正在使用 Mac,并且是使用 Keras 和 Python 的新手。
我现在通过不上传文件而只是 运行在我的本地终端从云中执行上传命令,使它工作了一半...但是在它 运行ning 期间出现了一个错误以 "job failed"
结尾似乎它试图从名为 "from tensorflow.python.eager import context" 的 TensorFlow 后端导入一些东西,但是出现了一个 ImportError: No module named eager
我已经尝试了"pip install tf-nightly",这是在另一个地方建议的,但是它说我没有权限或者我正在失去与云的连接shell(正是在我尝试 运行 命令时)。
我还尝试在本地创建一个虚拟环境以匹配 gcloud 上的虚拟环境(使用 Conda),并使用 Python=3.5,Tensorflow=1.14.0 创建了一个 Conda 环境 和 Keras=2.2.5,gcloud 应该支持。
python 程序在本地环境中工作正常,但我在尝试 运行 gcloud 上的作业时仍然得到(导入错误:没有名为 eager 的模块)。
我在提交作业时放了标志--python-version 3.5,但是当我在google云shell中写命令"Python -V"时,它说 Python=2.7。这可能是问题所在吗?我没有找到使用云 shell 提示更新 python 版本的方法,但它说 google 云应该支持 python 3.5。如果这是问题所在,关于如何在 google 云上升级 python 版本有什么建议吗?
也可以在 google 云 Web 界面中手动创建一个新作业,这样做时,我收到不同的错误消息:错误:找不到满足要求的版本要求 cnn_with_keras.py(来自版本:none) 和 未找到 cnn_with_keras.py 的匹配分布。其中 cnn_with_keras.py 是教程中我的 python 代码,运行 在本地没问题。
真的不知道接下来要做什么。任何建议或提示都会非常有帮助!
我能够成功地遵循您提到的教程,并在此过程中进行了一些修改。
我会提到所有的步骤,虽然你提到了一半。
首先为作业创建一个云存储桶:
gsutil mb -l europe-north1 gs://keras-cloud-tutorial
要回答您应该在哪里编写这些命令的问题,取决于您要存储将从 GitHub 下载的文件的位置。在您发布的教程中,作者使用他自己的计算机 运行 命令,这就是他使用 gcloud init
初始化 gcloud 命令的原因。但是,您也可以从云端 Shell 提交作业,前提是您需要在云端下载所需的文件。
repository 中我们需要的唯一文件是 trainer
文件夹和 setup.py
文件。因此,如果我们将它们放在名为 keras-cloud-tutorial
的文件夹中,我们将具有以下文件结构:
keras-cloud-tutorial/
├── setup.py
└── trainer
├── __init__.py
├── cloudml-gpu.yaml
└── cnn_with_keras.py
现在,ImportError: No module named eager
错误的一个可能原因是您可能更改了 cloudml-gpu.yaml
文件中的 runtimeVersion
。我们可以读到 here,eager
是在 Tensorflow 1.5 中引入的。如果您指定了较早的版本,则预计会遇到此错误。所以cloudml-gpu.yaml
的结构应该是这样的:
trainingInput:
scaleTier: CUSTOM
# standard_gpu provides 1 GPU. Change to complex_model_m_gpu for 4 GPUs
masterType: standard_gpu
runtimeVersion: "1.5"
注:"standard_gpu"是一个legacy machine type。
此外,setup.py
文件应如下所示:
from setuptools import setup, find_packages
setup(name='trainer',
version='0.1',
packages=find_packages(),
description='Example on how to run keras on gcloud ml-engine',
author='Username',
author_email='user@gmail.com',
install_requires=[
'keras==2.1.5',
'h5py'
],
zip_safe=False)
注意:如您所见,我已经指定我想要 keras
的 2.1.5
版本。这是因为如果我不这样做,将使用最新版本,它与早于 2.0
的 Tensorflow 版本存在兼容性问题。
如果一切都已设置,您可以通过 运行 在文件夹 keras-cloud-tutorial
中执行以下命令来提交作业:
gcloud ai-platform jobs submit training test_job --module-name=trainer.cnn_with_keras --package-path=./trainer --job-dir=gs://keras-cloud-tutorial --region=europe-west1 --config=trainer/cloudml-gpu.yaml
注意:我使用 gcloud ai-platform
而不是 gcloud ml-engine
命令,尽管两者都可以。不过在未来的某个时候,gcloud ml-engine
将被弃用。
注意:选择提交作业的区域时要小心。某些区域不支持 GPU,如果选择会抛出错误。例如,如果在我的命令中将 region
参数设置为 europe-north1
而不是 europe-west1
,我将收到以下错误:
ERROR: (gcloud.ai-platform.jobs.submit.training) RESOURCE_EXHAUSTED: Quota failure for project . The request for 1 K80 accelerators exceeds the allowed maximum of 0 K80, 0 P100, 0 P4, 0 T4, 0 TPU_V2, 0 TPU_V3, 0 V100. To read more about Cloud ML Engine quota, see https://cloud.google.com/ml-engine/quotas. - '@type': type.googleapis.com/google.rpc.QuotaFailure violations: - description: The request for 1 K80 accelerators exceeds the allowed maximum of 0 K80, 0 P100, 0 P4, 0 T4, 0 TPU_V2, 0 TPU_V3, 0 V100. subject:
编辑:
训练工作完成后,您指定的存储桶中应该有 3 个文件夹:logs/
、model/
和 packages/
。该模型保存在 model/
文件夹中的一个 .h5
文件中。请记住,如果您为目的地设置了一个特定的文件夹,您应该在末尾包含“/”。例如,您应该设置 gs://my-bucket/output/
而不是 gs://mybucket/output
。如果你选择后者,你最终会得到文件夹 output
、outputlogs
和 outputmodel
。在 output
里面应该有 packages
。作业页面 link 应指向 output
文件夹,因此请确保也检查存储桶的其余部分!
此外,在 AI-Platform 作业页面中,您应该能够看到有关 CPU
、GPU
和 Network
利用率的信息:
此外,我想澄清一点,因为我看到你发布了一些相关问题作为答案:
您的本地环境,无论是您个人的 Mac 还是云端 Shell 都与实际的训练工作无关。您不需要在本地安装任何特定的包或框架。您只需要安装 Google Cloud SDK(在 Cloud Shell 当然已经安装)到 运行 适当的 gcloud
和 gsutil
命令。您可以阅读更多关于 AI 平台上的训练作业如何工作的信息 here。
希望我的回答对您有所帮助。
GPU 问题现已解决,问题很简单,我的 google 云帐户禁用了 GPU 设置,需要升级。