将 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。我们可以读到 hereeager 是在 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)

注意:如您所见,我已经指定我想要 keras2.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:

您可以详细了解每个地区的特点here and here

编辑:

训练工作完成后,您指定的存储桶中应该有 3 个文件夹:logs/model/packages/。该模型保存在 model/ 文件夹中的一个 .h5 文件中。请记住,如果您为目的地设置了一个特定的文件夹,您应该在末尾包含“/”。例如,您应该设置 gs://my-bucket/output/ 而不是 gs://mybucket/output。如果你选择后者,你最终会得到文件夹 outputoutputlogsoutputmodel。在 output 里面应该有 packages。作业页面 link 应指向 output 文件夹,因此请确保也检查存储桶的其余部分!

此外,在 AI-Platform 作业页面中,您应该能够看到有关 CPUGPUNetwork 利用率的信息:

此外,我想澄清一点,因为我看到你发布了一些相关问题作为答案:

您的本地环境,无论是您个人的 Mac 还是云端 Shell 都与实际的训练工作无关。您不需要在本地安装任何特定的包或框架。您只需要安装 Google Cloud SDK(在 Cloud Shell 当然已经安装)到 运行 适当的 gcloudgsutil 命令。您可以阅读更多关于 AI 平台上的训练作业如何工作的信息 here

希望我的回答对您有所帮助。

GPU 问题现已解决,问题很简单,我的 google 云帐户禁用了 GPU 设置,需要升级。