《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > 在CUDA的天下,OpenAI開源GPU編程語言Triton,將同時支持N卡和A卡

在CUDA的天下,OpenAI開源GPU編程語言Triton,將同時支持N卡和A卡

2021-07-29
來源:機器之心
關鍵詞: CUDA GPU

  OpenAI 開源了全新的 GPU 編程語言 Triton,它能成為 CUDA 的替代品嗎?

  過去十年中,深度神經網絡 (DNN) 已成為最重要的機器學習模型之一,創造了從自然語言處理到計算機視覺、計算神經科學等許多領域的 SOTA 實現。DNN 模型的優勢來自于它的層次結構,這一特征導致其計算量巨大,但也會產生大量高度并行化的工作,特別適合多核和眾核處理器。

  深度學習領域的新研究思路往往是結合原生框架 operator 來實現的,這種方法雖然方便,但需要創建或移動許多臨時張量,因此可能會造成神經網絡的性能損失。編寫專門的 GPU 內核或許可以解決這個問題,但 GPU 編程的確是一件相當復雜的事。

  DNN 計算潛力與 GPU 編程困難之間的矛盾由來已久。英偉達在 2007 年發布了 CUDA 的初始版本,CUDA 平臺是一個軟件層,使用者可以直接訪問 GPU 的虛擬指令集和并行計算單元,用于執行計算內核。近年來,主流深度學習框架幾乎都是基于 CUDA 進行加速,英偉達也一直在完善 CUDA 工具包,但對于一般的開發者來說,CUDA 還是「不那么容易上手」。

  今天,OpenAI 正式推出 Triton 1.0,這是一種類 Python 的開源編程語言。即使沒有 CUDA 經驗的研究人員,也能夠高效編寫 GPU 代碼。例如,它可以用不到 25 行代碼寫出與 cuBLAS 性能相匹配的 FP16 矩陣乘法內核,后者是許多專業的 GPU 編程者尚且無法做到的。此外,OpenAI 的研究者已經使用 Triton 成功生成了比 PyTorch 同類實現效率高 2 倍的內核。

  代碼地址:https://github.com/openai/triton

  Triton 的最初想法來源于現任 OpenAI 科學家的 Philippe Tillet 2019 年在哈佛大學攻讀研究生學位時發表的一篇論文,當時他的導師是 H. T. Kung 和 David Cox。

  論文鏈接:http://www.eecs.harvard.edu/~htk/publication/2019-mapl-tillet-kung-cox.pdf

  Tillet 希望解決的問題是打造一種比英偉達的 CUDA 等特定供應商庫更好用的庫,能夠處理神經網絡中涉及矩陣的各種操作,具備可移植性,且性能可與 cuDNN 或類似的供應商庫相媲美。團隊表示:「直接用 CUDA 進行 GPU 編程太難了,比如為 GPU 編寫原生內核或函數這件事,會因為 GPU 編程的復雜性而出奇困難。」

  Facebook AI 研究中心科學家 Soumith Chintala 也在推特上表達了自己對 Triton 的期待:

  新發布的 Triton 可以為一些核心的神經網絡任務(例如矩陣乘法)提供顯著的易用性優勢。「我們的目標是使其成為深度學習 CUDA 的可行替代方案,」Philippe Tillet 作為 Triton 項目負責人如此表示。

  GPU 編程面臨的挑戰

  現代 GPU 的架構大致可以分為三個主要組件:DRAM、SRAM 和 ALU。優化 CUDA 代碼時,必須考慮到每一個組件:

  來自 DRAM 的內存傳輸必須合并進大型事務,以利用現代內存接口的總線位寬;

  必須在數據重新使用之前手動存儲到 SRAM 中,并進行管理以最大限度地減少檢索時共享內存庫沖突;

  計算必須在流處理器(SM)內部或之間細致分區和調度,以促進指令 / 線程級的并行以及專用算術邏輯單元(ALU)的利用。

  GPU 基礎架構。

  種種因素導致 GPU 編程難度驟增,即使對于具有多年經驗的 CUDA 程序員也是如此。Triton 的目的是將這些優化過程自動化,以此讓開發人員更專注于并行代碼的高級邏輯。出于對泛用能力的考量,Triton 不會自動調度跨流處理器的工作,而是將一些重要的算法考慮因素(例如 tiling、SM 間同步)留給開發者自行決定。

  CUDA vs Triton 編譯器優化對比。

  編程模型

  在所有可用的領域專用語言和 JIT 編譯器中,Triton 或許與 Numba 最相似:內核被定義為修飾過的 Python 函數,并與實例網格上不同的 program_id 的同時啟動。但不同之處值得注意:如下圖代碼片段所示,Triton 通過對 block 的操作來展示 intra-instance 并行,此處 block 是維數為 2 的冪的數組,而不是單指令多線程(SIMT)執行模型。如此一來,Triton 高效地抽象出了與 CUDA 線程 block 內的并發相關的所有問題(比如內存合并、共享內存同步 / 沖突、張量核心調度)。

  Triton 中的向量加法。

  雖然這對 embarrassingly 并行(即 element-wise)計算可能沒什么幫助,但是可以簡化更復雜的 GPU 程序的開發。例如,在融合 softmax 核的情況下,對于每個輸入張量 X∈R^M×N 來說,每個實例對給定輸入張量的不同行進行歸一化。這種并行化策略的標準 CUDA 實現可能難以編寫,需要線程之間的顯式同步,因為這種策略并發地減少 X 的同一行。而 Triton 很大程度上消除了這種復雜性,每個內核實例加載感興趣的行,并使用類似 NumPy 的原語順序對其進行規范化。

  import triton

  import triton.language as tl

  @triton.jit

  def softmax(Y, stride_ym, stride_yn, X, stride_xm, stride_xn, M, N):

  # row index

  m = tl.program_id(0)

  # col indices

  # this specific kernel only works for matrices that

  # have less than BLOCK_SIZE columns

  BLOCK_SIZE = 1024

  n = tl.arange(0, BLOCK_SIZE)

  # the memory address of all the elements

  # that we want to load can be computed as follows

  X = X + m * stride_xm + n * stride_xn

  # load input data; pad out-of-bounds elements with 0

  x = tl.load(X, mask=n < N, other=-float(‘inf’))

  # compute numerically-stable softmax

  z = x - tl.max(x, axis=0)

  num = tl.exp(z)

  denom = tl.sum(num, axis=0)

  y = num / denom

  # write back to Y

  Y = Y + m * stride_ym + n * stride_yn

  tl.store(Y, y, mask=n < N)

  import torch

  # Allocate input/output tensors

  X = torch.normal(0, 1, size=(583, 931), device='cuda‘)

  Y = torch.empty_like(X)

  # SPMD launch grid

  grid = (X.shape[0], )

  # enqueue GPU kernel

  softmax[grid](Y, Y.stride(0), Y.stride(1),

  X, X.stride(0), X.stride(1),

  X.shape[0]    , X.shape[1])

  在 Triton 中融合 softmax

  Triton JIT 把 X、Y 當作指針而不是張量。最重要的是,softmax 這種特殊實現方式在整個規范化過程中保持 SRAM 中 X 的行不變,從而在適用時最大限度地實現數據重用(約 32K 列)。這與 PyTorch 的內部 CUDA 代碼不同,后者使用臨時內存使其更通用,但速度明顯變慢(見下圖)。

  融合 softmax、M=4096 的 A100 性能。

  Torch (v1.9) JIT 較低的性能突出了從高級張量操作序列自動生成 CUDA 代碼的難度。

  @torch.jit.script

  def softmax(x):

  x_max = x.max(dim=1)[0]

  z = x - x_max[:, None]

  numerator = torch.exp(x)

  denominator = numerator.sum(dim=1)

  return numerator / denominator[:, None]

  融合 softmax 與 Torch JIT

  矩陣乘法

  能夠為元素操作(element-wise operation)和規約操作(reduction operation)編寫融合內核是很重要的,但考慮到神經網絡中矩陣乘法的重要性,這還不夠。事實證明,Triton 在這些方面表現很好,僅用大約 25 行 Python 代碼就能達到最佳性能。相比之下,CUDA 效率就沒有那么高了。

  Triton 中的矩陣乘法。

  手寫矩陣乘法內核的一個重要優點是它們可以根據需要進行定制,以適應其輸入(例如切片)和輸出(例如 Leaky ReLU)的融合變換。假如不存在 Triton 這樣的系統,那么對于沒有出色的 GPU 編程專業知識的開發人員來說,矩陣乘法內核將很難大改。

  高級系統架構

  Triton 的良好性能得益于以 Triton-IR 為中心的模塊化系統架構。Triton-IR 是一種基于 LLVM 的中間表示,多維值塊(blocks of values)是其中最重要的東西。

  Triton 的高級架構。

  @triton.jit 裝飾器的工作原理是遍歷由 Python 函數提供的抽象語法樹(AST),這樣一來就能使用通用的 SSA 構造算法實時生成 Triton-IR。生成的 IR 代碼隨后由編譯器后端進行簡化、優化和自動并行化,然后轉換為高質量的 LLVM-IR,最終轉換為 PTX,以便在最新的 NVIDIA GPU 上執行。目前 Triton 還不支持 CPU 和 AMD GPU,但團隊表示對二者的支持正在開發中。

  編譯器后端

  研究人員發現通過 Triton-IR 來使用塊狀程序表示,這種方法允許編譯器自動執行各種重要的程序優化。例如,通過查看計算密集型塊級操作(例如 tl.dot)的操作數,數據可以自動存儲到共享內存中,并使用標準的活躍性分析技術進行數據的分配與同步。

  Triton 編譯器通過分析計算密集型操作中使用的塊變量的活動范圍來分配共享內存。

  此外,Triton 還可以在 SM 之間以及 SM 之內高效、自動地并行化,前者通過并發執行不同的內核實例來實現,后者通過分析每個塊級操作的迭代空間,并將其充分劃分到不同的 SIMD 單元來實現。如下所示:

  Triton 自動并行化。每個塊級操作都定義了一個塊級迭代空間,該空間可以自動并行化以利用 SM(Streaming Multiprocessor) 上的可用資源。




微信圖片_20210517164139.jpg

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
女主播福利一区| 欧美大片在线观看| 亚洲国产小视频在线观看| 中国女人久久久| 在线电影国产精品| 国产在线观看精品一区二区三区 | 欧美日本网站| 久久免费视频在线| 久久精品国产一区二区电影 | 亚洲一区二区三区四区中文| 亚洲日本中文字幕| 久久精品国产在热久久| 午夜一区二区三区在线观看| 中文欧美字幕免费| 艳妇臀荡乳欲伦亚洲一区| 亚洲人成高清| 亚洲激情在线播放| 国产一区av在线| 国产裸体写真av一区二区| 欧美三级中文字幕在线观看| 欧美日韩国产bt| 久久国产精品网站| 午夜一区不卡| 亚洲欧美电影在线观看| 亚洲欧美国产毛片在线| 亚洲一区二区日本| 亚洲在线观看免费视频| 亚洲综合丁香| 亚洲欧美怡红院| 性欧美videos另类喷潮| 欧美影视一区| 久久嫩草精品久久久精品一| 久久青草久久| 美国成人直播| 欧美激情一区二区三区| 欧美区高清在线| 欧美视频三区在线播放| 国产精品毛片高清在线完整版| 国产精品大片免费观看| 国产精品麻豆va在线播放| 国产精品亚洲视频| 国产一区深夜福利| 国内偷自视频区视频综合| 精品电影一区| 亚洲区在线播放| 99riav久久精品riav| 亚洲在线成人精品| 欧美在线视屏| 亚洲激情国产| 中国成人亚色综合网站| 午夜精品免费在线| 久久综合婷婷| 国产精品美女www爽爽爽| 好看不卡的中文字幕| 9色porny自拍视频一区二区| 久久成人免费| 亚洲午夜精品17c| 久久夜色精品国产噜噜av| 欧美小视频在线| 依依成人综合视频| 亚洲网站在线播放| 亚洲欧洲在线视频| 欧美中文字幕在线观看| 欧美精品亚洲二区| 国产一区二区三区最好精华液| 亚洲美女黄网| 久久精品国亚洲| 午夜欧美大尺度福利影院在线看 | 午夜在线观看欧美| 夜色激情一区二区| 久久综合久久88| 国产精品乱人伦一区二区| 亚洲欧洲一区二区三区在线观看| 午夜国产精品视频| 亚洲一区综合| 欧美精品一区二区三区高清aⅴ| 国内精品免费午夜毛片| 亚洲自拍偷拍福利| 一区二区三区 在线观看视| 久久人人97超碰精品888| 国产精品免费一区豆花| 亚洲精品黄色| 亚洲国产成人久久综合一区| 欧美一级视频| 国产精品电影观看| 99精品欧美| 日韩亚洲综合在线| 欧美a级在线| 狠狠久久五月精品中文字幕| 亚洲影院一区| 亚洲一区二区在线观看视频| 欧美日韩1区| 亚洲精品1区| 91久久夜色精品国产网站| 久久人人看视频| 国产日韩欧美精品一区| 亚洲一区二区视频在线| 中文亚洲字幕| 欧美日韩情趣电影| 亚洲精品社区| 一区二区高清视频在线观看| 欧美黄色一区| 亚洲国产天堂久久综合网| 亚洲激情第一页| 免费成人av在线看| 影音先锋成人资源站| 久久精品一区二区三区中文字幕 | 国产精品户外野外| 在线亚洲国产精品网站| 亚洲视频自拍偷拍| 欧美日韩成人综合在线一区二区| 亚洲经典三级| 一本色道久久| 欧美日产一区二区三区在线观看| 亚洲精品一区二区三区在线观看| 一二美女精品欧洲| 欧美日本三区| 在线亚洲美日韩| 亚洲欧美日韩另类| 国产精品爽黄69| 亚洲欧洲99久久| 久久精品国产91精品亚洲| 国内精品久久久久久影视8| 久久精品国亚洲| 欧美aⅴ一区二区三区视频| 亚洲国产日韩欧美| 99精品欧美一区二区蜜桃免费| 欧美精品国产精品| 日韩午夜剧场| 亚洲欧美成人精品| 国产色综合天天综合网| 久久国产精品99国产| 久久久夜夜夜| 亚洲国产成人午夜在线一区| 91久久在线观看| 欧美日韩国产黄| 亚洲视屏在线播放| 久久精品国产2020观看福利| 激情久久婷婷| 99视频超级精品| 国产精品进线69影院| 午夜欧美不卡精品aaaaa| 久久最新视频| 亚洲精品久久久久久下一站| 亚洲视频一区二区免费在线观看| 国产免费亚洲高清| 亚洲电影免费观看高清完整版在线观看 | 亚洲视频播放| 久久久久久久欧美精品| 最新国产乱人伦偷精品免费网站| 亚洲一区二区欧美| 国产日韩1区| 亚洲精品一区在线| 国产精品美女久久久| 久久激情视频久久| 欧美日韩视频在线一区二区 | 亚洲国产精品久久精品怡红院| 亚洲视频 欧洲视频| 国产欧美日韩亚洲一区二区三区| 亚洲韩国青草视频| 国产精品99免费看| 亚洲电影在线观看| 国产精品国产三级欧美二区| 久久精品国产成人| 国产精品99一区二区| 亚洲第一在线综合网站| 欧美日韩黄视频| 欧美专区中文字幕| 欧美日韩免费观看一区| 欧美一区二区私人影院日本| 欧美精品在线免费观看| 欧美一区二区三区男人的天堂 | 欧美美女日韩| 欧美在线视频观看| 欧美日韩一区二区三| 久久精品国产亚洲aⅴ| 欧美日韩情趣电影| 亚洲二区精品| 国产精品美女久久久| 日韩一级大片| 国语自产精品视频在线看一大j8 | 欧美成年视频| 午夜视频久久久| 欧美日韩蜜桃| 亚洲国产一区二区在线| 国产老女人精品毛片久久| 日韩视频―中文字幕| 国产亚洲综合在线| 亚洲综合电影| 亚洲日本aⅴ片在线观看香蕉| 久久精品国产亚洲精品| 一区二区三区国产在线观看| 欧美sm视频| 欧美亚洲三级| 欧美午夜视频在线| 亚洲精品欧美| 一区二区在线不卡| 久久国产精品99国产精| 一区二区三区 在线观看视频 | 国产精品乱人伦一区二区|