内置 NCF 算法使用入门

本教程将引导您完成 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 数据集
  • 运行训练和评估

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 AI Platform Training & Prediction API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 AI Platform Training & Prediction API。

    启用 API

  8. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

准备数据

  1. 在 Cloud Shell 中,创建并激活 Python 虚拟环境:

    (vm)$  virtualenv ncf-env
    
    (vm)$  source ncf-env/bin/activate
    
  2. 安装 TensorFlow Model Garden 代码:

    (vm)$  pip install tf-models-official==2.3.0
    
  3. 添加 Google Cloud 项目中 Cloud Storage 存储桶的 URI 以及在此存储桶中存储数据的目录的环境变量。将 BUCKET_NAME 替换为您的存储桶名称。

    (vm)$ export STORAGE_BUCKET=gs://BUCKET_NAME
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/ncf_data
    
  4. 在 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 True 在模型训练中使用自定义 Keras 训练循环。

如需所有其他 NCF 算法标志的详细列表,请参阅内置 NCF 参考文档

运行训练作业

  1. 在 Google Cloud 控制台中,转到 AI Platform 页面:

    转到 AI Platform

  2. 模型训练部分,选择使用内置算法进行训练

  3. 在下拉列表中,选择 NCF。点击下一步

  4. 使用浏览按钮选择 Cloud Storage 存储桶中的训练和评估数据集,然后选择输出目录。点击下一步

  5. 算法参数页面上,使用上一部分的表中的参数值配置训练作业。

  6. 为训练作业命名,并使用 BASIC_TPUBASIC_GPU 机器类型。

  7. 点击提交以启动作业。

了解作业目录

训练作业成功完成后,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 中的目录结构与上述列表中描述的结构匹配:

gsutil ls -a $JOB_DIR/*

部署经过训练的模型

AI Platform Prediction 使用模型和版本资源来组织经过训练的模型。modelmodelAI Platform Prediction 模型是存放机器学习模型版本的容器。

要部署模型,请在 AI Platform Prediction 中创建模型资源,创建该模型的一个版本,然后使用该模型和版本请求在线预测。

详细了解如何将模型部署到 AI Platform Prediction

控制台

  1. 作业页面上,您可以找到包含所有训练作业的列表。点击您刚刚提交的训练作业的名称。

  2. 作业详情页面上,您可以查看作业的整体进度,也可以点击查看日志,更详细地查看进度。

  3. 如果作业成功,顶部会显示部署模型按钮。点击部署模型

  4. 选择“部署为新模型”,然后输入模型名称。然后,点击确认

  5. 创建版本页面上,输入版本名称(如 v1),并将其他所有字段保留为默认设置。点击保存

  6. 您的版本名称会显示在模型详情页面。版本创建过程需要几分钟时间才能完成。版本准备就绪后,版本名称旁会显示一个对勾图标。

  7. 点击版本名称 (v1) 以导航到版本详情页面。在本教程的下一步,您将发送预测请求

获取在线预测结果

请求预测时,您必须按照模型预期的方式将输入数据的格式设置为 JSON。当前的 NCF 模型不会自动预处理输入。

控制台

  1. 在“v1”(刚刚创建的版本)的版本详情页面上,您可以发送示例预测请求。

    选择测试和使用标签页。

  2. 将以下示例复制到输入字段:

     {
       "instances": [{
         "duplicate_mask": [0],
         "item_id": [1],
         "train_labels": [true],
         "user_id": [1],
         "valid_point_mask": [false]
       }]
      }
    
  3. 点击测试

    稍等片刻,然后应返回预测矢量。

后续步骤