特征平台支持新模型上线

修改特征后,需要重新上线训练的模型,以下以增加一个 user 特征表 和 一个 item 特征表为例介绍,如何在增加特征表后,上线新的推荐模型。

1. 新特征表在特征平台注册

新注册特征表可以分为网页操作和 python sdk 操作,可以选一种方式完成。

网页操作:特征平台网页操作

Python SDK 操作:特征平台 Python SDK 操作

2. 在特征平台中创建新模型

新特征表注册完成后,需要创建新模型,创建新模型分为网页操作和 python sdk 操作,可以选一种方式完成。

网页操作:特征平台网页操作

Python SDK 操作:特征平台 Python SDK 操作

3. 创建 eas 服务

eas 服务主要用于接收线上请求,推理模型,拿到打分后返回给推荐引擎。 在 dataworks 里面,选择业务流程,选择 通用,选择新建节点,如下图所示:

image.png

在新建节点里面选择 shell.

然后将以下内容复制到 shell 脚本中:

ymd=$1
cat << EOF > echo.json
{
    "metadata": {
        "cpu": 16,
        "gateway": "default",
        "gpu": 0,
        "instance": 2,
        "memory": 64000,
        "name": "fs_model_v1",
        "resource": "",
        "rpc": {
            "enable_jemalloc": 1,
            "max_queue_size": 256
        }
    },
    "model_config": {
        "fg_mode": "tf",
        "fs_host": "xxxx",
        "fs_token": "xxxx",
        "fs_model": "fs_model_name",
        "fs_project": "project_name",
        "fs_entity": "item",
        "outputs": "probs",
        "period": 2880,
        "prefetch_feature_hot_ids": true,
        "steady_mode": true
    },
    "model_path": "oss://your_bucket/easyrec/model_path/20230328/export/final_with_fg",
    "processor_entry": "libtf_predictor.so",
    "processor_path": "https://easyrec.oss-cn-beijing.aliyuncs.com/processor/LaRec-0.9.7b-77ad29d-TF-2.5.0-Linux.tar.gz",
    "processor_type": "cpp",
    "warm_up_data_path": ""
} 
EOF

/home/admin/usertools/tools/eascmd -i id -k ak -e pai-eas.cn-beijing.aliyuncs.com create echo.json
# /home/admin/usertools/tools/eascmd -i id  -k ak -e pai-eas.cn-beijing.aliyuncs.com modify dnn_online_deep_rank_v1 -s echo.json

其中第 4 行到第 16 行是指定 eas 配置相关的信息,具体可以参考 eas 配置文档: 第 17 行到第 28 行是指定 processor 相关的信息,其中需要填写的 feature store 相关的信息是 fs_host, fs_token, fs_model (模型名称), fs_project (项目名称),fs_entity (实体名称)。 第 29 行制定了用 EasyRec 训练好的模型导出的信息,第 31 行指定了 processor 的地址。第 37 行是调用 eascmd 创建 eas 服务, id 和 ak 要替换为实际的 id 和 ak, cn-beijing 也要根据实际区域进行修改。 注意 create 只能 create 一次,不能在重复 create, 如果需要更新服务,可以把 37 行注释掉,把 38 行取消注释,详细可以见下方的:设置 eas 服务更新例行。

4. 设置任务例行

要维持服务效果正常,需要设置例行,例行主要包含数据特征同步和模型更新。其中数据同步是指将模型推理过程中所有用到的资源都发布到线上,可以让在线请求取到,模型更新是指每天模型训练完成后,能够更新到线上的 eas 服务进行推理。

4.1 设置数据特征同步任务例行

在 dataworks 中的业务流程,选择 MaxCompute, 选择数据开发,选择新建节点,如下图所示:

image.png

在新建节点中选择 pyodps 3. 然后将以下内容复制到 节点中:

from feature_store_py.fs_client import FeatureStoreClient
import datetime

def getdate(beforeOfDay):
    today = datetime.datetime.now()
    # 计算偏移量
    offset = datetime.timedelta(days=-beforeOfDay)
    # 获取想要的日期的时间
    re_date = (today + offset).strftime('%Y%m%d')
    return re_date

cur_day = getdate(1)
print("cur_day = ", cur_day)

host = 'http://12345/api/predict/pairec_experiment'
token = 'AAXXXXXBBBBB'
fs = FeatureStoreClient(host, token)
cur_project_name = 'fs_test'
project = fs.get_project(cur_project_name)

feature_view_name = 'fs_feature_view_1'
batch_feature_view = project.get_feature_view(feature_view_name)
if batch_feature_view is None:
    ds = MaxComputeDataSource(data_source_id=offline_datasource_id, table=table_name)
    feature_view = self.feature_store_project.create_batch_feature_view(
        name='fs_feature_view_1',
        owner='RecTemplate',
        datasource=ds,
        online=True,
        entity='user',
        primary_key='user_id',
        register=True)
task = batch_feature_view.publish_table(partitions={'dt':cur_day}, mode='overwrite')
print(task.summary)
task.wait()
print(task.task_summary)

第 15 行指定了配置中心 server 端地址。第22行是先读取默认设置的特征视图,第一次运行如果没有的话会自动进行创建 (第 25 行),然后第 33 行进行特征同步,将数据由 offline store (max compute, spark) 同步到 online store (hologres, igraph, redis) 中。

4.2 设置 eas 服务更新例行

前面创建 eas 服务的代码如下:

ymd=$1
cat << EOF > echo.json
{
    "metadata": {
        "cpu": 16,
        "gateway": "default",
        "gpu": 0,
        "instance": 2,
        "memory": 64000,
        "name": "fs_model_v1",
        "resource": "",
        "rpc": {
            "enable_jemalloc": 1,
            "max_queue_size": 256
        }
    },
    "model_config": {
        "fg_mode": "tf",
        "fs_host": "xxxx",
        "fs_token": "xxxx",
        "fs_model": "fs_model_name",
        "fs_project": "project_name",
        "fs_entity": "item",
        "outputs": "probs",
        "period": 2880,
        "prefetch_feature_hot_ids": true,
        "steady_mode": true
    },
    "model_path": "oss://your_bucket/easyrec/model_path/20230328/export/final_with_fg",
    "processor_entry": "libtf_predictor.so",
    "processor_path": "https://easyrec.oss-cn-beijing.aliyuncs.com/processor/LaRec-0.9.7b-77ad29d-TF-2.5.0-Linux.tar.gz",
    "processor_type": "cpp",
    "warm_up_data_path": ""
} 
EOF

#/home/admin/usertools/tools/eascmd -i id -k ak -e pai-eas.cn-beijing.aliyuncs.com create echo.json
/home/admin/usertools/tools/eascmd -i id  -k ak -e pai-eas.cn-beijing.aliyuncs.com modify dnn_online_deep_rank_v1 -s echo.json

将第 37 行注释掉,将 38 行取消注释,这样就可以每天更新服务 (modify)。提交后即可例行。

5. 在 pairec 引擎配置添加服务

pairec 引擎配置可以参考 pairec 文档:引擎配置, 配置总览

PAIREC 引擎侧配置主要是用来拉取 user 侧特征。一般配置时需指定特征平台地址,以及创建的 project 和 model 相关的信息。具体配置如下所示:

配置 server 端地址

  "FeatureStoreConfs": {
    "pairec-fs": {
      "Host": "xxx",
      "Token": "xxx",
      "ProjectName": "demo_rank"
    }
  },

配置特征平台 model 名称和 entity 名称

"rank_v1": {
  "AsynLoadFeature": true,
  "FeatureLoadConfs": [
    {
      "FeatureDaoConf": {
        "AdapterType": "featurestore",
        "FeatureStoreName": "pairec-fs",
        "FeatureKey": "user:uid",
        "FeatureStoreModelName": "rank_v1",
        "FeatureStoreEntityName": "user",
        "FeatureStore": "user"
      },
    }
  ]
},

其中 FeatureStoreModelName 指定了特征平台中的模型名称,FeatureStoreEntityName 指定了 entity 名称。这里指定的 entity 名称是 “user”, 即会拉取所有挂在名为 “user” 的 entity 的特征表。不再需要指定具体的特征名。

6. 利用离线在线一致性工具测试整个在线推荐流程服务的一致性

部署完成后,可以利用离线在线一致性工具来对整个推荐流程服务测试一致性。离在线一致性的文档见:,以下是使用 特征平台 的示例。

6.1 config 配置

首先在工具的一致性检查页面选择特征一致性,然后点新增: image.png

在是否使用 FS 时选择 是,如下图所示:

image.png

创建完成后点击确定,可看到如下图所示任务:

image.png

6.2 运行

点击启动任务:

image.png

在启动任务中选择场景:

image.png

可以根据有流量的场景选择,一般在预发环境中打流量测试。选择完成后点击确认。

确认后,可以在任务日志中查看任务详情:

image.png

任务运行完成后,能在任务日志对应的任务中看到结果。

7. 上线

测试一致性没有问题后,可以先小流量上线测试,然后再慢慢转为大流量。流量大小可以在推荐引擎 pairec 中设置,设置方法具体可以参考 pairec 文档:

下面给出一个小流量测试的样例步骤: 例如一个小流量观察的步骤:先设置 1% 流量观察 10 分钟,没问题后,设置 2% 流量观察 20 分钟,服务依然正常后,设置 5% 流量观察 30 分钟。如果服务依然正常,说明服务基本稳定,可以先再继续观察一段时间,或者再根据实际情况扩流量观察。