1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        深度解讀:讓你掌握OneFlow框架的系統(tǒng)設計(下篇)

        共 12948字,需瀏覽 26分鐘

         ·

        2021-01-06 21:06

        本文主要介紹OneFlow系統(tǒng)的運行時(Runtime)的運行流程,以及參與運行時的各個模塊是如何協(xié)同工作的,還探討了OneFlow的Actor機制如何解決流水線和流控問題(Control Flow)。


        如果你對OneFlow這套致簡致快的框架設計感興趣,或者對深度學習框架、分布式系統(tǒng)感興趣的話,本文就會讓你全面掌握OneFlow的系統(tǒng)設計。相信讀完這篇文章,你就會理解我們是如何看待分布式深度學習訓練的,我們?yōu)槭裁匆@樣設計,這樣設計的好處是什么,以及我們?yōu)槭裁聪嘈臤neFlow這套設計是分布式深度學習訓練框架的最優(yōu)設計。

        目 錄
        1. 深度學習框架原理

        2. OneFlow系統(tǒng)架構設計(簡略版)

        3. OneFlow完整運行流程與各模塊的交互方式

        3.1 分布式集群環(huán)境初始化

        3.2 Python端搭建計算圖

        3.3 編譯期:OneFlow(JobSet) -> MergedPlan

        3.4 編譯期:Compiler(Job)->Plan

        3.5 運行時:Runtime(Plan)


        本篇內容為下篇,上篇請見本次推送第一條,中篇請見本次推送第二條。


        3.5. 運行時:Runtime(Plan)

        OneFlow的運行時(Runtime)極其簡單,總共分3步:

        1. 創(chuàng)建所有的Global對象

        2. 根據Plan創(chuàng)建本機上的所有Actor

        3. 給源節(jié)點的Actor發(fā)送ActorCmd::kStart啟動信號。隨后整個計算圖中的Actor依次啟動,runtime啟動完畢。

        由于OneFlow的運行時僅是一張全部由Actor組成的計算圖(對于分布式訓練,是一張跨機器的Actor計算圖),當每個機器都把本機上的Actor建立起來以后,僅需要給那些源節(jié)點Actor發(fā)動啟動信號,啟動信號就會在整個計算圖中傳導開來,每個Actor就開始根據自身的狀態(tài)機工作了。當整個訓練(Runtime)要結束時,也是這些源節(jié)點發(fā)送關閉信號(kEordMsg),關閉信號也會隨著Actor之間的通信逐漸傳導到整個計算圖,所有的Actor就會根據eord信號依次關閉。當所有的Actor都關閉后,Runtime就可以下線了。

        對運行時的Actor機制介紹可以參考知乎文章:《都2020年了,為什么我們相信OneFlow會成功》 中的章節(jié)三:OneFlow的特色一:Actor機制——用一套簡潔的機制解決所有分布式深度學習框架中的技術難題。

        3.5.1 創(chuàng)建所有的Global對象

        此處會依次創(chuàng)建運行時所需的所有全局對象。

        • CommNet:CommNet是OneFlow分布式訓練中負責多機數據傳輸和消息通信的模塊。底層有基于Epoll的實現和基于RDMA的實現。

        • boxing::collective::CollectiveBoxingExecutor & boxing::collective::CollectiveBoxingDeviceCtxPoller:負責執(zhí)行集合通信操作(NCCL)

        • MemoryAllocator:負責內存(Host內存 和 GPU顯存)的申請與釋放

        • RegstMgr:負責創(chuàng)建所有的Regst (Mgr是Manager的縮寫)

        • ActorMsgBus:負責運行時Actor之間的消息通信 (Msg是Message的縮寫)

        • ThreadMgr:負責創(chuàng)建和管理所有的Thread

        3.5.2 ThreadMgr與Thread

        在創(chuàng)建Global對象ThreadMgr時,ThreadMgr會根據Plan中本機上的所有TaskProto中的ThreadID創(chuàng)建對應的Thread。

        Thread

        Thread負責創(chuàng)建、運行、銷毀Actor。一個Thread會管理多個Actor,Actor收到的消息(ActorMsg)都需要通過Thread中的消息隊列獲取。

        Thread的消息隊列分為兩級:

        • msg_channel_(繼承自Channel對象)接收跨線程的ActorMsg

        • local_msg_queue_ (就是一個隊列std::queue)接收本線程內的消息通信

        通過local_msg_queue_可以加速消息傳遞的過程。

        每個Thread內部都有一個輪詢線程actor_thread_負責輪詢消息隊列PollMsgChannel,將輪詢到的消息解析,調用該消息的接收者Actor,并讓該Actor處理該消息ProcessMsg

        GpuThread

        Thread分為CPU和GPU Thread。CpuThread除了啟動輪詢線程以外沒有其他多余的工作了。GpuThread有兩個額外的部分:1)創(chuàng)建ThreadCtx,里面包含了GPU的CUDA stream handle和CUDA callback event channel;2)啟動一個額外的輪詢線程callback event poller,負責從ThreadCtx中的callback event channel中輪詢獲取callback,并執(zhí)行該callback(原因是GPU上的任務是異步執(zhí)行)。對GPU的架構和使用,我們放在下面的Device章節(jié)介紹。

        3.5.3 ActorMsgBus與ActorMsg

        ActorMsgBus

        每臺機器都會有一個Global對象ActorMsgBus負責消息通信。只有一個主要的接口:SendMsg

        ActorMsgBus相當于一個消息的路由,會判斷該消息的目的地是否是本機,如果是本機,則通過ThreadMgr找到對應的Thread,然后EnqueueActorMsg。如果消息的目的地是其他機器,則通過Global對象CommNet將該消息發(fā)送給其他機器。其他機器的Global對象再收到這個消息以后會通知本機的ActorMsgBus做消息處理。這樣就完成了一個消息從消息的生產者Actor到消費者Actor的傳遞。

        運行時Actor消息通信機制

        示意圖見下圖:

        當一個Actor需要給另一個Actor發(fā)消息時,會判斷接收者Actor:

        • 是否是本線程內:

          • 如果是,則ActorMsgBus會找到本機內的對應線程Thread,傳入到該Thread的Msg channel中

          • 否則:調用本機器的CommNet對象傳輸該消息。接收者所在機器的CommNet對象收到消息后會轉給該機器的ActorMsgBus處理。該機器的ActorMsgBus會找到對應的線程Thread將該消息傳入線程的MsgChannel中

          • 如果是,則直接壓入Thread的LocalMsgQueue中 (最快)

          • 否則:調用本機器的ActorMsgBus傳輸數據。Actor Msg Bus會判斷接收者是否在本機內

        • Thread會不斷輪詢自己的LocalMsgQueue,取出對應的消息找到對應的Actor去處理該消息。如果LocalMsgQueue為空,則嘗試去從MsgChannel中取消息放到LocalMsgQueue中。

        ActorMsg

        運行時Actor的消息稱之為ActorMsg。ActorMsg有幾種類型(ActorMsgType):

        • kRegstMsg:表示這個ActorMsg包含了一個Regst。這是運行時Actor之間通信最主要的消息,生產者生產一個Regst通知下游消費者的消息、消費者使用完Regst返還給生產者說我用完了,都是RegstMsg??梢詮腁ctorMsg的regst()接口中拿到該Regst。

          需要注意的是,無論是生產者通知消費者的消息,還是消費者用完的Ack消息,都是同一種消息。OneFlow的Actor通信中是不需要指明“Ack”的。各個Actor在處理ActorMsg的時候都可以從Regst中得知是不是Ack。

        • kCmdMsg:一些控制指令信號。不包含數據。如kConstructActor(Thread直接處理的消息,用于Thread創(chuàng)建Actor);kStart,Actor啟動并開始工作。運行時靠著Start消息的傳染,整個計算圖開始工作。

        • kEordMsg:表示訓練結束,Actor可以切換到Zombie狀態(tài)。運行時靠著Eord消息的傳染,整個計算圖中的Actor均切換到Zombie狀態(tài),等待銷毀和RunTime下線。運行時的結束不是一下子就結束的,有可能計算圖的源節(jié)點已經發(fā)出了Eord的信號,并將自己切換成Zombie狀態(tài),而計算圖中的后半部分還在工作中。

        通過數據流以去中心化的方式控制整個計算圖的工作,是OneFlow區(qū)別于其他框架的一大特色。

        3.5.4?Register

        oneflow/core/register/路徑

        在初始化全局對象時,會創(chuàng)建Global對象RegstMgr。每臺機器上的RegstMgr管理了所有的Regst。

        RegstMgr

        RegstMgr在初始化時就會根據Plan申請所有的本機上的內存:HostMemory、HostPinnedMemory(For CUDA CopyH2D)、DeviceMemory、LockedMemory(For RDMA)等。并根據Plan中的Regst配置信息分配相應的內存地址給Regst。Regst的內存地址是固定的,直到運行時結束Regst的內存地址和大小都不會變化。OneFlow的靜態(tài)內存管理是Runtime啟動時統(tǒng)一分配,Runtime結束時統(tǒng)一銷毀。運行時的內存調度開銷是0。

        Regst

        Regst是OneFlow運行時的基本內存單元,也是基本的消息單元,Actor之間的通信、所有的數據生產、消費、回收都是Regst。由于OneFlow是靜態(tài)內存分配,內存的分時復用調度是編譯期的內存復用算法已經做好了(通過控制邊+offset方式),所以運行時僅需要按照編譯期生成的MemChunk、MemBlock、Regst的配置描述(RegstDescProto)信息一次性申請內存,并分配給對應的Regst即可。

        Regst存儲了兩類信息:

        • 生產者Actor id和消費者 Actor ids。一個Regst的生產者是唯一的,消費者可能有多個。

        • Blob的信息

        由于歷史原因(在介紹ExecGraph和ExecNode時也提到了),Actor內部可能會有一個執(zhí)行子圖(多個op/kernel),Actor的產出消費Regst均可能包含多個Blob(Tensor)。Regst需要管理blob name in op -> logical blob id -> blob的映射(blob name in op -> logical blob id 是op自己管理的),使得Kernel在執(zhí)行時可以直接根據blob name拿到對應的blob指針。

        未來會精簡Regst的設計,一個Regst只包含一個blob;合并Tensor和Blob概念。

        Regst相關概念

        • RegstDesc 編譯期的Regst描述類(C++),提供元信息,關聯(lián)Task,包含mem block,包含regst_num。RegstDesc 與Regst是一對多的關系(相鄰Actor流水并行執(zhí)行的關鍵)。TaskNode的Build過程中的Produce/ConsumeRegst就是在創(chuàng)建和消費RegstDesc

        • RegstDescProto 配置文件的proto描述,存儲在Plan中

        • RtRegstDesc 運行時的Regst描述類(C++),關聯(lián)Actor,提供計算Size的接口

        • Regst 運行時的Regst,存儲真正的blob內存,被Actor所管理。

        關系:RegstDesc(Compiler)-> RegstDescProto(Plan)-> RtRegstDesc(Runtime)-> Regst(Runtime, 1 to n)

        Blob相關概念

        • BlobDesc 編譯期的Blob描述類(C++),提供元信息:Shape、DataType;Op的InferBlobDesc就是在推導BlobDesc。

        • BlobDescProto Blob配置文件的Proto描述,存儲在Plan中(RegstDescProto中)

        • RtBlobDesc 運行時的Blob描述類,跟BlobDesc的區(qū)別是提供Header和Body的Size/CudaAlignedSize

        • Blob 運行時Kernel操作的基本數據對象。存儲在Regst中。

        需要注意的是,由于RegstNum > 1時,同一個RegstDesc會有多個Regst,多個Regst會存儲多個相同BlobDesc的Blob,所以Kernel每次運行拿到的Blob指針、Blob中的數據地址也可能是不同的。

        Tensor相關概念

        • user_op::TensorDesc ?BlobDesc在UserOp框架下的代稱

        • user_op::Tensor Blob在UserOp框架下的代稱

        3.5.5 Actor

        Actor是OneFlow運行時的基本單元。編譯期的主要工作就是把用戶定義的邏輯計算圖和分布式集群環(huán)境編譯成Plan。Plan由Actor的描述信息TaskProto組成。所以運行時就是根據Plan中的所有TaskProto創(chuàng)建所有的Actor。

        3.5.5.1 創(chuàng)建流程

        1) Runtime對象通過ThreadMgr->Thread->AddTask的方式新增一個Actor (HandoutTasks

        2) Runtime對象通過ActorMsgBus給每個Actor發(fā)送 ConstructActor的指令消息(ActorCmd::kConstructActor)

        3)每個Actor所在的Thread收到構造Actor的消息后調用ConstructActor接口構造Actor,其中是使用了NewActor ,傳入ThreadCtx,調用Actor的Init方法初始化該Actor。

        Actor::Init(JobDesc, TaskProto, ThreadCtx)

        我們看看Actor的初始化過程中做了哪些事情:

        1) 根據ThreadCtx創(chuàng)建DeviceCtx 。運行時的Context有三級:ThreadCtx->DeviceCtx->KernelCtx 。對于Context的解釋我們放在Device部分詳細介紹。

        2) 構造Kernel(ConstructKernel

        3) 創(chuàng)建Regst(NewRegsts

        在調用RegstMgr->NewRegsts之前,RegstMgr已經給所有的Regst都申請好了內存,NewRegsts更應該像是GetRegsts。對于同一個RegstDesc,根據其regst_num會有多個Regst實例

        4) 處理消費的RegstDescId以及Regst之間的Inplace

        5) 虛接口VirtualActorInit,供各個子類Actor自己重載自定義的初始化內容

        3.5.5.2 Actor狀態(tài)機

        當Actor初始化完畢以后,Actor就進入了等待狀態(tài)。在Actor收到Eord信號并銷毀之前,Actor一直都在等待狀態(tài)和執(zhí)行狀態(tài)之間切換。Actor的狀態(tài)機我在之前的知乎文章中簡要介紹過:

        ?

        Actor所有的邏輯都通過ProcessMsg來實現。Thread將收到的消息交給Actor處理,Actor處理消息過程中可能會觸發(fā)執(zhí)行(Act),執(zhí)行會Launch其內部的Kernel。執(zhí)行結束會向上下游Actor發(fā)消息。運行時的去中心化調度就是靠著Actor之間的消息通信所實現的。

        Actor內部有多種MsgHandler來處理消息(HandlerNormal和HandlerZombie)。在Actor正常運行過程中都使用HandlerNormal來處理消息。HandlerZombie用于Actor在有序退出時的消息管理。

        HandlerNormal

        Actor正常運行過程中主要處理的消息是RegstMsg,其中包含了上游發(fā)來的可供該Actor消費的Regst 或者 下游使用完該Actor產出的某個Regst。在HandlerNormal中,Actor會解析RegstMsg并更新自己的狀態(tài),然后觸發(fā)ActUntilFail

        ActUntilFail

        ActUntilFail中,Actor會判斷執(zhí)行條件是否滿足,如果滿足就一直執(zhí)行,直到失敗。執(zhí)行條件是否滿足需要兩個條件:IsReadReady和IsWriteReady,通常Actor需要判斷其消費的Regst都到齊了,且有空閑塊可寫時,才會觸發(fā)執(zhí)行。每次執(zhí)行都會觸發(fā)消息的發(fā)送:包括給上游和下游Actor發(fā)消息。

        Act

        每次Actor執(zhí)行稱之為一次Act。Act 是一個虛方法,需要子類具體實現。我們可以參考一個最常見的Actor:NormalForwardActor,我們所有的用戶級別的Op都使用NormalForward類型的Actor。這種Actor的Act方法里調用了AsyncLaunchKernel,去Launch內部的Kernel執(zhí)行。

        3.5.5.3 異步執(zhí)行 與 異步消息發(fā)送

        AsyncLaunchKernel

        Actor內部的Kernel是異步調用的。每次Launch Kernel,Actor都要給該Kernel關聯(lián)此次執(zhí)行對應的Regst(流水并行對Kernel無感)。

        Actor的所有消息發(fā)送都是異步的。見ActUntilFail。等Kernel異步執(zhí)行結束以后,相關的消息才會被發(fā)送出去。

        Actor中需要對Inplace的Regst/Msg做特殊處理,因為Inplace會改變Regst的生命周期(延長ConsumedRegst的生命周期直到ProducedRegst生命周期結束)

        Actor控制邏輯掩蓋

        異步消息保存在Actor的async_msg_queue中。如果消息的接收者和本Actor在同一個WorkStream(Thread)中時,異步消息可以提前發(fā)送,不需要等待Kernel異步執(zhí)行完就可以通知其他Actor,由于在同一個Stream中,任務的執(zhí)行是有序的,該Actor的后繼Actor可以提前將任務也提交到相同的Stream中,等上一個任務執(zhí)行完,下一個任務一定可以滿足執(zhí)行條件并執(zhí)行。OneFlow的Actor機制通過相同Stream提前發(fā)消息就可以掩蓋GPU上絕大多數Actor的控制邏輯開銷。

        3.5.5.4 Actor擴展性

        Actor子類可以定制消息的處理方式,可以定制執(zhí)行條件。在NormalForward這類常見Actor中,Actor需要所有的輸入和輸出都滿足才會Act一次,且Act結束會將輸入還給上游、輸出發(fā)給下游。

        同時OneFlow也擴展了多種特殊的Actor,如

        • Repeat,收到一個輸入以后,就可以連續(xù)重復Act多次(只要有可寫的),重復Act結束以后才會返還輸入Regst。

        • Unpack,收到一個輸入以后,會將該輸入解碼,拆成多個Regst分批次發(fā)給下游,發(fā)完以后才會返還輸入Regst。

        • Input-wise,該Actor有多路輸入,每到達一個輸入,就可以Act,無需等待所有的輸入都到齊才去Act

        等等。

        需要指出的是:Repeat和Unpack分別對應時間上的Broadcast和Split。OneFlow的BatchAccumulate就是通過插入Repeat和Unpack op來實現的(反向梯度會插入Acc)。一個模型的Repeat num = 4 、數據 Unpack num = 4的單卡訓練 跟 4卡數據并行 從數學上是完全等價的。

        Actor通過子類的多種自定義行為使得整個系統(tǒng)很容易擴展,一些特殊的需求僅需要在OneFlow中新增一個類型的Actor就能完成。

        3.5.5.5 流控機制

        Actor天然支持流水線,運行時每個Actor自己通過判斷跟自己相關的消息就能得知自己能否執(zhí)行,不依賴中心調度結點,使用最簡單的FIFO原則就解決了流控問題(Control Flow)。我們用一個數據預處理的流水線時間線的例子介紹一下Actor的流水線和流控機制:

        一個非常常見的數據預處理流程如下:

        為了方便推演,我們假設DataLoding、Preprocessing、Copy、Training都是一個Actor(實際上Preprocessing和Training分別都是由多個Actor所組成的子圖)。當這4個Actor之間的RegstNum均為2時,如果訓練時間比較長(訓練是整個網絡的瓶頸),我們看到一種流水線的時間線如下圖:

        當訓練到第3個batch時,4個Actor的執(zhí)行時間成一種反序遞進的方式規(guī)律執(zhí)行。圖中灰色表示奇數Batch的數據,藍色表示偶數Batch的數據,為了方便理解,其中標出了Batch 6 的數據隨著時間線的演進在整個pipeline中的流向。圖中相鄰兩條時間線中間的兩個小方塊表示RegstNum=2的Regst,白色表示空閑狀態(tài),藍色表示被偶數Batch的數據占用,灰色表示被奇數Batch的數據占用。隨著時間線的演進,我們羅列出了Regst狀態(tài)變化時刻的新狀態(tài)。當訓練是瓶頸時,數據加載、預處理、拷貝傳輸的開銷都被完美掩蓋在訓練時間中了。

        那么當數據加載是瓶頸的時候呢?下面這個時間線更容易理解OneFlow流控是如何實現的:

        由于Preprocessing是耗時最長的,所以預處理上游的Actor(DataLoading)的工作節(jié)奏(背壓機制, Back Pressure)以及預處理下游的Actor(Copy、Training)的工作節(jié)奏均被預處理這個Actor的執(zhí)行所控制。

        OneFlow使用背壓機制解決流控問題。如上面兩張圖所示,雖然DataLoading的時間很短,但并不會無節(jié)制的加載數據,而是當Regst被填滿之后就會等待,當Training是瓶頸時,Batch 3的數據在訓練時,DataLoading提前準備了Batch 7和Batch 8的數據,然后就等著;當Preprocessing是瓶頸時,DataLoading永遠都比Preprocessing提前處理了兩個Batch的數據。

        3.5.6 Opertor 與 Kernel

        Operator是OneFlow計算圖(ComputeGraph)的基本單元,是計算圖中的節(jié)點,Tensor是計算圖上的邊。Operator是編譯期概念,對應的運行時概念就是Kernel

        oneflow/core/operator路徑下包含了Operator的基類以及一些系統(tǒng)Op;

        oneflow/core/kernel路徑下包含了Kernel的基類以及一些系統(tǒng)Kernel;

        UserOp(UserKernel)的描述在oneflow/core/framework下定義,而具體的每個UserOp/UserKernel都放在了oneflow/user路徑下。

        Operator

        bn_in_op表示blob name in op。一般的Op都會定義"in"作為輸入的Tensor名字,“out”是輸出的Tensor名字。

        lbi/lbn:分別是LogicalBlobId和LogicalBlobName的縮寫,LogicalBlobName是一個Op的輸入輸出Tensor在邏輯圖上的唯一字符串,通常以"op_name/bn_in_op"的方式描述。如Conv1 Op的輸出Tensor的LogicalBlobName就是"Conv1/out",LogicalBlobId是LogicalBlobName的結構化表達。

        一個具體Op的主要行為是規(guī)定輸入輸出、提供Tensor的推導方法、提供合法的SBP Signature等。

        Kernel

        Actor中通常都會有一個Kernel,每次執(zhí)行就是異步Launch一次Kernel。Kernel的Forward函數(對應UserKernel的Compute函數)就是在做實際的數學計算,讀輸入的Tensor數據,將計算完的數據寫到輸出Tensor的內存/顯存上。對于GPU的Kernel,Kernel的計算實際上是向CUDA Stream提交異步任務(對應Kernel中的cuda kernel的定義和調用)。

        向GPU提交異步的計算任務使用到了KernelCtx,KernelCtx由DeviceCtx構造而來,而DeviceCtx又由ThreadCtx構造而來。其中最重要的結構就是CudaStreamHandle

        3.5.7 Device

        oneflow/core/device路徑

        Kernel向Device(GPU)提交計算任務,使用到了cudaStream_t,這個cuda stream是哪里來的呢?

        當一個Thread是GPUThread時,創(chuàng)建GPUThread會創(chuàng)建相應的ThreadCtx,其中包含了一個cudaStream以及cuda callback event的Channel。GPUThread除了自己輪詢ActorMsgQueue的線程以外,還會有一個callback的輪詢線程:cuda callback event poller 。Actor(Kernel)異步執(zhí)行計算任務結束后,cuda callback event poller線程會拿到相應的callback event,并會執(zhí)行該event。

        Kernel執(zhí)行結束的callback是什么時候被插入的呢?在Actor每次Act(AsyncLaunchKernel)結束后,都會將發(fā)消息的動作作為一個CallBack(Actor::AsyncSendQueuedMsg)通過DeviceCtx->AddCallBack接口壓入cuda stream。

        DeviceCtx(KernelCtx、ThreadCtx)的主要作用就是提供一個CudaStream供Kernel提交計算任務,同時提供一個callback的channel用于執(zhí)行Actor發(fā)消息的邏輯。通過這種設計,OneFlow的運行時就實現了Actor的異步執(zhí)行和異步消息機制。

        Actor通過DeviceCtx異步LaunchKernel的示意圖如下:

        由于相同Stream下的多個Actor,可以不用等Kernel的異步計算任務執(zhí)行完就發(fā)消息,所以可以將Actor通信開銷、Kernel的CPU代碼執(zhí)行開銷完全掩蓋在CudaStream的計算開銷中。其時間線如下圖所示:

        其中WithoutOverlap對比了如果沒有Actor在同一個Stream中可以提前發(fā)消息的優(yōu)化,CudaStream中的計算會因為消息通信、LauchKernel的開銷導致GPU計算資源沒有被充分利用。

        3.5.8 內存管理

        oneflow/core/memory路徑

        MemCase

        Regst通過MemCase標記了自己所屬的內存類型,如果是GPU上的顯存,還需要標記自己所屬的DeviceId。如果是CPU上的主存,會標記該Regst是否是被CopyHD或CommNet所使用的。Regst通過MemBlockId和MemBlockOffset標記了自己所屬于哪個MemBlock以及對應的偏移量。

        MemoryAllocator

        根據MemCase和Size申請對應大小和類型的內存塊,返回內存塊首地址;根據內存地址回收內存。在Lazy情況下,僅在Runtime的啟動/結束時(RegstMgr的構造函數和析構函數里)才會申請/釋放內存。

        MemBlock與Chunk

        這是OneFlow的多級內存設計:Chunk -> MemBlock -> Regst。

        • MemBlock:同一個Chain(MemChain,通常是GPU上的前后向的所有activation regsts在一個MemChain中,Optimizer子圖部分的Regst在各自的MemChain中)內的Regst根據分時復用的原則共用一個MemBlock的不同段,通過size和offset標記。內存復用算法會盡可能讓MemBlock的Size小,同時滿足互斥的Regst(生命周期有重疊的)不會有內存區(qū)域的重疊。

        • Chunk:一個Job內在同一塊GPU上的MemBlock的合集稱為一個Chunk。Chunk的Size是所有內部MemBlock的Size之和。(即同一個Chunk內部的MemBlock之間沒有復用內存)

        • 多個Job在同一個塊GPU上的Chunk,會根據Job之間的互斥關系,完整復用一個大的Chunk(取最大值)作為最終的Chunk。如TrainJob和EvalJob互斥,所以TrainJob的所有可復用的Regst的總Chunk跟Eval的總Chunk合并復用一塊內存。通常情況下,Eval只有前向,比TrainJob計算圖要小,可以完全被TrainJob的Chunk所包含。即新增一個EvalJob不會新增任何內存。

        3.5.9 網絡模塊

        oneflow/core/comm_network路徑

        Global對象CommNet提供運行時多機之間收發(fā)ActorMsg、傳輸Regst數據功能。分為Epoll(基于Socket)實現和Ibverbs(基于RDMA)實現。其中RDMA需要注冊內存(鎖頁內存),會將對應的Regst內存注冊。

        3.5.10 IO模塊

        oneflow/core/persistence路徑

        提供一系列磁盤讀寫操作的接口,主要用于跟IO相關的Kernel實現。

        • FileSystem 提供文件系統(tǒng)相關操作,如創(chuàng)建文件、查詢目錄等。(文件、目錄的增刪改查操作)。目前支持POSIX文件系統(tǒng)和Hadoop文件系統(tǒng)。

        • Snapshot 分為SnapshotReader和SnapshotWriter,對應Checkpoint的Load和Save操作。

        • In/OutStream 提供文件讀寫流操作。如DataReader的Kernel讀取OFRecord就使用了PersistentInStream。

        oneflow/core/record 路徑

        除了OFRecord以外其余內容都是即將過時的老版本的decoder/encoder接口。新版本的易于擴展的data reader設計見 oneflow/user/data路徑下的各個文件。主要分為了data reader、dataset、parser等抽象。新的DataReader設計后面會專門出一篇文章介紹。

        3.5.11 ID manager

        Global對象IDMgr(ID編址系統(tǒng))嚴格意義上不能稱之為一個模塊,在OneFlow中是一個很小的單元。負責id的壓縮和映射、負責編譯期Task、運行時Actor的唯一標識符TaskId/ActorId的編碼和解碼。64位的task id包含了10位的machine id、11為的thread id、21位的local work stream id、21位的task id。

        IDMgr還提供各種映射接口,主要是GPU相關的各個線程id映射(計算、copy、nccl等)。


        4

        總結

        OneFlow的運行時是一套非常簡潔、高效的Actor系統(tǒng),通過簡單的消息機制就解決了分布式訓練中的復雜調度問題、流控問題,流水線的實現等。相比于其他框架的運行時,OneFlow的Actor實際上是對Kernel的一層很簡單很淺層的封裝,但是這一套抽象解決了運行時眾多Kernel對各種資源的管理、分布式并行引入的Kernel間復雜的時序依賴、狀態(tài)依賴等問題。Actor系統(tǒng)還非常的模塊化,同時易于擴展和組合,可以支持各種復雜的分布式深度學習訓練需求。


        點擊“閱讀原文”,前往OneFlow代碼倉庫。

        瀏覽 34
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            五月天在线电影| 水蜜桃网站在线观看| 亚洲中文无码在线观看| 午夜撸一撸| sesese999| 密臀av在线| 免费看无码| 91人兽| 久久婷婷秘精品国产538| 国产亚洲一区二区三区| 操美女大逼| 黄色免费网| 国产成人97精品免费看片| www.欧美| 丁香五月婷婷色| 天天做天天爽| 免费成人高清视频| 欧美激情一区二区A片成人牛牛| 欧美性视频网站| 婷婷五月激情网| 中文字幕99| 亚洲无码精品一区| 青草99| 999成人网| 久久久无码精品亚洲日韩男男| 亚洲综合婷婷| 久久中文视频| 亚洲内射视频| 围内精品久久久久久久久久‘变脸| 亚洲天堂无码av| 中文字幕自拍偷拍| 正在播放吴梦梦淫行| 女人的天堂AV| 97超碰人妻| 老妇槡BBBB槡BBBB槡| 久久香蕉网站| 3D动漫操逼视频| 2020人妻中文字幕| 日韩三级片av| 国产AV资源| 欧美黄色影院| 亚洲少妇一区| 欧美一级在线视频| 最近中文字幕在线| 欧美精品福利| 九一成人电影| h视频免费看| 亚洲成人第一网站| 91精品国产成人www| www.尤物| 青青草超碰| 一级片在线免费观看| 亚洲午夜久久久久久久久红桃| 欧美黄页| 永久免费AV| 99re在线精品| 一级婬片A片AAAAA毛片| 精品国产精品国产精品国产网站 | 久久精品三级片| 一二区视频| 偷拍亚洲欧美| 中文无码第一页| 北条麻妃AV在线播放| 少妇搡BBBB搡BBB搡小说| 亚洲天堂久久久| 免费成人国产| 麻豆视频在线看| 国产Av婬乱麻豆| 日韩中文字幕在线视频| 四虎在线观看| AV无码高清| 中文字幕一区二区三区四区50岁 | 69婷婷国产精品| 超碰在线精品| 香蕉视频成人在线| 精品国产天线2024| 在线视频污| 一区二区三区www污污污网站| 国产操逼无码| 日韩无码1| 日韩无码乱码| 中日韩精品A片中文字幕| 亚洲视频网址| 亚洲第一色在线| 欧美精品A级片| 欧美,日韩,日| 国产精品久久久久久久久免费无码| 啪啪免费视频| 亚洲一二三| 国产久久久久久| 国产传媒自拍| 免费69视频| 中文字幕在线不卡| 亚洲男人天堂av| 国产精品色8| 久久伊人精品| 熟妇人妻中文AV无码| 人妻中文在线| 91亚洲国产AⅤ精品一区二区| 日日夜夜AV| 尤物视频官网| 美女黄色免费网站| 久久久亚洲无码精品| 中文字幕在线网| 九色自拍视频| 国产毛片一区二区| 亚洲A级| A片免费在线播放| 一级免费A片| 亚洲黄色影视| 97精品在线视频| 18禁网站免费| 91干| 成人黄色一级片| 你懂的在线播放| 日韩在线电影| 日本爱爱网站| 超碰日韩| 一区二区视频免费| 久久精品网| 91在线观看| 日本韩国叼嘿片| 2015中文字幕黄色视频| 一级黄色录相片| 亚日韩视频| 小早川怜子精品一区二区| 久了中文字幕| 性猛交AAAA片免费观看直播| 丰满人妻一区二区三区46| 老熟女搡BBBB搡BBBB视频| 在线播放高清无码| 国产aaaaaa| 加勒比综合网| 国产一区二区免费| 国产成人免费做爰视频| 国产小电影在线| 黄色AV免费| 影音先锋国产资源| 国产资源av| 99热最新网址| 东京热视频在线观看| 成人一区二区三区| 无码精品一区二区三区在线播放| 5252a我爱haose01我愿| 日逼大香蕉| 高清无码在线免费视频| 好男人WWW社区在线视频夜恋 | 18禁看网站| 中文字幕av一区| 中文字幕va| 337P人体美鮑高清| 无码视频韩国| 麻豆视频在线| 伊人久久影院| 在线观看免费黄色视频| 天天干天天撸影视| 亚洲99热| 欧美亚洲在线观看| 激情综合视频| 大香蕉婷婷五月天| 精品人妻| 久操视频网| 日逼视频免费观看| 亚洲不卡| 欧美特级黄片| 免费无码婬片AAAAA片| 久久五月亭亭| 亚欧洲精品在线视频| 欧美成人精品欧美一级| 亚洲欧美精品在线| 亚洲理论电影| 青娱乐av| 欧美在线观看网站18| 五月丁香色色网| 亚洲成人av在线播放| 色香蕉影院| 东北女人操逼视频| 三级黄视频| 天天干天天操天天| 2025中文在线观看最好看的电影 | 波多野结衣在线无码| 欧洲精品在线观看| 午夜成人三级| 五月天婷婷小说| 三级在线网| 最新黄色av| 无码av免费精品一区二区三区| 韩国精品无码一区二区三区18| 久久婷婷视频| 永久免费不卡在线观看黄网站| 欧一美一婬一伦一区二区三区自慰国 | 黄色激情av| 丁香六月激情婷婷| 国产一区二区免费| 西西444www无码精品| 欧美精品久久久久久| 日韩三级AV在线观看| 91麻豆一区二区| 在线播放91灌醉迷J高跟美女| 日韩一级在线观看| 日韩一区二区AV| 精品无码不卡| HEYZO少婦AV無碼精品| 一本一道伊人99久久综| 中文字幕中文字幕| 亚洲激情视频| 国产欧美精品一区二区三区| 特黄色视频| 91足浴店按摩漂亮少妇| 97在线超碰| 一本道不卡色色| 综合av| 91久久久青青青青草| 国产一区二区三区在线观看免费视频免费视频免费视频 | 久草大香蕉在线| 操逼激情网| 一级a一级a爱片免费免免高潮| 69AV在线观看| 国产亚洲视频在线观看视频| 激情五月天激情网| 骚逼黄片| 91中文在线| 免费视频一区二区| 免费无码国产在线怀| 韩国三级HD久久精品| 俺也去也| 亚洲日韩精品秘在线观看| 综合玖玖| 四川少妇搡bbw搡bbbb| 国产视频福利在线| 免费看欧美成人A片无码| 国产激情视频在线免费观看| 亚洲综合二区| 久久精品苍井空免费一区二| 三级在线视频| 亚洲AV无码第一区二区三区蜜桃| 欧美一级生活片| 午夜69成人做爱视频网站| 色婷婷AV一区二区三区软件| 91熟女视频| 大香蕉电影网站| 大吊AV| 久久午夜无码鲁丝片午夜精| 99久久国内精品成人免费| 欧美a∨| 三级片视频网址| 上床网站| 国产免费一区二区三区免费视频 | 国产视频在线播放| 国产操逼逼| 久久91av| 91ccc| 狠狠操狠狠操狠狠操| 狠狠的日| 天天视频亚洲| 亚洲v在线观看| 日本色色| 91探花精品偷拍在线播放| 粉嫩av一区二区白浆| 狠狠干2021| 不卡一区| 一本久道视频一本久道| 国产一区二区三区在线观看免费视频免费视频免费视频 | 中文字幕在线观看二区| 五月婷婷中文| 欧美亚洲黄色| 日本久久综合网| 豆花视频成人精品视频| 99热精品免费在线观看| 亚洲成年人在线| 69AV在线播放| 亚洲AV官方网站| 999这里只有精品| 丁香婷婷五月色成人网站| 波多野结衣无码高清| 国产成人自拍视频在线| 精品一区二区三区在线观看| 99国产在线观看| 波多野结衣视频在线观看| 青青操久久| 婷婷国产亚洲精品网站| 亚洲成人电影天堂| 操屄小视频| 亚洲成人国产| 欧一美一婬一伦一区二区三区 | 草榴在线视频| 成人片网址| 成人午夜视频精品一区| 欧美老女人性爱视频| 亚洲精品在线视频| 成人网站视频| 欧美精品一卡| 18禁黄网站| 久久免费视频网站| 超碰人人人人人| 欧美一级片内射| 黑人亚洲娇小videos∞| 亚洲成人av在线观看| 两根茎一起进去好爽A片在线观看| 欧美群交videotv群交| 天天操夜夜操狠狠操| 天堂v在线观看| 日韩欧美在中文| 日韩视频一区二区三区| 亚洲成人第一网站| 国产嫩草精品A88AV| 国产成人精品视频| 超碰在线人人爱| 国产免费黄色片| 国产精品视频瘾无码| 国外成人性视频免费| 久草小视频| 久久国产高清视频| 亚洲AV无码久久精品色无码蜜桃| 国产激情都市一区二区三区欧美| 日韩精品小电影| 男人天堂V| 一本免费视频| 东方a在线| 亚洲欧美在线观看| 日本婷婷| 黄色综合| 日韩一区二区三区四区久久久精品有吗| 亚洲日韩欧美视频| 欧美A级视频在线观看| 久久综合久| 三级片在线观看视频| 在线观看中文字幕网站| 国产精品成人无码a无码| 色男天堂| 丁香五月六月婷婷| 日本天堂Tv视频在线观看| 欧美日韩在线视频免费| 国产午夜无码福利视频| 免费av播放| 成人毛片| 欧美A级黄片| 亚洲人妻一区二区| 蜜桃影视| 一插综合网| 国产精品无毛五区六区| 亚洲A片一区二区三区电影网| 婷婷五月天AV| 视色AV| 专区无日本视频高清8| 91.射| 成人亚洲视频| 四川妇搡BBBB搡BBBB| 国产精品久久久精品cos| 在线亚洲福利| 狼人综合在线| 99热在线观看| 大香蕉这里只有精品| 做爱网站| 久久成人无码电影| 九九九免费视频| 夜夜骑夜夜撸| 夜夜操夜夜爽| 欧美乱伦一区| 亚洲无码在线电影| 精品视频在线看| 一级片| av老鸭窝| 91免费小视频| 影音先锋三区| www.91久久| 蜜臀久久99精品久久| 四虎成人网站| 午夜福利老司机| 午夜高清无码| 先锋影音成人资源| 无码高清一区二区| 成人免费视频一区二区三区| 成人免费大香蕉| 精品91在线视频| 久久午夜夜伦鲁鲁一区二区| 精品免费在线| 国产性爱在线| 国产aaaaaa| 色婷婷视频在线观看| 黄色a片视频| 欧美mv日韩mv国产网站| 久草资源在线观看| 欧美性猛交一区二区三区| 国产精品AV在线观看| 五月天激情午夜福利| 日韩欧美在线不卡| 精品欧美片在线观看步骤| 亚洲人妻无码一区| 黄色性视频| 欧美女人操逼| 黄色毛片在线播放| av中文字幕在线播放| 人人操人人人| 中文字幕免费在线| 一色综合| 天天干夜夜操| 精东AV| 国产不卡精品| 18毛片| 性爱A级视频| 国产黄色精品| 亚洲第一成人网址| 国产操B视频| 亚洲精品成人无码AV在线| 亚洲无码视频在线观看高清| 日韩A片免费看| 伊人影院麻豆| 欧美成人性爱视频| 日韩精品无码一区二区三区 | 国内精品久久久| 日韩无码视频一区二区| 大香蕉伊人视频| av无码一区二区| 天天操免费| 国产精品成人影视| 五月天婷婷小说| www.狠狠| 五月六月婷婷| 欧美三级视频| 国产小视频在线播放| 激情婷婷亚洲| 日本黄色一级视频| 5D肉蒲团| 看国产AA免费| 天天想夜夜操| 无码在线视频播放| 久久久精品国产| 亚洲免费黄| 羽月希在线播放| 各种妇女撒尿mm毛免费网站| 97天天操| 欧美一区二区在线| 无码草逼| 91探花精品偷拍在线播放| 日韩在线高清| 欧美午夜性爱视频| 日韩一级在线| 日韩亚洲视频| 免费看A片视频| 色综合色| 91亚洲国产成人久久精品麻豆| 国产Av大全| 五月天社区| 激情视频综合网| 国产无套在线观看| www.一区| 成人AV午夜福利| 成人无码区免费A片久久鸭| 波多野结衣久久中文字幕| 在线观看中文字幕视频| 日朝无码| 成人AV一区二区三区| 国产性精品| 久久午夜视频| 久久偷看各类wc女厕嘘嘘偷窃| 少妇高潮av久久久久久| 琪琪色视频| 黄色一级片在线| 韩国中文字幕HD久久| 91精品视频网站| 91爱搞在线| 在线不卡免费Av| 国产欧美精品一区二区色综合| 黄色大片在线播放| 午夜福利干B在线免费小视频| 狠狠干2021| 操老女人逼视频| 午夜3D动漫AV| 黄片高清免费| 美日韩AV| 亚洲一级免费在线观看| av三级片在线观看| 中文字幕日韩亚洲| 亚洲不卡免费视频| www.青青草| 亚洲成人二区| 日韩av电影免费在线观看| 国产精品久久久久永久免费看| 欧美日韩色| 日韩av无码中文字幕| 亚洲精品三级| 一级黄片免费观看| 米奇狠狠干| 成人国产精品免费观看| 亚洲人妻少妇| 国产区一区| 国产欧美精品一区二区三区| 婷婷在线播放| 日韩家庭乱伦| 久草欧美| 丁香婷婷五月综合影院| 久久成人片| 波多野结衣亚洲视频| 99视频+国产日韩欧美| 国产操逼网| 在线中文无码| 国产videos| 人人操人人看人人干| 国产精品一区在线观看| 免费一级A片在线播放| 免费视频亚洲| 亚洲无码三级片在线观看| 久久国产av| jzzijzzij亚洲成熟少妇在线播放| A级片免费看| mm131亚洲国产精品久久| 91av视频在线| 我和岳m愉情XXXⅩ视频| 日本中文无码| 欧美操逼视频| 午夜性视频| 一区二区三区四区五区无码| 91精品少妇高潮一区二区三区不卡| 丁香六月婷婷| 国产Av一区二区三区| 欧美老妇操逼视频| 色噜噜狠狠一区二区三区| 九九热毛片在线观看| 97精品综合久久| 成人AV三级片| 在线观看欧美黄片| 国产免费乱伦| 日韩激情网| 久热国产精品| 久久午夜无码鲁丝| 久碰人妻人妻人妻| 伊人狼人香蕉| 超碰在线人人操| www.热久久| 日韩A毛片| 夜夜爽夜夜高潮夜夜爽| 欧美一级在线| 午夜成人免费视频| 无码草逼| 黄色AV免费观看| 18禁网站在线看| 精品免费视频| 一级黄色视频在线观看| 欧美精品在线观看视频| 亚洲一区二区免费视频| 91香蕉国产在线观看| 日韩精品视频在线| 成人无码视频在线观看| 色综合欧美| 中文字幕日本| 女人久久久久| 91自摸| 色男人色天堂| 欧美在线免费观看| 成人无码观看| 精品无码免费视频| 中国女人如毛片| 色婷婷视频在线观看| 91精品国产综合久久久蜜臀九色| 日韩一级片在线播放| 成人无码激情| 无码人妻丰满熟妇啪啪| 国产AV18岁| 日韩黄色电影在线观看| 国产二区三区| 围内精品久久久久久久久久‘变脸| 一边做一边说国语对白| 最新日韩中文字幕| 白虎高清无码大尺度免费在线观看| www.91久久| 日本一区二区视频| 九九综合伊人7777777| 18成人网站在线观看| 一级a爱视频| 亚洲无码AV麻豆| 亚洲乱伦网| 日韩av免费在线观看| 在线黄色av| 久热免费| 欧美aaa在线| 欧美特黄AAAAAA| 99极品视频| 男女日皮视频| 国产免费黄色电影| 一级色情片| 逼特逼视频在线| 亚洲乱码一区二区三区| 久久都是精品| 人人操人人看人人干| 久久中文字幕免费| 中文字幕欧美日韩| www亚洲无码A片贴吧| 中文在线高清字幕| 视频一区18| 日本a在线免费观看| 久久老女人| 中文字幕AV免费观看| WWW.豆花视频精品| 欧美日韩中文| 亚洲国产成人精品女人| 国产女人18毛片水真多18精品| 99国产精品免费视频观看8| 一级黄色小视频| 亚洲砖区区免费| 国产av小电影| 超碰8| 天天操夜夜操视频免费高清| 亚洲免费精品视频| 超碰69| 特黄网站| 欧美亚洲黄片| 中文字幕亚洲一区| 性欧美69| 安微妇搡BBBB搡BBBB| ChineSe露脸老女人| 九九五月天| 扒开让我91看片在线看| 欧美成人午夜影院| 黑人AV在线播放| 日韩AA视频| 丹麦电影《下午》| 免费黄色| 日日精品| 久久成人片| 天天艹夜夜艹| 天天肏夜夜肏| 2025av天堂网| 黄片免费看网站| 伊人影院久久| 欧美高潮视频| 亚洲国产成人一区二区| 少妇人妻AV| 人人操人人妻人人爽| 国产美女被爽到高潮免费A片软件 国产无遮挡又黄又爽又色视频软件 | 成人精品永久免费视频99久久精品| 中文字幕日本欧美| 北条麻妃一区二区三区-免费免费高清观看| 日本a在线| 成人免费毛片AAAAAA片| 亚洲小视频在线观看| 国产精品成人午夜福利| 色色丁香| 91欧美日韩综合| 欧美亚洲日韩国产| 手机成人在线视频| 欧美另类| 亚洲欧美日韩色图| 高清无码二区| 久久成人三级片| 日韩欧美精品| 欧美日韩成人一区二区三区| 在线观看黄A片免费网站| 久久一二三四| 狼人一区二区| 亚欧洲精品在线视频| 久久久免费观看视频| 永久AV免费网站| 精品黄色视频| xxxxxbbbbb| 婷婷五月天啪啪| 亚洲一级黄色大片| 日韩高清成人无码| 夜夜骚av.一区二区三区四区| 69国产精品视频免费观看| sm国产在线调教视频| 日本免费黄色小视频| 蜜臀久久99精品| 激情综合在线| 国产精品美女在线观看| 伊人逼逼| jizz久久| 91亚洲精品国偷拍自产在线观看| 日本久久综合网| 国产精品视频在线免费观看 | 激情久久婷婷| 国产精品人妻AⅤ在线看| 午夜视频在线播放| AV在线免费观看网站| 91乱子伦国产乱子伦海的味道 | 麻豆午夜成人无码电影| 中文无码日韩欧美久久| 北条麻妃99| 成人午夜激情| 在线观看禁无码精品| 青青草无码| 亚洲无码在线电影| 69免费视频| 波多野结衣一区| 一区二区三区无码视频| 五月天网址| 欧美三级长视频| 超碰超爽| 国产麻豆精品ThePorn| 日韩中文字幕成人| 欧美日韩一区二区三区四区五区六区 | 色欲精品| 日韩欧美一级二级| 一级二级三级视频| 亚洲.欧美.丝袜.中文.综合| 91AV成人| 一区二区国产精品| 翔田AV无码秘三区| 色色五月天婷婷| 婷婷丁香激情五月天| 亚洲黄色网址| 欧美黄片免费| 特级丰满少妇免费观看| 亚洲无吗在线视频| 日本www视频| 97在线免费| 亚洲国产精品VA在线看黑人| 男人的天堂青青草| 草榴在线视频| 五月丁香婷婷综合网| 色色777| 欧美性爱-熊猫成人网| 女人的天堂av| 99热超碰| 人妻被午夜福利AV| 亚日韩视频| 黄片视频在线免费播放| 激情色图| 成人免费乱码大片a毛片蜜芽| 黄视频免费| www.99av| 久久精品国产99精品国产亚洲性色| 精品一区二区视频| 国产视频久久久| 国产香蕉视频| 熟妇私拍| 国产a毛一级,a毛一级| 精品一区二区三区四区五区六区七区八区九区 | 丁香激情网| 成人高清无码| 苍井空无码一区二区三区| 天天爱夜夜爱| 欧美黄色免费在线观看| 久操视频在线免费观看| 影音先锋男人天堂| 四虎精品| 特级西西人体444www高清| 大香蕉手机视频| 最新中文字幕av| 五月丁香婷婷成人| 电影91久久久| 欧美午夜成人一区二区三区| 国产青草视频在线观看| 波多野结衣AV在线播放| 久操视频在线观看免费| 日韩日日日| 亚洲中文字幕免费| 3D动漫精品啪啪一区二区免费| 免费看无码网站成人A片| 亚洲熟女一区二区三区妖精| 黄色一级在线| 91探花秘入囗| 国产不卡一| 国产2页| 亚洲免费成人网站| 狼友视频在线| 日本50路熟女| 狠狠色噜噜狠狠狠7777米奇网| 蜜桃影院| 性爱AV天堂| 国产女同性系列| 天天做天天爱天天爽| 欧美九九九| 怡春院综合| 少妇搡BBBB搡BBB搡造水多,| 久久99精品国产.久久久久久| 99久久婷婷| 猛男大粗猛爽H男人味| 一级爱爱免费视频| 亚洲性爱视屏| 天天搞搞| 婷婷六月色| 国产精品三级视频| 欧美午夜爱爱| 久久高清亚洲| 中文字幕高清AⅤ| 亚洲在线无码视频| 色综合激情| 亚洲天堂在线视频播放| 91成人在线影院| 亚洲成人高清在线| 一本无码中文字幕| 大香蕉久热| 无码人妻一区二区| 奶头和荫蒂添的好舒服囗交漫画| 伊人网视频在线播放| 国产黄片一区二区| 亚洲免费一级| 激情色播| 日本久久久久久久久视频在线观看| 无码999| 天堂A片| 久操视频在线观看免费| 伊人导航| av玖玖| 超碰在线观看免费版| 91骚| 三级网站大全| www.操逼| 草碰在线视频| 操日本女人逼| 欧美疯狂做受XXXXX高潮| 日韩无码一级| 情趣视频网站| 午夜在线无码| 大香蕉啪啪视频| 亚洲综合图区| 亚州毛多色色精品| 1024大香蕉| 一本一本久久a久久精品牛牛影视| 91精品国产偷窥一区二区| 无码人妻一区二区三区免费九色| www.wuma| 操逼视频一级| 中文字幕无码亚| 一本一道久久a久久精品蜜桃| 俺来了俺去也| 国产视频a| 中文有码视频| 中文字幕精品在线| 欧一美一伦一A片| 国产精品扒开腿做爽爽爽视频 | 久久久www| 欧美在线视频一区二区| 中文字幕15页| 俺来也俺也啪www色| 性做久久久久久| 亚洲免费天堂| 欧美黄色录像| 奇米色色| 一级A片久久久免费直播间| 欧美精产国品一二三区别| 国精产品一区一区三区四川| jizz国产| 婷婷五月六月| 国产在线视频91| 大香蕉精品视频在线| 天天日很很日| 亚洲AV秘无码不卡在线观看| 久久精品国产精品| 精品欧美无人区乱码毛片| 人人摸人人操人人爽| 午夜视频在线看| 亚洲精品国产精品国自产曰本| 无码网址| 国产思思99re99在线观看| 人人操人人操人人操人人| 97久久精品国产熟妇高清网| 在线看操逼| 丁香花激情网| 国产AV黄色| aa人人操夜夜操人人| 黄色操B视频| 在线播放一区| 91青青草| www.青草视频| 四虎成人网址| 黄色在线免费看| 中日韩精品A片中文字幕| 中国老女人性爱视频| 日本一区二区不卡| 亚洲一本色道中文无码| 婷婷五月天性爱| 自拍AV在线| 91香蕉在线观看视频在线播放| 日韩欧美小电影| 日韩色吧| 91免费观看国产| 啊啊啊啊啊靠逼| 亚洲自拍电影| 激情小说亚洲图片:伦| 亚洲人免费视频| 西西444www无码精品| 女BBBBBB女BBB| 亚洲高清电影| 成人小说在线观看| 精品国产乱子伦一区二区三区,小小扐| 日韩欧美黄色电影| 免费毛片网址| 天天色网站| 日韩十八禁网站| 免费成人毛片| 久久久久久一区| 国产TS变态重口人妖| 天天干天天操| 人人色网站| 免费观看一区二区三区| 91乱伦视频| 亚洲乱伦av| 日韩操逼网站| 香蕉漫画在线观看18| 欧美在线视频网| 91亚洲在线| 大香蕉伊人网在线| 熟妇女人妻丰满少妇中文字幕| 色人人| 羞羞涩漫无码免费网站入口| 看黄色一级片| 肉片无遮挡一区二区三区免费观看视频 | 苏妲己一级婬片A片|