0

我有一张可以运行我的培训工作的图像。训练数据位于 Cloud SQL 数据库中。当我在本地机器上运行 cloud_sql_proxy 时,容器可以正常连接。

❯ docker run --rm us.gcr.io/myproject/trainer:latest mysql -uroot -h"'172.17.0.2'" -e"'show databases;'"

    Running: `mysql -uroot -h'172.17.0.2' -e'show databases;'`
    Database
    information_schema
    mytrainingdatagoeshere
    mysql
    performance_schema

mysql只是用来测试连接,实际的训练命令在容器的其他地方。当我通过 AI Platform 尝试此操作时,我无法连接。

❯ gcloud ai-platform jobs submit training firsttry3 \
  --region us-west2 \
  --master-image-uri us.gcr.io/myproject/trainer:latest \
  -- \
  mysql -uroot -h"'34.94.1.2'" -e"'show tables;'"

    Job [firsttry3] submitted successfully.
    Your job is still active. You may view the status of your job with the command

      $ gcloud ai-platform jobs describe firsttry3

    or continue streaming the logs with the command

      $ gcloud ai-platform jobs stream-logs firsttry3
    jobId: firsttry3
    state: QUEUED

❯ gcloud ai-platform jobs stream-logs firsttry3

    INFO    2019-12-16 22:58:23 -0700   service     Validating job requirements...
    INFO    2019-12-16 22:58:23 -0700   service     Job creation request has been successfully validated.
    INFO    2019-12-16 22:58:23 -0700   service     Job firsttry3 is queued.
    INFO    2019-12-16 22:58:24 -0700   service     Waiting for job to be provisioned.
    INFO    2019-12-16 22:58:26 -0700   service     Waiting for training program to start.
    ERROR   2019-12-16 22:59:32 -0700   master-replica-0        Entered Slicetool Container
    ERROR   2019-12-16 22:59:32 -0700   master-replica-0        Running: `mysql -uroot -h'34.94.1.2' -e'show tables;'`
    ERROR   2019-12-16 23:01:44 -0700   master-replica-0        ERROR 2003 (HY000): Can't connect to MySQL server on '34.94.1.2'

似乎无法从作业运行的任何地方访问主机。 如何授予 AI 平台对 Cloud Sql 的访问权限?

我已经考虑在训练容器中包含云 sql 代理,然后将服务帐户凭据作为用户 args 注入,但由于它们都在同一个项目中,我希望不需要这一步。这些希望是不是落空了?

4

2 回答 2

1

所以不幸的是,并非所有云产品都被沙盒化到同一个网络中,因此您将无法在产品之间自动连接。因此,您遇到的问题是 AI Platform 无法自动访问位于 34.xx.xx IP 地址的 Cloud SQL 实例。

有几种方法可以修复它,但需要注意的是,我不太了解 AI Platform 的网络设置(我将不得不这样做并尽快在此处发布博客)。首先,您是否可以尝试查看是否可以将 AI Platform 连接到 VPC(虚拟私有云)网络,并将您的 Cloud SQL 实例放入同一个 VPC。这将允许他们通过私有 IP 相互交谈(可能与您现在拥有的 IP 不同)。在 Cloud SQL 实例的连接详细信息中,您应该查看是否有私有 IP,如果没有,您可以在实例设置中启用它(需要关闭并重新启动)。否则,您可以确保设置了公共 IP 地址,它可能是 34.xx.xx IP,然后是允许列表(白名单,但我正在尝试更改术语)AI 平台的云 IP 地址。

您可以在此处了解 GCP 处理 IP 范围的方式:https ://cloud.google.com/compute/docs/ip-addresses/

将这些范围添加到 Cloud SQL 连接设置中的授权网络后,您应该能够直接从 AI Platform 进行连接。


原始回复

当您尝试从 AI 平台连接到代理时,代理在哪里运行?还在你的本地机器上吗?所以基本上,在场景 1 中,您使用 docker run 在本地运行容器,并连接到本地 IP:172.17.0.2,然后当您转移到 AI 平台时,您将连接到本地机器 34 .xx.xx?因此,首先,您可能想从原始问题中删除您的实际家庭 IP 地址。人们在互联网上很粗鲁,如果那真的是你的家庭 IP,那可能会很糟糕。其次,你有多确定你已经在防火墙上打开了一个洞来允许来自 AI 平台的流量进入?一般来说,这就是我认为问题所在,您在本地计算机上的连接被拒绝,并且导致的错误是无法连接。

于 2019-12-17T16:35:30.017 回答
0

这是我在不需要 VPC 对等互连或单独的代理的情况下完全通过我的 Python 项目完成的方法。

  1. 我在自定义容器中使用了适用于 Python 驱动程序的 Cloud SQL 连接器。顺便说一句,我建议使用连接器作为连接到应用程序中 Cloud SQL 实例的默认方法,因为它抽象了跨环境的连接详细信息。您只需要确保您的环境具有正确的应用程序默认凭据即可连接。无需代理。

  2. 使用我创建的自定义服务帐户运行作业,该帐户包括Cloud SQL 客户端以及Platform AI 服务代理的自定义版本,其中iam.serviceAccounts.actAs权限已添加到此处指定的角色。https://cloud.google.com/ai-platform/training/docs/reference/rest/v1/projects.jobs#ReplicaConfig

  3. 您无法通过 UI 启动使用自定义服务帐户的作业,但您可以很容易地以编程方式完成它,使其更快、更可配置。示例代码:

from oauth2client.client import GoogleCredentials
from googleapiclient import discovery
from googleapiclient import errors
from time import time


project_name = YOUR_PROJECT
project_id = 'projects/{}'.format(project_name)
projectNumber = 1234 # retrieved via Google Cloud SDK Shell: gcloud projects describe YOUR_PROJECT --format="value(projectNumber)"



trainingInputs = {
        "region": "us-east4",
    "masterConfig": {
        "imageUri": "gcr.io/my_project/my_image",
        
    },
    "serviceAccount":"****@your_project.iam.gserviceaccount.com"
}

# https://cloud.google.com/ai-platform/training/docs/reference/rest/v1/projects.jobs#ReplicaConfig
job = {
    "jobId": f"TestJob_{int(time())}",
    "labels": {
        "custom_label":"label_value"
    },
    "trainingInput": trainingInputs
}


# https://cloud.google.com/ai-platform/training/docs/reference/rest/v1/projects.jobs/create
cloudml = discovery.build('ml','v1')
request = cloudml.projects().jobs().create(body=job,
              parent=project_id)
try:
    response = request.execute()
    # You can put your code for handling success (if any) here.
    print(response)

except errors.HttpError as err:
    print('There was an error creating the training job.'
                  ' Check the details:')
    print(err._get_reason())
于 2021-07-26T23:39:59.253 回答