如何向 AI 平台训练作业授予对同一项目中的云 SQL 资源的访问权限?



我有一个图像可以运行我的训练作业。 训练数据位于云 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平台尝试此操作时,我无法连接。

❯ 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 平台对云 SQL 的访问权限?

我考虑过在训练容器中包含云 sql 代理,然后将服务帐户凭据作为用户参数注入,但由于它们都在同一个项目中,我希望不需要此步骤。 这些希望是错误的吗?

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

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

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

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


原始回复

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

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

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

  2. 使用我创建的自定义服务帐户运行作业,该帐户包括云 SQL 客户端以及平台 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())

相关内容

  • 没有找到相关文章

最新更新