Google experiment infrastructure 閱讀心得

背景

Google 的文化就是數據驅動:不停實驗,不斷得到實驗結果進行分析並進行改進,這樣就會導致所有R&D(Researcher&Developer)都會有不斷實驗的衝動和需求。這就對實驗框架提出了文中重點描述的三個需求:

1.        More: 更多能夠同時進行的實驗

2.        Better:不合法的實驗不能在框架中實驗, 而合法的實驗, 但如果效果不佳, 則應該能夠被及時發現並下線

3.        Faster:實驗應該能快速建立並啓動

和google search engine面臨的問題一樣,推薦系統也存在大量實驗,故文中的思想可以在後續關鍵詞推薦的設計中借鑑。

原有相關工作

一般來說,進行實驗的目的有以下兩個:

1.        測試新的features

2.        在已有features上,測試各種參數的最優值及組合

而原有框架卻有較多限制。例如google在2007年以前使用single Layer模式,該方式實現較爲簡單, 卻有很多限制, 包括:

1.        每個請求最多隻能做一個實驗,可能導致很多實驗流量不足

2.        添加條件進行分流時會使框架變得複雜

3.        上游模塊做了較多流量劃分後,下游模塊可能出現stravation的狀況

另一種方式:Mutil-factorialdesign,讓每個參數都相對獨立地做實驗,最多能同時做N個實驗,其中N爲參數個數。缺點是不容易調整,且很多參數是不獨立的,文中給的例子是UI顯示文字,背景的顏色不能相同。

Overlapping Experiment Infrastucture

主要思想:

1.        將待實驗參數劃分爲獨立的N組subsets。例如,不同的binary功能不一樣,則可以認爲他們的parameters不相交,可劃分到不同的subsets中

2.        定義domain, layer,experiment後,對流量進行劃分及條件判斷,其中:

l  Domain: 流量的劃分,domain之間流量是不能有交集的

l  Layer:每組相關的subset參數組成一個實驗layer

l  Experiment:具體實驗,在一個subset中,測試0個及多個測試參數

3.        Domain, layer, experiment可以嵌套

如下圖所示:


其中(a)爲single layer,(b)爲帶有非覆蓋domain的簡單示例,(c)中包含兩個launchlayer(d)中則存在更多嵌套

具體的參數設置, 既可以通過代碼修改來實現, 也可以通過更新數據來制定(對應文中的binarypush 和data push,一般情況下data push 能夠更快地進行更新)。

對於domain流量的劃分,在searchengine 中一般是通過cookie來劃分(不能通過request等非機器/用戶屬性進行劃分,否則用戶看到的效果可能出現跳動),而在Overlapping Experiment Infrastucture中,流量劃分有以下原則:

1.        Domain 流量不能有交集,一旦流量劃分到某個domain,則流量不能再其他平級的domain中被使用,所以一般domain的劃分可以使用。一般使用cookie,或是cookie-day,userid取模來進行劃分。

2.        Layer可以考慮使用不同的功能模塊binary來進行劃分參數。在各layers中,分流可使用mod =f(cookie, layer)進行流量劃分

3.        在具體實驗中,需要考慮condition(具體實驗條件是否成立)

具體實驗邏輯參見下圖:


同時文中提到會使用配套數據校驗工具校驗數據格式正確性(其實這個是上線的必須具有的工具,並無新意),另外線上會時時關注重要指標,例如CTR,如果CTR等重要KPI超過異常邊界,則新實驗直接下線。這樣的檢測固然能保證避免異常,但是否會限制實驗的上線速度需要思考,畢竟線上多個實驗同時進行的話, CTR類似的KPI發生異常時,不能很快確認是哪個實驗導致。

和傳統方式一樣, 實驗框架提供的是實驗流量的定位,但具體實驗中,某次請求究竟是走了實驗組邏輯,還是走了控制組邏輯,則仍需要從日誌中分析。

其他

文中提到的以下內容也非常值得借鑑:

1.        文中提到了canary code的概念,表明google會在線上開實驗,小流量測試代碼正確性。也是正式,讓google公司中RD/QA的比例很高(中國主要的search engine公司中,代碼正確性更多是在線下驗證,這就要求更多測試工程師)

2.        所有和實驗框架的代碼均被抽離成shared library的形式編譯到各binary中,這樣就讓實驗代碼實現高度統一。但這裏有一個問題:很多複雜系統中數據流是通過很多層binary後,才能得到最後的結果,如何控制各層之間的數據流向,設計時需要重點考慮。

需思考的問題

1.        涉及到多層次模塊的架構中,如何控制各實驗在各層之間的數據傳輸(如使用binary push的方式,則同一層的binary可能不一樣,除非統一binary,而由data push控制)

2.        如何記錄實驗結果:文中使用logging的方式仍然會導致線下需要較多的logging事後分析的工作




也可關注我的微博:  weibo.com/dustinsea

或直接訪問 semocean.com


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章