AI学习者 · 8月8日

在 Cloud TPU 上训练 NCF (TF 2.x)

概览

这是神经协同过滤 (NCF) 框架的实现 神经矩阵分解 (NeuMF) 模型,如 “Neural Collaborative Filters”(神经协同过滤)论文。 当前的实现代码基于作者的NCF 代码和 MLPerf 代码库中的 Stanford 实现。

NCF 是一种通用框架,用于对 Google Cloud 中的 使用神经网络架构来模拟用户-项目交互。 NCF 用一个多层感知机替换内部积,该感知器可以学习 任意函数。

NCF 有两种实现方式:泛化矩阵分解 (GMF) 和多层感知机 (MLP)。GMF 应用线性核对潜在 特征交互,而 MLP 则使用非线性内核来学习交互 函数。NeuMF 是 GMF 和 MLP 的融合模型, 复杂的用户-项目交互,并统一了 MF 和 使用 MLP 的非线性模型对用户-推荐项潜在结构进行建模。NeuMF 可以让 GMF 和 MLP 学习单独的嵌入,并通过 将最后一个隐藏层串联起来。neumf_model.py 定义了架构细节

以下说明假定您熟悉 Cloud TPU。如果您刚接触 Cloud TPU,请参阅 使用入门:了解基本介绍。

数据集

MovieLens 数据集用于模型训练和评估。我们使用两个 数据集:ml-1m(MovieLens 100 万的简称)和 ml-20m(MovieLens 的简称) 2000 万)。

ml-1m

ml-1m 数据集包含 1000209 个匿名评分,对应大约 3706 部电影 调查对象为 2000 年加入 MovieLens 的 6,040 名用户。所有评分均包含在 文件“ratings.dat”没有标题行,并采用以下格式:

UserID::MovieID::Rating::Timestamp

  • UserID 的范围介于 1 到 6040 之间。
  • MovieID 的范围介于 1 到 3952 之间。
  • 评分采用 5 星制(仅限全星评分)。

ml-20m

ml-20m 数据集包含 138493 名用户对 26744 部电影的 20000263 个评分。所有评分都包含在文件“ratings.csv”中。此文件的每一行 表示单个用户对电影的评分,并且 以下格式:

userId,movieId,rating,timestamp

此文件中的行首先按 userId 排序,然后在 user 中按 movieId。评分按 5 星制评分,每增加半星 (0.5 星 - 5.0 星)。在这两个数据集中,时间戳都表示为 自 1970 年 1 月 1 日午夜以来的秒数。每个 用户至少获得 20 个评分。

目标

  • 创建 Cloud Storage 存储分区以保存数据集和模型输出
  • 准备 MovieLens 数据集
  • 设置 Compute Engine 虚拟机和 Cloud TPU 节点以进行训练和评估
  • 运行训练和评估

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

在开始学习本教程之前,请检查您的 Google Cloud 项目是否已正确设置。

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

本演示使用 Google Cloud 的收费组件。请查看 Cloud TPU 价格页面估算您的费用。请务必在使用完您创建的资源以后清理这些资源,以免产生不必要的费用。

设置资源

本部分介绍如何为此教程设置 Cloud Storage、虚拟机和 Cloud TPU 资源。

  1. 打开一个 Cloud Shell 窗口。

    打开 Cloud Shell

  2. 为项目 ID 创建一个环境变量。
 export PROJECT_ID=project-id
  1. 配置 Google Cloud CLI 以使用要在其中创建 Cloud TPU。
gcloud config set project ${PROJECT_ID}

首次在新的 Cloud Shell 虚拟机中运行此命令时, 系统随即会显示为 Cloud Shell 授权页面。在出现的 以允许 gcloud 使用您的凭据进行 API 调用。

  1. 为 Cloud TPU 项目创建服务账号。
    gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID

该命令将返回以下格式的 Cloud TPU 服务账号:

 service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
  1. 使用以下命令创建 Cloud Storage 存储分区:
    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=europe-west4

此 Cloud Storage 存储分区存储您用于训练模型的数据和训练结果。本教程中使用的 gcloud 命令会为您设置 TPU,还会为在上一步中设置的 Cloud TPU 服务账号设置默认权限。如果您需要更精细的权限,请查看访问级层权限

存储桶位置必须与您的 TPU 虚拟机位于同一区域。TPU 虚拟机 位于特定可用区中,这些可用区 一个区域内的多个细分。

  1. 创建 Cloud TPU 虚拟机。
    $ gcloud compute tpus tpu-vm create ncf-tutorial \
      --zone=europe-west4-a \
      --accelerator-type=v3-8 \
      --version=tpu-vm-tf-2.17.0-pjrt

命令标志说明


`zone`

拟在其中创建 Cloud TPU 的[区域](https://cloud.google.com/tpu/docs/types-zones?hl=zh-cn)。

`accelerator-type`

加速器类型指定要创建的 Cloud TPU 的版本和大小。 如需详细了解每个 TPU 版本支持的加速器类型,请参阅 [TPU 版本](https://cloud.google.com/tpu/docs/system-architecture-tpu-vm?hl=zh-cn#versions)。

`version`

Cloud TPU [软件版本](https://cloud.google.com/tpu/docs/supported-tpu-versions?hl=zh-cn#tpu_software_versions)。

如需详细了解 gcloud 命令,请参阅 gcloud 参考文档

  1. 使用 SSH 连接到 Compute Engine 实例。连接到网络后 您的 Shell 提示符会从 username@projectname 更改为 username@vm-name
gcloud compute tpus tpu-vm ssh ncf-tutorial --zone=europe-west4-a

准备数据

  1. 为存储分区添加环境变量。将 bucket-name 替换为您的存储分区名称。
 (vm)$ export STORAGE_BUCKET=gs://bucket-name
  1. 为数据目录添加环境变量。
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/ncf_data
  1. 设置模型位置并设置 PYTHONPATH 环境变量。
(vm)$ git clone https://github.com/tensorflow/models.git
    (vm)$ pip3 install -r models/official/requirements.txt
    
    (vm)$ export PYTHONPATH="${PWD}/models:${PYTHONPATH}"
  1. 切换到存储模型处理文件的目录:

(vm)$ cd ~/models/official/recommendation
  1. 在 DATA_DIR 中为 ml-20m 数据集生成训练和评估数据:
    (vm)$ python3 create_ncf_data.py \
        --dataset ml-20m \
        --num_train_epochs 4 \
        --meta_data_file_path ${DATA_DIR}/metadata \
        --eval_prebatch_size 160000 \
        --data_dir ${DATA_DIR}

此脚本会在您的虚拟机上生成并预处理数据集。预处理 将数据转换为模型所需的 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

设置并开始训练 Cloud TPU

  1. 设置 Cloud TPU 名称变量。
     (vm)$ export TPU_NAME=local

运行训练和评估

以下脚本运行一个示例训练,运行三个周期:

  1. 为 Model 目录添加环境变量以保存检查点和 TensorBoard 总结:
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/ncf
  1. 创建 TPU 时,如果您将 --version 参数设置为以 -pjrt 时,请设置以下环境变量以启用 PJRT 运行时:
      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
  1. 运行以下命令训练 NCF 模型:
    (vm)$ python3 ncf_keras_main.py \
         --model_dir=${MODEL_DIR} \
         --data_dir=${DATA_DIR} \
         --train_dataset_path=${DATA_DIR}/training_cycle_ */ * \
         --eval_dataset_path=${DATA_DIR}/eval_data/ * \
         --input_meta_data_path=${DATA_DIR}/metadata \
         --learning_rate=3e-5 \
         --train_epochs=3 \
         --dataset=ml-20m \
         --eval_batch_size=160000 \
         --learning_rate=0.00382059 \
         --beta1=0.783529 \
         --beta2=0.909003 \
         --epsilon=1.45439e-07 \
         --dataset=ml-20m \
         --num_factors=64 \
         --hr_threshold=0.635 \
         --keras_use_ctl=true \
         --layers=256,256,128,64 \
         --use_synthetic_data=false \
         --distribution_strategy=tpu \
         --download_if_missing=false

训练和评估大约需要 2 分钟时间,并生成如下所示的最终输出:

Result is {'loss': <tf.Tensor: shape=(), dtype=float32, numpy=0.10950611>,
'train_finish_time': 1618016422.1377568, 'avg_exp_per_second': 3062557.5070816963}

清除数据

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

  1. 断开与 Compute Engine 实例的连接(如果您尚未这样做):
 (vm)$ exit

您的提示符现在应为 username@projectname,表明您位于 Cloud Shell 中。

  1. 删除您的 Cloud TPU 资源。
      $ gcloud compute tpus tpu-vm delete ncf-tutorial \
        --zone=europe-west4-a
  1. 通过运行 gcloud compute tpus execution-groups list 验证资源是否已删除。删除操作可能需要几分钟时间才能完成。如下所示的响应表明 您的实例已成功删除。
      $ gcloud compute tpus tpu-vm list \
        --zone=europe-west4-a
    
    Listed 0 items.
  1. 如下所示,运行 gcloud CLI,将 bucket-name 替换为 您为本教程创建的 Cloud Storage 存储桶的名称:
 $ gcloud storage rm gs://bucket-name --recursive

后续步骤

TensorFlow Cloud TPU 教程通常使用示例数据集来训练模型。此训练的结果不能用于推理。接收者 使用模型进行推理,就可以使用公开可用的 或您自己的数据集。在 Cloud TPU 上训练的 TensorFlow 模型 通常需要将数据集 TFRecord 格式。

您可以使用数据集转换工具 示例,用于转换图片 转换为 TFRecord 格式。如果您使用的不是图片 分类模型,您需要将数据集转换为 TFRecord 格式 。如需了解详情,请参阅 TFRecord 和 tf.Example

超参数调节

要使用数据集提升模型的性能,您可以调整模型的 超参数。您可以找到所有用户共有的超参数的相关信息 支持 TPU 的 GitHub。 如需了解特定于模型的超参数,请参阅源代码 每个代码 模型。如需详细了解超参数调优,请参阅概览 超参数调优Tune 超参数

推断

训练模型后,即可将其用于推理(也称为 预测)。您可以使用 Cloud TPU 推断转换器 工具来准备和优化 在 Cloud TPU v5e 上用于推理的 TensorFlow 模型。有关 如需了解如何在 Cloud TPU v5e 上进行推理,请参阅 Cloud TPU v5e 推理 简介

文章来源:google cloud

推荐阅读

更多芯擎AI开发板干货请关注芯擎AI开发板专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
9845
内容数
79
搭载基于安谋科技自研“周易”NPU的芯擎科技工业级“龍鹰一号”SE1000-I处理器
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息