智能時(shí)代的數(shù)據(jù)煉金術(shù):從特征工程到組件化建模
一、特征生產(chǎn)
特征生產(chǎn)在推薦廣告、風(fēng)控、記憶學(xué)習(xí)等領(lǐng)域都有廣泛的應(yīng)用,特征平臺(tái)的特征生產(chǎn)功能是要降低特征工程的復(fù)雜度,將特征工程中常見的功能固定下來,通過配置的方式實(shí)現(xiàn)特征生產(chǎn)。后續(xù)還會(huì)推出支持跨平臺(tái)功能,比如同一套特征定義可以在 MaxCompute、Flink 等多個(gè)平臺(tái)運(yùn)行,盡可能減少用戶的工作量,提升一致性。
1. 特征平臺(tái)介紹
特征生產(chǎn)是特征平臺(tái)的一個(gè)子功能,特征平臺(tái) FeatureStore 是阿里云 PAI 平臺(tái)下的特征管理工具和共享平臺(tái),用于組織、存儲(chǔ)和管理機(jī)器學(xué)習(xí)及訓(xùn)練中使用的特征數(shù)據(jù),通過特征平臺(tái)可以方便地向多人、多團(tuán)隊(duì)共享特征,保證離在線的一致性,提供高效的特征訪問。
如上圖所示是特征平臺(tái)的整體鏈路,特征平臺(tái)包含在線和離線兩條鏈路,離線鏈路可以注冊(cè)實(shí)體、注冊(cè)特征視圖、存儲(chǔ)某個(gè)具體的特征,可以和具體的表關(guān)聯(lián)起來;注冊(cè)完特征視圖之后,可以構(gòu)建模型,訓(xùn)練模型;在訓(xùn)練之前,可以用特征生產(chǎn)的功能來生成更豐富的特征,訓(xùn)練完后可以導(dǎo)出模型,把模型部署到線上服務(wù),就可以進(jìn)行推理模型。線上推理時(shí) user 側(cè)的實(shí)時(shí)特征可以放在在線的存儲(chǔ)引擎,目前平臺(tái)支持的存儲(chǔ)引擎主要包括 Hologres、OTS、GraphCompute,還有自建的存儲(chǔ)引擎 FeatureDB。還可以支持 item 側(cè)的實(shí)時(shí)特征,item 側(cè)的特征如果是離線特征可以放到服務(wù)內(nèi)存里,取特征更快,基本上在幾毫秒之內(nèi)就可以完成,而實(shí)時(shí)特征可以通過輪詢的方式取,比如可以從 feature DB 每隔固定幾秒輪詢到內(nèi)存里面,這樣不會(huì)對(duì)在線服務(wù)造成很大的壓力;整個(gè)鏈路是收到請(qǐng)求之后讀取用戶特征,然后打分。
特征平臺(tái)除了支持離線鏈路,還支持實(shí)時(shí)鏈路,比如從消息隊(duì)列 DataHub,接到 Flink 計(jì)算,做特征的統(tǒng)計(jì)和計(jì)算等特征工程,然后寫到在線存儲(chǔ)引擎(Hologres、OTS、GraphCompute,F(xiàn)eatureDB 等)里面,這是在線的鏈路。離線鏈路可以通過大數(shù)據(jù)平臺(tái) MaxCompute 來存儲(chǔ)數(shù)據(jù),同時(shí)可以把數(shù)據(jù)表同步到在線存儲(chǔ)引擎里。特征平臺(tái)也提供了很多的 SDK,有 Go、C + +、Java,Python 的 SDK。Java、Go 的 SDK 在 GitHub 是開源的可以直接獲取到。Python SDK 可以做數(shù)據(jù)分析,比如讀特征、特征提取、特征生產(chǎn)等,特征生產(chǎn)是 Feature Store Python SDK 里面支持的功能。
上圖所示是特征平臺(tái)的頁(yè)面,目前已經(jīng)在人工智能 PAI 產(chǎn)品頁(yè)面下開放,特征平臺(tái)包含幾個(gè)頁(yè)面:特征實(shí)體、特征視圖、label 表,模型特征、任務(wù)中心。比如在推薦系統(tǒng)中,特征實(shí)體是 user 和 item 側(cè)的特征,可以注冊(cè)為 user 和 item。特征視圖包含離線特征視圖、在線特征視圖、實(shí)時(shí)特征視圖、序列特征視圖,可以根據(jù)不同的功能來管理特征。Label 表是訓(xùn)練時(shí)指定的 label。模型特征可以指定構(gòu)建樣本表的特征,在線和離線只需要指定模型特征,就可以自動(dòng)分析出你要使用的特征,進(jìn)行特征的加載,不需要指定需要用多少?gòu)執(zhí)卣鞅恚热缒阌昧?10 張?zhí)卣鞅?,只需要指定一個(gè)模型特征,就可以自動(dòng)分析出特征表中你要使用的特征。任務(wù)中心包括數(shù)據(jù)同步,從離線同步到在線,可以保證特征一致性,還有樣本表的導(dǎo)出,比如訓(xùn)練的時(shí)候,我們使用樣本來訓(xùn)練,構(gòu)建樣本表的過程任務(wù)可以自動(dòng)完成,比如涉及離線表的 join,序列表的 join,還有實(shí)時(shí)表的 join。
2. 特征生產(chǎn)
為什么需要特征生產(chǎn)?
- 捕捉時(shí)間趨勢(shì),比如在用戶行為數(shù)據(jù)中,最近一段時(shí)間的行為可能對(duì)當(dāng)前的狀態(tài)有比較大的影響,用戶最近幾天的點(diǎn)擊率可能比一個(gè)月之前的點(diǎn)擊率更能反映當(dāng)前的興趣偏好。
- 降低噪音。原始數(shù)據(jù)中可能包含大量的噪音,我們通過統(tǒng)計(jì)變換,或者聚合操作可以減少噪音的影響。比如簡(jiǎn)單的點(diǎn)擊次數(shù)可能受廣告位的隨機(jī)影響比較大,但是一段時(shí)間內(nèi)的平均點(diǎn)擊率則更穩(wěn)定。
- 豐富特征。通過特征工程可以生成新的特征,增強(qiáng)模型的表達(dá)能力。比如除了閱讀數(shù)特征,還可以引入閱讀增長(zhǎng)率、平均閱讀時(shí)長(zhǎng),為模型提供更多的信息,可以讓模型更好地?cái)M合標(biāo)簽。
- 提高模型性能。通過引入一些統(tǒng)計(jì)特征,可以顯著提高模型的預(yù)測(cè)性能,因?yàn)檫@些特征更穩(wěn)定,在多天或更長(zhǎng)的窗口上進(jìn)行統(tǒng)計(jì)特征,更能準(zhǔn)確地反映潛在的模式。
- 增強(qiáng)解釋性。統(tǒng)計(jì)特征更加易于解釋和理解,使得問題的診斷和分析更為方便,比如可通過查看一些長(zhǎng)期和短期的統(tǒng)計(jì)數(shù)據(jù)推斷某些行為的變化趨勢(shì)和原因。
- 數(shù)據(jù)壓縮。在某些情況下,統(tǒng)計(jì)特征可以有效地減少數(shù)據(jù)的維度,比如用過去一年的平均值代替每日的數(shù)據(jù),從而簡(jiǎn)化模型的復(fù)雜度。
面對(duì)不同的大數(shù)據(jù)平臺(tái),通常會(huì)根據(jù)不同大數(shù)據(jù)平臺(tái)的文檔,去寫特征生產(chǎn)的語(yǔ)句,然后執(zhí)行不同的特征生產(chǎn)邏輯。
但是如果換一個(gè)大數(shù)據(jù)平臺(tái),又要根據(jù)另外一個(gè)大數(shù)據(jù)平臺(tái)來寫特征生產(chǎn)語(yǔ)句,難以復(fù)用,這就會(huì)帶來一些問題:
- 特征生產(chǎn)的實(shí)現(xiàn)過程比較復(fù)雜,有可能每實(shí)現(xiàn)一步,就要進(jìn)行一些校驗(yàn),然后判斷邏輯實(shí)現(xiàn)是否正確,還需要寫一些冗長(zhǎng)的語(yǔ)句,會(huì)耗費(fèi)較多時(shí)間。
- 計(jì)算過程難以優(yōu)化,需要對(duì)大數(shù)據(jù)平臺(tái)進(jìn)行比較深入的了解,閱讀文檔,需要使用哪些關(guān)鍵字、哪些功能,也是非常耗時(shí)的。
- 線上線下不一致現(xiàn)象頻出,在推薦廣告、風(fēng)控或者其它一些場(chǎng)景中都經(jīng)常出現(xiàn)。
我們做特征生產(chǎn)功能,就是為了解決上述問題,實(shí)現(xiàn)以下功能:
- 同一套特征生產(chǎn)定義。
- 根據(jù)定義生產(chǎn)出各種特征。
- 特征生產(chǎn)出來是一個(gè)執(zhí)行過程,支持本地進(jìn)行調(diào)試,也適配各個(gè)大數(shù)據(jù)平臺(tái)運(yùn)行,如果從大數(shù)據(jù)平臺(tái) a 切換到 b 大數(shù)據(jù)平臺(tái),不需要整個(gè)的定義過程,只需要改其中的某個(gè)參數(shù),指定大數(shù)據(jù)平臺(tái)就可以。比如從 MaxCompute,到 Flink,特征生產(chǎn)定義都是同一套,可以在多個(gè)平臺(tái)運(yùn)行,還包括 Spark。
- 保證在線和離線的一致性。
- 優(yōu)化計(jì)算過程,節(jié)省計(jì)算資源。通過引入中間表,做中間結(jié)果的存儲(chǔ)可以極大地節(jié)省計(jì)算時(shí)間。如果在大數(shù)據(jù)平臺(tái)訓(xùn)練,其計(jì)算也會(huì)節(jié)省一些費(fèi)用,計(jì)算時(shí)間也會(huì)更短。
- 統(tǒng)計(jì)特征的實(shí)時(shí)更新。
上圖所示是特征生產(chǎn)的整體鏈路,開始是特征定義的部分,針對(duì)不同的大數(shù)據(jù)平臺(tái)可以有相同的定義,就可以不用因?yàn)榍袚Q大數(shù)據(jù)平臺(tái)而修改特征定義,便于各個(gè)平臺(tái)的移植,特征定義完成之后有編譯的過程,根據(jù)指定的不同的大數(shù)據(jù)平臺(tái)進(jìn)行分別的編譯,編譯完之后的執(zhí)行過程就可以在對(duì)應(yīng)的大數(shù)據(jù)平臺(tái)上運(yùn)行。
特征定義對(duì)于新手比較友好。如果熟悉 Python 的話,有 Python 的定義方式,比較簡(jiǎn)單直接;還支持 JSON 的定義。Python 定義會(huì)轉(zhuǎn)成自動(dòng) JSON 的定義,通過唯一的輸入,就能有一個(gè)固定的輸出,不受各個(gè)平臺(tái)的限制也不受語(yǔ)言的限制。
上圖所示左邊是 Python 的特征定義,比如定義 TableTtransform,指定字段表變換的名稱、去重字段和排序字段等,還做 ComboTransform,把兩個(gè)特征連接起來。還能對(duì)特征做一些處理,比如對(duì) play time 特征除以 10 這些操作都可以在一個(gè)特征生產(chǎn)鏈路里面執(zhí)行。最后會(huì)自動(dòng)生成右邊的 JSON 格式,包含輸入原表,特征處理(表變換、特征變換等)操作,輸出結(jié)果表;通過這樣唯一的定義,就可以生成整個(gè)的執(zhí)行過程,在不同的大數(shù)據(jù)平臺(tái)運(yùn)行。
整個(gè)編譯的過程根據(jù)不同的平臺(tái)來分別實(shí)現(xiàn),我們盡可能針對(duì)平臺(tái)的特性做對(duì)應(yīng)的優(yōu)化。平臺(tái) command 命令也放在包里面,用戶就可以指定同一個(gè)執(zhí)行的命令,在不同大數(shù)據(jù)平臺(tái)運(yùn)行。
上圖所示是連接不同變換的編譯過程,是一個(gè) pipeline 的形式,可以進(jìn)行表變換、特征變換,可以指定多個(gè)表變換,也可以指定很多的特征變換,不同的特征變換之間利用了 SQL 的公域表達(dá)式,比如左邊是一個(gè) SQL,看起來很復(fù)雜,但轉(zhuǎn)變成右邊的一個(gè)語(yǔ)句的形式,看起來會(huì)更簡(jiǎn)單直接,在每一個(gè)語(yǔ)句實(shí)現(xiàn)的時(shí)候,只需要關(guān)心本身的輸入和變換過程,不需要關(guān)心前一個(gè)和后一個(gè)變化是什么。當(dāng)這個(gè)變換完成之后輸出出來,程序就可以根據(jù)本次變換的輸出,和下一個(gè)變換的過程,再進(jìn)行下一個(gè)語(yǔ)句的實(shí)現(xiàn),整個(gè)過程以流水線的形式來執(zhí)行,可以定義任意的變換,最后拿到結(jié)果。
編譯過程中內(nèi)部變換優(yōu)化分為兩個(gè)方面:
- 優(yōu)化用戶使用功能。支持定義多個(gè)根據(jù)不同的 group key 進(jìn)行連接, 還有考慮如何讓用戶使用起來更方便等相關(guān)優(yōu)化。
- 優(yōu)化計(jì)算過程。特征的產(chǎn)出需要非常多的時(shí)間,通過存儲(chǔ)一些中間表,把中間的結(jié)果存儲(chǔ)下來,可以節(jié)省資源,提高運(yùn)行效率。
下面介紹兩個(gè)有代表性的優(yōu)化的例子:AggregationTransform和 WindowTransform。
AggregationTransform,根據(jù)某個(gè)聚合做統(tǒng)計(jì),比如 user_sum_click_count_3d,計(jì)算某個(gè)用戶最近三天點(diǎn)擊過所有物品的總點(diǎn)擊數(shù),如上圖所示左邊是一個(gè)行為寬表,有請(qǐng)求 ID、用戶 ID、行為、物品 ID、物品歷史總點(diǎn)擊數(shù)和時(shí)間分區(qū),做近三天點(diǎn)擊數(shù)特征聚合統(tǒng)計(jì),得到 u1 用戶 50 次,u2 用戶 50 次,這是 AggregationTransform 的計(jì)算內(nèi)容。
AggregationTransform 實(shí)際定義的過程比較復(fù)雜,但是用戶只需要通過一個(gè)簡(jiǎn)單的定義就可以實(shí)現(xiàn)復(fù)雜的計(jì)算,以下是一些功能的優(yōu)化:
- 支持同窗口的自動(dòng)歸并,不同窗口自動(dòng)連接,比如點(diǎn)擊數(shù)可能會(huì)定義 1 天、3 天、7 天、15 天、30 天、45 天,甚至是 60 天、90 天等長(zhǎng)時(shí)間窗口的統(tǒng)計(jì)。還能定義很多別的特征,比如點(diǎn)贊的統(tǒng)計(jì)、評(píng)論的統(tǒng)計(jì),使用的過程中可能會(huì)做特征變換,在變換的過程中,對(duì)于同窗口會(huì)自動(dòng)的歸并,不同窗口會(huì)自動(dòng)地做連接,比如用 left join,把 1 天、3 天、7 天、15 天、30 天等窗口 join 起來。
- 同一個(gè) group key 一起計(jì)算,不同的分組關(guān)鍵字自動(dòng)連接,與不同窗口類似,不同的 group key 不需要放在多個(gè) SQL 中實(shí)現(xiàn),只需要放在一個(gè) pipeline 流程里面即可實(shí)現(xiàn)自動(dòng)連接。
- 類型的自動(dòng)推導(dǎo)。用戶不需要指定輸出類型,會(huì)根據(jù)輸入特征的類型和聚合函數(shù),做類型的自動(dòng)推導(dǎo),極大方便用戶使用的門檻。
- 內(nèi)置自動(dòng)擴(kuò)展函數(shù),支持特征變換自動(dòng)擴(kuò)展,只需要根據(jù)擴(kuò)展函數(shù)輸入要做的特征的一些統(tǒng)計(jì),就能生成成百上千個(gè)特征,如上圖左側(cè)單個(gè)特征示例,單個(gè)特征定義比較簡(jiǎn)單,指定聚合函數(shù)、判斷條件和 group key、窗口,就可以進(jìn)行單個(gè)特征清晰地定義,但是如果要添加多個(gè)特征,單個(gè)特征地加比較麻煩,就可以用自動(dòng)擴(kuò)展函數(shù)生成成百上千個(gè)特征,比如上圖右側(cè)示例指定了要做輸入的一些統(tǒng)計(jì),可以生成 96 個(gè)特征,這個(gè)函數(shù)用戶可以根據(jù)自己的場(chǎng)景來進(jìn)行一些修改,生成出適配自己使用場(chǎng)景的函數(shù)。
WindowTransform 用于計(jì)算不同實(shí)體的交叉統(tǒng)一特征,如上圖示例 user_kv_category_click_sum_3d 是計(jì)算用戶最近三天點(diǎn)擊過的不同類目的所有物品的總點(diǎn)擊數(shù),是一個(gè) KV 特征,輸出不同實(shí)體的交叉統(tǒng)計(jì)特征 map,線上要排序打分需要取到 item 和 user 特征,通過 uid 和 item 類目進(jìn)行特征查找,比如 u1 和 item 類目 1 取出來就是 30。根據(jù)上圖所示的歷史行為寬表去做的匯總統(tǒng)計(jì),得到右邊的 kv 特征表,存儲(chǔ)到在線的存儲(chǔ)引擎里面。線上取特征時(shí),做一個(gè) lookup 查找,根據(jù) k 來查找對(duì)應(yīng)的 value,然后再做模型的推理;如果是離線的話再去做模型的訓(xùn)練。
WindowTransform 也做了一些功能上和計(jì)算過程上的優(yōu)化,還有一些計(jì)算過程的優(yōu)化:
- 類型自動(dòng)推導(dǎo)。
- 支持不同的分組關(guān)鍵字的自動(dòng)連接。
- 統(tǒng)計(jì)不同窗口特征的時(shí)候計(jì)算量很大,比較浪費(fèi)計(jì)算資源,我們引入了中間臨時(shí)表,將每天的計(jì)算過程臨時(shí)存儲(chǔ)下來,當(dāng)計(jì)算新的一天時(shí),只需要匯總結(jié)果即可。這個(gè)過程的優(yōu)化大幅縮短了計(jì)算時(shí)間,提高計(jì)算效率。比如對(duì) n 天的樣本統(tǒng)計(jì),計(jì)算完?次后,下?次不需要再重新計(jì)算 n 天,只需計(jì)算第 n + 1 天,然后匯總。執(zhí)行的過程還支持第一次執(zhí)行自動(dòng)補(bǔ)全中間臨時(shí)表數(shù)據(jù)。
- 內(nèi)置自動(dòng)擴(kuò)展函數(shù),支持特征的自動(dòng)變換擴(kuò)展。
WindowTransform 同樣也支持單個(gè)特征的定義和自動(dòng)擴(kuò)展。
特征生產(chǎn)功能支持很多變換,包括表變換、特征變換、JoinTransform、ComboTransform、CustomTransform、AggregationTransform、WindowTransform。
二、組件化建模
組件化建模是 EasyRec 算法框架的一個(gè)新功能,EasyRec 框架是一個(gè)訓(xùn)練框架,已經(jīng)在 GitHub 開源,它支持 20 多種行業(yè)的經(jīng)典模型,可以和多種數(shù)據(jù)源對(duì)接,支持大規(guī)模分布式訓(xùn)練評(píng)估,支持自動(dòng)超參搜索、知識(shí)蒸餾等功能。框架里包含了召回模型、排序模型,多目標(biāo)模型,重排模型。這個(gè)框架的優(yōu)勢(shì)在于它支持多個(gè)平臺(tái),只需要指定一個(gè) config 就可以在各個(gè)平臺(tái)上運(yùn)行和訓(xùn)練模型。支持多種經(jīng)典模型,如果模型不滿足要求,通過組件化建模就可以根據(jù)自己的需求用組件來搭建自己所需模型。并且提供了豐富的組件,常用模型都可以通過組件化的形式像搭積木一樣搭建出來,當(dāng)組件不滿足要求時(shí),也支持自定義組件。
組件化靈活搭建模型,可以做到所思即所得,通過搭積木的方式來搭建想要的模型結(jié)構(gòu),組件間無縫銜接,還可以復(fù)用組件,做到一次開發(fā)就能使用多種模型,通過配置的方式即可生成新的模型。過去開發(fā)一個(gè)新的公共模塊到現(xiàn)有模型中,需要修改模型的代碼才能用上新特性,過程繁瑣。組件化之后,可以快速地通過配置的方式來搭建新的模型,極大提高了實(shí)驗(yàn)的迭代效率,想法可以得到快速地驗(yàn)證。
上圖示例是組件化流程示例,有 backbone 網(wǎng)絡(luò)和一些 blocks,整體組成一個(gè) DAG 圖。組件化的目標(biāo)是不需要新的模型,只需要新的組件。新的模型由已有的組件通過拼接形成,各個(gè)組件只需要專注于實(shí)現(xiàn)自身的功能和單一的任務(wù)即可。組件化的 EasyRec 網(wǎng)絡(luò),可以通過一個(gè)可配置的主干網(wǎng)絡(luò)作為核心部件,主干網(wǎng)絡(luò)是由多個(gè)模塊組成的一個(gè) DAG 圖構(gòu)成,輸出到頂部的 MLP 層,然后到最終的預(yù)測(cè)層。
上圖所示具體的案例是比較常用的模型 Wide&Deep 網(wǎng)絡(luò)。主干的網(wǎng)絡(luò)由很多 block 組成,圖中左邊是原來的一個(gè)示例,更改比較麻煩,中間部分是用組件化升級(jí)之后,通過幾個(gè)組件來拼接來生成想要的模型,一個(gè) block 輸入可以關(guān)聯(lián)一個(gè) feature group 或者 keras layer 對(duì)象,實(shí)現(xiàn)了一個(gè)可復(fù)用的子模塊網(wǎng)絡(luò)。
上圖所示是 DCN 模型的示例,用了一個(gè) recurrent 組件,實(shí)現(xiàn)循環(huán)調(diào)用某個(gè)模塊多次的效果,另外還加了一個(gè) MLP 模塊,如果想嘗試其它組件的效果也可以加到這里面。
上圖示例是組件化升級(jí)之前實(shí)現(xiàn)的 DLRM 模型,模型代碼都是固定的,使用這個(gè)模型時(shí)只能修改輸入層特征,和一些 DN 層的改變,其它特殊模塊改變不了。
而升級(jí)用組件化搭建 DLRM 網(wǎng)絡(luò)只需要實(shí)現(xiàn)一個(gè) dot block,案例中的 dot block 第一個(gè)輸入是一個(gè) Tensor,第二個(gè)輸入是一個(gè) list,第一個(gè)輸入會(huì)插入到 list 當(dāng)中,形成一個(gè)更大的 list 作為 block 輸入。我們還有數(shù)值 embedding 組件,效果非常好,也可以很方便地加入模型結(jié)構(gòu)中,組件化具有很強(qiáng)的靈活性和可擴(kuò)展性。
支持豐富的組件,包括 MLP、Highway、Gate 等可以實(shí)際使用體驗(yàn)其功能,還有一些特征交叉的組件,包括二階交叉、二階內(nèi)積交叉、雙線性等。
我們還支持一些特征重要度學(xué)習(xí)的組件,序列特征編碼組件(DIN 和 BST),多目標(biāo)學(xué)習(xí)的組件 MMoE。
當(dāng)現(xiàn)有組件沒有辦法滿足使用要求的時(shí)候,支持自定義組件。自定義組件實(shí)現(xiàn)初始化和 call 函數(shù)即可。因?yàn)榇a是開源的,根據(jù)已實(shí)現(xiàn)組件可以參考開源代碼是怎么實(shí)現(xiàn)的,可以直接模仿開源代碼去實(shí)現(xiàn)。
特征平臺(tái)的特征?產(chǎn) Notebook 已在 PAI-DSW Gallery 發(fā)布,可以直接運(yùn)行 Notebook 進(jìn)行體驗(yàn)。EasyRec 代碼是開源的,通過上圖 GitHub 地址可以體驗(yàn),有問題可以加群溝通交流咨詢。
三、Q&A
Q1:這個(gè)特征工程的產(chǎn)品是在云上可以體驗(yàn)的嗎?
A1:是可以體驗(yàn)的,在阿里云 PAI-DSW Gallery 已經(jīng)發(fā)布,它是一個(gè) Notebook,只需要 Notebook 就可以實(shí)現(xiàn)整個(gè)特征變換過程。我們還提供了示例表,模擬真實(shí)場(chǎng)景的一些示例,包括行為表、用戶表和物品表,通過這些表可以直接體驗(yàn)產(chǎn)品功能。另外還提供了最佳實(shí)踐的文檔,還可直接加群,群公告里面有相關(guān)地址,使用過程當(dāng)中如果有什么問題都可以在群里提問。
Q2:FeatureStore 的 SDK 和 EasyRecProcessor 的一些集成案例有開放嗎?
A2:FeatureStore SDK 目前是集成在 EasyRec Processor 里面,EasyRec Processor 可以直接在阿里云 ES 上運(yùn)行,我們有文檔,直接搜索一下 EasyRec Processor,就可以在阿里云上搜到這篇文檔,就可以直接使用了,里面內(nèi)置了 Feature Store SDK,我們做了非常多的優(yōu)化,包括存儲(chǔ)優(yōu)化、取特征優(yōu)化,還支持了實(shí)時(shí)特征,只需要指定一些參數(shù)就可以運(yùn)行。
Q3:有一些 transform,只是基線上有,線上沒有,如何知道哪些是線上,哪些是用于離線的?
A3:這是離線和在線特征不一致的問題。如果用特征平臺(tái),注冊(cè)的時(shí)候特征視圖關(guān)聯(lián)的是一張表,但是我們會(huì)同時(shí)在離線和在線引擎里面構(gòu)建同樣的兩張表,保證離線數(shù)據(jù)平臺(tái)和在線存儲(chǔ)的 schema 是一模一樣的,這樣可以保證一致性。上線過程中取特征只需要指定你的模型特征,就可以從離線和在線拉取特征,我們還會(huì)有一致性檢查工具可以排查出來,把在線的特征和離線的特征拿出來,然后做一個(gè)特征的對(duì)比,最后打分對(duì)比,如果打分一致,那就說明在線和離線是一致的,打分不一致的話,我們還會(huì)做特征的分析,判斷在線特征和離線特征哪里不一樣,可以通過差別來看哪個(gè)地方有問題。
Q4:EasyREC 有拖拽組件的形式給用戶用嗎?
A4:EasyRec目前還沒有拖拽的組件,但是目前 config 配置其實(shí)非常方便。直接復(fù)制一下樣例就可以跑起來。
Q5:特征量非常大,不論是離線訓(xùn)練還是在線 serving,特征的生產(chǎn)到使用鏈路挺長(zhǎng)的,那在咱們平臺(tái)能否看到哪些特征在用,哪些特征不在用等一些血緣關(guān)系,在特征治理場(chǎng)景還是比較有強(qiáng)訴求去看到這種信息的,平臺(tái)上是怎么去實(shí)現(xiàn)這部分功能?
A5:這個(gè)是一個(gè)非常重要的功能,EasyRec 里面有特征重要度的分析,通過組件進(jìn)行訓(xùn)練之后,可以分析出來哪些特征是重要的,哪些特征是不重要的,如果想做特征的裁剪,可以通過這一功能把那些重要的特征保留出來,把不重要的去掉,比如你之前有 1000 多個(gè)特征,然后做了特征重要度的分析,發(fā)現(xiàn)只需要保留前 200 個(gè)就可以,那你保留了前 200 個(gè)特征之后,在線上的時(shí)候,我們會(huì)自動(dòng)分析你的模型,它用了 200 個(gè)特征,那就做這 200 個(gè)特征的加載,可以有效地減少特征的冗余。特征重要度和特征有沒有在用都可以分析出來。
Q6:在線存儲(chǔ)引擎里面去做特征抽取,在實(shí)際線上 serving 的過程中,它的吞吐和性能如何去優(yōu)化?因?yàn)榭赡苄枰〈罅康奶卣?,從特征引擎里是非常大的傳輸量?/strong>
A6:特殊拉取到在線存儲(chǔ)引擎里面分為兩種情況,如果是離線特征,只是天級(jí)拉取調(diào)度,拉取的過程也非???,拉取的過程中,線上數(shù)據(jù)是可以正常取的,不會(huì)影響線上數(shù)據(jù)。如果是實(shí)時(shí)特征,毫秒級(jí)更新,它整個(gè)鏈路就不是從大數(shù)據(jù)平臺(tái),一般是通過 Flink 實(shí)時(shí)計(jì)算數(shù)據(jù)流,然后寫入到存儲(chǔ)引擎里面,取的時(shí)候我們會(huì)通過服務(wù),支持輪詢的方式,通過設(shè)置時(shí)間間隔來輪詢,如果線上要求非常精準(zhǔn),輪詢的時(shí)間可以設(shè)得短一點(diǎn)。如果想節(jié)省一些成本的話,把輪詢時(shí)間設(shè)得稍微長(zhǎng)一點(diǎn),這都是可以自動(dòng)調(diào)整的。
Q7:如上所述 EasyREC 里面其實(shí)是做了一些特征的一些緩存是嗎?
A7:如果是離線特征的話,我們會(huì)直接通過大數(shù)據(jù)平臺(tái)拉到內(nèi)存里面,不通過存儲(chǔ)引擎,可以給存儲(chǔ)引擎減少很多壓力。存儲(chǔ)引擎目前只存儲(chǔ)了 user 特征和一些實(shí)時(shí)特征,因?yàn)?user 特征非常大,不適合放在內(nèi)存里面,還有一些實(shí)時(shí)特征,因?yàn)樗且獙?shí)時(shí)去更新,它需要 Flink 往里面寫,靜態(tài)的 item 側(cè)的特征,可以直接從大數(shù)據(jù)平臺(tái)拉到內(nèi)存里面。
Q8:如上所述做這種特征緩存的話,其實(shí)要做一些時(shí)效性上的權(quán)衡?
A8:對(duì),是要做時(shí)效性的權(quán)衡。