日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

从我开发过的Tensorflow、飞桨、无量框架看深度学习这几年

發布時間:2024/7/5 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从我开发过的Tensorflow、飞桨、无量框架看深度学习这几年 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文 | Peter潘欣@知乎

和深度學習框架打交道已有多年時間。從Google的TensorFlow, 到百度的PaddlePaddle,再到現在騰訊的無量。很慶幸在AI技術爆發的這些年橫跨中美幾家公司,站在一個比較好的視角看著世界發生巨大的變化。在這些經歷中,視角在不斷切換,從最早的算法研究,到后來的框架開發,到機器學習平臺和更多基礎架構,每一段都有不同的感受和更深的領悟。

清明節這幾天有些時間寫了這篇文章,從我的視角,用幾個深度學習框架串起來這些年歷史上的一些有趣的插曲,和技術背后的一些故事,免得寶貴的記憶隨著時間在腦中淡去。

TensorFlow


入門

故事開始在2015年底,我結束了在Google Core Storage和Knowledge Engine的工作,加入了Google Brain,在Samy Bengio下擔任一名Research Software Engineer,簡稱RSWE。RSWE角色的產生主要是因為Google Brain和DeepMind發現Research Scientist很難在研究中解決復雜的工程問題,并最終技術落地。因此需要卷入一些工程能力比較強的Engineer和Scientist一起工作。而我比較“幸運”的成為Google Brain第一個RSWE。

加入新組的前一個周末,非常興奮的提前探訪了Google Brain的辦公地點。想到能近距離在Jeff Dean旁邊工作還是有些小激動,畢竟是讀著MapReduce, BigTable, Spanner那些論文一路成長起來的。辦公場所沒有特別,Jeff和大家一樣坐在一起,比較意外的是發現我工位旁幾米的辦公室門牌上寫著谷歌創始人Larry Page&Sergey Brin,辦公室被許多獎杯,證書,太空服之類的雜物包圍著。看來公司對于AI技術的重視程度真實非常的高。

言歸正傳,早期的TensorFlow比較缺模型示例,相關API文檔還不太規范,于是先開始給TensorFlow搭建模型庫。我花了一年時間把Speech Recognition, Language Model, Text Summarization, Image Classification, Object Detection, Segmentation, Differential Privacy, Frame Prediction等模型寫了一遍,后來成為TensorFlow github上model zoo的雛形。那年還是個到處都是低垂果實的時候,沒有GPT3這種極其燒錢的大模型,只要對模型做一些小的調整,擴大模型的規模,就能刷新State-Of-The-Art。Bengio大佬經常在世界各地云游,偶爾回來后的1v1還是能給我不少的指引。印象深刻的第一次面聊,這位寫過幾百篇論文的一字眉大神給剛剛入門的我在白板上手推了gradient descent的一些公式。另外一次1v1,他發給我一本Ian Goodfellow寫的書(當時還是草稿pdf),然后我每天晚上就躺在茶水間的沙發上一邊做實驗一邊讀書。

那年還發生了件有意思的插曲,AlphaGo大戰人類棋手。DeepMind和Brain有非常緊密的合作關系,組里組織了一輪paper reading,仔細研讀了相關的paper,然后大家帶上啤酒和零食組織了觀戰活動,感覺就有點像是在看球賽。那次學會了兩件事,強化學習算法,還有圍棋的英文是Go。

16年是TensorFlow高速發展的一年。Jeff的演講里經常有TensorFlow代碼被引用次數指數級暴漲的圖。但是16年也是TensorFlow被噴的比較慘的一年。TF的Operator粒度是非常細的,據說這是從內部上一代框架DistBelif上吸取的教訓。細粒度的Operator可以通過組合形成各種高層的Layer,具有更好的靈活性和擴展性。然而,對于性能和易用性來說卻是比較嚴重的問題,一個模型隨便就有幾千個甚至跟多的Operator。舉幾個例子:

當時我要實現第一個基于TensorFlow的ResNet,光為了寫一個BatchNormalization(查了好幾個內部版本竟然都有些問題),需要通過5~10個細粒度的算子通過加減乘除的方式組裝起,1001層的ResNet有非常多的BatchNorm,整個ResNet有成千上萬個Operator,可想而知,性能也不怎么樣。不久后我朋友Yao搞了個Fused BatchNormalization,據說能讓整個ResNet提速好幾成。

BatchNormalization只是初級難度,做Speech Recognition時為了在Python層用TensorFlow完成BeamSearch也花了不少功夫。當時寫了個End-to-End的模型,用的是Seq2Seq with Attention,能夠一個模型直接把聲音轉成文字。為了把搜索生產線上語音識別的數據訓到最后收斂,用128個GPU整整花了2個月的時間。每天早上上班第一件事就是打開TensorBoard,放大后才能看到Loss又下降了那么一點點。

16年時TensorFlow訓練模式主要是基于Jeff等幾位的Paper,基于參數服務器的異步訓練是主流。訓練速度線性擴展性不錯,但是今天基于ring的同步訓練在NLP,CV這些領域的聲音更響一些。記得第一次和Jeff單獨交流是關于Speech Recognition分布式訓練的實驗情況,加到128個GPU做異步訓練基本能保證線性擴展,但是基于SyncOptimizer的同步訓練速度會慢很多。當時Jeff問了下收斂效果有沒有收到影響,我懵了一下,說沒有仔細分析過,趕緊回去查一下。順便八卦一下,Jeff真是非常瘦,握手的時候感覺幾乎就剩皮包骨了。

開發過一些模型后發現算法研究員其實還有不少痛點。1. 不知道怎么Profile模型。2. 不知道怎么優化性能。為了解決這兩個問題,我抽空寫了個tf.profiler。tf.profiler的原理比較簡單,就是把Graph, RunMeta和一些其他的產物做一些分析,然后用戶可以通過CLI,UI或者python API快速的去分析模型的結構,Parameter, FLOPs, Device Placement, Runtime等屬性。另外還做了個內部數據的抓取任務,去抓算法研究員的訓練任務的metrics,如果發現GPU利用率異常,網絡通行量過大,數據IO慢時會自動發郵件提醒,并給出一些修改的建議。

讓一個專心搞算法研究的人寫一個白板的數學公式不難,但是讓他去搞明白復雜的任務配置,分布式系統里的性能、資源、帶寬問題確是件很困難的事。無論多么牛的研究員都會問為什么任務沒能跑起來,是資源不夠還是配置不對。記得有天傍晚,人不多,Geoffrey Hinton大神突然走過來問到Can you do me a favor?My job cannot start...(正當我準備答應時,Quoc Lee已經搶先接單了,真是個精神的越南小哥。。。)

Moonshots

Google Brain每年會組織一次Moonshots提案,許多后來比較成功的項目都是這樣孵化出來的,比如AutoML,Neural Machine Translation等等。團隊成員會提出一些當時技術比較難達到的項目,大家組成類似興趣小組的形式投入到這些項目中。

現在火的一塌糊涂的AutoML有點因為商業化或者其他原因,感覺已經對原始的定義做了極大的拓展。當時Brain孵化這個項目的時候有兩隊人在做LearningToLearn的項目,一個小隊希望通過遺傳算法來搜索更優的模型結構,另一個小隊則決定使用強化學習算法搜索。遺傳算法小隊在使用資源時比較謹慎,通常只使用幾百個GPU。而另一個小隊則使用了幾千個GPU。最后強化學習小隊更早的做出了成果,也就是Neural Architecuture Search。而另一個小隊雖然后來使用更多的GPU也達到了類似的效果,但是要晚了不少。

一個比較有趣的插曲是Brain雖然很早就有幾萬張GPU,但是每當論文截稿的前一段時間總是不夠用,其中搞NAS的同學常常在郵件中被暗示。為了解決資源的分配問題,領導們被卷入了一個非常長的email,后來大概解決方案是每個人會被分配少量的高優先級GPU和適量的競爭級GPU資源。而NAS的同學因為已經完成了資本的原始積累成為了一個很火的項目,得到了特批的獨立資源池。為了支持這個策略,我又開發了個小工具,現在回頭想想還挺吃力不討好的。

Pytorch

動態圖

快速成長的時間總是過得很快,Megan加入Brain后,我被安排向她匯報,當時的RSWE團隊已經有十幾人,而Google Brain也從幾十人變成了幾百人。

2017年初,經Megan介紹,TensorFlow團隊一位資深專家Yuan Yu找到我,問有沒有關注Pytorch,約我調研后一塊聊聊。于是我就去網上搜集了一下Pytorch的資料,又試用了一下。作為一個TensorFlow的深度用戶,我的第一反應就是Pytorch解決了TensorFlow很大的痛點,用起來非常的“自然”。

和Yuan聊完后,我們快速的決定在TensorFlow上也嘗試支持類似Pytorch的imperative programming用法。Demo的開發過程還算比較順利,我大概花了一個多月的時間。記得當時我把項目命名為iTensorFlow, short for imperative TensorFlow。(后來被改名成eager,感覺好奇怪)。

Demo的設計思路其實也不復雜:1. TensorFlow graph可以被切分成任意粒度的Subgraph,可以通過函數調用的語法直接執行,2. TensorFlow對用戶透明的記錄執行過程以用于反向梯度計算。給用戶的感覺就就類似Python native的運行。

進而產生幾個推導:1. 當Subgraph的粒度是operator時,基本等價于Pytorch。2. 當Subgraph粒度由多個operator組成時,保留了graph-level optimization的能力,可以編譯優化。

最后再埋個伏筆:1. tf.Estimator可以自動的去融合Subgraph,形成更大的Subgraph。用戶在開發階段基于imperative operator-level Subgraph可以簡單的調試。用戶在部署階段,可以自動融合大的Subgraph,形成更大的optimization space。

做完之后,我非常興奮的和Yuan演示成果。Yuan也說要幫我在TensorFlow里面推這個方案。當時Pytorch的成長速度非常的快,TensorFlow的Director也召集了多名專家級的工程師同時進行方案的探索。當時我還沒能進入TensorFlow的決策層,最終得到的結論是1. 讓我們成立一個虛擬組專門做這個項目。2. 之前的Demo全部推倒重新做,TensorFlow 2.0作為最重要Feature 發布,默認使用Imperative Mode (后改名叫Eager Mode,中文常常叫動態圖)。我則作為團隊的一員在項目中貢獻來一些代碼。

后來Brain來了位新的大神,Chris Lattner,在編程語言和編譯領域研究的同學估計很多認識他。他提出來希望用Swift來實現Deep Learning Model的Progamming,也就是后來的Swift for TensorFlow。理由大概是Python是個動態的語言,很難靜態編譯優化。后來我和他深入討論來幾次,從技術上非常贊同他的觀點,但是也明確的表示Swift for TensorFlow是一條很難走的路。用Python并不是因為Python語言多么好,而是因為很多人用Python。和Chris的一些交流中我對編譯過程中的IR和Pass有了更深的了解,對后來在PaddlePaddle中的一些工作產生了不少的影響。

一個插曲是某位TensorFlow團隊的資深專家有次悄悄和我說:Python is such a bad language。這句話我品味了好久,不過和他一樣沒有勇氣大聲說出來。。。

當時動態圖的項目還延展出兩個比較有趣的項目。有兩個其他團隊的哥們想對Python做語法分析,進而編譯control flow。我很委婉的表示這個方案做成通用解決方案的可能性不太大,但是這個項目依然被很執著的做了很長一段時間,并且進行了開源,但是這個項目也就慢慢壽終正寢了。另一個很酷的項目是完全用numpy來構造一個deep learning model。通過隱式的tape來完成自動的求導,后來項目好像逐漸演化成來JAX項目。

API

后面我逐漸轉到了TensorFlow做開發。記得2017年還發生了一件印象深刻的事情,當TensorFlow收獲海量用戶時,網上一篇“TensorFlow Sucks"火了。雖然那篇文章很多觀點我不能茍同,許多想法比較膚淺。但是,有一點不能否認,TensorFlow API是比較讓人蛋疼的。1. 同一個功能往往幾套重復的API支持。2. API經常變動,而且經常發生不向后兼容的問題。3. API的易用性不高。

為什么會發生這個問題呢?可能要從Google這個公司的工程師文化說起。Google是非常鼓勵自由創新和跨團隊貢獻的。經常會有人給另一個團隊貢獻代碼,并以此作為有影響力的論據參與晉升。所以在早期TensorFlow還不是特別完善的時候,經常有外部的團隊給TensorFlow貢獻代碼,其中就包含了API。另外,在Google內部的統一代碼倉庫下,放出去的API是可以很容易的升級修改的,很多時候只需要grep和replace一下就行。但是github上放出去的API完全不一樣,Google的員工不能去修改百度,阿里,騰訊內部的TensorFlow使用代碼。對此TensorFlow團隊早期的確沒有非常有效的方案,后來才出現了API Committee對public API做統一的把關和規劃。

在我做視覺的時候,和Google內部一個視覺團隊有過很多合作,其中一個是slim API。這個視覺團隊非常的強,當年還拿了CoCo的冠軍。隨著他們模型的推廣流行,他們的tf.slim API也被廣為流傳。slim API的arg_scope使用了python context manager的特性。熟悉早期TensorFlow的人知道還有tf.variable_scope, tf.name_scope, tf.op_name_scope等等。with xxx_scope一層套一層,復雜的時候代碼幾乎沒有什么可讀性。另外就是各種global collection,什么global variable, trainable variable, local variable。這在傳統的編程語言課里,全局變量這種東西可能是拿來當反面教材的。然而,算法人員的視角是不一樣的,with xxx_scope和global collection能減少他們的代碼量。雖然我們知道合理的程序設計方法也可以做到,但是算法專家估計需要把時間用來讀paper,不太愿意研究這些程序設計的問題。

記得在早期內部還有兩個流派的爭論:面向對象和面向過程的API設計。

基于我教育歷史的洗腦,感覺這個是不需要爭論的問題。Keras的Layer class和Pytorch的Module class這些面向對象的接口設計無疑是非常優雅的。然而,其實當時的確發生了非常激烈的爭論。一些functional API的作者認為functional的調用非常節省代碼量:一個函數就可以解決的問題,為什么需要先構造一個對象,然后再call一下?

在TensorFlow動態圖能力開發的早期,我們也反復討論了2.0里面接口的設計方案。作為炮灰的我又接下了寫Demo的工作。

閉關兩周后,我給出了一個方案:1. 復用Keras的Layer接口。2. 但是不復用Keras的Network,Topology等其他更高層的復雜接口。

原因主要又兩點:1. Layer是非常簡潔優雅的,Layer可以套Layer,整個網絡就是一個大Layer。Layer抽象成construction和execution兩階段也非常自然。2. Keras有很多歷史上為了極簡設計的高層接口。我個人經驗覺得很難滿足用戶靈活的需求,并不需要官方提供。而且這樣可能會導致TensorFlow API層過度復雜。

后來方案被采納了一半,大佬們希望能夠更多的復用Keras接口。其實沒有完美的API,只有最適合某類人群的API。有個小插曲,當時Keras的作者Fran?ois也在Google Brain。為了在TensorFlow 2.0的動態圖和靜態圖同時使用Keras的接口,不得不在Keras API內做很多改造。通常Fran?ois在Review代碼時都非常的不情愿,但是最后又往往妥協。很多時候,特別是技術方面,真相可能在少數不被大多數人理解的人手上,需要時間來發現。

TPU

感覺互聯網公司那幾年,真正把AI芯片做得成熟且廣泛可用的,只有Google一家。TPU一直都是Google Brain和TensorFlow團隊關注的重點。原因可能是Jeff老是提起這件事,甚至一度在TensorFlow搞GPU優化是件很沒前途的事情。

TPU有個比較特別的地方,在于bfloat16的類型。如今bfloat16,還有英偉達最新GPU上的TF32都已經被廣為了解了。在當時還是個不小的創新。

bfloat16的原理非常簡單,就是把float32的后16bit全部截掉。和IEEE的float16相比,bfloat16的mantissa bits會少一些,但是exponential bits會多一些。保留更多的exponential bits有利于gradients很接近0時不會消失,保證bfloat16訓練時能夠更好的保留模型的效果。而傳統基于float16訓練時,往往需要做loss scaling等調試才能達到類似的效果。因此bfloat16能讓AI芯片更快的運算,同時又確保收斂效果通常不會有損失。

為了在TensorFlow上全面的支持bfloat16,我當時花了不少的功夫。雖然之前有基于bfloat16通信的方案,但是要在所有地方都無縫打通bfloat16,還有非常多的工作要做。比如eigen和numpy都不支持bfloat16這種特殊的東西。幸好他們都可以擴展數據類型(就是文檔太少了)。然后還要修復成百上千個fail掉的unit tests來證明bfloat16可以在python層完備的使用。

TPU是一個非常高難度,跨團隊,跨技術棧的復雜工程。據說Google有位非常優秀的工程師,為了在TPU上支持depthwise convolution一個TPU kernel,花掉了半年的時間。

其實這一點也不夸張,除了底層的硬件設計,單是將tensorflow graph編譯成硬件binary的XLA項目早期就至少卷入幾十人。從HLO到底層的target-specific code generation,幾乎又重寫了一遍TensorFlow C++層,遠比之前的解釋型執行器復雜。

TPU的訓練在底層跑通后,我基于底層接口的基礎上完成Python層的支撐API,然后去實現幾個模型。當時碰到了好幾個難題,有些在幾周時間內解決了,有些持續到我不再團隊后好些年。這里舉幾個例子。

  • 當時一個TPU Pod(好像是512個chips)算得太快了,即使是很復雜模型的計算也會卡在數據的IO和預處理上。后來搞了個分布式的data processing,通過多個CPU機器來同時去處理數據,才能喂飽TPU。

  • 早器的TPU API易用性比較弱。通常一個model需要在TPU上train幾百步然后再返回python層,否則TPU的性能會飛快的退化。這對于算法人員是很不友好的,這意味著debug能力的缺失,以及大量復雜模型無法實現。記得當年OKR被迫降低為支持常見的CV模型。

  • TPU如何支持動態圖。記得我當時迫于TPU的約束,做了個所謂的JIT的能力。就是Estimator先在CPU或者GPU上迭代N步,完成模型的初步調試,然后再自動的deploy到TPU上。從算法人員角度,既滿足單步調試的能力,又能在主要training過程用上TPU。

  • 團隊

    Google Brain是個很神奇的團隊,比較不客氣的說,在2015年后的幾年間包攬了全世界在深度學習領域一半以上的關鍵技術突破,比如TPU,TensorFlow, Transformer, BERT, Neural Machine Translation, Inception, Neural Architecture Search, GAN,Adverserial Training, Bidrectional RNN等等。這里不只有深度學習領域的圖靈獎獲得者,還有編程語言、編譯器、計算機體系結構、分布式系統的頂級專家,甚至還有生物,物理學專家。Jeff將這些人放在一起后,發生了神奇的化學反應,加快了技術改變世界的步伐。

    PaddlePaddle 飛槳

    Paddle其實誕生時間比較早,據說是大約13~14年的時候徐偉老師的作品。后來據說Andrew Ng覺得Paddle叫一次不過癮,就改名成了PaddlePaddle。Paddle和那個年代的框架Caffe有類似的問題,靈活性不夠。很多地方用C++寫成比較粗粒度的Layer,無法通過Python等簡單的編程語言完成模型的快速構造。

    后來17年下半年,團隊開始完全從新寫一個框架,但是繼承了Paddle的名字。2017年底的時候,Paddle國內的團隊找到了我,邀請我擔任Paddle國內研發團隊的負責人。抱著打造國產第一框架的理想,我接受了邀請,一個月后就在北京入職了。

    早期設計

    加入團隊的時候,新的Paddle還是一個比較早期的原型系統,里面有一些設計已經被開發了出來。我發現其中有些設計理念和TensorFlow有明顯的差異,但是實現的時候卻又模仿了TensorFlow。

    仿編程語言

    設計者希望設計一種編程語言來完成深度學習模型的構建(有點類似Julia等把深度學習模型的特性嵌入到了編程語言中)。然而在實現上,我發現其實和TensorFlow比較類似。都是通過Python去聲明一個靜態模型結構,然后把模型結構交給執行器進行解釋執行。并沒有發明一種新的深度學習編程語言。

    這塊我基本沒有對設計進行調整。本質上和TensorFlow早期靜態圖的沒有區別。但是在細節上,TF基于Graph的模型可以通過feed/fetch選擇性的執行任意一部分子圖,更加靈活。Paddle中與Graph對應的是Program。Program就像正常程序一樣,只能從頭到尾完整的執行,無法選擇性的執行。因此Paddle在這塊相對簡化了一些,但是可以通過在Python層構造多個Program的方式補全這部分靈活性的缺失,總體來說表達能力是足夠的。

    Transpiler

    Transpiler是對Program進行直接改寫,進而可以讓模型能夠被分布式運行,或者進行優化。初衷是比較好的,可以降低算法人員的使用難度。然而在實現上,最開始是在Python層直接對Program結構進行改寫。后來我從新設計了IR+Pass的Compiler體系,通過一種更系統性的方式做了實現。

    LoDTensor

    可能是因為團隊的NLP和搜索背景比較強,對于變長序列的重視程度很高。Paddle的底層數據是LoDTensor,而不是類似其他框架Tensor。LoDTensor相當于把變長序列信息耦合進了Tensor里面。這可能導致比較多的問題,比如很多Operator是完全序列無關的,根本無法處理序列信息在輸入Tensor和輸出Tensor的關系,進而比較隨機的處理,給框架的健壯性埋下隱患。雖然我一直想推動序列信息和Tensor的解耦合,但是因為種種原因,沒有徹底的完成這個重構的目標,希望后面能改掉。

    性能

    18年初的時候,Paddle還是個原型系統。由于OKR目標,團隊已經開始初步接入一些業務場景。其實一個比較大的痛點就是性能太差。單機單卡速度非常慢,單機4卡加速比只有1.x。但是性能問題的定位卻非常困難。我花了些時間寫了些profile的工具,比如timeline。一些明顯的性能問題可以被快速的定位出來并修復。

    但是單機多卡的速度還是非常慢,timeline分析后發現其中有個ParallelOp,存在大量的Barrier。最后改寫成了ParallelExecutor,把Program復制了N份部署在多張卡上,在其中插入AllReduce通信算子,然后這N倍的算子基于圖依賴關系,不斷把ready的算子扔進線程池執行。即使這樣,我們也發現在多卡的性能上,不同模型需要使用不同的線程調度策略來達到最優。很難有一種完美的one-fits-all的方案。后面我們再聊如何通過IR+Pass的方法插件化的支持不同的算子調度策略。

    分布式的訓練也碰到不少的問題。一開始使用grpc,花了挺大的功夫做并行請求,然后又切成了brpc,在RDMA等方面做了不少的優化。分布式訓練的性能逐步得到了提升。另外為了做到自動化分布式部署,前面提到的Transpiler隨著場景的增加,Python代碼也變得越來越復雜。

    模型推理在公司內碰到來非常強勁的對手。Anakin的GPU推理速度的確很快,讓我吃驚的是他們竟然是用SASS匯編完成大量基礎算子的開發,針對Pascal架構做了異常極致的優化,甚至在某些場景遠超TensorRT。我一直主張訓練和推理要盡量用一樣的框架,并不需要一個單獨的推理框架來解決性能問題。使用不同的框架做推理會造成很多意外的精度問題和人工開銷。

    因為推理性能的問題,我們和兄弟團隊發生來曠日持久競賽,作為狗頭軍事,我充分發揮來團隊在CPU這塊的技術積累、以及和Intel外援的良好關系,在CPU推理場景常常略勝一籌。在GPU方面苦于對手無底線使用匯編,和我方戰線太多、人員不夠,只能戰略性放棄了部分頭部模型,通過支持子圖擴展TensorRT引擎的方式,利用Nvidia的技術優勢在許多個通用場景下展開進攻。現在回想起來真實一段有趣的經歷。

    Imtermediate Representation&Pass

    Imtermediate Representation+Pass的模式主要是從LLVM的架構上借鑒來的。在編譯器上主要是用來解決把M個編程語言中任意一個編譯到N個硬件設備中任意一個執行的問題。簡單的解決方案是為每個編程語言和硬件單獨寫一個編譯器。這需要M*N個編譯器。顯然這對于復雜的編譯器開發來說,是非常高成本的。

    Intermediate Representation是架構設計中抽象能力的典型體現。不同編程語言的層次不一樣,或者僅僅是單純的支持的功能有些差異。但是,這些編程語言終歸需要在某種硬件指令集上執行。所以在編譯的過程中,他們會在某個抽象層次上形成共性的表達。而IR+Pass的方法很好的利用了這一點。其基本思想是通過多層Pass (編譯改寫過程),逐漸的把不同語言的表達方式在某個層次上改寫成統一的IR的表達方式。在這個過程中,表達方式逐漸接近底層的硬件。而IR和Pass可以很好的被復用,極大的降低了研發的成本。

    深度學習框架也有著非常類似的需求。

  • 用戶希望通過高層語言描述模型的執行邏輯,甚至是僅僅聲明模型的結構,而不去關心模型如何在硬件上完成訓練或者推理。

  • 深度學習框架需要解決模型在多種硬件上高效執行的問題,其中包括協同多個CPU、GPU、甚至大規模分布式集群進行工作的問題。也包括優化內存、顯存開銷、提高執行速度的問題。

  • 更具體的。前文說到需要能夠自動的將用戶聲明的模型Program自動的在多張顯卡上并行計算、需要將Program拆分到多個機器上進行分布式計算、還需要修改執行圖來進行算子融合和顯存優化。

    Paddle在一開始零散的開展了上面描述的工作,在分布式、多卡并行、推理加速、甚至是模型的壓縮量化上各自進行模型的改寫。這個過程非常容易產生重復性的工作,也很難統一設計模式,讓團隊不同的研發快速理解這些代碼。

    意思到這些問題后,我寫了一個Single Static Assignment(SSA)的Graph,然后把Program通過第一個基礎Pass改寫成了SSA Graph。然后又寫了第二個Pass把SSA Graph改寫成了可以多卡并行的SSA Graph。

    后面的事情就應該可以以此類推了。比如推理加速可以在這個基礎上實現OpFusionPass, InferenceMemoryOptimizationPass, PruningPass等等,進而達到執行時推理加速的目的。分布式訓練時則可以有DistributedTransPass。量化壓縮則可以有ConvertToInt8Pass等等。這一套東西基本解決了上層Program聲明到底層執行器的Compiler問題。

    這個過程中的確碰到了不少的阻力。比如分布式早期通過Python完成了這個邏輯,需要遷移到C++層。壓縮量化的研發更喜歡寫Python,而IR&Pass是基于C++的。不同Pass間順序依賴和Debug等。

    全套深度學習框架工具

    TensorFlow Everywhere原本是TensorFlow團隊時的一個口號,意思是TensorFlow需要支持深度學習模型在任意的場景下運行,進而達到AI Everywhere的目標。可以說深度學習框架希望成為AI的“操作系統”,就像魚離不開水、App離不開iOS/Android一樣。

    Paddle作為全面對標TensorFlow的國產深度學習框架,自然也希望提供全套的解決方案。在早期的時候,Paddle和公司其他團隊合作了PaddleMobile,提供了移動端的推理能力。后來又開展了Paddle.js,支持在H5、Web等場景的推理能力。為了在toB,在Linux的基礎上又新增了Windows的支持。為了支持無人車等設備、又支持了在更多不同設備上運行。

    舉個PaddleMobile的例子。深度學習框架想再移動設備上部署面臨這比較多的挑戰。手機的空間和算力都比服務器小很多,而模型最開始在服務器訓練好后體積相對較大,需要從很多角度下手。1. 使用較小的模型結構。2. 通過量化,壓縮等手段削減模型體積。

    另外移動段深度學習框架是通常基于ARM CPU,GPU則有Mali GPU, adreno GPU等等。為了最求比較極致性能,常常需要使用匯編語言。有個同學寫到后面幾乎懷疑人生,感覺自己大學學的東西不太對。為了不顯著增加APP的體積,框架編譯后的體積需要在KB~幾MB的級別,因此需要基于部署的模型結構本身用到的算子進行選擇性編譯。極端的時候甚至需要是通過C++ Code Gen的方法直接生成前向計算必須的代碼,而不是通過一個通用的解釋器。

    回顧

    隨著項目的復雜化,很多棘手的問題逐漸從深度學習的領域技術問題轉變成了軟件工程開發和團隊管理分工的問題。隨著團隊的不斷變化,自己有時候是作為一個leader的角色在處理問題,有的時候又是以一個independent contributor的角色在參與討論。很慶幸自己經歷過這么一段,有些問題在親身經歷后才能想得明白,想得開。時代有時候會把你推向風口浪尖,讓你帶船隊揚帆起航,在更多的時候是在不斷的妥協與摸索中尋找前進的方向。

    無量

    無量是騰訊PCG建設的一個深度學習框架,主要希望解決大規模推薦場景下的訓練和推理問題。深度學習在推薦場景的應用和CV、NLP、語音有些不一樣。

  • 業務會持續的產生用戶的行為數據。當用戶規模達到數千萬或者上億時就會產生海量的訓練數據,比如用戶的畫像,用戶的點擊,點贊,轉發行為,還有Context等等。

  • 這些數據是高度稀疏的,通常會編碼成ID類的特征進而通過Embedding的方式進入模型訓練。隨著業務規模的提升和特征工程日漸復雜,比如累計用戶數,商品,內容增加,以及特征交叉的使用,Embedding參數的體積可以達到GB,甚至TB級。

  • 推薦場景是實時動態變化的,新用戶,內容,熱點不斷產生。用戶的興趣,意圖逐漸變化,因此模型需要持續不斷的適應這些變化,時刻保持最好的狀態。

  • 調整

    19年中這個項目時大概有2~3人。團隊希望開發一個新的版本,基于TensorFlow進行擴展加強,使得無量可以復用TensorFlow已有的能力,并且能夠支持推薦場景下的特殊需求。無量一開始采用的是基于參數服務器的架構。TensorFlow被復用來提供Python API以及完成基礎算子的執行。而參數服務器,分布式通信等方面則是自己開發,沒有復用TensorFlow。

    這個選擇在團隊當時的情況下是比較合理的。如果選擇另一種方向,基于TensorFlow底層進行改造,研發難度會比較大,而且很可能與社區版TensorFlow走向不同的方向,進而導致TensorFlow版本難以升級。而把TensorFlow作為一個本地執行的lib則可以在外圍開發,不需要了解TensorFlow內部的復雜邏輯,也可以復用一些其他開源組件,比如pslib。

    早期在軟件開發的流程上相對比較欠缺。為了保障工程的推進,我先幫忙做了些基礎工作,比如加上了第一個自動化測試和持續集成,對一些過度封裝和奇怪的代碼做了重構和簡化。

    另外,在接口層也做了一些調整。原來框架開始執行后就進入C++執行器,無法從python層提供或者返回任何執行結果,也無法在python層執行邏輯進行插件化的擴展。為了滿足預期用戶將來需要進行調試的需求,我模擬tf.Session和tf.Estimator對執行層的接口做了重構。這樣用戶可以通過feed/fetch的方式單步調試執行的過程。也可以通過Hook的方式在執行前后擴展任意的邏輯,提高框架的適用場景。

    另外一個問題是python層基本完全是全局變量,很難進行多模型的封裝。像TensorFlow有Graph實例或者Paddle有Program實例。因為python層需要重構的量比較大,我暫時先加入了Context的封裝,勉強將各種狀態和配置封裝在了Context下。考慮到短期可能不會有更復雜的需求,暫時沒有把這件事做完。

    reader那塊也做了一些重構。最開始那塊的線程模型異常復雜,一部分是因為分布式文件系統等基礎設施無法提供比較好的SDK,導致許多邏輯不得不在深度學習框架里面,比如文件的本地緩存。考慮到特征加工的邏輯比較復雜,以及一些老的TensorFlow用戶可能習慣于tf.Example和tf.feature_column等基礎算子庫,我在reader層引入了基于TensorFlow的tf.dataset。不過后來發現用戶似乎更關心性能問題,喜歡自定義C++ lib的方式來解決特征處理的問題。

    API設計是個老大難的問題。TensorFlow,Paddle,無量都沒能幸免。在一個多人協同的團隊里,每個研發更多還是關注每個獨立功能是否完成開發,而功能的接口往往需要考慮到整體的API設計風格,易用性,兼容性等許多因素,常常在高速迭代的過程中被忽略掉。不幸的是API常常不能像內部實現一樣后期優化。當API被放給用戶使用后,后續的修改往往會破壞用戶代碼的正確性。很多時候只能自己評審一下。

    升級

    無量經過一年基礎能力的打磨,逐漸的成為來整個事業群統一的大規模推薦模型訓練和推理框架,支撐數十個業務場景,每天都能生產數千個增量和全量的模型。簡單的完成功能已經不能滿足業務和團隊發展的需求,需要在技術上更加前沿。

    數據處理

    數據格式上要從原來的明文轉到更高效的二進制。另外基于CSR編碼的稀疏數據可以進一步的減少數據處理時的拷貝等額外開銷。

    流水線

    盡量挖掘訓練中可以并行的地方,通過流水線的方式提高并發度,進而提高訓練的速度。比如在數據讀取的過程中,就可以提前按照參數服務器的規模對數據進行預切分,并告知參數服務器需要提前準備哪些參數。這樣當pull/push的時候能夠更快的完成計算,進而提高每個minibatch的速度。

    同樣,當使用GPU訓練時,也可以在數據IO的并行過程中,預計算未來需要用的的Embedding參數。這樣GPU訓練下一輪的數據時,需要用到的Embedding已經提前被計算好,可以直接開始訓練,減少來等待的時間。

    定制化參數服務器

    由于無量解決的一個關鍵問題是推薦模型的海量參數問題,因此參數服務器必須是高度優化過的。并且應該合理的將推薦模型的領域知識引入到設計中,通過特殊的策略進一步產生差異化的優勢。

    定制化的線程模型,內存管理和HashMap。由于參數是被切分歸屬到不同線程上,所以可以通過無鎖化的把每次pull/push的參數處理好。另外由于海量參數消耗較大硬件成本,內存空間都需要通過定制化的內存池來管理。否則很可能有大量的空間碎片在默認內存庫中無法及時歸還給操作系統。另外也有無法精細化控制內存清理機制,導致內存OOM或者浪費。定制化的內存管理可以解決這些問題,甚至通過特殊的內存淘汰策略,在不損害模型效果的基礎上進一步降低內存的開銷。高性能HashMap則是需要解決Embedding快速的增刪改查的問題。

    Embedding向量的管理也是有非常多可以改進的地方。1. 動態的改變Embeding向量的長度來支持模型的壓縮,提高模型效果。2. 擴展Embedding的元數據來記錄熱度,點擊展現等統計值,有助于提高訓練推理時高級分布式架構的Cache命中率,已經模型的訓練效果。3. 模型的恢復和導出機制在大規模Embedding場景對于Serving時能夠實時加載模型更新重要。另外還需要考慮到任務失敗重啟后資源伸縮等問題。

    GPU訓練

    傳統PS架構的訓練模式下,由于單臺機器的計算能力有限,需要幾十甚至上百個實例進行分布式訓練。但是這樣會導致大量的計算被用在來無效的開銷上。比如稀疏特征在網絡通信兩邊的處理。這種額外開銷甚至經常超過有效計算。

    GPU和相應的高速網絡鏈接可以解決這一問題。單臺8卡機器通過NVLink連接起來,速度甚至可以超過幾十臺物理機,有更高的性價比。但是由于幾百GB,甚至TB級的參數問題,還有Embedding的GPU計算問題,導致GPU一直都沒有被廣泛的用起來。

    然而實驗發現其實稀疏特征存在顯著的Power-law分布,少部分Hot特征使用遠多于其他大量不Hot的特征。因此,通過在數據處理時統計特征,然后批量將將來新需要的Embedding換入GPU,就可以讓GPU長時間的進行連續訓練,而不需要頻繁的和CPU內存交換參數。

    GPU預測

    隨著推薦模型復雜度提高,引入傳統CV,NLP的一些結構需要消耗更多的計算。CPU往往很難在有效的時間延遲下(幾十毫秒)完成大量候(幾百上千)選集在復雜推薦模型的推理。而GPU則成為了一個潛在的解決方案。

    同樣,GPU推理也需要解決顯存遠小于Embedding參數的問題。通過在訓練時預先計算Hot Embedding,然后加載如推理GPU,可以一定程度的緩解這個問題。在推理時僅有少部分的Embedding沒有在GPU顯存中緩存,需要通過CPU內存拷貝進入GPU。

    而通過模型的量化和壓縮能進一步減少Embedding參數的規模。實驗表明當大部分Embedding參數的值控制為0時,模型依然能夠表現出原來的效果,甚至略優。

    總結

    深度學習算法的發展和深度學習框架的發展是相輔相成,互相促進的。從2002年時Torch論文發表后,框架的技術發展相對緩慢,性能無法顯著提升導致無法探索更加復雜的算法模型,或者利用更加大規模的數據集。

    在2010年后逐漸出現了Caffe, Theano等框架,通過將更高性能的GPU引入,可以訓練更加復雜的CNN和RNN模型,深度學習算法的發展出現來顯著的加速。

    到了2014~2017年幾年間,TensorFlow的出現讓用戶可以通過簡單的Python語言將細粒度的算子組裝各種模型結構。并且模型可以簡單的被分布式訓練,然后自動化部署在服務器,手機,攝像頭等各種設備上。而Pytorch的動態圖用法滿足了研究人員對易用性和靈活性更高的要求,進一步推進算法研究。

    國內的深度學習框架技術在這股浪潮中也緊跟這世界的步伐。Paddle在14年左右產生,在國內積累了一定的用戶,在當時基本能比肩其他的框架。雖然在TensorFlow和Pytorch等更先進的框架出現后,國內錯過了寶貴的幾年技術升級的窗口以及社區生態培育時機,但是我們看到從18年到20年間,新版的PaddlePaddle,OneFlow, MindSpore等深度學習框架陸續開源,技術上逐漸趕了上來。

    推薦場景在電商,視頻,資訊等眾多頭部互聯網公司的火爆導致推薦系統對AI硬件的消耗在互聯網公司超過了傳統NLP,CV,語音等應用的總和。許多公司開始針對推薦場景(以及廣告,搜索)的特殊需求對深度學習框架進行定制優化。百度的abacus是比較早期的框架,和其他早期框架一樣,在易用性和靈活性上較弱。無量,XDL等框架則進行了改進,兼顧了社區兼容性,算法易用性和系統的性能等緯度。

    深度學習的框架的觸角其實遠不止我們常見到的。隨著AI技術的推廣,Web、H5、嵌入式設備、手機等場景下都有許多優秀的深度學習框架產生,如PaddleMobile, TFLite,tensorflow.js等等。

    深度學習框架的技術也逐漸從更多緯度開始拓展。ONNX被提出來作為統一的模型格式,雖然離目標有很長的距離和問題需要解決。但是從它的流行我們能看到社區對于框架間互通的渴望。隨著摩爾定律難以維持,框架開始更多的從新的硬件和異構計算領域尋求突破。為了支持海量的算子在CPU、FPGA、GPU、TPU、NPU、Cerebras等眾多AI芯片上運行,TVM、XLA等借鑒編譯技術幾十年來的積累,在更加艱巨的道路上進行來持續的探索,經常能傳來新進展的好消息。深度學習框架也不再僅應用于深度學習,還在科學計算,物理化學等領域發光發熱。

    后臺回復關鍵詞【入群

    加入賣萌屋NLP/IR/Rec與求職討論群

    后臺回復關鍵詞【頂會

    獲取ACL、CIKM等各大頂會論文集!

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的从我开发过的Tensorflow、飞桨、无量框架看深度学习这几年的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    av电影中文字幕在线观看 | 亚洲国产成人高清精品 | 中文字幕在线看视频 | 99久久久国产精品 | 日韩美女免费线视频 | 国产精品青草综合久久久久99 | 免费日韩一区二区三区 | 久久69av| 国产精品资源网 | 97夜夜澡人人爽人人免费 | 黄色大片日本免费大片 | 成人av在线资源 | 国产午夜精品视频 | 999久久a精品合区久久久 | 精品久久99 | 国产香蕉久久 | 99爱爱| 97超碰国产在线 | 婷婷中文字幕综合 | 人人网av | 免费看亚洲毛片 | 婷婷亚洲五月色综合 | 婷婷色在线播放 | 日韩字幕在线观看 | 午夜丰满寂寞少妇精品 | 在线观看成人网 | 在线av资源 | 草久久久久 | 国产亚洲精品久久久久久久久久久久 | 精品综合久久 | 99视频免费播放 | 久久日本视频 | 99精品视频在线播放观看 | 中文字幕精品在线 | 天堂在线免费视频 | 最新色视频 | 国产免费看| 国产一区二区三精品久久久无广告 | 亚洲婷婷综合色高清在线 | 最近中文字幕视频网 | 天天干夜夜爱 | 麻豆视频免费在线播放 | 日韩高清成人 | 六月婷婷网 | 四虎影视国产精品免费久久 | 国产一区国产二区在线观看 | 特级西西人体444是什么意思 | 日韩一区二区三免费高清在线观看 | 国产99久久久国产精品免费二区 | 在线观看的a站 | 日本精品久久久久久 | 天天爱av导航 | www.久久com | 亚洲精品福利在线 | 日操操 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 日韩成人免费在线 | 91成人黄色| 97在线观看免费视频 | 国产麻豆成人传媒免费观看 | 久久精品一级片 | 最近最新mv字幕免费观看 | 亚洲夜夜网 | 欧美成人性网 | www.黄色在线| 日韩欧美在线观看 | 免费高清看电视网站 | 免费在线国产精品 | 亚洲国产精品电影在线观看 | 国产精品99久久久久 | 黄色小网站在线 | 91精品国产自产在线观看永久 | 久黄色 | 久久人人添人人爽添人人88v | 国产一区二区在线播放视频 | 欧美日韩免费网站 | 人人涩 | 超薄丝袜一二三区 | 中文字幕一区二区三区四区久久 | 成人小视频在线播放 | 亚洲视频每日更新 | 午夜视频在线观看一区二区三区 | a在线免费| 日本aa在线 | 2019天天干天天色 | www99精品 | 久草在线视频首页 | av在线免费观看黄 | 中文字幕在线视频一区 | 在线免费观看视频一区二区三区 | 免费的黄色的网站 | 亚洲精品久久久蜜桃直播 | 五月婷婷丁香激情 | 国产无套精品久久久久久 | 久久美女视频 | 在线观看av网站 | 国产一区二区不卡视频 | 日本三级在线观看中文字 | 亚洲国产av精品毛片鲁大师 | 香蕉成人在线视频 | 久久免费视频在线 | 欧美一级黄色网 | 香蕉视频国产在线 | 国产精品自在线拍国产 | 女人18精品一区二区三区 | 丁香综合五月 | 免费进去里的视频 | www.色午夜.com | 在线看一区二区 | 黄色一级大片在线观看 | av成年人电影 | 91理论片午午伦夜理片久久 | 亚洲精品理论 | 缴情综合网五月天 | 91精品国产91 | 亚洲专区欧美专区 | 国产精品3| 国产小视频在线免费观看视频 | 天天综合网 天天综合色 | 国产一二三在线视频 | 久草久草久草久草 | 五月天九九 | 在线视频你懂 | 久草综合在线 | 国产美腿白丝袜足在线av | 日韩色一区二区三区 | 欧美黑人xxxx猛性大交 | 久久久久国产精品一区二区 | 久久99久国产精品黄毛片入口 | 成片视频免费观看 | 91精品网站 | 超碰公开在线 | 久艹视频在线免费观看 | 91精品国产九九九久久久亚洲 | 视频在线日韩 | 欧美美女激情18p | 成人黄色av免费在线观看 | 成人午夜免费福利 | 夜夜躁日日躁狠狠久久88av | 欧美十八 | 色婷婷免费 | 一区二区伦理 | 国产精品6 | 国产精品毛片一区二区三区 | 97超碰影视 | 日韩免费成人av | 国产黄色av | 中文字幕在线免费97 | 精品亚洲一区二区 | 在线观看黄av | 日韩久久精品一区二区三区 | av性在线| 丁香电影小说免费视频观看 | 国产裸体视频bbbbb | 日日操天天操夜夜操 | 久久99九九99精品 | www.久久精品视频 | 成人免费在线播放 | 久久99久久99久久 | 天天色天天骑天天射 | 91精品国产三级a在线观看 | 国产中年夫妇高潮精品视频 | 精品在线观看一区二区 | 丝袜美腿av | 日韩在线观看视频中文字幕 | 天天天综合 | 国产精品久久久电影 | 制服丝袜在线 | 国产一区二区三区网站 | 91欧美精品| 亚洲视频专区在线 | 欧美日韩一区二区三区不卡 | 精品国产乱码久久久久久久 | 欧美精品乱码久久久久 | 91免费试看 | 国产九九九视频 | 日韩黄色大片在线观看 | 午夜精品电影 | 亚洲电影免费 | 日韩欧美视频一区二区 | 成人午夜网址 | 国产精品亚洲综合久久 | 色丁香婷婷 | 欧美一进一出抽搐大尺度视频 | 日韩在线观看中文 | av片在线观看免费 | 久久人网 | 9免费视频 | 奇米四色影狠狠爱7777 | 国产精品美女视频 | 最新av网址大全 | 麻豆极品 | 日本在线精品视频 | 狠狠色丁香久久婷婷综合五月 | 五月天久久久久久 | 亚洲国产精品成人av | 91九色视频国产 | 国产午夜一级毛片 | 岛国一区在线 | 五月网婷婷 | 久久精品欧美日韩精品 | 亚洲免费永久精品国产 | 免费毛片一区二区三区久久久 | 韩日av一区二区 | 日韩一区二区三区观看 | 在线观看成人毛片 | 久久精品国产精品亚洲精品 | 麻豆成人小视频 | 蜜臀精品久久久久久蜜臀 | 中中文字幕av在线 | 91av网址 | 亚洲激情免费 | 久久久久久亚洲精品 | 香蕉久久久久久久 | 日韩精品中文字幕有码 | 色综合天天在线 | 国产成人一区在线 | 国产人成一区二区三区影院 | 国产一区欧美一区 | 亚洲视频h | 精品国产伦一区二区三区观看说明 | 在线观看麻豆av | 亚洲黄色免费在线看 | 337p日本大胆噜噜噜噜 | 91视频91蝌蚪 | 五月婷婷丁香色 | 亚洲精品66 | 在线av资源 | 亚洲国产精品成人综合 | 激情五月婷婷综合 | 国产一区二区久久久 | 91看成人| 国产精品ssss在线亚洲 | 精品黄色在线观看 | 91豆麻精品91久久久久久 | 中文免费观看 | 激情网综合 | 91尤物国产尤物福利在线播放 | 欧美成人999 | 精品国产乱码久久久久久久 | 免费福利在线播放 | 欧美日韩在线视频一区二区 | 欧美怡红院 | 色婷婷www | 在线观看黄色小视频 | 色综合久久99 | 日韩av中文字幕在线 | 久久久污 | 播五月婷婷| 亚洲欧洲国产日韩精品 | 欧美日韩亚洲国产一区 | 在线看日韩av | 亚洲精品国产精品国自产观看 | 成年美女黄网站色大片免费看 | 亚洲免费一级电影 | 天天射天天 | 日韩欧美网址 | 日韩精品五月天 | 成人一级在线 | 六月色播 | 久久精品国产免费观看 | 五月婷婷在线视频观看 | 91入口在线观看 | 亚洲婷婷网 | 国产亚洲精品久久久久久移动网络 | 看片的网址| 91成人天堂久久成人 | 国产精品热视频 | 久久人人爽人人爽人人片 | ,午夜性刺激免费看视频 | 亚洲人人网 | 六月丁香婷婷网 | 精品国产一区二区三区四区vr | 成人观看 | 在线v片免费观看视频 | 最新av网站在线观看 | 99久热在线精品视频观看 | 人人添人人 | 在线国产片 | www.成人久久 | 欧美日韩国产精品一区二区三区 | 在线电影91 | www最近高清中文国语在线观看 | 在线免费高清一区二区三区 | 911免费视频 | 超碰午夜| 日日射天天射 | 亚洲 欧美变态 另类 综合 | 国产精品网在线观看 | 69国产在线观看 | 国产精品1区2区在线观看 | 色综合久久久久久久 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 高清av免费一区中文字幕 | 欧美在线视频一区二区三区 | 久草在线官网 | 免费看黄在线看 | 激情 一区二区 | 玖玖色在线观看 | 日韩精品在线免费观看 | 97色婷婷成人综合在线观看 | 夜夜视频 | 国产免费国产 | 美女网站在线观看 | 日本久久电影网 | 福利电影久久 | 亚洲精品一区二区三区四区高清 | 久艹在线观看视频 | 最新久久免费视频 | 欧美日韩在线观看一区二区三区 | 91桃色免费视频 | a电影免费看 | 国产91对白在线 | 99视频偷窥在线精品国自产拍 | 日韩大片免费在线观看 | 午夜影视剧场 | 久久在线观看视频 | 在线日韩视频 | 在线国产高清 | 久久福利国产 | 91av免费观看| 中国精品一区二区 | 免费视频xnxx com | 在线观看免费一级片 | 亚洲欧洲久久久 | 国产一区在线视频 | 国产精品久久久久久久电影 | www.亚洲激情.com | 999热线在线观看 | 99精品毛片 | 国产美女精品视频 | 九七人人干 | 婷婷干五月 | 丁香花中文字幕 | 毛片一级免费一级 | 国产不卡视频在线播放 | 最近高清中文字幕 | 成人黄性视频 | 超碰人人舔 | 欧美日韩中文在线 | 天天射天天射天天 | 成年人在线电影 | 日本电影黄色 | 亚洲精品成人av在线 | 91免费看片黄 | 国产aa精品 | 免费在线观看一区二区三区 | 五月开心六月婷婷 | 特级毛片在线 | 久久免费中文视频 | 国产在线视频一区 | 欧美日韩中字 | 欧美精品国产综合久久 | 色网免费观看 | 91精品久久久久久综合乱菊 | 日韩三级免费 | 久久手机在线视频 | 欧美综合在线观看 | 91色一区二区三区 | 日韩免费视频在线观看 | av看片在线 | 97成人精品 | 观看免费av | 亚洲人成在线观看 | 一区二区视频在线播放 | 一区av在线播放 | 国产免费一区二区三区网站免费 | 久久国产精品免费观看 | 国产日韩精品一区二区三区在线 | 最近中文字幕完整高清 | 国产精品久久99精品毛片三a | 91漂亮少妇露脸在线播放 | 99在线看 | 99久久日韩精品免费热麻豆美女 | 天堂在线一区二区 | 国产精品视频永久免费播放 | av亚洲产国偷v产偷v自拍小说 | 亚洲电影第一页av | 99视频久 | 91女子私密保健养生少妇 | 二区精品视频 | 亚洲精品乱码久久久久久蜜桃动漫 | 日本成人中文字幕在线观看 | 91理论片午午伦夜理片久久 | 黄色一级大片在线免费看产 | 久久精品最新 | 久久久高清 | 国产精品久久久久久久久软件 | 欧美亚洲国产日韩 | 国产在线传媒 | 国产精品a久久 | 美女视频黄的免费的 | 在线免费性生活片 | 日韩av图片 | 色偷偷av男人天堂 | 免费在线观看黄 | 欧美成人中文字幕 | 人人玩人人添人人澡超碰 | h视频在线看 | 蜜臀av性久久久久蜜臀av | 97精品国产一二三产区 | 亚洲热视频 | 91麻豆免费看 | 欧美激情视频一区二区三区免费 | 久久久久久久久久影视 | 依人成人综合网 | 亚洲特级毛片 | 亚洲一区二区三区在线看 | 亚洲精品高清一区二区三区四区 | 天天射天天干天天爽 | 久久网站免费 | 午夜视频在线观看一区 | 五月婷婷综合激情 | 日日夜夜天天综合 | 免费在线观看的av网站 | 69av国产| 一区二区三区免费在线播放 | 久久综合五月婷婷 | 欧美午夜精品久久久久久浪潮 | 欧美一级欧美一级 | 精品一二三四视频 | 亚洲经典在线 | 色综合久久88色综合天天 | 成人毛片网 | 久久字幕 | 久久久国产一区二区三区四区小说 | 久久久精品国产免费观看同学 | 欧美va天堂在线电影 | 亚洲一区二区精品 | 精品美女久久久久久免费 | 久草免费在线观看 | 五月婷婷开心中文字幕 | 五月天婷婷狠狠 | 国产免费久久久久 | 国产小视频在线 | 午夜影院一级片 | 中文在线字幕观看电影 | 特级毛片aaa | 九九综合久久 | 黄色国产成人 | 992tv又爽又黄的免费视频 | 夜夜干夜夜 | 日韩中文幕 | 天天操天天操天天操天天操 | 日韩午夜在线 | 久草免费在线观看视频 | 99精品国产aⅴ | 亚洲一区二区高潮无套美女 | 欧美一级小视频 | 超碰av免费| 日韩电影中文字幕在线 | 欧美日韩免费在线视频 | 天天躁日日躁狠狠躁av麻豆 | 亚洲精品在线视频 | 日日骑| 久久精品精品电影网 | 人人干人人做 | 国产精品成人一区二区 | 99视频精品视频高清免费 | 欧美日韩免费看 | 九九视频免费在线观看 | av在线精品 | 国产一级电影免费观看 | 国产精品日韩久久久久 | 久久狠狠干 | 中文字幕视频免费观看 | 天天做天天爱夜夜爽 | 久久在线 | 超碰97在线资源 | 国产永久免费高清在线观看视频 | 99久免费精品视频在线观看 | 成片免费观看视频大全 | 手机在线视频福利 | 又黄又色又爽 | 在线一级片 | 国产精品女同一区二区三区久久夜 | 精品久久免费看 | 欧美最新大片在线看 | 黄色一级免费电影 | 国产精品第十页 | 国产91探花| av在线免费不卡 | 久久久精品网 | 天堂av免费看 | 国产精品18久久久久白浆 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 亚洲成人黄色网址 | 久久综合网色—综合色88 | av五月婷婷 | 91精品国产九九九久久久亚洲 | 成 人 黄 色 视频免费播放 | 国产1区在线观看 | 色成人亚洲网 | 午夜久久网站 | 免费色视频网站 | 亚洲成a人片77777kkkk1在线观看 | 色欧美88888久久久久久影院 | 欧洲一区精品 | 久久网站最新地址 | 久久久久黄色 | 亚洲国产欧美一区二区三区丁香婷 | 国产精品久久久久久久久久东京 | 又污又黄的网站 | 日韩欧美在线视频一区二区 | 久草国产精品 | 成人午夜精品福利免费 | 欧美一二三四在线 | 久久99精品视频 | 国产91av视频在线观看 | 国产中文字幕视频在线 | 香蕉在线视频观看 | 国产精品久久久久av | 久久精品999 | 永久免费精品视频网站 | 97超碰人人在线 | 日韩av不卡在线观看 | 中文字幕亚洲情99在线 | 少妇性色午夜淫片aaaze | 久久精品中文 | 福利电影一区二区 | 日韩高清一 | 久久午夜精品视频 | 国产精品日韩在线观看 | 808电影免费观看三年 | 国产精品免费成人 | 亚洲精品乱码白浆高清久久久久久 | 毛片视频网址 | 青青河边草手机免费 | 欧美韩日在线 | 国产 亚洲 欧美 在线 | 国产综合香蕉五月婷在线 | 97福利在线 | 最近日本韩国中文字幕 | 又色又爽又黄 | 国产成人不卡 | 成人污视频在线观看 | 午夜在线观看 | 色综合天天综合在线视频 | 日韩精品一区二区三区水蜜桃 | 国产成视频在线观看 | www国产亚洲| 日韩欧美一区二区在线 | 国产999精品久久久影片官网 | 国产美女网站视频 | 国产女人18毛片水真多18精品 | 美女黄频视频大全 | 国内精品久久久久影院男同志 | 国产中文字幕一区二区 | 免费一级特黄毛大片 | 高清不卡一区二区在线 | 日韩va欧美va亚洲va久久 | 国产一区二区在线观看视频 | 国产精品一区二区av麻豆 | 日韩电影在线观看一区 | 国产精品久久久免费看 | 国产91欧美| 久久久国产精品人人片99精片欧美一 | 国产小视频免费在线网址 | 亚洲精品乱码久久久久久蜜桃动漫 | 国产高清av免费在线观看 | 国产成人在线观看免费 | 亚洲欧洲精品一区二区精品久久久 | 亚洲精品 在线视频 | 亚洲在线精品视频 | 午夜精品久久久久久中宇69 | 狠狠的干狠狠的操 | 国产69精品久久99不卡的观看体验 | 亚洲天堂在线观看完整版 | 日韩理论电影在线 | av黄免费看 | 亚洲天堂精品视频在线观看 | 亚洲综合在线五月 | 国产在线观看黄 | 色综合天天综合 | 成年在线观看 | 四虎国产精品免费观看视频优播 | 97精品国产97久久久久久免费 | www.日本色| 国产在线综合视频 | 国产精品theporn | 国产小视频网站 | 日本在线观看一区二区三区 | 国产香蕉97碰碰久久人人 | av资源免费看 | 免费91在线 | 黄色av免费在线 | 99久热 | 色在线观看网站 | 久久精品综合 | 国产不卡一| 日韩在线 一区二区 | 欧美日韩激情视频8区 | 午夜黄色一级片 | 国产精品成人一区二区 | 精品久久久久国产 | 91一区二区三区在线观看 | 五月激情在线 | 最新av网址大全 | 蜜臀aⅴ国产精品久久久国产 | 国产黄色精品视频 | 亚洲国产精久久久久久久 | 中文字幕在线观看完整版 | av免费电影网站 | 日日干天天爽 | 99精品国产99久久久久久福利 | 人人爱天天操 | 久久国产手机看片 | av手机版| 成人在线视频免费观看 | 日日夜夜天天久久 | 亚洲三级网站 | 日本中文字幕在线 | 99精品在线视频播放 | 久久九九国产精品 | 国产成人精品久久二区二区 | 久久精品中文字幕少妇 | 免费成人在线观看 | 国产99爱| 欧美日韩高清在线观看 | 国产精品一区二区三区99 | 久久视频免费看 | 日韩在线电影观看 | 亚洲区精品视频 | 国偷自产中文字幕亚洲手机在线 | 永久免费的av电影 | 免费观看www7722午夜电影 | 夜夜操综合网 | 欧美日韩国产二区三区 | 精品一区在线看 | 亚洲一级性 | 91传媒视频在线观看 | av品善网 | 欧美亚洲国产一卡 | 中日韩欧美精彩视频 | 超碰97国产在线 | 精品国产伦一区二区三区观看体验 | 中文资源在线官网 | 国产精品黄色在线观看 | 五月婷婷av在线 | 国模视频一区二区三区 | 国产精品成人一区二区三区吃奶 | www久久精品 | 久久精品亚洲精品国产欧美 | 国产精品白丝jk白祙 | 日韩在线免费 | 午夜少妇 | 国产成人免费 | 婷婷丁香激情五月 | 一二三精品视频 | 国产午夜精品一区二区三区嫩草 | 久久久久久久久久伊人 | 国产精品久久久久毛片大屁完整版 | 国产色爽 | 亚洲最快最全在线视频 | 精品一区 在线 | 国内精品福利视频 | 亚洲91视频| 天天翘av | 欧美一二区在线 | 国产免费一区二区三区网站免费 | 国产成人精品福利 | 91黄色成人 | 精品一区欧美 | 成人精品久久久 | 蜜臀久久99精品久久久无需会员 | 欧美日韩久久不卡 | 欧美亚洲国产一卡 | 热久久视久久精品18亚洲精品 | 亚洲 欧美 变态 国产 另类 | 日韩av电影中文字幕 | www最近高清中文国语在线观看 | 成人在线播放免费观看 | 亚州av成人| h动漫中文字幕 | 99欧美 | 日本超碰在线 | 久久视频精品 | 亚洲精品av中文字幕在线在线 | 欧美精品一区二区在线观看 | 免费观看www7722午夜电影 | av官网 | 日韩理论片在线观看 | 久久国产欧美日韩精品 | 欧美在线观看小视频 | 日韩v在线91成人自拍 | 97在线免费观看视频 | 永久免费毛片在线观看 | 黄色精品免费 | 九九久久国产 | 久久久久久国产精品久久 | 激情小说网站亚洲综合网 | 在线观看黄色av | 国产成a人亚洲精v品在线观看 | 亚洲免费一级 | 伊人天堂av| 深夜免费小视频 | 黄色软件在线观看视频 | 欧美日韩大片在线观看 | 91在线观 | 国产.精品.日韩.另类.中文.在线.播放 | 999久久久久久久久6666 | 日韩一区二区免费播放 | 日韩精品久久久 | 色多多视频在线 | 黄色精品免费 | 国产福利av | 久久这里只有精品23 | 日本视频精品 | 精品在线观看一区二区 | 97视频总站| 在线电影 一区 | 视频成人免费 | 在线观看www视频 | 欧美三级在线播放 | 国产视频九色蝌蚪 | 久久黄色影视 | 亚洲视频中文 | 久久国产片 | 久久夜夜夜 | 天天干.com | bbb搡bbb爽爽爽 | 久久久久久不卡 | 久久精品视频在线观看免费 | 99久久精品国产系列 | 日韩欧美黄色网址 | 中文字幕av全部资源www中文字幕在线观看 | 免费av在 | 亚洲视频99| 九九免费观看全部免费视频 | 国产日韩在线看 | 午夜视频亚洲 | 91探花在线视频 | 亚洲日本一区二区在线 | 成人福利在线观看 | 欧美一二三区播放 | 天天综合91| 中文字幕韩在线第一页 | 国产亚洲成av人片在线观看桃 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 国产成人一级电影 | 国产理论片在线观看 | 人人爱天天操 | 在线精品观看 | 久久在线看 | 麻豆久久久久久久 | 天无日天天操天天干 | av理论电影 | 国产高清绿奴videos | 国产亚洲视频系列 | 久久综合久久八八 | 久久国产片 | 亚洲在线精品 | 亚洲国产中文字幕 | 激情欧美一区二区三区免费看 | 在线黄色毛片 | adc在线观看 | 成人久久18免费网站麻豆 | 一区二区三区免费在线观看 | 在线看片一区 | 九九在线播放 | 天天综合色 | av片子在线观看 | 丁香激情综合 | 欧美孕妇与黑人孕交 | 亚洲黄色三级 | 黄色91免费观看 | 欧美精品一区二区三区一线天视频 | 亚州性色 | 在线免费国产视频 | 日韩av一区在线观看 | 国产一级在线视频 | 日韩激情久久 | 91av99| 国产成人在线综合 | 亚洲精品国偷自产在线91正片 | 99婷婷| 欧美日韩一区二区在线 | 久久久av电影 | 国产成人精品av久久 | 91人人网 | 午夜影视一区 | 在线视频手机国产 | 91在线看片 | 国产成人精品一区一区一区 | 欧美精品黑人性xxxx | 9热精品| 日韩理论视频 | 五月天com | 久久久久久久久久免费视频 | 国产精品第54页 | www.亚洲激情.com | 日韩av影片在线观看 | 国产精品第| 国产一级视频免费看 | 91污污视频在线观看 | 最近中文字幕第一页 | 中文字幕日韩电影 | 久久视频这里有精品 | 亚洲一区免费在线 | av在线免费观看不卡 | 日韩在线观看视频一区二区三区 | 国产四虎影院 | 日韩在线视频网址 | 免费日韩av电影 | 中文在线8新资源库 | 精品亚洲欧美无人区乱码 | 国产女人40精品一区毛片视频 | 美女福利视频一区二区 | 国产精品久久嫩一区二区免费 | 在线观看www视频 | 国产91电影在线观看 | 色爱成人网 | 欧美男同视频网站 | 天天操夜夜想 | 久青草视频在线观看 | 日本二区三区在线 | 日韩欧美成人网 | 亚洲免费av网站 | 国产一在线精品一区在线观看 | av高清一区二区三区 | 欧美一级激情 | 欧美福利久久 | 欧洲亚洲国产视频 | 亚洲男人天堂2018 | 五月婷婷在线观看 | 亚洲 欧洲av | 欧美日韩中文字幕综合视频 | 国产资源av | 伊人狠狠操 | 精品久久福利 | 国产色在线,com | 久久久久亚洲精品 | 午夜在线观看一区 | 国产精品色在线 | 日日夜夜av | 亚洲一级在线观看 | 五月香婷 | 国产乱对白刺激视频不卡 | 日本在线视频网址 | 中文字幕在线播出 | 久草视频在 | 国产在线免费观看 | 久久超碰免费 | av片中文字幕 | 91污在线 | 黄色成年片 | 国产精品免费一区二区三区 | 成人永久视频 | 日韩va亚洲va欧美va久久 | 精品亚洲免费 | 国产视频一二三 | 日韩精品在线观看视频 | 亚洲国产高清在线观看视频 | 97超碰色偷偷 | 黄色av一级片| 成人久久亚洲 | 成人丁香花 | 青青河边草免费直播 | 亚洲精品在线二区 | 成人av一区二区三区 | 久久国产精品一二三区 | 丝袜网站在线观看 | 亚洲午夜精品在线观看 | 欧美日韩国产一区 | 午夜精品久久久久久99热明星 | 色欧美88888久久久久久影院 | 97在线精品国自产拍中文 | 亚洲精选国产 | 精品国产91亚洲一区二区三区www | 在线a视频| 国产视频亚洲精品 | 99久久夜色精品国产亚洲96 | 精品视频www | 激情综合色综合久久综合 | 成人一级视频在线观看 | 99热99| 久久福利影视 | 狠狠干狠狠久久 | av在线影片 | 一区二区三区高清在线观看 | 美女免费视频黄 | 最新av电影网站 | 中文字幕 婷婷 | 免费日韩av片 | 久久夜色精品国产欧美乱极品 | 久久6精品 | 99精品国产福利在线观看免费 | 人人爽人人爽人人爽学生一级 | 超碰成人免费电影 | av软件在线观看 | 亚洲精区二区三区四区麻豆 | 丝袜精品视频 | 久久视频国产精品免费视频在线 | 国产精品视频一二三 | 日韩精品一区二区三区第95 | 黄色av一级 | 三级黄色网址 | .国产精品成人自产拍在线观看6 | 五月激情片 | 亚洲精品在线观看免费 | 福利av影院 | 天天操比| 日韩视频中文字幕在线观看 | 久久黄色网址 | 亚洲自拍av在线 | 天天操天天操天天操天天操天天操 | 精品国产99| 久久免费视频播放 | 国产精品久久久久久久久久免费看 | 91麻豆精品国产91久久久久久久久 | www.香蕉视频 | 日韩色视频在线观看 | 狠狠狠色狠狠色综合 | www黄com| 夜夜嗨av色一区二区不卡 | 国模一区二区三区四区 | 国产中文字幕亚洲 | 在线成人性视频 | 成人午夜电影在线播放 | 豆豆色资源网xfplay | 亚洲成人家庭影院 | av 一区 二区 久久 | 亚洲人成精品久久久久 | 国内精品视频久久 | 黄色软件视频大全免费下载 | 97国产精品免费 | 五月激情电影 | 欧美日韩一区二区在线观看 | 国产精品黄 | 久久久www免费电影网 | 中文字幕国语官网在线视频 | 最新av免费在线观看 | av看片网| 日韩精品一区二区三区免费视频观看 | 91视频啊啊啊 | 日韩日韩日韩日韩 | 亚洲免费在线观看视频 | 青青久草在线 | 国产美女视频免费观看的网站 | 超碰人人做 | 99热这里只有精品久久 | 99精品视频一区 | 伊人va| 果冻av在线 | 在线视频久 | 人人干狠狠操 | 久草电影在线观看 | 国产精品视频久久 | 久草视频免费 | 中文字幕在线免费看 | 婷婷丁香七月 | 蜜臀av夜夜澡人人爽人人桃色 | 天天色.com | 天天·日日日干 | 免费看的黄色网 | 国产高清福利在线 | 99精品视频免费观看视频 | 国产精品日韩欧美一区二区 | www.国产精品| 超碰97久久 | 亚洲黄网址| bbbb操bbbb| 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 高清美女视频 | 久草在线费播放视频 | 亚洲 欧美 日韩 综合 | 国产黄在线 | 深爱激情久久 | 久草电影网 | 日韩美在线| av大片免费在线观看 | 一区二区三区免费在线观看 | 黄色的片子 | 久久免费视频这里只有精品 | 97成人免费视频 | 激情视频一区二区三区 | 黄色三级免费网址 | 成人影音av| 国产成人综合在线观看 | 国产大片免费久久 | 日韩理论电影在线 | 91麻豆精品国产91久久久久 | 91电影福利 | 日韩综合视频在线观看 | 青青草在久久免费久久免费 | 精品久久九九 | 欧美日韩高清一区 | 99久久精品免费看国产一区二区三区 | 国产成人精品午夜在线播放 | 国产一区视频免费在线观看 | 亚洲精品乱码久久久久久按摩 | 成人av中文字幕 | 在线观看中文字幕dvd播放 | av色影院 | 国产日韩欧美在线免费观看 | 中文字幕av有码 | 久久精品成人热国产成 | 久久免费视频8 |