PAI-Rec系统中流量调控的使用流程

更新时间:
复制 MD 格式

流量调控使用流程涉及多个方面,本文逐一介绍。

准备工作

说明

创建流量调控任务时会生成实时统计的Flink SQL,该SQL在任务发布时会部署到Flink平台。所以这里需要手动上传JAR包。

在具体创建流量调控任务前,需要做以下准备工作(该配置做一次即可):

  1. 下载流量调控JAR包(流量调控JAR)和 FeatureStore 的JAR包 ,具体版本见设置Flink Connector文档

  2. 进入Flink实时计算控制台,如果没有购买实例,需要先购买。如果已有购买好的,选择工作空间(注意,需要让主账户或者购买实例的用户把你加入到工作空间,否则没有权限进入),进入工作空间之后,左侧导航栏选择连接器,然后点击创建自定义连接器,上传已经下载的Jar包,就可以注册 Connector了。流量调控的Jar包中包含多个连接器(如traffic-ctrl-sink、traffic-ctrl-lookup、traffic-lookup、http-sink、rest-lookup),需要逐个上传并创建。如果 Connector 有 Lookup 选项,就勾选上,其他的参数不要改动。

  3. 点击左侧目录中 ETL => 函数 => 点击+号,还是上传刚才下载好的流量调控Jar包去注册UDF。在注册UDF JAR 的窗口中,我们约定UDF名称填写为 traffic-ctrl ,最后点击确定。系统扫描JAR之后,会显示UDF函数列表是:ConditionMatch、DynamicTarget、ExplodeSplit,确认创建函数

PAI-Rec

1. 新建流量调控任务

回到PAI-Rec控制台,左侧导航栏找到运营工具->流量调控,点击新增任务

1.1 设置基础信息

新建流量调控任务时,需依次填写任务名称、任务描述,选择生效场景和引擎服务,配置Flink数据源和执行时间(指定时间段或永久执行),并在依赖数据源配置中选择行为表、物品表和用户表对应的数据表。页面底部还需选择预发实验和生产实验对应的实验组和实验。

选项

描述

任务名称

自定义任务名称。

任务描述

描述。

生效场景

都在哪些场景生效,其中第一个场景为主场景,报表数据都会统计到这个场景下。

引擎服务

用户可能部署多个引擎服务,这里限定在哪些引擎服务生效。

Flink数据源

在云产品配置页面注册的Flink数据源。

执行时间

可以选择一段时间,也可以永久执行。

依赖数据源配置

在数据注册页面注册的三张表,这里分别选择上。

预发实验

预发环境针对哪个试验进行调控。

生产试验

生产环境针对哪个试验进行调控。

1.2 圈选干预人群

选项

描述

示例

干预人群

圈选哪些用户的请求会进行流量调控,如果不配置此参数,则全部用户都会参与调控。

gender='man',代表只有男性用户的请求会进行流量调控。数组格式的多个条件之间是 and 的逻辑。

行为统计条件

对实时行为日志做过滤,这里过滤的是行为类型,如果你的目标是曝光,那这里应该填写曝光的事件值,不应该为空,为空会让所有的日志都参与计算,不符合逻辑。

event_type=expose,注意event_type 和 expose 要取决于你的字段和字段的值,这里只是举例。数组格式的多个条件之间是 and 的逻辑。

自定义表达式支持多种运算符,包含数学运算符、逻辑运算符、比较运算符及集合运算符等。

  • 数学运算符包括加(+)、减(-)、乘(*)、除(/)和取模(%)。

  • 逻辑运算符包括逻辑与(&&)、逻辑或(||)和逻辑非(!)。

  • 比较运算符有相等(==)、不等(!=)、小于(<)、小于等于(<=)、大于(>)和大于等于(>=)。

  • 操作集合的运算符,如in用于检查元素是否在集合中。

1.3 设置调控目标

选项

描述

调控类型

  • 按比例调控:控制调控池的流量在整个任务流量中的比例;整个任务的流量定义为与任务关联的物品集的总流量,若没有配置任务的关联物品集则为当前调控场景的总流量。

  • 按量/次数调控:保证调控池能够获得的绝对流量是多少。

调控颗粒度

  • 当调控类型是比例调控时,是有全局;

  • 当调控类型是按量调控时,有全局和单品:

    • 全局:调控池中各个物品流量的总和。

    • 单品:调控池中每个物品需要达成的流量。

调控逻辑

  • 保量:调控任务致力于让当前目标大于等于设定的目标。当现在的目标已经大于调控目标时,会跳过后续的调控逻辑,当现在的目标未大于调控目标时,会进行调控。

  • 逼近:调控任务致力于让目标约等于设定的目标。当现在的目标已经大于调控目标时,会对调控池中的物品打压,当现在的目标未大于调控目标时,会进行上调。注意,当多个“逼近”类型的调控任务关联了相同的物品子集时可能会存在因目标冲突而无法达成目标的情况。

物品范围

一般为在线所有生效的物品集合,您当前设置为比例型调控任务时,此处物品范围圈定的调控池流量将作为分母,核算调控比例。

调控目标:一个调控任务下,可以包含多个调控目标,调控目标是真正圈选调控物品集并设置目标的

选项

描述

目标名称

自定义名称。

目标时间窗口

选择一个时间段,时间尽量长一些。

调控物品集

根据物品特征,圈选调控池。

调控目标值

如果调控类型是比例调控,这里的目标就是占比多少,

如果调控类型是按量调控,这里的目标就是总量或者每个item的量是多少。

目标容错范围

容错范围。例如,如果值是 10,那调控目标在[x,x*(1+10%)] 就算达到目标,如果是 -10,那调控目标在 [x*(1-10%),x]范围就算达到目标。针对按比例调控的“逼近”型任务,设定容错范围的好处是当发生超调时不用做反向调控,有助于减轻对大盘指标的干扰。

是否为新品调控

此参数暂不生效,忽略即可。新品调控属于冷启动场景,新品无法从已有召回链路中产出,需新建一路单独的召回。

是否启用

此调控目标是否开启。

配置完之后,点击保存,会进入发布页面。

1.4 发布Flink任务

此处会生成两段 Flink Sql 代码,

Flink任务的目的是实时统计被调控目标的数量。

  1. 重置datahub/kafka的行为数据的点位到当天的0点(重置点位旨在校准消费起点,以消除历史状态干扰,确保数据在时间窗口处理逻辑上的严格对齐,从而保障统计结果的完整与准确。)

    发布任务时可能出现提示弹窗,请按照界面文档提示完成Datahub配置及Debug配置。

    弹窗中显示Datahub配置和Debug配置的完成状态,单击前往写配置按钮可跳转至对应配置页面完成设置。

  2. 生成的统计SQL在运行时需要用到ak信息,首次创建流控任务需要点击创建Flink项目变量,然后在发布任务前需要前往Flink平台配置您的ak信息。页面中红色提示区域显示需要配置ACCESS_KEY_IDACCESS_KEY_SECRET两个变量。

    提示创建变量成功之后,在Flink控制台变量管理会新增以下两个变量,请设置您的AK信息。

    这两个变量分别为ACCESS_KEY_IDACCESS_KEY_SECRET,类型均为密文,请在此处填入您的AK凭证。

  3. 以上做完后点击发布Flink任务即可(预发环境发布完成,生产环境方可发布)。 发布需要等待一段时间,可点击查看Flink发布状态观测具体发布流程,在Flink平台ETL=>作业草稿可以看到对应的SQL草稿(后缀为任务ID)以及作业运维中当前作业运行情况(启动中=>运行中)。

    在流量调控任务页面,切换到预发环境,单击发布Flink任务按钮。系统提示「已触发发布,部署中需稍等3min再查看」。任务列表中可查看各Flink作业的部署状态。发布Flink任务成功如下:

    Flink平台ETL > 作业运维中,可以看到已部署的Flink作业,状态为RUNNING表示任务正常运行。

    在任务列表中,可通过启动开关控制流量调控任务的启停状态。

    发布Flink任务操作,可能会出现err,您根据报错提示调整后可点击重试按钮重新执行后续阶段流程或去前往Flink平台详细排查原因并部署启动对应Flink作业。

2. 发布/启动任务

发布调控任务之后,任务参数不可以再调整,只能新增或者关闭调控目标。

发布完之后,才可以进行启动,先启动预发流量调控任务,整个链路运行正常后,再启动生产环境任务。

在左上角可以切换环境,在这里可以发布或者启动不同环境的任务。

引擎侧

在原来的引擎配置上,根据业务情况,添加下面的配置。

1.流量调控配置

该配置在预发环境和预发环境上都要配置。

    "SortConfs": [
        {
            "Name": "TrafficControlSort",
            "SortType": "TrafficControlSort",
            "PIDConf": {
                "DefaultKp": 5,
                "DefaultKi": 1,
                "DefaultKd": 1
            }
        },
        {
            "Name": "TrafficDiversityRuleSort",
            "SortType": "DiversityRuleSort",
            "DiversitySize": 20,
            "DiversityRules": [
                {
                    "Dimensions": [
                        "__traffic_control_id__"
                    ],
                    "WindowSize": 10,
                    "FrequencySize": 2
                }
            ]
        }
    ],
    "SortNames": {
        "home_feed": [
            "TrafficControlSort",
            "TrafficDiversityRuleSort"
        ]
    },
  • TrafficControlSort 是引擎中流量调控的模块名,这个模块执行后,会给每个item添加一个特殊字段:__traffic_control_id__

    • __traffic_control_id__ 的含义 :标记当前item的位置是否被“向前移动”,如果被“向前移动”,则该字段的值固定为 0,否则被赋值为它在列表中的原本的位置。

    • 上面向前移动的概念为:一个item数组,本来某个 item 在请求的size之后,意味着本来没有曝光的机会,如果流量调控把这个item提到了 size 之内,有了曝光机会,这种情况才会被标记为 __traffic_control_id__=0,其他情况,如果某个 item 本来就在 size 之内,调控之后还是 size 之内,是不会标记为 0 的,因为本来就在曝光列表中,调控之后,还在曝光列表中,这种会认为是自然流量,不是流量调控的功劳。

  • DiversityRuleSort 是引擎中打散规则的模块名,可以针对__traffic_control_id__这个字段配置打散约束,比如输出列表中, 每10个位置中最多只能出2个被调控“向前移动”的item。

    • 如果没有DiversityRuleSort,那么很有可能用户满屏看到的都是被调控后,从排序靠后的位置移到前面的item,这些item的相关性一般比较弱,导致系统失去个性化,对用户体验有一定的损伤,严重影响大盘指标。

2.进阶配置

2.1 按比例调控

无额外配置。

2.2 按量\次数调控

该配置在预发环境和预发环境上都要配置,配置完流量调控后,还需添加下面的配置。直接召回所有的被调控物品会给排序造成很大压力,所以需要自定义一个PipelineConfs,每次请求从召回表里取RetainNum:300个物品,进行排序,然后合并到主pipeline里,配置详情参考自定义 Pipeline 流程

"PipelineConfs": {
    "home_feed": [
        {
            "Name": "newitem",
            "FilterNames": [
                "UniqueFilter",
                "UserExposureFilter15Min",
                "UserExposureFilterReal",
                "adjust_count_filter"
            ],
            "RecallNames": [
                "new_item_1500_recall"
            ],
            "RankConf": {
                "RankAlgoList": [
                    "fs_dbmtl_v4"
                ],
                "RankScore": "${fs_dbmtl_v4_probs_is_click}+${fs_dbmtl_v4_probs_is_collect_like_comment}",
                "BatchCount": 400,
                    "Processor": "EasyRec"
                },
                FeatureLoadConfs": [
                    {
                        "FeatureDaoConf": {
                        "AdapterType": "hologres",
                        "HologresName": "holo_info",
                        "ItemFeatureKeyName": "item_id",
                        "FeatureKey": "item:id",
                        "HologresTableName": "xxx_home_feed_new_item_1500_v2_online",
                        "ItemSelectFields": "item_id,is_1500_new_item",
                        "FeatureStore": "item"
                    },
                    "Features": []
                }
            ]
        }
    ]
},
"RecallConfs": [
    {
        "Name": "new_item_1500_recall",
        "RecallType": "ColdStartRecall",
        "RecallCount": 1500,
        "ColdStartDaoConf": {
            "AdapterType": "hologres",
            "HologresName": "holo_info",
            "HologresTableName": "xxx_home_feed_new_item_1500_v2_online",
            "WhereClause": "is_complated='1'",
            "PrimaryKey": "\"item_id\""
        }
    }
],
"FilterConfs": [
    {
        "Name": "adjust_count_filter",
        "FilterType": "AdjustCountFilter",
        "ShuffleItem": true,
        "RetainNum": 300
    }
]

FQA

1. TrafficControlSort 和 DiversityRuleSort,为什么要配合起来用?

TrafficControlSort 是PaiRec引擎中流量调控的模块名,这个模块执行后,会给每个item添加一个特殊字段:__traffic_control_id__

  • __traffic_control_id__ 的含义 :标记当前item的位置是否被“向前移动”,如果被“向前移动”,则该字段的值固定为 0,否则被赋值为它在列表中的原本的位置

DiversityRuleSort 是PaiRec引擎中打散规则的模块名,可以针对__traffic_control_id__这个字段配置打散约束,比如输出列表中, 每10个位置中最多只能出3个被调控“向前移动”的item。

如果没有DiversityRuleSort,那么很有可能用户满屏看到的都是被调控后,从排序靠后的位置移到前面的item,这些item的相关性一般比较弱,导致系统失去个性化,对用户体验有一定的损伤,严重影响大盘指标。

2. PID  参数一般怎么调整?

参考文章:《流量调控PID算法调参指南

查看链接:https://zhuanlan.zhihu.com/p/643275184

3. 流量调控的算法原理是什么?

参考文档:https://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/pairec/docs/pairec/html/traffic_control/traffic_control.html