算力經濟時代:阿里展示廣告引擎的“柔性”變形之路

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"0. 序曲"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"縱觀這兩年業界技術的演化趨勢,幾乎主流的團隊都已經完成了深度學習爲代表的技術升級,進入到算力喫緊、模型紅利放緩的新瓶頸期。去年在"},{"type":"link","attrs":{"href":"https:\/\/zhuanlan.zhihu.com\/p\/137071474","title":"","type":null},"content":[{"type":"text","text":"《深度學習推薦系統》序言"}]},{"type":"text","text":" "},{"type":"text","text":"一文中,我對工業級深度學習技術邁入新的2.0進階階段的特徵做過一些探討:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"}],"text":"可以預見,在工業級深度學習2.0階段,技術演進的模式將再升級:從算法視角的實踐和問題驅動,進一步拓展到更宏大的技術體系整體思考:領域問題特性、數據、算力、算法、架構及工程系統等將被納入統一的思考框架中,成爲技術創新的發力點"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從2018年開始我們團隊就開始做相應的佈局。除了在算法層面持續開闢縱深戰場外,對於\"算力\"這件事我們做了大量細緻的工作,這幾年支撐了我們的核心廣告模型一路從"},{"type":"link","attrs":{"href":"https:\/\/link.zhihu.com\/?target=https%3A\/\/arxiv.org\/abs\/1706.06978","title":"","type":null},"content":[{"type":"text","text":"DIN(2017)"}]},{"type":"text","text":"、"},{"type":"link","attrs":{"href":"https:\/\/link.zhihu.com\/?target=https%3A\/\/arxiv.org\/abs\/1809.03672","title":"","type":null},"content":[{"type":"text","text":"DIEN(2018)"}]},{"type":"text","text":"、"},{"type":"link","attrs":{"href":"https:\/\/link.zhihu.com\/?target=https%3A\/\/arxiv.org\/abs\/1905.09248","title":"","type":null},"content":[{"type":"text","text":"MIMN(2019)"}]},{"type":"text","text":",升級到今年的"},{"type":"link","attrs":{"href":"https:\/\/link.zhihu.com\/?target=https%3A\/\/arxiv.org\/abs\/2006.05639","title":"","type":null},"content":[{"type":"text","text":"SIM(2020)"}]},{"type":"text","text":"、"},{"type":"link","attrs":{"href":"https:\/\/link.zhihu.com\/?target=https%3A\/\/arxiv.org\/abs\/2011.05625","title":"","type":null},"content":[{"type":"text","text":"CAN(2020)"}]},{"type":"text","text":"。值得一提的是,在業界普遍陷入滯漲的這個階段,今年我們一年內完成了SIM和CAN兩個大版本主模型的研發和全量上線,同時疊加在主模型之上的多場景、多目標建模也都有所突破,核心場景取得了CTR\/RPM累積提升超過20%的巨大收益,這是繼2017年all in深度學習之後我們達到的第二個技術創新小高峯。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"印象中直到今天,還有不少同學對我們宣稱DIEN這樣的複雜模型能夠在廣告系統全流量服務報以懷疑的態度。的確,在這種大規模的廣告系統中支持GRU-based模型的在線實時inference,即使是18年模型生產化之初我們的工程同學也是有擔憂的。然而實際情況是,相比於今年的SIM及CAN模型而言,DIEN的inference算力需求不過是開胃小菜了。另一方面,不僅僅是ranking模型,我們的廣告召回模型、粗排模型,甚至後鏈路的機制策略、rerank模型等,都面臨着相似的恐怖算力激增挑戰。如何解決這個問題呢?18年的時候我做過一個斷言:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"佔領算力效能的制高點,將成爲頭部團隊在工業級深度學習2.0階段算法繼續創新突破的勝負手"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"幸運的是,經過近3年的辛苦跋涉,我們終於在轉角處聞到了薔薇的花香。近期我們陸續開始把一些成型的工作總結和分享出來,希望能夠給大家帶來一些啓發,如:model design和model inference相結合的"},{"type":"link","attrs":{"href":"https:\/\/link.zhihu.com\/?target=https%3A\/\/arxiv.org\/abs\/1905.09248","title":"","type":null},"content":[{"type":"text","text":"MIMN"}]},{"type":"text","text":"; 算法與系統co-design思路下重新設計的粗排系統"},{"type":"link","attrs":{"href":"https:\/\/zhuanlan.zhihu.com\/p\/186320100","title":"","type":null},"content":[{"type":"text","text":"COLD"}]},{"type":"text","text":";以及被今年DLP-KDD 2020收錄且評選爲best paper runner-up的"},{"type":"link","attrs":{"href":"https:\/\/link.zhihu.com\/?target=https%3A\/\/mp.weixin.qq.com\/s\/soruo90Dbtzi6d1kA63Akg","title":"","type":null},"content":[{"type":"text","text":"\"個性化算力\"分配算法DCAF"}]},{"type":"text","text":"。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果說以上工作更多focus在局部模塊進行了algorithm和system的co-design,那本文則是我們這一思想的更深度推進:進一步發展\"個性化算力\"技術,將算力融合到廣告引擎的設計中,形成更全面立體的算力解決方案,同時也給古典的引擎系統賦予了全新的動力。\"算力經濟時代\" 看起來有點標題黨,但我認爲這是對算力在這個時期技術版圖中重要性的最好註解了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以下是本文的具體內容,來自阿里展示廣告技術團隊(致謝相關兄弟團隊的大力支持)。友情提醒,它解決的不是傳統的算法或者引擎領域問題,因此不一定適合所有讀者。哪怕是廣告、推薦領域的從業者,如果沒有接觸或者思考過這類命題,亦或是對引擎系統的細節瞭解不多,讀起來也會有點艱澀。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"1. 導讀"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"時間的焦距拉到5年前,誰也不會預料到以深度學習爲代表的AI變革,對業界技術的重塑力度會如此之大、影響如此之深。這背後的一個重要變量就是\"算力\"。隨着深度學習技術上的大量創新,廣告、推薦等在線引擎系統的架構和算法複雜度迅速飆升,對算力的需求出現了爆發式的增長。以阿里展示廣告系統爲例,相比於5年前的精排模型,其在線算力的需求暴漲了近2個數量級[2,3,4]。如此驚人的算力需求增速,僅僅靠GPU\/NPU等硬件的演化已然不足,更不用說硬件本身已經在逼近摩爾定律極限。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"面臨着算力供給觸及瓶頸的巨大危機,我們看到不論是工業界還是學術界都在積極尋找解法。阿里展示廣告團隊從18年起就開始佈局算力效能技術的研發,目前已經邁入了第3代算力效能體系的階段:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1. 算力效能1.0階段 (2018):聚焦單點工程優化及模型瘦身優化等技術"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2. 算力效能2.0階段 (2019):將Model Design和Engineering Optimization結合,通過算法-工程Co-design方法論的深度實踐,帶來了顯著紅利"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3. 算力效能3.0階段 (2020):從引擎單模塊進一步拓展到系統全鏈路,用\"個性化\"算力的思想去重新審視和改造了整個廣告引擎系統,爲古典在線引擎注入了新的活力,讓它變得更加\"柔性\":充分提升給定算力的性價比,讓其在面臨任意複雜、動態的業務需求和流量環境時能夠自適應地做到"},{"type":"text","marks":[{"type":"strong"}],"text":"算力最優使用。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"結合了算力效能視角的展示廣告引擎,我們命名爲Transformers(致敬變形金剛),本文將分享我們的實踐經驗和思考。值得一提的是,算力效能感知的柔性廣告引擎(Computing Power-aware Transformers Engine)今年已經真正落地於阿里展示廣告業務:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"1. 業務效果上:"},{"type":"text","text":"僅廣告精排的個性化算力優化就能夠帶來RPM持平下算力節省25%、同等算力下RPM提升2%的收益[1];"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"2. 系統能力上:"},{"type":"text","text":"具備柔性能力的廣告在線系統平穩地應對了雙十一的各種流量波動和日常的各類系統異常,大幅提升了系統穩定性和運維效率。"}]}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2. 開胃菜:先來看看算力分配這件事"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們可以從微觀和宏觀的層面來理解在線系統的算力分配問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1. 微觀上:在某一時刻,不同流量的價值不同,算力消耗也不同——也就是算力性價比不同。我們可以根據算力性價比,爲每個流量分配更合理的算力(計算資源\/Latency約束等),從而在系統總算力的約束下,實現業務收益的全局最優。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2. 宏觀上:由於流量大小和分佈會隨時間不斷變化,那麼在總算力約束下,算力分配策略也需要動態調整,來保持業務收益的動態最優。這種微觀和宏觀相結合的視角,能夠有效地幫助我們拆解問題。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/c7\/c7b682ca3d8bb87e317e42fbc22b46ff.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"圖1:算力分配的微觀&宏觀視角"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Transformers引擎的核心理念,就是將算力分配納入到系統的設計範疇。對於古典廣告引擎而言,其使命是確保引擎系統能夠準確地實現和運行業務邏輯。對任意一條流量請求,原則上執行的計算邏輯是一致的(這裏僅考慮算力差異化視角)。在資源充足時這是合理的策略,但在算力緊張、需要騰挪資源甚至算法策略降級才能在特定的系統資源約束下完成業務邏輯時,這背後就隱藏着巨大的效能空間。以廣告系統爲例,我們可以選擇:1. 開足算力對每條流量做最精細化最複雜的計算,對超出系統算力的部分流量做丟棄操作; 2. 對不同價值的流量做差異化的算力規劃,確保系統對每條流量都有效服務。 哪種策略是最優?這就是Transformers引擎的目標:在有限的資源中做\"柔性\"算力伸縮,確保業務收益最大化。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"3. 形式化:算力分配的數學化表達"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們來具體分析宏觀、微觀兩個層面的算力分配問題。首先,我們需要具象化地理解“算力”。系統算力往往被計算相關的參數控制,包括算法策略參數(檢索token數\/打分doc數\/模型版本等)和系統性能參數(線程數\/緩存規則等)。在線系統通常會包含很多這樣的算力參數。我們用“檔位”來描述這些算力參數的取值,不同檔位代表不同的算力消耗。檔位選擇的過程就是算力分配的過程。對某個算力參數來說:流量"},{"type":"katexinline","attrs":{"mathString":"i"}},{"type":"text","text":"需要在"},{"type":"katexinline","attrs":{"mathString":"K"}},{"type":"text","text":"個候選檔位中選擇一個檔位,其中第 "},{"type":"katexinline","attrs":{"mathString":"j"}},{"type":"text","text":"個候選檔位 "},{"type":"katexinline","attrs":{"mathString":"action_{i,j}"}},{"type":"text","text":" 將會帶來 "},{"type":"katexinline","attrs":{"mathString":"cost_{i,j}"}},{"type":"text","text":"的算力消耗和 "},{"type":"katexinline","attrs":{"mathString":"value_{i,j}"}},{"type":"text","text":"的業務收益。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"微觀層面:"},{"type":"text","text":"對某一時刻 "},{"type":"katexinline","attrs":{"mathString":"t"}},{"type":"text","text":",若用 "},{"type":"katexinline","attrs":{"mathString":"s(i)"}},{"type":"text","text":"表示流量 "},{"type":"katexinline","attrs":{"mathString":"i"}},{"type":"text","text":" 選擇的算力檔位,那麼該時刻的算力分配問題可以描述爲:該時刻的 "},{"type":"katexinline","attrs":{"mathString":"N(t)"}},{"type":"text","text":"個流量的總算力消耗 "},{"type":"katexinline","attrs":{"mathString":"\\sum_{i \\leq N} cost_{i,s(i)}"}},{"type":"text","text":"在不超過總算力約束 "},{"type":"katexinline","attrs":{"mathString":"C"}},{"type":"text","text":"的前提下,如何最大化總業務收益 "},{"type":"katexinline","attrs":{"mathString":"\\sum_{i \\leq N(t)} value_{i,s(i)}"}},{"type":"text","text":"的問題。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/11\/1179fa6dc0d57470815e0b31fb4bbee3.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"圖2:算力分配問題定義"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"宏觀層面:"},{"type":"text","text":"對不同時刻 "},{"type":"katexinline","attrs":{"mathString":"t"}},{"type":"text","text":",流量大小 "},{"type":"katexinline","attrs":{"mathString":"N(t)"}},{"type":"text","text":"在不斷變化,但系統的總算力約束 "},{"type":"katexinline","attrs":{"mathString":"C"}},{"type":"text","text":"通常會相對穩定。我們將某一時刻在 "},{"type":"katexinline","attrs":{"mathString":"\\sum_{i \\leq N} cost_{i,s(i)} \\leq C"}},{"type":"text","text":"約束下的 "},{"type":"katexinline","attrs":{"mathString":"\\max_s \\sum_{i \\leq N} value_{i,s(i)}"}},{"type":"text","text":"策略推廣到所有時刻,理論上就可以實現動態的算力最優分配。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在下文中,我們將分別介紹特定時刻下的算力分配算法和考慮宏觀變化下的系統實現。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"4. 靜態算力最優分配:DCAF算法"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先我們來看某一時刻的算力最優分配求解。延續上文的形式化定義,將算力配置選擇 "},{"type":"katexinline","attrs":{"mathString":"s(i)"}},{"type":"text","text":"用one-hot向量的方式表示爲待優化變量 "},{"type":"katexinline","attrs":{"mathString":"x(i)"}},{"type":"text","text":",即: "},{"type":"katexinline","attrs":{"mathString":"x_{i,j} = 1 ~~if~s(i) = j, ~otherwise ~~x_{i,j}=0"}},{"type":"text","text":",則優化目標和約束定義如下:"}]},{"type":"katexblock","attrs":{"mathString":"\\max_{x \\in dom X} \\sum_{i \\leq N, j \\leq K} x_{i,j} \\ value_{i,j} \\\\\ns.t.(\\sum_{i \\leq N, j \\leq K} x_{i,j} \\ cost_{i,j}) \\leq C"}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"Lagrangian求解思路"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏爲大家介紹我們團隊自研的"},{"type":"link","attrs":{"href":"https:\/\/link.zhihu.com\/?target=https%3A\/\/mp.weixin.qq.com\/s\/soruo90Dbtzi6d1kA63Akg","title":"","type":null},"content":[{"type":"text","text":"DCAF個性化算力分配算法"}]},{"type":"text","text":"。我們使用Lagrangian方法來求解這個帶約束的優化問題,引入額外變量 λ:"}]},{"type":"katexblock","attrs":{"mathString":"L(x, \\lambda) = -\\sum_{i \\leq N, j \\leq K} x_{i,j} \\ value_{i,j} + \\lambda(\\sum_{i \\leq N, j \\leq K} x_{i,j} \\ cost_{i,j} - C)"}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"並相應地構造對偶函數"},{"type":"katexinline","attrs":{"mathString":"g(λ)"}},{"type":"text","text":":"}]},{"type":"katexblock","attrs":{"mathString":"g(\\lambda) = \\min_{x \\in dom X} -\\sum_{i,j} x_{i,j} \\ (value_{i,j} - \\lambda cost_{i,j}) - \\lambda C \\\\\n= -[\\sum_{i \\leq N}\\max_{j \\leq K}(value_{i,j} - \\lambda cost_{i,j}) + \\lambda C]"}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可以看出,對於任意給定的 λ,對偶函數"},{"type":"katexinline","attrs":{"mathString":"g(λ)"}},{"type":"text","text":"在 "},{"type":"katexinline","attrs":{"mathString":"s(i) = \\arg\\max_{j \\leq K} (value_{i,j} - \\lambda \ncost_{i,j})"}},{"type":"text","text":"時最優。注意:每個流量 "},{"type":"katexinline","attrs":{"mathString":"i"}},{"type":"text","text":"的最優檔位 "},{"type":"katexinline","attrs":{"mathString":"s(i)"}},{"type":"text","text":"可以獨立求解,因此非常適合在實際的分佈式系統中進行線上服務。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"λ的含義:算力邊際收益的約束"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於流量 "},{"type":"katexinline","attrs":{"mathString":"i"}},{"type":"text","text":",在給定λ下,若檔位 "},{"type":"katexinline","attrs":{"mathString":"j"}},{"type":"text","text":"優於檔位 "},{"type":"katexinline","attrs":{"mathString":"j'"}},{"type":"text","text":",則:"},{"type":"katexinline","attrs":{"mathString":"value_{i,j} - \\lambda cost_{i,j} > \nvalue_{i,j'} - \\lambda cost_{i,j'}"}},{"type":"text","text":",即: "},{"type":"katexinline","attrs":{"mathString":"\\frac\n{ \\Delta value_{j' \\rightarrow j} }\n{ \\Delta cost_{j' \\rightarrow j} }\n> λ"}},{"type":"text","text":"。也就是說:一個檔位相比另一檔位更優,當且僅當其算力邊際收益 "},{"type":"katexinline","attrs":{"mathString":"\\frac\n{ \\Delta value }\n{ \\Delta cost }> \\lambda"}},{"type":"text","text":"。因此,"},{"type":"text","marks":[{"type":"strong"}],"text":"可以認爲 λ 是對算力邊際收益的約束。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/12\/12f17906db8b01967102c662e4bc49ee.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"圖3:算力消耗-收益曲線(邊際收益遞減)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"不難看出,λ越小(放寬性價比約束)最優檔位"},{"type":"katexinline","attrs":{"mathString":"j"}},{"type":"text","text":"就越大,對應的算力消耗和業務收益也越大,反之亦然。因此,"},{"type":"text","marks":[{"type":"strong"}],"text":"總消耗和總收益會隨着λ減小而單調遞增,而整體算力性價比會隨着λ減小而單調遞減。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"λ的求解:算力約束的臨界狀態"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"知道了λ的含義,接下來看使得"},{"type":"katexinline","attrs":{"mathString":"g(λ)"}},{"type":"text","text":"最優的λ如何計算。由單調性和算力約束可以想到,儘可能地多用算力可最大化價值。而稍加整理也能看到"},{"type":"katexinline","attrs":{"mathString":"g(λ)"}},{"type":"text","text":"的現實含義就是“已使用算力的總收益” + “λ倍的剩餘可用算力\"。通過分析λ減小\/增大時這兩部分的增減量,可以發現當"},{"type":"text","marks":[{"type":"strong"}],"text":"算力恰好被用完時 "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/www.zhihu.com\/equation?tex=%5Csmall%7B++%5Csum_%7Bi+%5Cle+N%7D+cost_%7Bi%2C+s%28i%29%7D+%3D+C++%7D","alt":null,"title":null,"style":[{"key":"width","value":"25%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" ,此時"},{"type":"katexinline","attrs":{"mathString":"g(λ*)"}},{"type":"text","text":"取到極大值。由弱對偶性可知,此時的"},{"type":"katexinline","attrs":{"mathString":"g(λ*)"}},{"type":"text","text":"對應的解也正是全局最優解。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/79\/79a6a833effc45a4bf58fde51c5118d2.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因此,在離線靜態求解λ時,"},{"type":"text","marks":[{"type":"strong"}],"text":"利用算力總消耗隨λ減小而單調增加的性質"},{"type":"text","text":",我們只需通過二分查找去找到最接近算力約束"},{"type":"katexinline","attrs":{"mathString":"C"}},{"type":"text","text":"的λ即可。而面對在線流量的連續變化,我們也無須每時每刻重新求解λ,只需根據每一時刻的算力消耗和算力約束的相對關係,對λ進行實時微調即可——全局維護當前時刻的"},{"type":"katexinline","attrs":{"mathString":"\\lambda(t)"}},{"type":"text","text":"並統計當前時刻的總算力消耗 "},{"type":"katexinline","attrs":{"mathString":"\\sum_{i \\le N_t} cost_{i, s(i)}"}},{"type":"text","text":"。若當前時刻總算力消耗超過了"},{"type":"katexinline","attrs":{"mathString":"C"}},{"type":"text","text":",則在下一時刻通過上調"},{"type":"katexinline","attrs":{"mathString":"λ_{t+1}"}},{"type":"text","text":"來降低算力消耗從而滿足約束,反之亦然。由此,在流量平穩時,通過動態維持總算力消耗恰好滿足算力約束,幾乎可以保證每時每刻系統都處在最優的算力分配狀態;而當流量突變時,系統也可以在較短時間內調整到滿足約束的狀態。具體的系統方案將在下面章節展開。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"流量價值\/消耗預估和最優檔位求解"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當在線流量"},{"type":"katexinline","attrs":{"mathString":"i"}},{"type":"text","text":"到來時,只需要得到各檔位預估的流量價值"},{"type":"katexinline","attrs":{"mathString":"value_{i,j}"}},{"type":"text","text":"、算力消耗"},{"type":"katexinline","attrs":{"mathString":"cost_{i,j}"}},{"type":"text","text":"以及當前的λ,就可以計算出最優檔位。那麼,流量價值"},{"type":"katexinline","attrs":{"mathString":"value_{i,j}"}},{"type":"text","text":"和算力消耗 "},{"type":"katexinline","attrs":{"mathString":"cost_{i,j}"}},{"type":"text","text":"如何預估呢?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於流量價值預估,可以通過分場景或者分用戶統計歷史RPM均值。對於算力消耗預估,取決於算力參數的選取,通常只要找到可量化的算力指標並且在檔位間相對可比即可(例如,召回階段選取檢索標籤數、海選廣告數作爲參數,預估階段選取特徵數、廣告數作爲參數)。以精排階段的算力分配爲例,個性化算力分配可以在廣告RPM收益不折損的情況下,節省25%的精排打分算力。而相比不做個性化算力分配,在同等算力下可以提升廣告RPM約2%。個性化算力分配爲業務增長打開了顯著空間,並且該算法方案不侷限於單個模塊、單個算力參數,可以推廣到整個系統。關於DCAF算法的更多細節,可以參見我們的論文[1]。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"5. 動態算力最優分配:AllSpark架構"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"實時反饋調節"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以上介紹的DCAF算力分配算法,可以在微觀層面解決某一時刻的算力最優分配問題。該方法如果推廣到所有時刻,在宏觀層面實現動態的算力最優分配,關鍵點在於讓“作爲算力性價比約束的λ”動態保持最優——λ過大則有可能算力用不完出現浪費,反之λ過小則有可能超出算力約束。上文已經提到了“根據每一時刻的算力消耗和算力約束的相對關係,對λ進行實​時微調”的思路,那麼就需要讓在線系統具備實時反饋調節的能力,一方面爭取讓算力“恰好用完”(既滿足算力約束又不浪費),另一方面確保系統穩定可用(對於高可用低延時的廣告引擎系統來說,“算力約束”不僅指的是計算資源的約束,還包括了Latency的約束)。因此我們選擇了"},{"type":"text","marks":[{"type":"strong"}],"text":"“模塊調用失敗率”"},{"type":"text","text":"(由資源不足和其他異常導致的調用超時和錯誤)作爲主要調控指標,根據實時反饋的模塊失敗率來調節全局的 λ,從而實現動態的算力最優分配。當然,這裏的調控標的指標在不同的引擎系統中可以選擇不同的錨點,一個可供參考的原則是:選擇對算力的波動最敏感的系統指標。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"系統設計實現"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"DCAF算力分配算法中的 λ、最優檔位 "},{"type":"katexinline","attrs":{"mathString":"i"}},{"type":"text","text":"是針對每個算力參數的,也就是這個參數在所有流量上共享一個全局的 λ,也可以認爲所有流量的平均檔位對應一個全局的 λ 。爲了便於理解和簡化實現,"},{"type":"text","marks":[{"type":"strong"}],"text":"在線系統可以考慮直接對每個參數的平均檔位進行實時調節"},{"type":"text","text":"。另一方面,爲了實現系統整體的算力最優分配,系統的每個模塊都定義了不止一個算力參數,這些參數如果分別獨立地自我調節,一是非常複雜,二是不容易形成全局最優。因此真實場景中的算力參數設計需要考慮更加全面。例如我們採用了模塊失敗率作爲主要調控目標,那麼就可以把同一模塊內所有按失敗率調節的算力參數聚合成一個"},{"type":"text","marks":[{"type":"strong"}],"text":"調控單元"},{"type":"text","text":",一個調控單元由一組 { 調控目標、調控策略、平均檔位 } 組成,單元內的所有參數共享調控策略和平均參考檔位。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"再回到系統設計。實時反饋調節系統可以認爲是在線引擎的非侵入式控制器,它既是一套獨立的框架,也能夠與在線引擎系統密切配合,共同實現算力調節的能力。我們將整體框架取名爲AllSpark(來自於《變形金剛》中的“火種源”,能夠賦予機械生命,使它們具有變形的能力)。AllSpark框架主要由四個部分組成:"},{"type":"text","marks":[{"type":"strong"}],"text":"調節鏈路、反饋鏈路、控制面板、監控視圖"},{"type":"text","text":"。"}]},{"type":"image","attrs":{"src":"https:\/\/static001.infoq.cn\/resource\/image\/2e\/0e\/2eb8be7fe603d1aeb956bc287f51c40e.jpg","alt":null,"title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"圖4:AllSpark動態算力框架"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"調節鏈路"},{"type":"text","text":":調節鏈路包括中控Controller和嵌入在應用模塊中的Agent。Controller收集所有模塊一段時間內各種調控目標(失敗率\/Latency\/QPS\/CPU水位等)的實時指標,並根據一定的調控策略給出每個調控單元的平均檔位建議,起到動態調節 λ的作用,同時讓各模塊滿足算力和可用性的約束。Controller作爲算力調節的中控,需要做到"},{"type":"text","marks":[{"type":"strong"}],"text":"穩、準、快"},{"type":"text","text":"。爲了滿足這些要求,Controller支持了PID控制算法、單步控制、個性化規則等多種調控策略,以及去噪、防抖等平滑機制。Agent是嵌入在每個應用模塊中的SDK,它通過從Controller主動拉取該模塊所有調控單元的平均檔位等調控信息,來確保該模塊在平均檔位的建議下安全運行。同時,Agent還爲每個模塊提供了個性化調控的API,可以讓各模塊自己實現流量粒度的各種個性化算力分配策略(例如DCAF算力分配算法和基於用戶質量分的分配算法等)。甚至還可以在Agent中實現下游模塊的流控能力。可以看出,Controller-Agent的兩級調控機制,既保證了每個模塊整體滿足算力約束,又能夠針對不同流量做個性化的算力分配。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"反饋鏈路:"},{"type":"text","text":"各模塊用於算力調控的指標會通過反饋鏈路採集到Controller。反饋鏈路包括採集和存儲兩部分,我們使用Prometheus收集應用容器中的狀態數據,寫入時序數據庫存儲,併爲Controller提供查詢接口。整個鏈路目前具備5s左右的反饋時效。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"控制面板:"},{"type":"text","text":"控制面板是人工介入AllSpark的接口,用於分模塊\/調控單元\/場景 多層次地配置和管理 { 調控目標、調控策略、算力檔位 },可以根據情況決定每個參數使用固定檔位還是動態檔位,並且通過版本控制以及分集羣的發佈管控,實現可灰度、可回滾的能力。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"監控視圖:"},{"type":"text","text":"可以想象,整個系統中數以百計的算力參數實時動態地變化,如果沒有完善的監控和異常發現能力,系統隨時可能陷入失控的狀態。監控視圖用於透出每個算力參數的實時\/歷史平均檔位,並且將檔位的異常變化對接到監控系統中,讓整個AllSpark系統具備可觀測的能力。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"系統柔性表現"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們以今年雙十一大促當天展示廣告系統的表現來說明AllSpark系統的柔性能力。展示廣告場景在雙十一零點高峯時段有十倍於日常流量的洪峯。零點之後,流量呈階梯狀逐步回落。往年爲了扛住流量洪峯,需要手動推動策略降級預案,並且需要根據流量的變化推送不同版本的降級預案,實現流量和算法策略的最優組合,來確保業務收益最大化。問題在於人工操作的成本很高,風險也很大。AllSpark的上線使得今年雙十一的保障有了很大改觀。零點時段只需要推送一個基礎版本的降級預案保護,然後通過AllSpark根據流量的變化自適應地調節算力,就可以實現系統在高水位下的平穩運行,同時確保了零點黃金時段的業務效果。事實上,僅零點附近1、2個小時的系統服務能力增強(用更強的算法策略服務更多的流量),就給我們今年的廣告收入創造了千萬人民幣規模的收入增量。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/30\/307be0c0239641a0780970ede3b40be2.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"圖5:2020雙十一大促系統表現示意圖"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"除了能夠在大促期間柔性應對各種流量洪峯之外,AllSpark在系統的日常穩定性保障上也發揮了重要作用。當系統偶爾出現局部模塊的超時抖動時,AllSpark能夠自動降低問題模塊的算力負載、加速問題恢復,從而將故障隔離在局部,確保系統整體的健壯可用。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"6. Beyond算力:再看Transformers柔性引擎"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"個性化算力分配算法+自適應動態算力系統相結合,使得廣告引擎系統具備了柔性能力。這樣的系統就像變形金剛一樣,能夠自動變形成最適應環境變化的狀態,因此我們也把被賦予了柔性能力的在線系統稱作"},{"type":"text","marks":[{"type":"strong"}],"text":"Transformers。"},{"type":"text","text":"事實上,跳出算力視角看Transformers柔性系統,它同樣賦予了更多的想象力和可能性:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"多場景調控:Transformers不僅能在"},{"type":"text","marks":[{"type":"strong"}],"text":"時間維度"},{"type":"text","text":"的靜態和動態層面實現算力最優分配,還能夠在"},{"type":"text","marks":[{"type":"strong"}],"text":"空間維度"},{"type":"text","text":"的多場景複雜業務系統中起到算力調控的角色。由於不同業務場景的流量規模和流量價值差異很大,從安全隔離的角度通常做法是分場景獨立地部署系統。那麼如何爲每個場景分配合理的算力並且動態維護最優呢?這往往很難,而且對一些場景快速變化的響應速度是不足的。Transformers給我們提供了一條新的解決方案:無須多場景獨立部署,由一套統一的系統("},{"type":"text","marks":[{"type":"strong"}],"text":"OneEngine)"},{"type":"text","text":"高效承接各種異構的流量,從而可以自然地將DCAF和AllSpark的能力從單場景推廣到多場景,多場景資源共享的同時實現跨場景的全局算力最優分配、業務收益最大化,以及系統整體平穩可用。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"業務系統大腦:Transformers柔性系統區別於傳統的負載均衡、自動化限流降級等系統層面的解決方案,它站在業務系統的全局視角,追求算法策略的算力最優分配、業務收益最大化,同時讓系統在計算資源利用率、Latency等系統指標上達到最優平衡。可以看出,Transformers實際上扮演了業務系統運行時大腦的角色,這也是我們對在線系統未來演進方向的判斷和探索。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"Reference"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"[1]. Jiang et al, "},{"type":"text","marks":[{"type":"italic"}],"text":"DCAF: A Dynamic Computation Allocation Framework for Online Serving System, "},{"type":"link","attrs":{"href":"https:\/\/link.zhihu.com\/?target=https%3A\/\/arxiv.org\/abs\/2006.09684","title":"","type":null},"content":[{"type":"text","text":"https:\/\/arxiv.org\/abs\/2006.09684"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"[2]. Pi et al"},{"type":"text","marks":[{"type":"italic"}],"text":", Search-based User Interest Modeling with Lifelong Sequential Behavior Data, "},{"type":"link","attrs":{"href":"https:\/\/link.zhihu.com\/?target=https%3A\/\/arxiv.org\/abs\/2006.05639","title":"","type":null},"content":[{"type":"text","text":"https:\/\/arxiv.org\/abs\/2006.05639"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"[3]. Wang et al"},{"type":"text","marks":[{"type":"italic"}],"text":", COLD: Towards the Next Generation of Pre-Ranking System, "},{"type":"link","attrs":{"href":"https:\/\/link.zhihu.com\/?target=https%3A\/\/arxiv.org\/abs\/2007.16122","title":"","type":null},"content":[{"type":"text","text":"https:\/\/arxiv.org\/abs\/2007.16122"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"[4]. Zhou et al, "},{"type":"text","marks":[{"type":"italic"}],"text":"CAN: Revisiting Feature Co-Action for Click-Through Rate Prediction, "},{"type":"link","attrs":{"href":"https:\/\/link.zhihu.com\/?target=https%3A\/\/arxiv.org\/abs\/2011.05625v1","title":"","type":null},"content":[{"type":"text","text":"https:\/\/arxiv.org\/abs\/2011.05625v1"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"strong"}],"text":"本文首發於 "},{"type":"link","attrs":{"href":"https:\/\/zhuanlan.zhihu.com\/p\/340467381","title":"xxx","type":null},"content":[{"type":"text","text":"https:\/\/zhuanlan.zhihu.com\/p\/340467381"}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章