# 自定义 Pipeline 流程 ## 背景 PAI-Rec 引擎本身就是一个 pipeline 处理流程, 把召回、过滤、粗排、特性加载、精排 等各个阶段串联起来。但有时候,只有一条 pipeline 的处理流程是不够的。比如冷启动流程,它需要一条单独的 pipeline 来处理,因为冷启动的粗排、精排等流程与主链路是不同的。另一种情形是,在首页推荐流中,会有图文、视频等多种数据,图文,视频的处理链路是不同的,需要走不通的 pipeline , 最终把数据混排在一起。 目前通过 PAI-Rec 可以自定义 pipeline 流程,来处理单独的链路而区别于主链路流程。 可以通过配置文件来描述 pipeline , 并且可以结合 AB 服务,在实验中动态调整 pipeline 流程。 ## 整体架构 当前主链路的流程如下: ![image-20220107150220242](../images/image-20220107150220242.png) 当前在同一个场景中,可以配置多条 pipeline 流程,最终与主链路的数据 merge 到一起。 ![image-20220107151325761](../images/image-20220107151325761.png) ## 自定义 Pipeline 配置 配置如下: ```json { "PipelineConfs": { "video_feed": [ // 场景名称,场景,可以配置多个 pipeline { "Name": "coldstart", // 自定义 pipeline 名称,全局唯一,不同场景也要唯一 "RecallNames": [], // 召回列表, RecallConfs 里定义 "FilterNames": [], // 过滤列表, FilterConfs 里定义 "GeneralRankConf": { // 粗排定义, 可以参考粗排的配置 "FeatureLoadConfs":[], "RankConf":{}, "ActionConfs": [ { "ActionType": "filter", "ActionName": "" } ] }, "FeatureLoadConfs":[], "RankConf":{ "RankAlgoList":[], "RankScore":"", "Processor":"", "BatchCount": 100 }, "ColdStartRankConf": { "AlgoName":"", "OnlyEmbeddingFeature": true }, "SortNames":[] // 排序处理,SortConfs 里定义 } ] } } ``` 上述的配置基本上与主链路的配置是一致的,上面是完整的配置,并不是所有的字段都是必须的。解释说明如下: * PipelineConfs 所有的 pipeline 的定义都放在这里, 支持多场景配置 * Name 自定义pipeline 名称,在配置里全局唯一 * RecallNames 召回列表,名称可以在 RecallConfs 里定义,也可以是自定义的召回 * FilterNames 过滤列表, 名称可以在 FilterConfs 里定义,也可以是自定义的过滤 * GeneralRankConf 粗排配置。 这个不是必须的。 具体的定义可以参考[这里](http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/pairec/docs/pairec/html/config/general_rank.html) * FeatureLoadConfs 特征加载,具体可以参考[特征配置](http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/pairec/docs/pairec/html/config/feature.html) * RankConf/ColdStartRankConf 这两个是互斥的配置,如果是想用冷启动算法, 配置 ColdStartRankConf 就可以了。 如果是模型的精排,可以配置 RankConf * SortNames 自定义排序,这个也不是必须的。是否对pipeline 的数据做进一步处理,可以在这里做。 名称可以在 SortConfs 里找到,或者自定义的排序 ## 实验参数支持 在很多情况下,需要对 pipeline 的流程做实验对比,pipeline 中的各个子阶段都支持实验参数,模式为 "pipelines." + {pipeline 名称} + ".{子阶段名称}"。具体详情如下 | 参数名称 | 参数类型 | 参数说明 | 样例 | | ------------------------------------------------------ | --------------------------- | ------------------------------ | ------------------------------------------------------------ | | "pipelines." + {pipeline 名称} + ".RecallNames" | json array | 召回的列表,需要包含所有的召回 | {"pipelines.coldstart.RecallNames":[ "ColdStartRecall"]} | | "pipelines." + {pipeline 名称} + ".FilterNames" | json array | 过滤列表,包含所有的过滤流程 | {"pipelines.coldstart.FilterNames":["UniqueFilter", "UserExposureFilter"]} | | "pipelines." + {pipeline 名称} + ".GeneralRankConf" | recconf.GeneralRankConfig | 粗排配置 | {"pipelines.coldstart.GeneralRankConf":{"Actions":[]}} | | "pipelines." + {pipeline 名称} + ".FeatureLoadConfs" | []recconf.FeatureLoadConfig | 特征加载配置 | {"pipelines.coldstart.FeatureLoadConfs":[{"FeatureDaoConf":{}}]} | | "pipelines." + {pipeline 名称} + ".RankConf" | recconf.RankConfig | 排序算法的配置 | {
**"pipelines.coldstart.RankConf"**:{
**"RankAlgoList"**:[
**"pai_homepage_fm"**
],
**"RankScore"**:**"${pai_homepage_fm}"**
}
} | | "pipelines." + {pipeline 名称} + ".ColdStartRankConf" | recconf.ColdStartRankConfig | 冷启动算法配置 | {
**"pipelines.coldstart.ColdStartRankConf"**:{
**"AlgoName"**:**""**,
**"OnlyEmbeddingFeature"**:**true**
}
} | | "pipelines." + {pipeline 名称} + ".SortNames" | json array | 排序列表 | { **"pipelines.coldstart.SortNames"**:[]} |