我们使用了一个托管的 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 方面的经验是有限的,所以如果有一个简单的解决方案,我不会感到惊讶。
任何建议将不胜感激!