0

我们使用了一个托管的 Kubeflow Pipelines (KFP) 实例,它是使用 GCP 的 AI Platform Pipelines 创建的,以及一个托管的 MySQL 实例,它是使用 Cloud SQL 创建的。我们还使用 Cloud Build 来构建和运行我们的 KFP 管道。我们想添加一个 Cloud Build 步骤,在 KFP 管道运行完成后,运行一个脚本,该脚本使用 MLMD API 来查询该管道运行的元数据。我们有一个 MLMD 脚本,可以在 GCP VM 上手动运行时成功查询元数据。问题是让该脚本在 Cloud Build 中运行。

第一种方法是mlmd.metadata_store.MetadataStore使用 MySQL 连接信息创建对象,例如,

connection_config = metadata_store_pb2.ConnectionConfig()
connection_config.mysql.host = [IP address]
connection_config.mysql.port = 3306
connection_config.mysql.database = "kubeflow_experiments_metadata_metadata"
connection_config.mysql.user = [user]
connection_config.mysql.password = [password]
store = mlmd.metadata_store.MetadataStore(connection_config)

这在 VM 上运行良好。但是,似乎需要 Cloud SQL 代理才能在 Cloud Build 中运行。以这个Cloud Functions 代码实验室为例,我能够在 Cloud Build 中运行一个脚本,该脚本使用 sqlalchemy 通过代理连接到 MySQL。但是,将 sqlalchemy 与代理连接的方法似乎与上述 MLMD API 不兼容。它看起来像这样:

driver_name = "mysql+pymysql"
query_string = dict({"unix_socket": "/cloudsql/{}".format(connection_name)})
db = sqlalchemy.create_engine(
    sqlalchemy.engine.url.URL(drivername=driver_name, username=[user], password=[password], database="kubeflow_experiments_metadata_metadata", query=query_string),
    pool_size=5,
    max_overflow=2,
    pool_timeout=30,
    pool_recycle=1800,
)

第二种方法使用与 KFP 一起部署的 MLMD gRPC 服务。首先,我端口转发服务:

kubectl port-forward svc/metadata-grpc-service 8080:8080

然后mlmd.metadata_store.MetadataStore使用 MLMD gRPC API 创建:

connection_config = metadata_store_pb2.MetadataStoreClientConfig(
    host="127.0.0.1",
    port=8080,
)
store = mlmd.metadata_store.MetadataStore(connection_config)

同样,这在 VM 上运行良好。但是,我不确定如何从 Cloud Build 连接到 gRPC 服务。我在 gRPC 和 Kubernetes 方面的经验是有限的,所以如果有一个简单的解决方案,我不会感到惊讶。

任何建议将不胜感激!

4

1 回答 1

0

通过其他途径,我被指出了这篇文章,其中包含如何在 Cloud Build 中移植 KFP 的 ml-pipeline 服务的示例。我必须做一个小的修改,即删除命令的"-n"and"kubeflow"参数kubectl port-forward。这指定kubectl使用"kubeflow"命名空间。"default"然而,GCP 的 AI Platform Pipelines在部署您的 KFP 实例时似乎会创建一个命名空间。

于 2021-02-19T02:00:53.030 回答