百度信息流和搜索業(yè)務(wù)中的彈性近線計(jì)算探索與應(yīng)用
導(dǎo)讀:在生產(chǎn)環(huán)境的PaaS平臺(tái)中,為了應(yīng)對(duì)流量增長、負(fù)載尖峰、軟硬件升級(jí)、大規(guī)模局部故障等,通常需要留有一定的資源冗余。百度信息流和搜索服務(wù)在全網(wǎng)提供超過5個(gè)9的可用性,為了應(yīng)對(duì)極端情況,各個(gè)地域的PaaS集群在設(shè)計(jì)上都有一定資源冗余。此外,為了控制成本,業(yè)務(wù)迭代需要取得合理的投入產(chǎn)出比之后,才能正式上線推全。因此,我們結(jié)合推薦系統(tǒng)和搜索系統(tǒng)的業(yè)務(wù)特點(diǎn),設(shè)計(jì)并實(shí)現(xiàn)了一套介于在線和離線之間的彈性近線計(jì)算架構(gòu)。相比于在線計(jì)算,突破計(jì)算速度限制,為業(yè)務(wù)計(jì)算復(fù)雜度提供了更大空間;相比于離線批量計(jì)算,提供了時(shí)效性更強(qiáng),穩(wěn)定性更高的策略計(jì)算方式。
?
推薦系統(tǒng)、搜索系統(tǒng)的在線服務(wù)這種計(jì)算場(chǎng)景,整個(gè)負(fù)載隨流量波動(dòng),而流量存在明顯的波峰波谷。大部分用戶會(huì)在什么時(shí)候看新聞,刷信息流,搜索等存在一定的規(guī)律,例如上班通勤的路上刷信息流、睡前刷信息流等。
但在線服務(wù)的資源備貨必須要按照流量最高峰期的負(fù)載來準(zhǔn)備,另外為了容災(zāi),設(shè)計(jì)上需要有一定的部署冗余,實(shí)際部署的資源會(huì)比高峰期所需要的資源更多,因此在線集群中存在可以挖掘的冗余資源,在實(shí)際的生產(chǎn)環(huán)境中,集群的利用率一般不會(huì)超過60%。
△在線系統(tǒng)CPU利用率波動(dòng)及其資源冗余示意圖
此外,在線計(jì)算系統(tǒng)一般有嚴(yán)格的速度指標(biāo)限制。以推薦系統(tǒng)為例,用戶一次下拉刷新,需要在指定的時(shí)間內(nèi)返推薦回結(jié)果給用戶。受限于速度指標(biāo)的限制,一次在線計(jì)算的計(jì)算規(guī)模也受到了限制,包括一次推薦計(jì)算覆蓋的候選集受限以及召回和排序等計(jì)算的模型復(fù)雜程度也受限。
在這樣的背景之下,我們開始嘗試在百度的信息流推薦系統(tǒng)和搜索系統(tǒng)中引入近線計(jì)算。一方面,通過架構(gòu)和業(yè)務(wù)聯(lián)合設(shè)計(jì),將復(fù)雜計(jì)算遷移到近線系統(tǒng),從而突破在線計(jì)算的速度限制,進(jìn)行更大規(guī)模的策略計(jì)算,提升業(yè)務(wù)效果;另一方面,通過彈性的設(shè)計(jì),它能夠充分利用在線集群的閑散資源進(jìn)行策略計(jì)算,降低整個(gè)近線計(jì)算機(jī)制的成本。
二、整體思路
△彈性近線計(jì)算整體的思路
簡要來說,彈性近線計(jì)算的整體思路是采用異步計(jì)算的方式,把復(fù)雜策略計(jì)算與在線計(jì)算解耦。
首先在線計(jì)算系統(tǒng)緩存中間結(jié)果或者獨(dú)立建設(shè)復(fù)雜的業(yè)務(wù)近線計(jì)算流程,再通過一定的觸發(fā)信號(hào),觸發(fā)近線計(jì)算,提前計(jì)算中間結(jié)果。在線服務(wù)響應(yīng)請(qǐng)求時(shí),直接使用提前算好的計(jì)算結(jié)果做低復(fù)雜度的在線處理之后響應(yīng)請(qǐng)求,這樣就繞開了在線計(jì)算的速度限制,可以進(jìn)行復(fù)雜度高、計(jì)算量大的業(yè)務(wù)計(jì)算。另外就是在系統(tǒng)存在冗余資源的時(shí)候,可以結(jié)合歷史的觸發(fā)信號(hào)進(jìn)行到訪預(yù)估,主動(dòng)發(fā)起近線計(jì)算,優(yōu)化資源利用提升業(yè)務(wù)效果。
整個(gè)系統(tǒng)最重要的部分在于為了適配閑散資源,節(jié)約整個(gè)近線計(jì)算機(jī)制的成本。我們?cè)O(shè)計(jì)了一整套動(dòng)態(tài)算力和動(dòng)態(tài)參數(shù)的機(jī)制。
首先根據(jù)PaaS集群自身的負(fù)載情況,進(jìn)行動(dòng)態(tài)的超發(fā),獲取超額算力。
第二是設(shè)計(jì)跟負(fù)載相關(guān)的業(yè)務(wù)參數(shù),根據(jù)動(dòng)態(tài)算力的情況,決定整個(gè)近線計(jì)算的業(yè)務(wù)參數(shù),釋放出和算力相匹配的負(fù)載,從而平穩(wěn)&充分的可利用資源。平穩(wěn),指的是缺資源的時(shí)候,系統(tǒng)能自動(dòng)降級(jí),避免系統(tǒng)雪崩無法自愈,充分指的是沒有自然負(fù)載的時(shí)候,我們結(jié)合業(yè)務(wù)需要,主動(dòng)計(jì)算,充分利用算力,最終提升業(yè)務(wù)效果。
第三是為了優(yōu)化資源的利用,對(duì)資源使用情況進(jìn)行預(yù)估和規(guī)劃。一方面錯(cuò)峰調(diào)度資源,提高擴(kuò)展資源調(diào)度的成功率;另一方面結(jié)合資源情況,分配計(jì)算負(fù)載,提升資源的利用效率。最后,針對(duì)非高峰期,資源冗余的情況下,需要估算整個(gè)系統(tǒng)的容量,再根據(jù)剩余的算力,發(fā)起主動(dòng)近線計(jì)算,充分利用資源,提升業(yè)務(wù)效果。
另外,為了爭(zhēng)取更多的算力,系統(tǒng)中同時(shí)支持CPU/GPU和昆侖芯片等類型的資源,因此需要考慮在異構(gòu)算力模塊上調(diào)度計(jì)算負(fù)載。另外,計(jì)算集群分布在全國各地,所以系統(tǒng)設(shè)計(jì)上,也需要考慮如何利用跨地域的算力。
三、系統(tǒng)架構(gòu)
△彈性近線計(jì)算系統(tǒng)整體架構(gòu)簡圖
彈性近線計(jì)算系統(tǒng)主要包括幾個(gè)子系統(tǒng)。
· 觸發(fā)控制系統(tǒng)
主要負(fù)責(zé)根據(jù)業(yè)務(wù)參數(shù),控制近線計(jì)算的觸發(fā),達(dá)到削峰填谷的目的。
· 動(dòng)態(tài)算力和動(dòng)態(tài)調(diào)參系統(tǒng)
它相當(dāng)于彈性近線計(jì)算系統(tǒng)的大腦,根據(jù)集群的資源情況,分配近線計(jì)算算力;再根據(jù)算力情況,計(jì)算控制參數(shù),從而控制跟算力匹配的負(fù)載。
· 歷史數(shù)據(jù)中心
保存近線計(jì)算歷史的計(jì)算記錄。可以根據(jù)資源的情況,復(fù)用歷史計(jì)算結(jié)果,來調(diào)節(jié)對(duì)算力的使用。
· 業(yè)務(wù)近線計(jì)算&控制系統(tǒng)
這個(gè)主要是和業(yè)務(wù)接入近線計(jì)算相關(guān)的一些架構(gòu)機(jī)制設(shè)計(jì),比如說輸入輸出緩存的讀寫,計(jì)算的拆包/并包等等,業(yè)務(wù)計(jì)算與失敗信號(hào)的反饋等等。
· 業(yè)務(wù)在線接入
部分主要是業(yè)務(wù)接入近線計(jì)算系統(tǒng)上的一些設(shè)計(jì)。這塊主要考慮的是如何高效的接入業(yè)務(wù),避免業(yè)務(wù)接入過高的架構(gòu)人力成本。
四、算力來源
1)擴(kuò)展資源池
彈性近線計(jì)算使用的冗余資源(下文稱擴(kuò)展資源)來源主要包括兩個(gè)方面。
△可超發(fā)資源示意圖
首先,集群分配了但是沒使用的資源,為什么呢?
第一,流量存在峰谷,但資源一般按照高峰期的負(fù)載準(zhǔn)備,因此非高峰期存在資源空閑。
第二,由于Feed和搜索在線服務(wù)對(duì)外提供超過5個(gè)9的穩(wěn)定性保證,要應(yīng)對(duì)的機(jī)房故障除了硬件層面的故障之外,更多的也包括頻繁的業(yè)務(wù)迭代,復(fù)雜的部署環(huán)境等造成的故障。因此即使在高峰期,機(jī)房的負(fù)載也是存在設(shè)計(jì)上的冗余。
舉個(gè)例子,任何時(shí)刻當(dāng)一個(gè)機(jī)房出現(xiàn)故障的時(shí)候,其它機(jī)房能夠承接的這個(gè)故障機(jī)房的流量進(jìn)行止損。
其次是碎片資源,PaaS集群的分配率是不可能到100%的,總是存在一些無法滿足業(yè)務(wù)quota需求的資源碎片資源,這些也是近線計(jì)算可以利用的資源。
因此,通過監(jiān)控PaaS集群資源的使用情況,基于歷史資源使用數(shù)據(jù)情況進(jìn)行預(yù)估,形成一個(gè)擴(kuò)展資源池,這個(gè)過程可以用如下公示表示:
其中,表示擴(kuò)展資源的總量,它等于集群資源總量
減去已分配資源的總量
加上可回收的資源總量
,可回收的資源總量是一個(gè)動(dòng)態(tài)值,由具體穩(wěn)定資源的分配情況和使用情況決定,并根據(jù)擴(kuò)展資源的
等級(jí)進(jìn)行折中。PaaS的節(jié)點(diǎn)實(shí)時(shí)檢測(cè)節(jié)點(diǎn)內(nèi)的資源使用情況,如果擴(kuò)展資源的實(shí)例使用違規(guī)或者節(jié)點(diǎn)自身的資源利用率超過安全水位值,則隨時(shí)釋放節(jié)點(diǎn)上的擴(kuò)展資源。
綜上所述,在線大規(guī)模混布背景下的擴(kuò)展資源特性:1)不穩(wěn)定;2)供給量大。
不穩(wěn)定主要來自于混布環(huán)境下,資源熱點(diǎn)可能隨時(shí)隨機(jī)出現(xiàn),再加上常態(tài)的機(jī)房間切流,因此擴(kuò)展資源實(shí)例不穩(wěn)定。
另外,由于是混布的集群,因此所有PaaS上的模塊的閑置資源都可以統(tǒng)一利用,整體擴(kuò)展資源的供給量很大。
2)XPU擴(kuò)展資源挖掘和利用
△XPU資源調(diào)度系統(tǒng)架構(gòu)簡圖
由于XPU(這里是對(duì)GPU和昆侖芯片的統(tǒng)稱)資源與CPU資源的差異,雖然XPU本身已經(jīng)支持共享,但XPU共享本質(zhì)上還是分時(shí)復(fù)用的共享方式,所以如何保證共享XPU不影響在線業(yè)務(wù)的速度就是一個(gè)問題。為了利用冗余的XPU資源,在PaaS之上設(shè)計(jì)了一套XPU上的模型調(diào)度系統(tǒng),核心子系統(tǒng)包括:
首先,在節(jié)點(diǎn)層面,設(shè)計(jì)一個(gè)模型容器,在實(shí)例內(nèi)部進(jìn)行模型調(diào)度,它根據(jù)遠(yuǎn)程拓?fù)涔芾硐到y(tǒng)中的元數(shù)據(jù),決定實(shí)例具體執(zhí)行什么模型。
第二,通過擴(kuò)展PaaS的K8S Operator,在一個(gè)APP中,按照資源需求將實(shí)例劃分給不同的業(yè)務(wù),比如說在線和近線,使得每個(gè)APP可以承載多個(gè)模型的計(jì)算。
第三,資源預(yù)估系統(tǒng)會(huì)根據(jù)實(shí)際各個(gè)模型的資源需求情況,調(diào)整不同模型的資源。另外資源調(diào)整之后,涉及異構(gòu)算力的負(fù)載分配和和削峰填谷的參數(shù)調(diào)整等。
第四,所有對(duì)業(yè)務(wù)模型的訪問都通過名字服務(wù)尋址,獲取具體的模型到計(jì)算實(shí)例的映射。通過獨(dú)立的調(diào)度,隔離了近線計(jì)算的XPU共享對(duì)在線業(yè)務(wù)的干擾。
五、在線近線混合計(jì)算架構(gòu)
△近線在線混合計(jì)算架構(gòu)
考慮到業(yè)務(wù)同學(xué)已經(jīng)對(duì)原有在線業(yè)務(wù)的研發(fā)架構(gòu)比較熟悉,為了降低業(yè)務(wù)接入的學(xué)習(xí)成本,我們?cè)O(shè)計(jì)了一種通用的在線服務(wù)和近線服務(wù)混合計(jì)算架構(gòu),通過微服務(wù)進(jìn)程間的上下文數(shù)據(jù)交換機(jī)制,對(duì)業(yè)務(wù)同學(xué)屏蔽近線計(jì)算開發(fā)細(xì)節(jié),讓業(yè)務(wù)可以用開發(fā)線邏輯的形式來開發(fā)近線邏輯,從而通過一套代碼,兩套部署,實(shí)現(xiàn)任意中間數(shù)據(jù)的在線和近線混合計(jì)算。
另外,業(yè)務(wù)計(jì)算模塊為了適配擴(kuò)展資源,需要做一些特殊的設(shè)計(jì)。
· 服務(wù)分片
如果一個(gè)模塊需要加載太大量的數(shù)據(jù),那么需要將該模塊進(jìn)行分片化處理,不同的分片計(jì)算不同的數(shù)據(jù),限制模塊的quota粒度在100個(gè)邏輯核,15G內(nèi)存以下。
· 計(jì)算拆包
如果模型計(jì)算復(fù)雜,單次計(jì)算的粒度大影響成功率。通過計(jì)算拆包,即使部分計(jì)算結(jié)果失敗,不會(huì)導(dǎo)致全部的計(jì)算結(jié)果不可用。
六、計(jì)算觸發(fā)控制
△計(jì)算觸發(fā)控制示意圖
觸發(fā)控制系統(tǒng)根據(jù)資源情況,以及不同觸發(fā)源的優(yōu)先級(jí),來觸發(fā)近線計(jì)算。
系統(tǒng)在收到觸發(fā)信號(hào)之后,需要處理削峰和填谷兩個(gè)方面的工作。
一方面,在資源不足時(shí),通過控制業(yè)務(wù)計(jì)算參數(shù)來對(duì)流量進(jìn)行削峰。如果通過預(yù)先設(shè)計(jì)的計(jì)算參數(shù)的削峰不一定能控制負(fù)載以匹配更低的算力,尤其是搜索這種檢索詞分布特別散的業(yè)務(wù)場(chǎng)景,在資源不足時(shí),對(duì)觸發(fā)信號(hào)按需進(jìn)行保存,延遲觸發(fā)。
另一方面,在資源一旦出現(xiàn)冗余,就可以把主動(dòng)觸發(fā)的信號(hào)提取出來觸發(fā)近線計(jì)算,包括:1)削峰機(jī)制保存的信號(hào)。2)系統(tǒng)預(yù)估的會(huì)到訪的流量;3)以及歷史全量的觸發(fā)信號(hào)索引,按照優(yōu)先級(jí)進(jìn)行主動(dòng)觸發(fā)。
△實(shí)際計(jì)算qps
△填谷信號(hào)qps
因此這里還涉及到對(duì)整個(gè)近線計(jì)算系統(tǒng)的容量進(jìn)行預(yù)估,預(yù)估完成之后,根據(jù)系統(tǒng)自然負(fù)載控制主動(dòng)觸發(fā)的負(fù)載的水位,保持系統(tǒng)整體計(jì)算的負(fù)載不要超過系統(tǒng)的預(yù)估容量,達(dá)到平穩(wěn)和均衡使用資源的目的。
七、負(fù)載&算力智能調(diào)度
由于近線計(jì)算大量使用擴(kuò)展資源,算力上難免存在波動(dòng)。
原因主要有幾個(gè)方面,從大的層面說,由于局部系統(tǒng)故障,或者流量冗余度壓測(cè),業(yè)務(wù)經(jīng)常在機(jī)房之間做流量遷移,就是說把A機(jī)房的流量,打到B機(jī)房,來驗(yàn)證機(jī)房的冗余度或者容災(zāi)。
從小的層面來說,混布環(huán)境下,調(diào)度不均衡或者有意或者無意的資源超用,導(dǎo)致局部資源熱點(diǎn),造成擴(kuò)展資源退場(chǎng)。因此需要根據(jù)實(shí)時(shí)的資源情況,在機(jī)房之間調(diào)度負(fù)載,另外就是XPU與CPU資源由于計(jì)算能力不同,需要進(jìn)行資源系數(shù)的學(xué)習(xí)和調(diào)度。
△算力調(diào)度與計(jì)算量調(diào)度系統(tǒng)示意圖
從資源層面來說,一個(gè)近線計(jì)算任務(wù)往往涉及上下游多個(gè)模塊的交互。由于上下游各模塊都使用的動(dòng)態(tài)擴(kuò)展資源,就涉及到因?yàn)榫植抠Y源熱點(diǎn)造成上下游模塊利用率不均衡的情況,因此需要不斷動(dòng)態(tài)的在全鏈路的模塊之間做資源均衡。第二個(gè)是隨著負(fù)載波動(dòng),以及算力的波動(dòng),計(jì)算任務(wù)之間需要做資源均衡。第三個(gè)是由于資源調(diào)度的高峰往往和流量的高峰重疊,因此需要在流量高峰到來之前,預(yù)估近線計(jì)算所需要的資源,提前分配,錯(cuò)峰調(diào)度。
實(shí)踐下來,通過錯(cuò)峰調(diào)度,預(yù)估資源需求并提前分配計(jì)算資源是比較有效的提升算力的辦法,可以理解是如果在資源已經(jīng)緊張的時(shí)候,再進(jìn)行近線計(jì)算模塊的調(diào)度,新的近線計(jì)算模塊的算力消耗有概率本身就造成局部熱點(diǎn),導(dǎo)致擴(kuò)展資源被回收,造成調(diào)度失敗。
△負(fù)載調(diào)度效果示意圖
八、基于歷史計(jì)算結(jié)果優(yōu)化資源利用
在系統(tǒng)中我們會(huì)把歷史計(jì)算結(jié)果存下來,結(jié)合近線計(jì)算算力不穩(wěn)定的特點(diǎn),來優(yōu)化資源利用。在系統(tǒng)計(jì)算資源充足時(shí),用歷史上當(dāng)前用戶偏好較高的文章取出來重復(fù)計(jì)算,擴(kuò)大計(jì)算候選集,提升業(yè)務(wù)效果。在資源不足時(shí),將歷史上認(rèn)為跟當(dāng)前用戶不太相關(guān)的資源進(jìn)行過濾,提高資源使用效率。
△近線計(jì)算歷史結(jié)果復(fù)用
第二個(gè)是到訪預(yù)估。系統(tǒng)會(huì)跟進(jìn)歷史上用戶的到訪記錄,預(yù)估用戶的到訪時(shí)間。主要是提高用戶計(jì)算結(jié)果的時(shí)效性。因?yàn)椴粩嗟臅?huì)有新內(nèi)容會(huì)出現(xiàn),策略模型也在不斷的更新,我們希望新的內(nèi)容與新的模型盡快的出現(xiàn)在近線計(jì)算的結(jié)果中。另外,像Feed這種場(chǎng)景第一刷的質(zhì)量非常重要,從我們的實(shí)驗(yàn)結(jié)果也能看出來,通過主動(dòng)計(jì)算,提升了DAU。
第三個(gè)是對(duì)歷史觸發(fā)信號(hào)進(jìn)行保存和索引。按照不同的優(yōu)先級(jí)記錄歷史觸發(fā)信號(hào),從而可以按照業(yè)務(wù)自定義的優(yōu)先級(jí)進(jìn)行刷庫,針對(duì)推送這種業(yè)務(wù)場(chǎng)景,就非常的有用,通過全庫刷新,及時(shí)的把新模型和新資源能夠推送到用戶。
九、典型應(yīng)用案例
以下介紹典型的應(yīng)用場(chǎng)景。
典型應(yīng)用一:Feed在線&近線混合計(jì)算架構(gòu)
△Feed混合計(jì)算-近線召回隊(duì)列示意圖
圖上是我們最早在Feed中的近線和在線混合召回計(jì)算落地的一種場(chǎng)景。
在推薦算法服務(wù)這一層,每個(gè)推薦算法對(duì)應(yīng)召回的是數(shù)千或者數(shù)萬條的計(jì)算結(jié)果,由于資源和速度的限制,我們不能對(duì)這數(shù)千或者數(shù)萬條結(jié)果都進(jìn)行粗排,并且粗排的模型也需要控制復(fù)雜程度。因此我們考慮將多個(gè)推薦算法服務(wù)的召回結(jié)果進(jìn)行緩存,再放到近線系統(tǒng)來進(jìn)行綜合打分之后生成一個(gè)用戶對(duì)應(yīng)的近線計(jì)算候選集,作為一路新的召回。之后在線請(qǐng)求來了之后,使用這路新的召回結(jié)果,進(jìn)行輕量的在線計(jì)算之后就可以返回給用戶。
這樣就把召回層初步排序打分的計(jì)算規(guī)模提升了1個(gè)數(shù)量級(jí)。
這里主要涉及到的調(diào)參場(chǎng)景包括:
1)根據(jù)算力情況,決定一個(gè)用戶的計(jì)算頻率,舉例來說,就是資源充足時(shí),每個(gè)用戶在一定時(shí)間內(nèi)只算一次,資源不足時(shí),逐漸提高計(jì)算間隔,降低計(jì)算頻率。
2)預(yù)估用戶的到訪時(shí)間,根據(jù)系統(tǒng)容量的冗余程度,提前更新用戶的近線計(jì)算結(jié)果。
典型應(yīng)用二:搜索結(jié)果排序
△搜索結(jié)果相關(guān)性近線計(jì)算示意圖
另外一個(gè)典型的應(yīng)用是彈性近線計(jì)算在搜索產(chǎn)品的落地。
這個(gè)系統(tǒng)中由于涉及基于Transformer的復(fù)雜模型,用到了XPU資源和CPU資源的混合計(jì)算。業(yè)務(wù)上跟推薦的排序類似,我們把搜索的相關(guān)性計(jì)算放在近線計(jì)算系統(tǒng)進(jìn)行排序,計(jì)算檢索詞跟對(duì)應(yīng)的搜索結(jié)果的相關(guān)性排序。
跟推薦場(chǎng)景不同的是,搜索的場(chǎng)景下,檢索詞的全集更大,因此我們針對(duì)這種場(chǎng)景,用上了更激進(jìn)的削峰填谷機(jī)制,如果沒有足夠的算力,直接將觸發(fā)信號(hào)緩存到消息隊(duì)列,在低谷期再把計(jì)算完成。
總結(jié)
2018年落地以來,彈性近線計(jì)算已經(jīng)支持了CPU、GPU、昆侖芯片等異構(gòu)算力,在百度Feed推薦業(yè)務(wù)和搜索相關(guān)性業(yè)務(wù)落地。在Feed推薦業(yè)務(wù)落地超過10個(gè)業(yè)務(wù)場(chǎng)景,已經(jīng)累計(jì)帶來大盤時(shí)長和分發(fā)帶來超過2位數(shù)的增長。在搜索業(yè)務(wù)落地3個(gè)業(yè)務(wù)場(chǎng)景,并支持復(fù)雜語義模型,在搜索業(yè)務(wù)落地,顯著提升搜索視頻搜索、問答搜索的相關(guān)性和用戶體驗(yàn)。隨著更復(fù)雜的模型的落地以及更多目標(biāo)的模型疊加,彈性近線計(jì)算系統(tǒng)將發(fā)揮更大的作用,低成本地助力業(yè)務(wù)增長。
△搜索產(chǎn)品用戶體驗(yàn)評(píng)估
本期作者 | 盧嘉龍,百度資深研發(fā)工程師
呂輝明,百度高級(jí)研發(fā)工程師
聶勇,百度高級(jí)研發(fā)工程師
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!