PAI-Rec使用示例
PAI-Rec是一款基于Go的在線推薦服務(wù)引擎的框架,您可以基于此框架快速搭建在線推薦服務(wù),也可以定制化進(jìn)行二次開發(fā)。本文為您介紹如何在DataScience集群上使用PAI-Rec搭建一個(gè)簡單的在線推薦服務(wù),實(shí)現(xiàn)U2I召回和特征加載。
背景信息
PAI-Rec框架內(nèi)容如下:
集成Go http Server,提供路由注冊(cè)功能,方便開發(fā)Restful API。
包含推薦引擎的Pipeline流程,里面預(yù)定義了多種召回、過濾、排序策略,內(nèi)置訪問阿里云EAS服務(wù)。
包含多種數(shù)據(jù)源的加載,支持Hologres、MySQL、Redis、Tablestore(OTS)和Kafka等。
基于靈活的配置描述推薦流程。
集成輕量級(jí)A/B Test實(shí)驗(yàn)平臺(tái)。
支持簡單易用的擴(kuò)展點(diǎn),方便自定義操作。
更多框架信息,請(qǐng)參見PAI-Rec文檔。
前提條件
已創(chuàng)建DataScience集群,并且選擇了PairecEngine和PostgreSQL服務(wù),詳情請(qǐng)參見創(chuàng)建集群。
通過SSH方式連接集群,詳情請(qǐng)參見登錄集群。
操作流程
步驟一:數(shù)據(jù)準(zhǔn)備
因?yàn)橐獙?shí)現(xiàn)U2I召回和特征加載,所以需要準(zhǔn)備相應(yīng)的召回表和特征表。
單擊preparedata_mysql.sql,下載示例文件。
該文件會(huì)幫您創(chuàng)建db_pairecdemo數(shù)據(jù)庫及以下數(shù)據(jù)表:
召回表:t_recall,包含字段user_id,表示用戶ID,字段item_ids表示對(duì)應(yīng)要召回的物品ID。
user特征表:t_userfeature,包含字段user_id和若干特征字段。
item特征表:t_itemfeature,包含字段item_id和若干特征字段。
重要示例中的庫、表和字段信息會(huì)在之后的推薦引擎配置中用到。其中召回表的結(jié)構(gòu)定義是約定好的,不能隨意更改配置。更多配置詳情請(qǐng)參見配置總覽。
執(zhí)行以下命令,獲取MySQL服務(wù)的IP地址和端口。
kubectl -n bitnami get svc mysql
使用MySQL客戶端連接服務(wù),執(zhí)行preparedata_mysql.sql文件。
說明數(shù)據(jù)庫root賬號(hào)的默認(rèn)密碼為emr-datascience。
步驟二:加載配置
PAI-Rec推薦引擎的具體Pipeline流程由配置定義,目前配置支持啟動(dòng)時(shí)加載config配置文件和通過配置中心熱加載兩種方式,本示例為通過配置中心熱加載的方式。
配置中心也一同部署在DataScience上。
執(zhí)行以下命令,獲取端口。
kubectl -n pairec get svc pairec-experiment -o jsonpath='{.spec.ports[0].nodePort}'
訪問http://<header1節(jié)點(diǎn)的IP地址>:<端口>鏈接,登錄配置中心。
默認(rèn)用戶名和密碼均為admin。
說明<端口>為步驟1獲取到的。
新增配置。
在左側(cè)導(dǎo)航欄,選擇 。
在推薦引擎配置頁面,單擊新增。
在新增配置對(duì)話框中,填寫配置名稱和配置內(nèi)容,選擇運(yùn)行環(huán)境。
參數(shù)
描述
配置名稱
填寫為pairec_config。
DataScience上部署的PAI-Rec推薦引擎,默認(rèn)使用日常環(huán)境下名稱為pairec_config的配置。因此這里的配置名稱設(shè)為pairec_config,運(yùn)行環(huán)境設(shè)為日常環(huán)境。
運(yùn)行環(huán)境
選擇日常環(huán)境。
配置內(nèi)容分為以下幾部分:
數(shù)據(jù)源配置
{ // ... "MysqlConfs": { // mysql 配置 "pairec-mysql": { // 自定義名稱 "DSN": "root:emr-datascience@tcp(mysql.bitnami)/db_pairecdemo?parseTime=true&loc=Asia%2FShanghai" } }, // ... }
如果默認(rèn)配置中沒有MysqlConfs,新增即可。名稱您可以自定義,會(huì)在之后用到。數(shù)據(jù)庫設(shè)為之前數(shù)據(jù)準(zhǔn)備中創(chuàng)建的db_pairecdemo。
召回配置
{ // ... "RecallConfs": [ { "Name": "user2item_recall", "RecallType": "UserCustomRecall", "ItemType": "video", "RecallCount": 500, "DaoConf": { "AdapterType": "mysql", "MysqlName": "pairec-mysql", "MysqlTable": "t_recall" } } ], // ... "SceneConfs": { "default_scene": { "default": { "RecallNames": [ "user2item_recall" ] } } }, // ... }
需要在場景配置中啟用配置好的user2item_recall。其中,涉及的參數(shù)如下表所示。
參數(shù)
描述
RecallType
填寫為UserCustomRecall ,表示使用U2I的召回方式。
RecallCount
填寫為500,表示最多召回500個(gè)item。
AdapterType
填寫為mysql,表示使用MySQL數(shù)據(jù)源。
MysqlName
填寫為pairec-mysql,表示使用上文中配置的數(shù)據(jù)源- pairec-mysql。
MysqlTable
填寫為t_recall,表示召回表名稱為t_recall。
特征配置
{ // ... "FeatureConfs": { "default_scene": { "AsynLoadFeature": true, "FeatureLoadConfs": [ { "FeatureDaoConf": { "AdapterType": "mysql", "MysqlName": "pairec-mysql", "FeatureKey": "user:uid", "UserFeatureKeyName": "user_id", "MysqlTable": "t_userfeature", "UserSelectFields": "c1,c14,c15,c16,c17,c18,c19,c20,c21", "FeatureStore": "user" }, "Features": [ ] }, { "FeatureDaoConf": { "AdapterType": "mysql", "MysqlName": "pairec-mysql", "ItemFeatureKeyName": "item_id", "FeatureKey": "item:id", "MysqlTable": "t_itemfeature", "ItemSelectFields": "item_id,app_category,app_domain,app_id,banner_pos,device_conn_type,device_id,device_ip,device_model,device_type,hour,site_category,site_domain,site_id", "FeatureStore": "item" }, "Features": [ ] } ] } } // ... }
其中,涉及的參數(shù)如下表所示。
參數(shù)
描述
AdapterType
填寫為mysql,表示使用MySQL數(shù)據(jù)源。
MysqlName
填寫為pairec-mysql,表示使用上文中配置的數(shù)據(jù)源。
MysqlTable
填寫為t_recall,表示召回表名稱為 t_recall。
UserFeatureKeyName
用于指定特征表查詢條件中的字段名。
ItemFeatureKeyName
FeatureKey
用于指定從哪里獲取特征表查詢條件中的字段值。
UserSelectFields
用于指定查詢哪些特征。
ItemSelectFields
FeatureStore
用于指定將查詢得到的特征存到哪里。
完成配置后,單擊確定。
保存配置后,單擊配置操作列的發(fā)布。
發(fā)布配置,引擎會(huì)自動(dòng)加載設(shè)置好的配置。
步驟三:推薦測試
PAI-Rec引擎推薦接口為/api/rec/feed,訪問此接口即可進(jìn)行推薦測試(需要獲取引擎服務(wù)地址)。
參數(shù) | 描述 | 類型 | 是否必選 | 示例 |
uid | 用戶ID。 | String | 是 | 10**** |
size | 獲取item數(shù)量。 | Integer | 是 | 10 |
scene_id | 場景ID。 | String | 是 | feed |
category | 類目。 | String | 否 | 無 |
features | 上下文特征。 | JSON Map | 否 | {"age":20,"sex":"male"} |
debug | 打印更多的日志。 | BOOL | 否 | true |
您可以通過以下命令獲取引擎端口,然后http://<header1節(jié)點(diǎn)的IP地址>:<端口>即為服務(wù)地址。
kubectl -n pairec get svc pairec-engine -o jsonpath='{.spec.ports[0].nodePort}'
假設(shè)服務(wù)地址為http://127.0.0.1:32204,則可以使用curl工具進(jìn)行訪問和測試。
curl http://127.0.0.1:32204/api/rec/feed -d '{"uid":"10****", "size":2, "debug":true}'
因?yàn)檎倩睾吞卣鞫寂渲迷赿efault_scene,即默認(rèn)場景下,所以此處無需指定scene_id。
當(dāng)返回如下信息時(shí),表示流程執(zhí)行成功。如果推薦結(jié)果有問題或有其他需求,可以通過日志分析排查推薦流程,詳情信息請(qǐng)參見日志分析。
{
"code": 200,
"msg": "success",
"request_id": "16dda535-9d7f-4bbb-aaa9-dc7199f9f6e8",
"size": 2,
"items": [
{
"item_id": "200001",
"score": 0,
"retrieve_id": "user2item_recall"
},
{
"item_id": "200002",
"score": 0,
"retrieve_id": "user2item_recall"
}
]
}
日志分析
如果推薦結(jié)果有問題或有其他需求,可以通過日志分析排查推薦流程。
執(zhí)行以下命令,獲取部署的PAI-Rec引擎的pod名稱。
kubectl get po -n pairec
返回信息如下所示。
# NAME READY STATUS RESTARTS AGE # pairec-engine-9669c98fd-w9828 1/1 Running 0 2d4h
執(zhí)行以下命令,打印pod日志。
kubectl logs pairec-engine-9669c98fd-w9828 -n pairec
一次推薦流程的日志示例如下所示。
I1230 08:36:04.103712 6 log.go:13] [INFO] requestId=16dda535-9d7f-4bbb-aaa9-dc7199f9f6e8 event=begin uri=/api/rec/feed address=10.244.0.0:39088 body={"uid":"10****", "size":2, "debug":true} I1230 08:36:04.103814 6 logger.go:18] [ERROR] scene:default_scene, not found the scene info I1230 08:36:04.103828 6 log.go:13] [INFO] requestId=16dda535-9d7f-4bbb-aaa9-dc7199f9f6e8,uid=100001,scene_name=default_scene,exp_id= I1230 08:36:04.106789 6 log.go:13] [INFO] requestId=16dda535-9d7f-4bbb-aaa9-dc7199f9f6e8 module=UserCustomRecall name=user2item_recall count=3 cost=2 I1230 08:36:04.106805 6 log.go:13] [INFO] requestId=16dda535-9d7f-4bbb-aaa9-dc7199f9f6e8 module=recall cost=2 I1230 08:36:04.106815 6 log.go:13] [INFO] requestId=16dda535-9d7f-4bbb-aaa9-dc7199f9f6e8 module=Filter cost=0 I1230 08:36:04.109738 6 log.go:13] [INFO] requestId=16dda535-9d7f-4bbb-aaa9-dc7199f9f6e8 module=LoadFeatures cost=2 &{100001 map[c1:1005 c14:2035 c15:30 c16:25 c17:234 c18:2 c19:4 c20:1002 c21:3 uid:10****] {{0 0} 0 0 0 0}} I1230 08:36:04.109810 6 log.go:13] [INFO] requestId=16dda535-9d7f-4bbb-aaa9-dc7199f9f6e8 module=rank cost=0 &{200001 0 user2item_recall video [] {{0 0} 0 0 0 0} map[app_category:07d7df22 app_domain:7801e8d9 app_id:ecad2386 banner_pos:0 device_conn_type:0 device_id:a99f214a device_ip:9d046c7f device_model:9a45a8e8 device_type:1 hour:21 recall_name:user2item_recall recall_score:0 site_category:3e814130 site_domain:7687a86e site_id:5b08c53b user2item_recall:0] map[]} &{200002 0 user2item_recall video [] {{0 0} 0 0 0 0} map[app_category:07d7df22 app_domain:7801e8d9 app_id:ecad2386 banner_pos:0 device_conn_type:66 device_id:a99f214a device_ip:9d046c7f device_model:9a45a8e8 device_type:23 hour:21 recall_name:user2item_recall recall_score:0 site_category:3e814130 site_domain:7687a86e site_id:5b08c53b user2item_recall:0] map[]} I1230 08:36:04.109973 6 log.go:13] [INFO] requestId=16dda535-9d7f-4bbb-aaa9-dc7199f9f6e8 event=end uri=/api/rec/feed cost=6
展示了Pipeline各個(gè)模塊的執(zhí)行情況。其中,count代表結(jié)果數(shù)量, cost代表花費(fèi)時(shí)間。加載的特征也會(huì)打印出來。