教程:使用分类模型在对象表上运行推断
本教程介绍如何基于公共数据集中的图片创建对象表,然后使用 ResNet 50 模型对该对象表运行推断。
ResNet 50 模型
ResNet 50 模型会分析图片文件并输出一批向量,这些向量代表图片属于相应类别的可能性 (logits)。如需了解详情,请参阅模型的 TensorFlow Hub 页面上的用法部分。
ResNet 50 模型输入接受形状为 [-1, 224, 224, 3]
的 DType
= float32
张量,输出形状为 [-1, 1024]
的 tf.float32
张量数组。
所需权限
- 如需创建数据集,您需要拥有
bigquery.datasets.create
权限。 如需创建连接资源,您需要以下权限:
bigquery.connections.create
bigquery.connections.get
如需向连接的服务账号授予权限,您需要以下权限:
resourcemanager.projects.setIamPolicy
如需创建对象表,您需要以下权限:
bigquery.tables.create
bigquery.tables.update
bigquery.connections.delegate
如需创建存储桶,您需要拥有
storage.buckets.create
权限。如需将模型上传到 Cloud Storage,您需要拥有
storage.objects.create
和storage.objects.get
权限。如需将模型加载到 BigQuery ML 中,您需要以下权限:
bigquery.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
如需运行推断,您需要以下权限:
- 对象表的
bigquery.tables.getData
权限 - 模型的
bigquery.models.getData
权限 bigquery.jobs.create
- 对象表的
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
- BigQuery:您在 BigQuery 中创建对象表时会产生存储费用。
- BigQuery ML:您在 BigQuery ML 中创建模型和执行推断时会产生费用。
- Cloud Storage:您需要为存储在 Cloud Storage 中的对象支付费用。
您可使用价格计算器根据您的预计使用情况来估算费用。
如需详细了解 BigQuery 存储价格,请参阅 BigQuery 文档中的存储价格。
如需详细了解 BigQuery ML 价格,请参阅 BigQuery 文档中的 BigQuery ML 价格。
如需详细了解 Cloud Storage 价格,请参阅 Cloud Storage 价格页面。
准备工作
- 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
启用 BigQuery and BigQuery Connection API API。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
启用 BigQuery and BigQuery Connection API API。
创建数据集
创建名为 resnet_inference_test
的数据集:
SQL
转到 BigQuery 页面。
在编辑器窗格中,运行以下 SQL 语句:
CREATE SCHEMA `PROJECT_ID.resnet_inference_test`;
将
PROJECT_ID
替换为您的项目 ID。
bq
在 Google Cloud 控制台中,激活 Cloud Shell。
运行
bq mk
命令以创建数据集:bq mk --dataset --location=us PROJECT_ID:resnet_inference_test
将
PROJECT_ID
替换为您的项目 ID。
创建连接
创建名为 lake-connection
的连接:
控制台
转到 BigQuery 页面。
点击
添加数据,然后点击外部数据源。在连接类型列表中,选择 BigLake 和远程函数(Cloud 资源)。
在连接 ID 字段中,输入
lake-connection
。点击创建连接。
在连接信息窗格中,复制服务账号 ID 字段中的值并将其保存到某个位置。您需要此信息才能向连接的服务账号授予权限。
bq
在 Cloud Shell 中,运行
bq mk
命令以创建连接:bq mk --connection --location=us --connection_type=CLOUD_RESOURCE \ lake-connection
运行
bq show
命令以检索有关连接的信息:bq show --connection us.lake-connection
在
properties
列中,复制serviceAccountId
属性的值并将其保存到某个位置。您需要此信息才能向连接的服务账号授予权限。
创建 Cloud Storage 存储桶
创建 Cloud Storage 存储桶以存储模型文件。
向连接的服务账号授予权限
控制台
前往 IAM 和管理页面。
点击授予访问权限。
系统随即会打开添加主账号对话框。
在新的主账号字段中,输入您之前复制的服务账号 ID。
在选择角色字段中,选择 Cloud Storage,然后选择 Storage Object Viewer。
点击保存。
gsutil
在 Cloud Shell 中,运行 gsutil iam ch
命令:
gsutil iam ch serviceAccount:MEMBER:objectViewer gs://BUCKET_NAME
将 MEMBER
替换为您之前复制的服务账号 ID。将 BUCKET_NAME
替换为您之前创建的存储桶的名称。
如需了解详情,请参阅将主账号添加到存储桶级层的政策中。
创建对象表
基于公共 gs://cloud-samples-data/vision
存储桶中的图片文件创建名为 vision_images
的对象表:
SQL
转到 BigQuery 页面。
在编辑器窗格中,运行以下 SQL 语句:
CREATE EXTERNAL TABLE resnet_inference_test.vision_images WITH CONNECTION `us.lake-connection` OPTIONS( object_metadata = 'SIMPLE', uris = ['gs://cloud-samples-data/vision/*.jpg'] );
bq
在 Cloud Shell 中,运行 bq mk
命令以创建连接:
bq mk --table \
--external_table_definition='gs://cloud-samples-data/vision/*.jpg@us.lake-connection' \
--object_metadata=SIMPLE \
resnet_inference_test.vision_images
将模型上传到 Cloud Storage
获取模型文件,并在 Cloud Storage 中提供这些文件:
- 将 ResNet 50 模型下载到本地机器。您将获得模型的
saved_model.pb
文件和variables
文件夹。 - 将
saved_model.pb
文件和variables
文件夹上传到您之前创建的存储桶。
将模型加载到 BigQuery ML 中
转到 BigQuery 页面。
在编辑器窗格中,运行以下 SQL 语句:
CREATE MODEL `resnet_inference_test.resnet` OPTIONS( model_type = 'TENSORFLOW', model_path = 'gs://BUCKET_NAME/*');
将
BUCKET_NAME
替换为您之前创建的存储桶的名称。
检查模型
检查上传的模型以查看其输入和输出字段是什么:
转到 BigQuery 页面。
在“探索器”窗格中,展开您的项目,展开
resnet_inference_test
数据集,然后展开模型节点。点击
resnet
模型。在打开的模型窗格中,点击架构标签页。
查看标签部分。这会标识模型输出的字段。在本例中,字段名称值为
activation_49
。查看特征部分。这标识了必须输入模型的字段。您可以在
ML.DECODE_IMAGE
函数的SELECT
语句中引用它们。在本例中,字段名称值为input_1
。
运行推断
使用 resnet
模型对 vision_images
对象表运行推断:
转到 BigQuery 页面。
在编辑器窗格中,运行以下 SQL 语句:
SELECT * FROM ML.PREDICT( MODEL `resnet_inference_test.resnet`, (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 224, 224, FALSE) AS input_1 FROM resnet_inference_test.vision_images) );
结果应如下所示:
------------------------------------------------------------------------------------------------------------------------------------- | activation_49 | uri | input_1 | —------------------------------------------------------------------------------------------------------------------------------------ | 1.0254175464297077e-07 | gs://cloud-samples-data/vision/automl_classification/flowers/daisy/21652746_cc379e0eea_m.jpg | 0.0 | —------------------------------------------------------------------------------------------------------------------------------------ | 2.1671139620593749e-06 | | 0.0 | —-------------------------- ----------- | 8.346052027263795e-08 | | 0.0 | —-------------------------- ----------- | 1.159310958342985e-08 | | 0.0 | —------------------------------------------------------------------------------------------------------------------------------------
清理
- 在 Google Cloud 控制台中,进入管理资源页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关闭以删除项目。