国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

綜述|核心開發(fā)者全面解讀Pytorch內(nèi)部機制

共 8560字,需瀏覽 18分鐘

 ·

2020-09-11 22:42

↑ 點擊藍字?關(guān)注極市平臺

作者丨Edward?Z. Yang
來源丨機器之心
編輯丨極市平臺

極市導讀

?

Edward Z. Yang 是PyTorch開源項目的核心開發(fā)者之一。在PyTorch紐約聚會上,他做了一個有關(guān)PyTorch內(nèi)部機制的演講,本文即為該演講的中文翻譯,通過這篇文章,能夠幫助大家了解Pytorch的基本概念結(jié)構(gòu),以及一些相關(guān)工具和技巧。

大家好!今天我想談?wù)?PyTorch 的內(nèi)部機制。
這份演講是為用過 PyTorch,并且有心為 PyTorch 做貢獻但卻被 PyTorch 那龐大的 C++ 代碼庫勸退的人提供的。沒必要說謊:PyTorch 代碼庫有時候確實讓人難以招架。
本演講的目的是為你提供一份導航圖:為你講解一個「支持自動微分的張量庫」的基本概念結(jié)構(gòu),并為你提供一些能幫你在代碼庫中尋路的工具和技巧。我預設(shè)你之前已經(jīng)寫過一些 PyTorch,但卻可能還沒有深入理解機器學習軟件庫的編寫方式。
本演講分為兩部分:在第一部分中,我首先會全面介紹張量庫的各種概念。我首先會談?wù)勀銈冎狼蚁矏鄣膹埩繑?shù)據(jù)類型,并詳細討論這種數(shù)據(jù)類型究竟能提供什么,這能讓我們更好地理解其內(nèi)部真正的實現(xiàn)方式。
如果你是一位 PyTorch 高級用戶,你可能已經(jīng)熟悉其中大部分材料了。我們也會談到「擴展點(extension points)」的三個概念、布局(layout)、設(shè)備(device)和數(shù)據(jù)類型(dtype),這能引導我們思考張量類的擴展的方式。在 PyTorch 紐約聚會的現(xiàn)場演講中,我略過了有關(guān)自動梯度(autograd)的幻燈片,但我在這里會進行一些講解。
第二部分會闡述真正用 PyTorch 寫代碼時所涉及的基本細節(jié)。我會告訴你如何在 autograd 代碼中披荊斬棘、什么代碼是真正重要的以及怎樣造福他人,我還會介紹 PyTorch 為你寫核(kernel)所提供的所有炫酷工具。

概念

張量
張量是 PyTorch 中的核心數(shù)據(jù)結(jié)構(gòu)。對于張量直觀上所表示的東西,你可能已有很好的理解:張量是一種包含某種標量類型(比如浮點數(shù)和整型數(shù)等)的 n 維數(shù)據(jù)結(jié)構(gòu)。我們可以將張量看作是由一些數(shù)據(jù)構(gòu)成的,還有一些元數(shù)據(jù)描述了張量的大小、所包含的元素的類型(dtype)、張量所在的設(shè)備(CPU 內(nèi)存?CUDA 內(nèi)存?)
另外還有一個你可能沒那么熟悉的元數(shù)據(jù):步幅(stride)。stride 實際上是 PyTorch 最別致的特征之一,所以值得稍微多討論它一些。
張量一個數(shù)學概念。但要在我們的計算機中表示它,我們必須為它們定義某種物理表示方法。最常用的表示方法是在內(nèi)存中相鄰地放置張量的每個元素(這也是術(shù)語「contiguous(鄰接)」的來源),即將每一行寫出到內(nèi)存,如上所示。在上面的案例中,我已經(jīng)指定該張量包含 32 位的整型數(shù),這樣你可以看到每一個整型數(shù)都位于一個物理地址中,每個地址與相鄰地址相距 4 字節(jié)。為了記住張量的實際維度,我們必須將規(guī)模大小記為額外的元數(shù)據(jù)。
所以這幅圖與步幅有什么關(guān)系?
假設(shè)我想要讀取我的邏輯表示中位置張量 [0,1] 的元素。我該如何將這個邏輯位置轉(zhuǎn)譯為物理內(nèi)存中的位置?步幅能讓我們做到這一點:要找到一個張量中任意元素的位置,我將每個索引與該維度下各自的步幅相乘,然后將它們?nèi)考拥揭黄?。在上圖中,我用藍色表示第一個維度,用紅色表示第二個維度,以便你了解該步幅計算中的索引和步幅。進行這個求和后,我得到了 2(零索引的);實際上,數(shù)字 3 正是位于這個鄰接數(shù)組的起點以下 2 個位置。
(后面我還會談到 TensorAccessor,這是一個處理索引計算的便利類(convenience class)。當你使用 TensorAccessor 時,不會再操作原始指針,這些計算過程已經(jīng)為你隱藏了起來。)
步幅是我們?yōu)?PyTorch 用戶講解方法的基本基礎(chǔ)。舉個例子,假設(shè)我想取出一個表示以上張量的第二行的張量:
使用高級的索引支持,我只需寫出張量 [1, :] 就能得到這一行。重要的是:當我這樣做時,不會創(chuàng)建一個新張量;而是會返回一個基于底層數(shù)據(jù)的不同域段(view)的張量。這意味著,如果我編輯該視角下的這些數(shù)據(jù),它就會反映在原始的張量中。
在這種情況下,了解如何做到這一點并不算太困難:3 和 4 位于鄰接的內(nèi)存中,我們只需要記錄一個說明該(邏輯)張量的數(shù)據(jù)位于頂部以下 2 個位置的偏移量(offset)。(每個張量都記錄一個偏移量,但大多數(shù)時候它為零,出現(xiàn)這種情況時我會在我的圖表中省略它。)

演講時的提問:如果我取張量的一個域段,我該如何釋放底層張量的內(nèi)存?


答案:你必須制作該域段的一個副本,由此斷開其與原始物理內(nèi)存的連接。你能做的其它事情實際上并不多。另外,如果你很久之前寫過 Java,取一個字符串的子字符串也有類似的問題,因為默認不會制作副本,所以子字符串會保留(可能非常大的字符串)。很顯然,Java 7u6 將其固定了下來。

如果我想取第一列,還會更有意思:
當我們查看物理內(nèi)存時,可以看到該列的元素不是相鄰的:兩者之間有一個元素的間隙。步幅在這里就大顯神威了:我們不再將一個元素與下一個元素之間的步幅指定為 1,而是將其設(shè)定為 2,即跳兩步。(順便一提,這就是其被稱為「步幅(stride)」的原因:如果我們將索引看作是在布局上行走,步幅就指定了我們每次邁步時向前多少位置。)
步幅表示實際上可以讓你表示所有類型的張量域段;如果你想了解各種不同的可能做法,請參閱?

https://ezyang.github.io/stride-visualizer/index.html

我們現(xiàn)在退一步看看,想想我們究竟如何實現(xiàn)這種功能(畢竟這是一個關(guān)于內(nèi)部機制的演講)。如果我們可以得到張量的域段,這就意味著我們必須解耦張量的概念(你所知道且喜愛的面向用戶的概念)以及存儲張量的數(shù)據(jù)的實際物理數(shù)據(jù)的概念(稱為「存儲(storage)」):
也許會有多個張量共享同一存儲。存儲會定義張量的 dtype 和物理大小,同時每個張量還會記錄大小、步幅和偏移量,這定義的是物理內(nèi)存的邏輯解釋。
有一點需要注意:總是會存在一個張量-存儲對,即使并不真正需要存儲的「簡單」情況也是如此(比如,只是用 torch.zeros(2, 2) 劃配一個鄰接張量時)。
順便一提,我們感興趣的不是這種情況,而是有一個分立的存儲概念的情況,只是將一個域段定義為有一個基張量支持的張量。這會更加復雜一些,但也有好處:鄰接張量可以實現(xiàn)遠遠更加直接的表示,而沒有存儲造成的間接麻煩。這樣的變化能讓 PyTorch 的內(nèi)部表示方式更接近 Numpy。
我們已經(jīng)介紹了一些張量的數(shù)據(jù)布局(有人可能會說,如果你正確地理解了數(shù)據(jù)表示,其它一切都會自然到位)。但還是有必要簡要談?wù)勅绾螌崿F(xiàn)對張量的操作。在最抽象的層面上,當你調(diào)用 torch.mm 時,會發(fā)生兩次調(diào)度:
第一次調(diào)度基于設(shè)備類型和張量布局:比如是 CPU 張量還是 CUDA張量,是有步幅的張量還是稀疏的張量。這個調(diào)度是動態(tài)的:這是一個虛函數(shù)(virtual function)調(diào)用(這個虛函數(shù)調(diào)用究竟發(fā)生在何處是本演講后半部分的主題)。
這里需要做一次調(diào)度應(yīng)該是合理的:CPU 矩陣乘法的實現(xiàn)非常不同于 CUDA 的實現(xiàn)。這里是動態(tài)調(diào)度的原因是這些核(kernel)可能位于不同的庫(比如 libcaffe2.so 或 libcaffe2_gpu.so),這樣你就別無選擇:如果你想進入一個你沒有直接依賴的庫,你必須通過動態(tài)調(diào)度抵達那里。
第二次調(diào)度是在所涉 dtype 上的調(diào)度。這個調(diào)度只是一個簡單的 switch 語句,針對的是核選擇支持的任意 dtype。這里需要調(diào)度的原因也很合理:CPU 代碼(或 CUDA 代碼)是基于 float 實現(xiàn)乘法,這不同于用于 int 的代碼。這說明你需要為每種 dtype 都使用不同的核。
如果你想要理解 PyTorch 中算子的調(diào)用方式,這可能就是你頭腦中應(yīng)有的最重要的知識。后面當我們更深入代碼時還會回到這里。
因為我們已經(jīng)談過了張量,所以我還想花點時間談?wù)剰埩繑U展。畢竟,除了密集的 CPU 浮點數(shù)張量,還有其它很多類型的張量,比如 XLA 張量、量化張量、MKL-DNN 張量;而對于一個張量庫,還有一件需要思考的事情:如何兼顧這些擴展?
我們當前的用于擴展的模型提供了張量的四個擴展點。首先,有三個獨立地確定張量類型的配套參數(shù):
device(設(shè)備):描述了實際存儲張量的物理內(nèi)存,比如在 CPU、英偉達 GPU(cuda)、AMD GPU(hip)或 TPU(xla)上。設(shè)備之間各不相同的特性是有各自自己的分配器(allocator),這沒法用于其它設(shè)備。
layout(布局):描述了對物理內(nèi)存進行邏輯解讀的方式。最常用的布局是有步幅的張量(strided tensor),但稀疏張量的布局不同,其涉及到一對張量,一個用于索引,一個用于數(shù)據(jù);MKL-DNN 張量的布局更加奇特,比如 blocked layout,僅用步幅不能表示它。
dtype(數(shù)據(jù)類型):描述了張量中每個元素實際存儲的數(shù)據(jù)的類型,比如可以是浮點數(shù)、整型數(shù)或量化的整型數(shù)。
如果你想為 PyTorch 張量添加一種擴展,你應(yīng)該思考你想要擴展這些參數(shù)中的哪幾種。這些參數(shù)的笛卡爾積定義了你可以得到的所有可能的張量?,F(xiàn)在,并非所有這些組合都有核(誰為 FPGA 上的稀疏量化張量用核?),但原則上這種組合可能有意義,因此我們至少應(yīng)該支持表達它。
要為張量的功能添加「擴展」,還有最后一種方法,即圍繞能實現(xiàn)的目標類型的 PyTorch 張量編寫一個 wrapper(包裝)類。這可能聽起來理所當然,但有時候人們在只需要制作一個 wrapper 類時卻跑去擴展那三個參數(shù)。wrapper 類的一個突出優(yōu)點是開發(fā)結(jié)果可以完全不影響原來的類型(out of tree)。
你何時應(yīng)該編寫張量 wrapper,而不是擴展 PyTorch 本身?關(guān)鍵的指標是你是否需要將這個張量傳遞通過 autograd(自動梯度)反向通過過程。舉個例子,這個指標告訴我們稀疏張量應(yīng)該是一種真正的張量擴展,而不只是一種包含一個索引和值張量的 Python 對象:當在涉及嵌入的網(wǎng)絡(luò)上執(zhí)行優(yōu)化時,我們想要嵌入生成稀疏的梯度。
我們對擴展的理念也會影響張量本身的數(shù)據(jù)布局。對于我們的張量結(jié)構(gòu),我們真正想要的一件事物是固定的布局:我們不想要基本操作(這個說法很常見),比如「一個張量的大小是多少?」來請求虛調(diào)度。
所以當你查看一個張量的實際布局時(定義為 TensorImpl 結(jié)構(gòu)),會看到所有字段的一個公共前綴——我們認為所有類似「張量」的東西都會有;還有一些字段僅真正適用于有步幅的張量,但它們也很重要,所以我們將其保留在主結(jié)構(gòu)中;然后可以在每個張量的基礎(chǔ)上完成有自定義字段的后綴。比如稀疏張量可將其索引和值存儲在這個后綴中。
自動梯度(autograd)
我已經(jīng)說明了張量,但如果 PyTorch 僅有這點把戲,這就只不過是 Numpy 的克隆罷了。PyTorch 的顯著特性是其在最初發(fā)布時就已提供對張量的自動微分(現(xiàn)在我們還有 TorchScript 等炫酷功能,但那時候就只有這個?。?/span>
自動微分是做啥?這是負責運行神經(jīng)網(wǎng)絡(luò)的機制:
……以及填充實際計算你的網(wǎng)絡(luò)的梯度時所缺少的代碼:
花點時間看看這幅圖。其中有很多東西需要解讀,我們來看看:
首先將你的目光投向紅色和藍色的變量。PyTorch 實現(xiàn)了反向模式自動微分,這意味著我們可以「反向」走過前向計算來有效地計算梯度。查看變量名就能看到這一點:在紅色部分的底部,我們計算的是損失(loss);然后在這個程序的藍色部分,我們所做的第一件事是計算 grad_loss。loss 根據(jù) next_h2 計算,這樣我們可以計算出 grad_next_h2。從技術(shù)上講,我們加了 grad_ 的變量其實并不是梯度,它們實際上左乘了一個向量的雅可比矩陣,但在 PyTorch 中,我們就稱之為 grad,基本上所有人都知道這是什么意思。
如果代碼的結(jié)構(gòu)保持一樣,而行為沒有保持一樣:來自前向的每一行都被替換為一個不同的計算,其代表了前向運算的導數(shù)。舉個例子,tanh 運算被轉(zhuǎn)譯成了 tanh_backward 運算(這兩行用圖左邊一條灰線連接)。前向和反向運算的輸入和輸出交換:如果前向運算得到 next_h2,反向運算就以 grad_next_h2 為輸入。
autograd 的意義就在于執(zhí)行這幅圖所描述的計算,但卻不用真正生成這個源。PyTorch autograd 并不執(zhí)行源到源的變換(盡管 PyTorch JIT 確實知道如何執(zhí)行符號微分(symbolic differentiation))。
要做到這一點,我們需要在張量上執(zhí)行運算時存儲更多元數(shù)據(jù)。讓我們調(diào)整一下我們對張量數(shù)據(jù)結(jié)構(gòu)的圖:現(xiàn)在不只是一個指向存儲的張量,我們還有一個包裝這個張量的變量,而且也存儲更多信息(AutogradMeta),這是用戶在自己的 PyTorch 腳本中調(diào)用 loss.backward() 執(zhí)行 autograd 時所需的。
這張幻燈片的內(nèi)容在不久的將來就會過時。Will Feng 在簡單融合了 PyTorch 的前端端口之后,正在推動 C++ 中變量和張量的融合:
https://github.com/pytorch/pytorch/issues/13638。
我們也必須更新上面關(guān)于調(diào)度的圖:
在我們調(diào)度到 CPU 或 CUDA 實現(xiàn)之前,還有另一個對變量的調(diào)度,其負責打開(unwrap)變量,調(diào)用底層實現(xiàn)(綠色),然后再重新將結(jié)果包裝進變量并為反向過程記錄必需的 autograd 元數(shù)據(jù)。
某些實現(xiàn)不會 unwrap;它們只是調(diào)用其它變量實現(xiàn)。所以你可能要在變量宇宙中花些時間。但是,一旦你 unwrap 并進入了非變量張量宇宙,你就到達終點了;你再也不用退回變量(除非從你的函數(shù)返回)。
在我的紐約聚會演講中,我跳過了以下七頁幻燈片。對它們的文本介紹還要等一段時間。

工程開發(fā)

說夠了概念,我們來看看代碼。
找到你的路徑
PyTorch 有大量文件夾,在 CONTRIBUTING.md 文檔中有對它們的非常詳細的描述,但實際上你只需知曉 4 個目錄:
首先,torch/ 包含你最熟悉的東西:你導入和使用的實際的 Python 模塊。這些東西是 Python 代碼而且易于操作(只需要進行修改然后查看結(jié)果即可)。但是,如果太過深入……
torch/csrc/:實現(xiàn)了你可能稱為 PyTorch 前端的 C++ 代碼。用更描述性的術(shù)語講,它實現(xiàn)了在 Python 和 C++ 間轉(zhuǎn)換的綁定代碼(binding code);另外還有一些相當重要的 PyTorch 部分,比如 autograd 引擎和 JIT 編譯器。它也包含 C++ 前端代碼。
aten/:這是「A Tensor Library」的縮寫(由 Zachary DeVito 命名),是一個實現(xiàn)張量運算的 C++ 庫。如果你檢查某些核代碼所處的位置,很可能就在 ATen。ATen 本身就分為兩個算子區(qū)域:「原生」算子(算子的現(xiàn)代的 C++ 實現(xiàn))和「傳統(tǒng)」算子(TH、THC、THNN、THCUNN),這些是遺留的 C 實現(xiàn)。傳統(tǒng)的算子是其中糟糕的部分;如果可以,請勿在上面耗費太多時間。
c10/:這是「Caffe2」和「A"Ten"」的雙關(guān)語,包含 PyTorch 的核心抽象,包括張量和存儲數(shù)據(jù)結(jié)構(gòu)的實際實現(xiàn)。
找代碼需要看很多地方;我們應(yīng)該簡化目錄結(jié)構(gòu),就是這樣。如果你想研究算子,你應(yīng)該在 aten 上花時間。
我們看看在實踐中是如何分離這些代碼的:
當你調(diào)用一個函數(shù)時,比如 torch.add,會發(fā)生什么?如果你記得我們的有關(guān)調(diào)度的討論,你腦中應(yīng)該已有了這些基礎(chǔ):
  • 我們必須從 Python 國度轉(zhuǎn)換到 C++ 國度(Python 參數(shù)解析)。

  • 我們處理變量調(diào)度(VariableType—Type,順便一提,和編程語言類型并無特別關(guān)聯(lián),只是一個用于執(zhí)行調(diào)度的小工具)。

  • 我們處理設(shè)備類型/布局調(diào)度(Type)。

  • 我們有實際的核,這要么是一個現(xiàn)代的原生函數(shù),要么是傳統(tǒng)的 TH 函數(shù)。

其中每一步都具體對應(yīng)于一些代碼。讓我們開路穿過這片叢林。
我們在 C++ 代碼中的起始著陸點是一個 Python 函數(shù)的 C 實現(xiàn),我們已經(jīng)在 Python 那邊見過它,像是 torch._C.VariableFunctions.add。THPVariable_add 就是這樣一個實現(xiàn)。
對于這些代碼,有一點很重要:這些代碼是自動生成的。如果你在 GitHub 庫中搜索,你沒法找到它們,因為你必須實際 build PyTorch 才能看到它們。另外一點也很重要:你不需要真正深入理解這些代碼是在做什么,你應(yīng)該快速瀏覽它,知道它的功能。
我在上面用藍色標注了最重要的部分:你可以看到這里使用了一個 PythonArgParser 類來從 Python args 和 kwargs 取出 C++ 對象;然后我們調(diào)用一個 dispatch_add 函數(shù)(紅色內(nèi)聯(lián));這會釋放全局解釋器鎖,然后調(diào)用在 C++ 張量自身上的一個普通的舊方法。在其回來的路上,我們將返回的 Tensor 重新包裝進 PyObject。
(這里幻燈片中有個錯誤:我應(yīng)該講解變量調(diào)度代碼。我這里還沒有修復。某些神奇的事發(fā)生了,于是……)
當我們在 Tensor 類上調(diào)用 add 方法時,還沒有虛調(diào)度發(fā)生。相反,我有一個內(nèi)聯(lián)方法,其調(diào)用了一個內(nèi)聯(lián)方法,其會在「Type」對象上調(diào)用一個虛方法。這個方法是真正的虛方法(這就是我說 Type 只是一個讓你實現(xiàn)動態(tài)調(diào)度的「小工具」的原因)。
在這個特定案例中,這個虛調(diào)用會調(diào)度到在一個名為 TypeDefault 的類上的 add 的實現(xiàn)。這剛好是因為我們有一個對所有設(shè)備類型(CPU 和 CUDA)都一樣的 add 的實現(xiàn);如果我們剛好有不同的實現(xiàn),我們可能最終會得到 CPUFloatType::add 這樣的結(jié)果。正是這種虛方法的實現(xiàn)能讓我們最終得到實際的核代碼。
也希望這張幻燈片很快過時;Roy Li 正在研究使用另一種機制替代 Type 調(diào)度,這能讓我們更好地在移動端上支持 PyTorch。
值得再次強調(diào),一直到我們到達核,所有這些代碼都是自動生成的。
道路蜿蜒曲折,一旦你能基本上把握方向了,我建議你直接跳到核部分。
編寫核(kernel)
PyTorch 為有望編寫核的人提供了大量有用工具。在這一節(jié)我們會了解其中一些。但首先,編寫核需要什么?
我們一般將 PyTorch 中的核看作由以下部分組成:
首先有一些我們要寫的有關(guān)核的元數(shù)據(jù),這能助力代碼生成并讓你獲取所有與 Python 的捆綁包,同時無需寫任何一行代碼。
一旦你到達了核,你就經(jīng)過了設(shè)備類型/布局調(diào)度。你首先需要寫的是錯誤檢查,以確保輸入的張量有正確的維度。(錯誤檢查真正很重要!不要吝惜它!)
接下來,我們一般必須分配我們將要寫入輸出的結(jié)果張量。
該到寫核的時候了?,F(xiàn)在你應(yīng)該做第二次 dtype 調(diào)度,以跳至其所操作的每個 dtype 特定的核。(你不應(yīng)該過早做這件事,因為那樣的話你就會毫無用處地復制在任何情況下看起來都一樣的代碼。)
大多數(shù)高性能核都需要某種形式的并行化,這樣就能利用多 CPU 系統(tǒng)了。(CUDA 核是「隱式」并行化的,因為它們的編程模型構(gòu)建于大規(guī)模并行化之上。)
最后,你需要讀取數(shù)據(jù)并執(zhí)行你想做的計算!
在后面的幻燈片中,我將介紹 PyTorch 中能幫你實現(xiàn)這些步驟的工具。
要充分利用 PyTorch 的代碼生成能力,你需要為你的算子寫一個模式(schema)。這個模式能提供你的函數(shù)的 mypy 風格類型,并控制是否為 Tensor 上的方法或函數(shù)生成捆綁包。你還可以告訴模式針對給定的設(shè)備-布局組合,應(yīng)該調(diào)用你的算子的哪種實現(xiàn)。
有關(guān)這種格式的更多信息,請參閱:https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native/README.md
你可能也需要為你在 derivatives.yaml 中的操作定義一個導數(shù)。
錯誤檢查可以在低層 API 完成,也能通過高層 API 實現(xiàn)。低層 API 只是一個宏 TORCH_CHECK,其接收的是一個布爾值,然后還有任意數(shù)量的參數(shù)構(gòu)成錯誤字符串(error string)以便得出結(jié)論看該布爾值是否為真。
這個宏有個很好的地方:你可以將字符串與非字符串數(shù)據(jù)混合起來;每一項都使用它們的 operator<< 實現(xiàn)進行格式化,PyTorch 中大多數(shù)重要的數(shù)據(jù)類型都有 operator<< 實現(xiàn)。
高層 API 能讓你免于反復編寫重復的錯誤消息。其工作方法是;你首先將每個張量包裝為 TensorArg,這包含有關(guān)張量來處的信息(比如其參數(shù)名稱)。然后它提供了一些預先裝好的用于檢查多種屬性的函數(shù);比如 checkDim() 測試的是張量的維度是否是一個固定數(shù)值。如果不是,該函數(shù)就基于 TensorArg 元數(shù)據(jù)提供一個用戶友好的錯誤消息。
在用 PyTorch 寫算子時,有一點很重要:你往往要注冊三個算子:abs_out(其操作的是一個預分配的輸出,其實現(xiàn)了 out= keyword 參數(shù))、abs_(其操作的是 inplace)、abs(這只是一個算子的普通的舊功能版本)。
大部分時間,abs_out 是真正的主力,abs 和 abs_ 只是圍繞 abs_out 的薄弱 wrapper;但有時候也可為每個案例編寫專門的實現(xiàn)。
要執(zhí)行 dtype 調(diào)度,你應(yīng)該使用 AT_DISPATCH_ALL_TYPES 宏。這會獲取你想要進行調(diào)度操作的張量的 dtype,并還會為可從該宏調(diào)度的每個 dtype 指定一個 lambda。通常而言,這個 lambda 只是調(diào)用一個模板輔助函數(shù)。
這個宏不只是「執(zhí)行調(diào)度」,它也會決定你的核將支持的 dtype。這樣,這個宏實際上就有相當多一些版本,這能讓你選取不同的 dtype 子集以生成特定結(jié)果。大多數(shù)時候,你只需要 AT_DISPATCH_ALL_TYPES,但也要關(guān)注你可能需要調(diào)度其它更多類型的情況。
在 CPU 上,你通常需要并行化你的代碼。過去,這通常是通過直接在你的代碼中添加 OpenMP pragma 來實現(xiàn)。
某些時候,你必須真正訪問數(shù)據(jù)。PyTorch 為此提供了相當多一些選擇。
如果你只想獲取某個特定位置的值,你應(yīng)該使用 TensorAccessor。張量存取器就像是一個張量,但它將張量的維度和 dtype 硬編碼為了模板參數(shù)。當你檢索一個存取器時,比如 x.accessor ();,我們會做一次運行時間測試以確保張量確實是這種格式;但那之后,每次存取都不會被檢查。張量存取器能正確地處理步幅,因此你最好使用它們,而不是原始的指針訪問(不幸的是,很多傳統(tǒng)的核是這樣做的)。另外還有 PackedTensorAccessor,這特別適用于通過 CUDA launch 發(fā)送存取器,這樣你就能從你的 CUDA 核內(nèi)部獲取存取器。(一個值得一提的問題:TensorAccessor 默認是 64 位索引,這比 CUDA 中的 32 位索引要慢得多?。?/span>
如果你在用很常規(guī)的元素存取編寫某種算子,比如逐點運算,那么使用遠遠更高級的抽象要好得多,比如 TensorIterator。這個輔助類能為你自動處理廣播和類型提升(type promotion),相當好用。
要在 CPU 上獲得真正的速度,你可能需要使用向量化的 CPU 指令編寫你的核。我們也有用于這方面的輔助函數(shù)!Vec256 類表示一種標量向量,并提供了一些能在它們上一次性執(zhí)行向量化運算的方法。然后 binary_kernel_vec 等輔助函數(shù)能讓你輕松地運行向量化運算,然后結(jié)束那些沒法用普通的舊指令很好地轉(zhuǎn)換成向量指令的東西。這里的基礎(chǔ)設(shè)施還能在不同指令集下多次編譯你的核,然后在運行時間測試你的 CPU 支持什么指令,再在這些情況中使用最佳的核。
PyTorch 中大量核都仍然是用傳統(tǒng)的 TH 風格編寫的。(順便一提,TH 代表 TorcH。這是個很好的縮寫詞,但很不幸被污染了;如果你看到名稱中有 TH,可認為它是傳統(tǒng)的。)傳統(tǒng) TH 風格是什么意思呢?
它是以 C 風格書寫的,沒有(或很少)使用 C++。
其 refcounted 是人工的(使用了對 THTensor_free 的人工調(diào)用以降低你使用張量結(jié)束時的 refcounts)。
其位于 generic/ 目錄,這意味著我們實際上要編譯這個文件很多次,但要使用不同的 #define scalar_t
這種代碼相當瘋狂,而且我們討厭回顧它,所以請不要添加它。如果你想寫代碼但對核編寫了解不多,你能做的一件有用的事情:將某些 TH 函數(shù)移植到 ATen。
工作流程效率
最后我想談?wù)勗?PyTorch 上的工作效率。如果 PyTorch 那龐大的 C++ 代碼庫是阻攔人們?yōu)?PyTorch 做貢獻的第一只攔路虎,那么你的工作流程的效率就是第二只。如果你想用 Python 習慣開發(fā) C++,那可能會很艱辛:重新編譯 PyTorch 需要大量時間,你也需要大量時間才能知道你的修改是否有效。
如何高效工作本身可能就值得做一場演講,但這頁幻燈片總結(jié)了一些我曾見過某些人抱怨的最常見的反模式:「開發(fā) PyTorch 很困難?!?/span>
如果你編輯一個 header,尤其是被許多源文件包含的 header(尤其當被 CUDA 文件包含時),可以預見會有很長的重新 build 時間。盡量只編輯 cpp 文件,編輯 header 要審慎!
我們的 CI 是一種非常好的零設(shè)置的測試修改是否有效的方法。但在獲得返回信號之前你可能需要等上一兩個小時。如果你在進行一種將需要大量實驗的改變,那就花點時間設(shè)置一個本地開發(fā)環(huán)境。類似地,如果你在特定的 CI 配置上遇到了困難的 debug 問題,就在本地設(shè)置它。你可以將 Docker 鏡像下載到本地并運行:
https://github.com/pytorch/ossci-job-dsl
貢獻指南解釋了如何設(shè)置 ccache:
https://github.com/pytorch/pytorch/blob/master/CONTRIBUTING.md#use-ccache
強烈建議這個,因為這可以讓你在編輯 header 時幸運地避免大量重新編譯。當我們在不應(yīng)該重新編譯文件時重新編譯時,這也能幫你覆蓋我們的 build 系統(tǒng)的漏洞。
最后,我們會有大量 C++ 代碼。如果你是在一臺有 CPU 和 RAM 的強大服務(wù)器上 build,那么會有很愉快的體驗。特別要說明,我不建議在筆記本電腦上執(zhí)行 CUDA build。build CUDA 非常非常慢,而筆記本電腦往往性能不足,不足以快速完成。

參與進來!


這就是我們旋風一般的 PyTorch 內(nèi)核之旅了!其中省略了很多很多東西;但希望這里的描述和解釋至少能幫你消化其代碼庫中相當大一部分。
接下來該做什么?你能做出怎樣的貢獻?我們的問題跟蹤器是個開始的好地方:
https://github.com/pytorch/pytorch/issues
從今年開始,我們一直在分類鑒別問題;標注有「triaged」的問題表示至少有一個 PyTorch 開發(fā)者研究過它并對該問題進行了初步評估。你可以使用這些標簽找到我們認為哪些問題是高優(yōu)先級的或查看針對特定模塊(如 autograd)的問題,也能找到我們認為是小問題的問題。(警告:我們有時是錯的?。?/span>
即使你并不想馬上就開始寫代碼,也仍有很多其它有用的工作值得去做,比如改善文檔(我很喜歡合并文檔 PR,它們都很贊)、幫助我們重現(xiàn)來自其他用戶的 bug 報告以及幫助我們討論問題跟蹤器上的 RFC。沒有我們的開源貢獻者,PyTorch 不會走到今天;我們希望你也能加入我們!
原文地址:http://blog.ezyang.com/2019/05/pytorch-internals/

推薦閱讀


添加極市小助手微信(ID : cvmart2),備注:姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳),即可申請加入極市目標檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強/OCR/視頻理解等技術(shù)交流群:月大咖直播分享、真實項目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~

△長按添加極市小助手

△長按關(guān)注極市平臺,獲取最新CV干貨

覺得有用麻煩給個在看啦~??
瀏覽 70
點贊
評論
收藏
分享

手機掃一掃分享

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

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 亚洲欧美成人在线视频| 一区二区三区AV| 狠狠的日| 躁BBB躁BBB躁BBBBBB日| 欧美成人一区免费视频| 午夜无码鲁丝片午夜精品一区二区| 特级丰满少妇免费观看| 国产18女人水真多免费看| 国内一级A片| 欧美在线观看网站18| 毛片在线看片| 性满足BBwBBWBBw| 91在线免费视频| 日韩欧美在线视频| 韩国三级中文字幕HD久久精品| 丁香五香天堂| 伊人成人网视频| 欧美一区二区三区系列电影| 超碰成人欧美| 99热最新国产| 久久久久9| 久操福利| 亚洲h| 国产熟妇| 亚洲vs天堂vs成人vs无码| 91视频观看| 亚洲中文字幕电影| 日本三级片网站在线观看| 国产精选在线| 嘿嘿av| 丝袜三级片| 99热国产在线观看| 欧美黄色免费网站| 在线观看黄色AV| 成人免费毛片AAAAAA片| 亚洲欧美在线观看| 成人区色情综合小说| 日本色影院| 青青草综合视频| 男人的天堂视频在线| 69人人| 亚洲最大福利视频| 欧美成人版| 中文字幕精品无码亚| www.日韩系列| 国产一级婬乱片免费| 北条麻妃一区二区三区在线播放 | 久久久偷拍| 中文字幕在线观看网站| 国产黄片自拍| 欧美色爽| 五月天在线观看| 九色PORN视频成人蝌蚪自拍| 在线无码人妻| 大香蕉精品欧美色综合2025| 人人操人人爱人人妻| 十八禁无码| 91人妻人人澡人人爽人人| 日韩国产在线| 夜夜操操| 男女乱伦视频| 欧美成人三区性价比| 成人性生活视频| 青草视频在线观看免费| h片在线免费观看视频| 无码一区二区久久| 久久无码一区二区三区| 欧美在线观看一区| 一本久道视频一本久道| 密臀久久| h网站在线观看| 白丝在线观看| 免费观看高清无码| 国产精品久久久久久久久久两年半 | 亚洲精品秘一区二区三区在线观看| 97色在线| 最美孕交vivoestv另类| 国产精品51麻豆cm传媒| 亚洲成人网站免费观看| 国产操操操| 日韩码线观看视频| 国产免费av在线| 欧美一级特黄A片免费| 黄色片免费看| 人人操人人人| 中文字幕人妻互换av久久| 青草伊人网| 免费日韩黄色电影| 免费a视频在线观看| 亚洲在线观看| 黄片网址大全| 中文在线a∨在线| 大鸡巴在线观看| 婚闹不堪入目A片| 免费看黄色的视频| 一本大道东京热av无码| 五月丁香成人电影| 日韩毛片在线播放| 91人妻人人澡人人爽人人精品| 美女91小视频| 中文字幕在线精品| 欧美第一网站| aaa午夜| 亚洲人妻视频| 一区二区三区免费在线观看| 久久久久久久久久久久成人 | 成人一级黄色片| 无码高清一区| 91精品成人| 苍井空在线播放| 久视频在线观看| 人人操人人操人人操人人操人人操| 亚洲国产精品成人综合色五月| 国产视频一区二区三区四区| 国产亚洲AV| AV无码在线观看| 国产福利视频在线观看| 啪啪啪网站| 91无码| 精品无码一区二区三区| 色五月婷婷AV| 婷婷色色五月天图片| 久久夜色精品噜噜亚洲AV| 丰满人妻一区二区三区视频在线不卡 | 黑人干亚洲| 久久成人A片| 亚洲精品成人片在线观看精品字幕| 日本少妇高清视频| 国产人成视频免费观看| 亚洲高清无码在线观看视频 | 性爱免费专区| 日韩AV三级片| 国产AV高潮| 精品蜜桃秘一区二区三区观看 | 亚洲三级av| 精品国内自产拍在线观看视频| 日本一级片| 成人免费A片喷| 黄色在线免费观看网站| 日本一区二区三区在线观看网站| 在线看片A| 在线观看成年人视频| 久久精品一区二区三区蜜芽的特点| 国产精品18禁| 人人色人人干| 成人免费大香蕉| 精产国品一区二区区别| 天天干天天干天天干| 最近中文字幕高清2019中文字幕| 做爱视频网站18| 热久久综合网站| 精品成人Av一区二区三区| 日韩免费性爱视频| 特级特黄AAAA免费看| 日韩无码黄| 青春草在线免费视频| 高清无码三级片在线观看| av黄页| 欧美午夜视频| 日日干天天操| 91久久精品无码一区二区三区| 99视频在线| 北条麻妃在线播放一区| 天堂久久av| 欧美男女操逼视频| 男人的天堂aa| 欧美在线无码| 免费69视频| 亚洲日韩Av无码中文字幕美国| 国产福利在线播放| 国产成人一区| 一区性爱| AV婷婷在线| 少妇搡BBBB搡BBB搡小说| 亚洲成人三区| 99热大香蕉| 综合影院| 三级片网页| 国产欧美综合一区二区| 无码福利视频| 色婷婷AV一区二区三区之e本道 | 国产美女被操| 国产AV一区二区三区四区五区| 有免费的欧美操逼视频吗| 精品日韩中文字幕| 国产一級A片免费看| 国产成人精品久久久| www亚洲无码| 成人A片在线观看| 亚洲133| 又粗又硬又爽18级A片| 波多野结衣福利视频| 操B影院| 91在线无码精品秘入口男同| 中文字幕久久人妻无码精品蜜桃| 亚洲成人网站在线| 久久久桃色| 刘玥精品A片在线观看| 免费在线观看Av| 日韩人妻精品中文字幕专区不卡| 久久久久久久精| 精品人妻一区二区| 精品人妻一区二区三区四区不卡在| 亚洲欧美婷婷五月色综合| 亚洲黄色小电影| 12—13女人毛片毛片| 亚洲中文婷婷| 欧美性爱中文字幕| 天天躁狠狠躁av| 嘿嘿av| 99做爱| 国产棈品久久久久久久久久九秃| 少妇特黄A一区二区三区| 伊人久久福利视频| 亚洲成人第一网站| 日韩99在线| 丁香五月综合网| 男人的天堂黄色| 中文字幕av高清片,中文在线观看| 香蕉视频免费| 精品一区二| 久久久久亚洲AV成人片乱码| 开心色播五月天| 五月天无码av| 欧美在线va| 欧美大鸡吧视频| 日韩一级性爱视频| 先锋成人在线| 成人性生活免费视频| 日韩人妻无码一区二区三区中文| 91欧美精品成人AAA片| 日韩精品视频一区二区三区| 蜜桃视频一区二区| 亚洲一区二区无码| 日本色色网站免费| 亚洲毛片亚洲毛片亚洲毛片| 日韩av在线电影| 在线观看日本vs欧洲vs美洲| 小佟丽娅大战91哥| 狠狠狠狠狠狠狠狠狠狠| 免费在线黄色视频| 国产AV中文字幕| 九九r在线精品观看视频| 蜜桃免费网站| 九九九九国产| 91色噜噜狠狠色婷婷| 四虎在线观看| 日韩三级片av| www.色在线观看| 俺来了俺去也| 无码中文综合成熟精品AV电影| 欧美性爱无码在线| 国产一区在线看| 日韩免费在线观看视频| 日韩23岁观看| 欧美一区在线视频| 天天色色色| 国产a√| 亚洲AV综合色区无码国产播放| 少妇搡BBBB搡BBB搡毛片少妇| 亚洲香蕉在线视频| 久久免费黄色视频| 在线观看中文字幕视频| 狠狠狠狠狠操| 丝瓜视频| 大香蕉性爱| 午夜大香蕉| 麻豆999| 骚妇大战黑人15P| 亚洲高清无码在线| 超碰在线免费播放| 久久成人18免费网站波多野结衣| 国产色情视频在线观看| AAAA毛片| 日韩久久精品| 麻豆天美蜜桃91| 中字一区人妻水多多| 97国产在线视频| 无码秘蜜桃一区二区| 国产黄色Av| 风流少妇一区二区三区91| 五月婷婷在线观看| 日本特黄视频| 日韩大香蕉在线| 久操免费视频| 精品成人av| 特爽特黄特级特色视频| 亚洲AV中文无码| 小h片在线观看| 嫩BBB搡BBBB搡BBBB| 中文字幕成人在线观看| 黄色成人网站在线免费观看| 久久国产一级片| 亚洲v在线观看| 91传媒在线观看| 欧美在线视频99| 亚洲天堂在线免费观看视频| 亚洲福利网站| 欧美亚洲系列| 熟女AV888| 免费播放片色情A片| 国产网站视频| 青春草在线观看视频| av大片在线观看| 亚洲最大网站| 中文字幕成人视频| 欧美激情五月天| AV天堂影视在线观看| 亚洲免费视频在线看| 思思热思思操免费视频| 成功精品影院| 免费一区| 日本少妇激情视频| 亚洲人妻系列| 日韩一级| aaa三级片| 国产精品福利视频| 欧洲无码一区二区三区| 亚洲天堂AV网| 日韩成人A片| 久久久国产一区二区三区| eeuss一区二区| avcom无码| 国产又粗又猛又爽又黄91精品 | 黄色大片av| 欧美亚洲自拍偷拍| 欧美日逼超碰| 老女人网站| 一区二区三区成人| 学生妹一级片内射视频| 91乱子伦国产乱子伦| 国产精品一区av| 亚洲无码精品在线| 精品人妻午夜| 亚洲精品中文字幕无码| 欧美性爱香蕉视频| 成av人片一区二区三区久久| 人妻天堂| 黄片精品| 色欲欲www成人网站| 小骚逼操死你| 开心黄色网| 久操中文| 亚洲欧美久久久久久久久久久久 | 国产精品V| 在线观看一区二区视频| 国产精品视频网站| 特级丰满少妇免费观看| 色色在线观看| 国产一区二区成人久久919色 | 手机在线毛片| 国产精品内射婷婷一级二| 国产精品福利在线播放| 插菊综合网| 国产精品国产三级国产AⅤ中文| 97无码人妻| 日本在线一级| 久久午夜夜伦鲁鲁一区二区| 欧美自拍第一页| 91站街农村熟女露脸| 91熊猫| 超碰AV在线| 国产久久久久久久久久| 亚洲在线| 自拍偷拍视频网| 国产精品99久久久久的广告情况 | 操逼网首页123| 爽好紧别夹喷水欧美| 天堂在线观看AV| www.6969成人片亚洲| 日本无码片| 亚洲欧美国产视频| 亚洲欧美日韩无码| 国产一级婬片A片免费无成人黑豆 国产真实露脸乱子伦对白高清视频 | 波多野结衣国产区42部| 99视频免费在线观看| 蜜桃久久av一区| 操逼无码| 五月丁香狠狠爱| 久久久久久久久久免费视频| 丰满人妻精品一区二区在线 | 成人不卡视频| 久久精品美臀| 国产精品成人无码专区| 久久久婷婷五月亚洲国产精品| AV中文字幕网| 欧美老女人逼| 日韩黄色一级视频| 国产亚洲精品午夜福利巨大软件| 欧美精品秘一区二区三区蜜臀| 无码热| www亚洲无码A片贴吧| 三级片AAAA| 亚洲老鸭窝| www.四虎成人网站| 久久久无码AV| 婷婷五月天综合网| 人人爱人人操人人干| 久久爱成人| 国产成人无码精品一区秘二区 | 国产性爱精品| 一区二区三区国产精品| 国产黄页| a√天堂资源中文8| 日韩一级无码特黄AAA片| 国产一级AA大片毛片| 日韩黄色av| 天天干91| 亚洲在线| 怮交小拗女小嫩苞视频| 三级成人av| 久久五月婷| 特级西西444WWW无码视频兔费看| 曰本精品综合网在线| 91露脸熟女四川熟女在线观看 | 视频一区二区免费| 成人三级AV| 91综合视频在线播放| 日本三级网站| www.日本黄色视频| 亚洲免费在线视频| 一区二区三区视频在线| 91美女操逼视频| 亚洲小说区图片区| av天堂一区| 人人操人人干人人爽| 91视频免费观看| 99热在线只有精品| 天天撸免费视频| JiZZjiZZ亚洲成熟熟妇| 国产黄色片在线免费观看| 亚洲日韩国产AV无码无码精品| 亚洲在线观看中文字幕| 伊人成人网站| 亚洲爱| 午夜老湿机| 丁香五月激情啪啪啪| 最新国产第一页| 成人无码动漫A片| 久久久成人精品| 亚洲一级免费免费在线观看| 中文字幕第12页| 日本黄色A片免费看| 翔田千里被操120分钟| 手机成人在线视频| 日韩一级在线免费观看| 大香蕉99| 乱子伦国产精品视频| 亚洲成人一二三区| 一区二区免费| 大香蕉在线伊| 超碰成人欧美| 欲撸视频| 亚洲日韩国产AV无码无码精品| 久久精品在线播放| 国内一级A片| 人人操大香蕉| 国产精品无码免费| 国产成人片色情AAAA片| 操B视频在线免费观看| 中文在线字幕电视剧免费平台| 老司机精品| 久久夜色精品噜噜亚洲AV| 精品人妻| 亚洲AV成人片色在线观看高潮| 狼人综合网| 精品国产黄色| 国产乱子伦真实精品!| 91色色| 粉嫩小泬BBBBBB免费| 亚洲热在线视频| 亚洲精品无码视频| 五月丁香婷婷在线| 俄罗斯老熟妇与子伦| 懂色av一区蜜桃| 国产精品成人无码a无码| 久久嫩草| 色婷婷久久久久swag精品| 伊人9999| 91超碰在线播放| 97视频福利| 激情91| 激情五月婷婷五月| 波多野结衣AV网站| 最近日韩中文字幕中文翻译歌词| 亚洲va中文字幕| 国产成人精品免高潮在线观看 | 久久6精品| 亚洲搞清视频日本| 99热亚洲| 青青草超碰在线| 婷婷国产精品视频| 国产欧美综合一区| 成人A片视频| 狼友无码| 国产色在线| 亚洲欧美在线视频免费| 日本欧美在线观看高清| 成人无码视频在线观看| 成熟的国模冰莲[2]| 亚洲久久色| 操b视频网站| 亚色视频| 久久久国产精品在线| 开心色色五月天| 免费精品99| 国产嫩苞又嫩又紧AV在线| 特黄一级A片| 人人摸人人干| 99涩涩| 大香蕉在8线| 色99网站| 日韩黄色片| 豆花视频成人精品视频| 最新中文字幕av| 亚洲aaaaaa| 亚洲小电影| 一级黄色电影免费看| 少妇搡BBBB搡BBB搡AA| 91日韩视频在线| 日批视频| A片小视频| 大荫蒂视频另类XX| 一级内射片在线网站观看| 玩弄大乳乳妾高潮乳喷视频| 日本黄色色情视频| 人妻久操| 久久久久久麻豆| 亚洲一区二区在线| 深爱五月婷婷| 玖玖大香蕉| 久久99精品久久久久久| 91日综合欧美| 黄色小网站在线观看| 久久久精品欧美| 麻酥酥在线视频| 麻豆天美传媒AV果冻传媒| 午夜丁香| 国产无遮挡又黄又爽| 日本中文字幕网| 国产免费成人在线观看| 国产AV激情| 亚洲男人天堂av| 欧美黄页| 爱爱视频免费网站| 亚洲成人a片| 99精品热| 另类罕见稀奇videos| 在线日韩AV| 999热视频| 人妻北条麻妃在线| 日本处女性高潮喷水视频| 人人妻人人爽人人操| 伊人大综合| 蜜桃91在线观看| www.操B| 亚洲天堂av在线观看| 国产精品久久久久野外| 黄色一级在线观看| 69av在线观看视频| 九九久久久久| 狠狠操狠狠插| 日本免费高清视频在线观看一区 | 免费在线观看黄| 国产精品无码一区二区在线欢| 500部大龄熟乱4K视频| 国产成人无码一区二区在线| 人人操av| 内射无码专区久久亚洲| 男女啪啪网| 日韩高清av| 老熟女网站| 在线免费人成视频| 久久国产精品波多野结衣AV| 97国产免费| 91jiujiu| 91香蕉网| 欧洲综合视频| 肉色超薄丝袜脚交一区二区| 欧美男女日逼视频| 91牛| 亚洲在线无码视频| 成人1区| 一本到在线视频| 女人av天堂| AV777777| 99亚洲无码| 91视频美女模特| 色妹子综合| 国产传媒视频| 国产精品va| 日韩性爱在线观看| 亚洲精品国产精品国自产A片同性| 黄色成人网站大全| 做爱视频网站18| 亚洲成人一区| 国产一级二级三级| 亚洲综合免费观看高清完整版| 国产免费a片| 青青草成人电影| 国产精品久久久久久久9999 | 人人澡人人澡人人澡| 四虎永久在线精品| 亚洲精品中文字幕乱码三区91| 超碰97在线精品国产| 四虎成人精品永久免费AV九九 | 亚洲av不卡| 蜜桃视频一区二区三区| 国产精品久久久久久久久久王安宇 | 中文字幕一区二区三区精华液| 一级AA毛片| 特级西西人体WWWWW| 久操亚洲| 国产精品美女毛片j酒店| 91理伦| 免费观看的av| 广西少妇BBwBBwBBw| 欧美国产成人在线| 午夜黄片| 99这里只有精品| 双飞少妇| 操逼网站免费观看| 三级片无码在线观看| 欧美A片在线| 美女极度色诱图片www视频 | 密臀av在线| 超碰在线精品| 欧性猛交ⅩXXX乱大交| 六月激情丁香| 蜜臂AV| 久久国产日韩| www.seses| 久久久久人| 国产视频一区二区在线| 性爱免费专区| 91福利网| 蜜桃视频网| www.色老板| 日韩精品一区二区三区使用方法| 国产在线黄片| 亲子乱一区二区三区视频| 免费操逼网| av网站免费观看| 无码三| 婷婷成人综合| 久久久久久综合| 中文无码专区| 影音av资源| 在线视频一区二区三区四区| 青青草成人在线观看| 色婷婷18正码国产| 超碰青青青| 久热人妻| 欧美AAA大片| 西欧超碰在线| 国产伦精品一区二区三区妓女下载 | 特一级A片| 亚洲AV无码蜜桃| A免费在线观看| chinese高潮老女人| 2018天天日天天操| 久久久久亚洲精品| 亚洲天堂一| 中文一区在线观看| 免费观看A级毛片| 亚洲男女内射| 久久久久久久久久久国产精品| 国产麻豆免费| 国产a片视频| 揄拍成人国产精品视频| 少妇熟女视频| 北条麻妃无码av| 亚洲内射网| 内射日韩| WW免费视频| 青操在线| 99导航| 色老师综合| 黄色视频在线| 91成人在线影院| 中文资源在线√8| 日韩色图在线观看| 91大屁股| av天堂中文| 日本无码成人片在线播放| 人妻18无码人伦一区二区三区精品| 怡春院首页| 蜜桃91在线| 高清无码在线免费视频| 靠逼网站免费观看| 91人妻人人澡人人添人人爽| 777色色色| 日韩欧美在线中文字幕| 日韩久久网站| 精品人妻无码一区二区三区四川人| 男人天堂久久| 国产夫妻自拍AV| 日韩在线一级| 欧美日韩一二| 国产一级a毛一级a毛观看视频网站| 亚洲视频在线免费播放| 日韩高清无码电影| 人人干人人艹| 成人精品免费视频| 日韩黄色一级片| 三级片国产| 亚洲搞清视频日本| 3d动漫一区二区| 在线免费观看国产视频| 欧美一区二区三区成人| 免费在线观看黄色网址| 一级特黄毛片| 狠狠色噜噜狠狠狠7777| 亚州免费视频| 午夜无码高清| 日本欧美在线观看| 一级片黄色| 国产suv精品一区二区| 国产又粗又大| 肏逼网| 无码精品黄色片| 偷窥丶亚洲丶熟女| 69伊人| 息子交尾一区二区三区| 激情国产AV| 国产精品99视频| 人人草大香蕉| 亚洲一级AV| 另类罕见稀奇videos| 18禁网站在线| 亚洲综合激情五月久久| 男人午夜AV| 亚洲欧美手机在线| 亚洲无码十八禁| 国产精品囯产三级囯产AV野外| 日韩欧美视频在线播放| 国产做受91电影| 熟女嗷嗷叫高潮合集91| 日韩熟妇无码中文字幕| 国产传媒三级| 欧美亚洲天堂| 中文字幕淫乱视频欧美| 激情A| AV无码一区| www.97av| 九九久久99| 丰满人妻一区二区三区不卡二| 五月丁香激情视频| 成人网在线观看| 懂色成人Av| 婷婷五月18永久免费视频| 亚洲成人在线视频免费观看| 国产成人AV一区二区三区在线观看| 少妇人妻精品| 国产娇小13videos糟蹋| 日韩成人一区| 日韩精品成人| 五月天超碰| 日韩一区二区在线看在线看| 嫩BBB槡BBBB槡BBBB免费视频 | 污导航在线| 麻酥酥在线视频| 色噜噜人妻av中文字幕| 久久久久成人精品无码| 免费无人区一码二码乱码怎么办| 黑人久久| 五月丁香啪啪啪| 国产盗摄AV| 尻屄视频网站| 波多野结衣一二三区| 亚洲中文字幕在线看| 欧美老逼| 国产小视频在线观看| 超碰护士| 自慰喷水在线观看| 男女无套在线观看免费| 丁香五月综合网| 亚洲欧美另类在线| 国产视频福利| 精国产品一区二区三区A片| 国产精品一区二区在线播放| 成人久久av| 亚洲无码一区二区三区| 成人A片一级| 777免费观看成人电影视频 | 久久嫩草精品久久久久| 影音先锋成人资源| 亚洲a视频在线| 天堂在线v| 欧美性爱视频免费观看| 国产成人视频免费观看| 久久午夜夜伦鲁鲁一区二区| AV你懂得| 黄色视频免费| 69国产精品无码免费| 99精品视频免费看| 国产精品久久久久永久免费看| 91亚洲精品久久久久蜜桃| 五月丁香激情四射| 亚洲在线成人视频| 久久亭亭| 狠狠网| 亚洲无码三级片在线观看| 人人爽人人爽人人| 狠狠躁日日躁夜夜躁A片小说免费 色综合久久久无码中文字幕999 | 天天爽天天爽| 激情一区| 成人性生交片无码免费看人| chinese搡老熟老妇人| 玖玖成人电影| 午夜成人福利电影| 西西www444无码大胆| 亚洲精品成人AV| 做爰视频毛片下载蜜桃视频。| 成年人黄色网址| 美日韩三级| 九九热99视频| 伊人久久香| 免费在线成人网站| 大香蕉一级红色片青青河边草| 青青操青青干| 日韩区一中文字幕a∨| 国模私拍视频| 中文字幕在线免费观看| a片在线免费| 嫩草91| 免费黄色视频大全| 色tv在线| 99国产高清| 影音av资源| 日韩免费高清无码| 中文字幕淫乱视频欧美| 人妻少妇综合| 熟女综合| 在线天堂网| 国产精选在线| 国产日韩中文字幕| 午夜高清视频| 久久高清免费视频| 日韩无码黄色电影| 国产精品内射视频| 人人妻人人爽人人澡人人精品| 偷偷撸在线| 在线国产激情视频| 91狠狠综| 操操操操操| 大香蕉伊人电影| 一级黄色免费片| 黄色福利在线观看| 日本伊人在线综合视频| 少妇厨房愉情理伦BD在线观 | 黄片免费观看视频| 在线免费观看黄色小视频| 国产一区二区三区视频| 国产成人黄色片| 少妇婷婷| 亚洲精品在线视频| 久久国产热在8| 一区二区三区不卡在线| 精品乱子伦一区二区三区免费播放| 高清无码在线视频| a片网站在线观看| 操逼视频欧美| 亚洲秘无码一区二区三区观看| 91在线无码精品秘软件| 激情五月婷婷色| 強姧伦一区二区三区在线播放| 麻豆午夜福利| 99黄网| 狼友在线观看| 翔田千里无码在线观看| 99黄色电影| 自拍偷拍一区| 做爱激情视频网站| 男人天堂视频在线| av资源站| 日本操B久久| 美女特黄视频| 91欧美日韩综合| 亚洲综合一二三区| 丝袜三级片| 中文二区| 香蕉网站操逼片| 国产不卡一| 黄片网站免费看| 麻豆国产成人AV一区二区三区 | 91成人视频免费观看| 婷婷五月丁香花| 初学影院WWWBD英语完整版在线观看| 国产精品国产三级囯产普通话2| 精品麻豆| 欧美色视频在线观| 影音先锋在线视频观看| 成人自拍视频在线观看| 午夜色色影院| 新版欧美内射大全| 成人爱爱免费视频| 国产传媒在线观看| 91无码高清视频| 精品欧美一区二区三区久久久|