教程:使用分类模型在对象表上运行推断
本教程介绍如何基于公共数据集中的图片创建对象表,然后使用 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: You incur storage costs for the object table you create in BigQuery.
- BigQuery ML: You incur costs for the model you create and the inference you perform in BigQuery ML.
- Cloud Storage: You incur costs for the objects you store in Cloud Storage.
您可使用价格计算器根据您的预计使用情况来估算费用。
如需详细了解 BigQuery 存储价格,请参阅 BigQuery 文档中的存储价格。
如需详细了解 BigQuery ML 价格,请参阅 BigQuery 文档中的 BigQuery ML 价格。
如需详细了解 Cloud Storage 价格,请参阅 Cloud Storage 价格页面。
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery and BigQuery Connection API APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery and BigQuery Connection API APIs.
创建数据集
创建名为 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。
点击保存。
gcloud
在 Cloud Shell 中,运行 gcloud storage buckets add-iam-policy-binding
命令:
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member=serviceAccount:MEMBER \ --role=roles/storage.objectViewer
将 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 | —------------------------------------------------------------------------------------------------------------------------------------
清理
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.