在线服务¶
概述¶
在线推荐服务是推荐必不可少的一环,PAI-Rec Engine一款基于 go 的在线推荐服务引擎的框架,其中预定义了多种召回、过滤,排序算法和策略,支持多种数据源和特征存储,集成了轻量级 A/B Test 实验平台,用户可以基于PAI-Rec Engine快速搭建起一套推荐在线服务。此外,PAI-Rec Engine也支持简单易用的扩展点,用户能很方便地定制化扩展自己的业务场景的策略和算法。 下面基于示例数据 及 前文中构建的Etrec召回和DBMTL多目标精排算法,我们来看下如何快速搭建一个推荐在线服务
使用流程¶
新建服务¶
推荐引擎配置:进入运维与实验操作台的推荐引擎 > 推荐引擎配置 的预发环境新增一个名叫pairec_config的配置,配置内容的填写可参考附录A填写。PAI-Rec Engine的详细的各项配置说明可以参考配置说明,配置完成以后点击发布,并点击克隆,克隆到生产环境
新增服务:进入推荐引擎 > 服务列表页面新增一个推荐服务,在本最佳实践中,我们使用标准的PAI-Rec镜像,用户也可以基于这个标准的镜像进一步扩展自定义的功能
发布服务:进入推荐引擎 > 发布单管理页面新增一个发布单,选择刚新建的pairec_demo服务,镜像版本填写1.0.0,点击预发发布。则可以在 **机器学习PAI > 模型在线服务(EAS)**中看到相应的叫pairec_demo_prepub的预发服务(注:机器学习PAI指代的是阿里云机器学习PAI产品,不是运维与实验操作台中的一个页面)
调试服务¶
实验工具表:进入 基础配置 > 数据表管理 > 实验工具表 中新增一张物料基础信息表,用于推荐预发服务的调试。我们复用前文中已经导入到hologres的物料特征表rec_sln_demo_item_table_preprocess_all_feature_holo_v1做个演示,如下图所示进行配置。实际可以用线上的业务数据,可以包含更丰富的字段,如图片的url,视频的url等。
服务调试:进入工具 > 推荐结果诊断页面,EAS数据源选择刚发布的pairec_demo_prepub服务,数据表选择刚创建的rec_sln_demo_item_table_preprocess_all_feature_holo_v1实验数据表。并构造一个请求body填写在请求数据中(其中uid建议从etrec的hologres表中获取)。点击开始诊断,就能在下方看到推荐的物品列表。
如果实验工具表中配置了图片url或视频url的话,相应的图片和视频也会展现在诊断结果中。
如果提示“查询失败”,请进入 **机器学习PAI > 模型在线服务(EAS)**的pairec_demo_prepub的模型服务中查看具体的请求服务日志,一般是由于配置错误或请求body构造错误引起的
{"uid":"100017524", "size":10, "scene_id":"home_page", "request_id":"e332fe9c-7d99-45a8-a047-bc7ec33d07f6", "features": {"page":"home","net_type":"wifi"}}
发布服务¶
推荐引擎配置发布生产:回到推荐引擎 > 推荐引擎配置 > 预发页面,选择刚调试完的配置,点击克隆,运行环境选择生产环境。选择刚克隆到生产环境的配置,点击发布
推荐服务发布到生产:回到推荐引擎 > 发布单管理页面,选择刚调试完的服务,点击测试通过后,点击生产发布,即可以在 **机器学习PAI > 模型在线服务(EAS)**中看到相应的叫pairec_demo的生产服务。可以用如上推荐结果诊断工具诊断生产服务的推荐结果。
如何节约EAS费用?¶
1、通过EAS动态扩缩容可以节约费用¶
通过动态扩缩容节约费用,例如晚上7-10点高峰期是20个实例,凌晨流量最小的时候5个实例,当QPS超过10的时候就扩容。
2、通过预付费实例节约费用。¶
3、怎么应付固定的流量峰值?¶
在EAS 实例配置中可设定定时增加实例,例如每天晚上8点是固定的用户访问高峰期,我们可以设置7点半定时将实例扩容到n个实例(提前半个小时是为了初始化各种数据)。如果某个时间有活动,预计会有大量用户到来,也可以提前设置定时扩容。
附录¶
附录A:PAI-Rec Engine服务配置¶
其中包含了一个前文中构建的Etrec召回和DBMTL多目标精排算法。其中,AlgoConfs中的EasModelVpcUrl和EasModelToken需要填写成部署的DBMTL精排模型的EAS VPC地址和Token,HologresConfs中hologres的DSN需要填写上开通的hologres的db信息
{
"ListenConf": {
"HttpAddr": "",
"HttpPort": 8000
},
"FilterConfs": [],
"RecallConfs": [
{
"Name": "EtrecU2IRecall",
"RecallType": "UserCustomRecall",
"RecallCount": 1000,
"DaoConf": {
"AdapterType": "hologres",
"HologresName": "pairec-holo",
"HologresTableName": "public.home_page_demo_etrec_u2i2i_score_holo_v1"
}
}
],
"SortNames": {
"default": [
"ItemRankScore"
]
},
"FilterNames": {
"default": [
"UniqueFilter"
]
},
"AlgoConfs": [
{
"Name": "home_page_dbmtl",
"Type": "EAS",
"EasConf": {
"Processor": "EasyRec",
"Timeout": 300,
"ResponseFuncName": "easyrecMutValResponseFunc",
"Url": "<EasModelVpcUrl>",
"Auth": "<EasModelToken>"
}
}
],
"HologresConfs": {
"pairec-holo": {
"DSN": "postgres://<AccessID>:<AccessKey>@<Endpoint>:<Port>/<database>?sslmode=disable&connect_timeout=1"
}
},
"LogConf": {
"RetensionDays": 3,
"DiskSize": 20,
"LogLevel": "INFO"
},
"RankConf": {
"home_page": {
"RankAlgoList": [
"home_page_dbmtl"
],
"RankScore": "${home_page_dbmtl_probs_is_click} + ${home_page_dbmtl_y_play_time} + ${home_page_dbmtl_probs_is_praise}",
"BatchCount": 500,
"Processor": "EasyRec"
}
},
"SceneConfs": {
"home_page": {
"default": {
"RecallNames": [
"EtrecU2IRecall"
]
}
}
},
"FeatureConfs": {
"home_page": {
"AsynLoadFeature": true,
"FeatureLoadConfs": [
{
"FeatureDaoConf": {
"AdapterType": "hologres",
"HologresName": "pairec-holo",
"FeatureKey": "user:uid",
"UserFeatureKeyName": "user_id",
"HologresTableName": "public.rec_sln_demo_user_table_preprocess_all_feature_holo_v1",
"UserSelectFields": "*",
"FeatureStore": "user"
},
"Features": [
{
"FeatureType": "new_feature",
"FeatureName": "day_h",
"Normalizer": "hour_in_day",
"FeatureStore": "user"
},
{
"FeatureType": "new_feature",
"FeatureName": "week_day",
"Normalizer": "weekday",
"FeatureStore": "user"
}
]
}
]
}
}
}
注:召回的表名称 public.home_page_demo_etrec_u2i2i_score_holo_v1 要根据实际情况调整下。 可以从 dataworks 的业务流程中找到。