本教程将引导您完成 MovieLens 数据集上的神经协同过滤 (NCF) 模型训练。包括预处理数据、使用内置 NCF 算法进行训练、将模型部署到 AI Platform,以及向已部署的模型请求预测。
数据集
本教程使用以下 MovieLens 数据集进行模型训练和评估:
- ml-1m(MovieLens 100 万的简称)
- ml-20m(MovieLens 2000 万)
ml-1m
ml-1m 数据集包含 2000 年加入 MovieLens 的 6040 名用户对约 3706 部电影的 1000209 个匿名评分。所有评分都包含在文件“ratings.dat”中,没有标题行,并且采用以下格式:
UserID::MovieID::Rating::Timestamp
- UserID 的范围介于 1 到 6040 之间。
- MovieID 的范围介于 1 到 3952 之间。
- 评分采用 5 星制(仅限全星评分)。
- 时间戳以从世界协调时间 (UTC) 1970 年 1 月 1 日零点起计算的秒数表示。
ml-20m
ml-20m 数据集包含 138493 名用户对 26744 部电影的 20000263 个评分。所有评分都包含在文件“ratings.csv”中。在此文件中,标题行之后的每一行代表一个用户对一部电影的一个评分,并采用以下格式:
userId,movieId,rating,timestamp
此文件中的行先按 userId 排序。具有相同 userId 的行按 movieId 排序。评分采用 5 星制,按 0.5 星递增(0.5 星到 5.0 星)。时间戳以从世界协调时间 (UTC) 1970 年 1 月 1 日零点起计算的秒数表示。每个用户至少有 20 个评分。
目标
- 准备 MovieLens 数据集
- 运行训练和评估
准备工作
- 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 AI Platform Training & Prediction API.
-
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 AI Platform Training & Prediction API.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
准备数据
在 Cloud Shell 中,创建并激活 Python 虚拟环境:
(vm)$ virtualenv ncf-env
(vm)$ source ncf-env/bin/activate
安装 TensorFlow Model Garden 代码:
(vm)$ pip install tf-models-official==2.3.0
添加 Google Cloud 项目中 Cloud Storage 存储分区的 URI 以及在此存储分区中存储数据的目录的环境变量。将 BUCKET_NAME 替换为您的存储分区名称。
(vm)$ export STORAGE_BUCKET=gs://BUCKET_NAME (vm)$ export DATA_DIR=${STORAGE_BUCKET}/ncf_data
在 DATA_DIR 中为 ml-20m 数据集生成训练和评估数据:
(vm)$ python -m official.recommendation.create_ncf_data \ --dataset ml-20m \ --num_train_epochs 4 \ --meta_data_file_path ${DATA_DIR}/metadata \ --eval_prebatch_size 160000 \ --data_dir ${DATA_DIR}
此脚本在 Cloud Shell 中生成并预处理数据集。预处理将数据转换为模型所需的 TFRecord 格式。下载和预处理大约需要 25 分钟,并生成类似于以下内容的输出:
I0804 23:03:02.370002 139664166737728 movielens.py:124] Successfully downloaded /tmp/tmpicajrlfc/ml-20m.zip 198702078 bytes I0804 23:04:42.665195 139664166737728 data_preprocessing.py:223] Beginning data preprocessing. I0804 23:04:59.084554 139664166737728 data_preprocessing.py:84] Generating user_map and item_map... I0804 23:05:20.934210 139664166737728 data_preprocessing.py:103] Sorting by user, timestamp... I0804 23:06:39.859857 139664166737728 data_preprocessing.py:194] Writing raw data cache. I0804 23:06:42.375952 139664166737728 data_preprocessing.py:262] Data preprocessing complete. Time: 119.7 sec. %lt;BisectionDataConstructor(Thread-1, initial daemon)> General: Num users: 138493 Num items: 26744 Training: Positive count: 19861770 Batch size: 99000 Batch count per epoch: 1004 Eval: Positive count: 138493 Batch size: 160000 Batch count per epoch: 866 I0804 23:07:14.137242 139664166737728 data_pipeline.py:887] Negative total vector built. Time: 31.8 seconds I0804 23:11:25.013135 139664166737728 data_pipeline.py:588] Epoch construction complete. Time: 250.9 seconds I0804 23:15:46.391308 139664166737728 data_pipeline.py:674] Eval construction complete. Time: 261.4 seconds I0804 23:19:54.345858 139664166737728 data_pipeline.py:588] Epoch construction complete. Time: 248.0 seconds I0804 23:24:09.182484 139664166737728 data_pipeline.py:588] Epoch construction complete. Time: 254.8 seconds I0804 23:28:26.224653 139664166737728 data_pipeline.py:588] Epoch construction complete. Time: 257.0 seconds
提交训练作业
要提交作业,您必须指定一些基本的训练参数和一些与 NCF 算法相关的基本参数。
训练作业的常规参数:
训练作业参数 | |
---|---|
参数 | 说明 |
job-id |
训练作业的唯一 ID。提交训练作业后,您可以使用此参数查找训练作业状态的日志。 |
job-dir |
AI Platform Training 在训练作业成功完成后用来保存训练文件的 Cloud Storage 路径。 |
scale-tier |
指定用于训练的机器类型。使用 BASIC 选择仅使用一台机器的配置。 |
master-image-uri |
Container Registry URI,用于指定训练作业要使用的 Docker 容器。将容器用于先前定义为 IMAGE_URI 的内置 NCF 算法。 |
region |
指定用于运行训练作业的可用地区。在本教程中,您可以使用区域 us-central1 。 |
MovieLens 上的内置 NCF 算法训练的专用参数:
算法参数 | ||
---|---|---|
参数 | 本教程使用的值 | 说明 |
train_dataset_path |
${DATA_DIR}/training_cycle_*/* | 存储训练数据的 Cloud Storage 路径。 |
eval_dataset_path |
${DATA_DIR}/eval_data/* | 存储评估数据的 Cloud Storage 路径。 |
input_meta_data_path |
${DATA_DIR}/metadata | 存储输入架构的 Cloud Storage 路径。 |
train_epochs |
3 | 要运行的训练周期数。 |
batch_size |
99000 | 用于训练的批次大小。 |
eval_batch_size |
160000 | 用于评估的批次大小。 |
learning_rate |
0.00382059 | Adam 优化器使用的学习速率。 |
beta1 |
0.783529 | Adam 优化器的 Beta 1 超参数。 |
beta2 |
0.909003 | Adam 优化器的 Beta 2 超参数。 |
epsilon |
1.45439e-07 | Adam 优化器的 Epsilon 超参数。 |
num_factors |
64 | MF 模型的嵌入大小。 |
hr_threshold |
0.635 | 达到此 HR 评估指标值时,训练应停止。 |
layers |
256,256,128,64 | MLP 的隐藏层的大小。格式为以逗号分隔的整数。 |
keras_use_ctl |
是 | 在模型训练中使用自定义 Keras 训练循环。 |
如需所有其他 NCF 算法标志的详细列表,请参阅内置 NCF 参考文档。
运行训练作业
在 Google Cloud 控制台中,转到 AI Platform 页面:
在模型训练部分,选择使用内置算法进行训练。
在下拉列表中,选择 NCF。点击下一步。
使用浏览按钮选择 Cloud Storage 存储分区中的训练和评估数据集,然后选择输出目录。点击下一步。
在算法参数页面上,使用上一部分的表中的参数值配置训练作业。
为训练作业命名,并使用
BASIC_TPU
或BASIC_GPU
机器类型。点击提交以启动作业。
了解作业目录
训练作业成功完成后,AI Platform Training 会在您的 Cloud Storage 存储分区中创建经过训练的模型,以及其他一些工件。您可以在 JOB_DIR
中找到以下目录结构:
- 模型/(TensorFlow SavedModel 目录)
- saved_model.pb
- assets/
- variables/
- 总结/(来自训练和评估的日志记录)
- eval/
- train/
- 各种检查点文件(在训练期间创建和使用)
- checkpoint
- ctl_checkpoint-1.data-00000-of-00002
- …
- ctl_checkpoint-1.index
确认 JOB_DIR
中的目录结构与上述列表中描述的结构匹配:
gcloud storage ls -a $JOB_DIR/*
部署经过训练的模型
AI Platform Prediction 使用模型和版本资源来组织经过训练的模型。AI Platform Prediction 模型是存放机器学习模型版本的容器。
要部署模型,请在 AI Platform Prediction 中创建模型资源,创建该模型的一个版本,然后使用该模型和版本请求在线预测。
详细了解如何将模型部署到 AI Platform Prediction。
控制台
在作业页面上,您可以找到包含所有训练作业的列表。点击您刚刚提交的训练作业的名称。
在作业详情页面上,您可以查看作业的整体进度,也可以点击查看日志,更详细地查看进度。
如果作业成功,顶部会显示部署模型按钮。点击部署模型。
选择“部署为新模型”,然后输入模型名称。然后,点击确认。
在创建版本页面上,输入版本名称(如
v1
),并将其他所有字段保留为默认设置。点击保存。您的版本名称会显示在模型详情页面。版本创建过程需要几分钟时间才能完成。版本准备就绪后,版本名称旁会显示一个对勾图标。
点击版本名称 (
v1
) 以导航到版本详情页面。在本教程的下一步,您将发送预测请求
获取在线预测结果
请求预测时,您必须按照模型预期的方式将输入数据的格式设置为 JSON。当前的 NCF 模型不会自动预处理输入。
控制台
在“v1”(刚刚创建的版本)的版本详情页面上,您可以发送示例预测请求。
选择测试和使用标签页。
将以下示例复制到输入字段:
{ "instances": [{ "duplicate_mask": [0], "item_id": [1], "train_labels": [true], "user_id": [1], "valid_point_mask": [false] }] }
点击测试。
稍等片刻,然后应返回预测矢量。
后续步骤
- 详细了解如何使用内置 NCF 算法。