《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > 在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私拍在线观看| 亚洲欧美在线看| 中文无字幕一区二区三区| 亚洲精品乱码久久久久久蜜桃91| 亚洲第一二三四五区| 欧美一级视频精品观看| 亚洲欧美国产日韩天堂区| 亚洲一区二区三区高清不卡| 亚洲网在线观看| 亚洲一区二区三区午夜| 亚洲亚洲精品三区日韩精品在线视频| 一区二区三区四区五区视频| 99精品99久久久久久宅男| 亚洲精品美女在线| 日韩一级免费| 在线亚洲国产精品网站| 一区二区三区免费在线观看| 亚洲视频一二三| 亚洲在线国产日韩欧美| 午夜精品视频一区| 欧美制服丝袜第一页| 久久精品人人爽| 亚洲精品国产欧美| 制服丝袜亚洲播放| 亚洲欧美日韩国产中文| 亚洲欧美日韩国产中文| 欧美在线|欧美| 久久久久综合网| 欧美成熟视频| 欧美午夜不卡影院在线观看完整版免费| 欧美日韩系列| 国产欧美一区二区视频| 国模精品一区二区三区| 亚洲国产日韩欧美在线99| 亚洲美女av在线播放| 正在播放日韩| 欧美一区2区视频在线观看 | 久久福利精品| 老司机aⅴ在线精品导航| 欧美黄在线观看| 欧美午夜宅男影院在线观看| 国产日产精品一区二区三区四区的观看方式 | 国外视频精品毛片| 亚洲国产欧美在线| 亚洲天堂激情| 亚洲第一中文字幕| 一区二区三区国产在线| 欧美一区二区三区四区在线| 久久综合九色99| 欧美三区在线观看| 国产综合视频| 一本不卡影院| 亚洲第一精品久久忘忧草社区| 日韩亚洲欧美一区| 欧美一区二区三区日韩| 欧美国产一区在线| 国产老肥熟一区二区三区| 一区二区三区在线高清| 日韩一级黄色大片| 久久精品国产99精品国产亚洲性色| 亚洲精品日韩精品| 欧美一区二区三区视频免费播放| 蜜桃av一区二区| 国产老肥熟一区二区三区| 亚洲黄色成人网| 欧美一区二视频| 中文欧美字幕免费| 久久伊人一区二区| 国产精品久久久久9999高清 | 亚洲国产成人av| 亚洲欧美韩国| 一本色道久久综合亚洲精品按摩| 久久精品人人| 国产精品成人v| 亚洲黄色在线| 欧美在线啊v一区| 亚洲综合色噜噜狠狠| 欧美国产亚洲视频| 激情综合色综合久久| 亚洲一区二区精品在线观看| 亚洲美女精品一区| 久久香蕉精品| 国产乱理伦片在线观看夜一区| 最近中文字幕日韩精品| 欧美在线啊v| 欧美一区二区精品在线| 欧美调教vk| 亚洲激情偷拍| 亚洲国产高清高潮精品美女| 欧美在线免费一级片| 欧美视频手机在线| 亚洲国产欧美国产综合一区| 欧美一级视频| 欧美在线播放视频| 国产精品扒开腿做爽爽爽视频| 亚洲品质自拍| 亚洲精品四区| 葵司免费一区二区三区四区五区| 国产精品系列在线| 亚洲视频在线看| 亚洲一区二区三区视频播放| 欧美精选一区| 亚洲精品视频二区| 亚洲人成在线观看一区二区| 久久午夜影视| 韩国女主播一区| 性欧美在线看片a免费观看| 亚洲欧美网站| 国产精品素人视频| 亚洲一区国产一区| 亚洲欧美激情诱惑| 国产精品裸体一区二区三区| 一区二区三区回区在观看免费视频| 99国产精品99久久久久久粉嫩| 欧美粗暴jizz性欧美20| 在线不卡亚洲| 亚洲人成免费| 欧美国产亚洲另类动漫| 亚洲欧洲精品成人久久奇米网| 日韩视频精品在线观看| 欧美精品免费播放| 亚洲精品在线免费观看视频| 99精品国产在热久久| 欧美日韩亚洲一区二区三区四区| 亚洲精选视频免费看| 一区二区三区久久久| 欧美色网一区二区| 亚洲天堂免费在线观看视频| 亚洲专区一二三| 国产精品自拍在线| 欧美在线啊v| 牛牛影视久久网| 亚洲欧洲久久| 中文在线一区| 国产精品视频精品| 欧美一区二区视频网站| 久久一二三四| 亚洲国产精品久久久| 夜夜爽夜夜爽精品视频| 国产精品成人aaaaa网站| 亚洲中字黄色| 久久久久久黄| 亚洲国产精品久久91精品| 亚洲深夜影院| 国产精品一区在线观看| 欧美主播一区二区三区| 欧美成人免费网站| 夜夜嗨av一区二区三区| 欧美亚洲综合另类| 一区二区三区在线不卡| 夜夜嗨av色综合久久久综合网| 国产精品久久久久9999高清| 午夜在线不卡| 欧美激情精品| 亚洲一区免费视频| 久久久久久亚洲精品杨幂换脸| 亚洲国产三级在线| 亚洲男女自偷自拍图片另类| 国产亚洲精品久久飘花| 亚洲看片免费| 国产精品一区二区三区乱码 | 亚洲激情视频| 欧美视频在线观看视频极品| 亚洲欧美www| 欧美sm视频| 中文久久精品| 美国三级日本三级久久99| 日韩一级黄色av| 久久久综合网| 亚洲日韩中文字幕在线播放| 午夜综合激情| 亚洲高清在线观看| 亚洲在线一区二区三区| 一区二区三区在线观看视频| 亚洲一区二区三区中文字幕在线 | 在线精品国产欧美| 亚洲一区欧美二区| 一区二区在线视频播放| 亚洲一区日本| 一色屋精品视频免费看| 亚洲一区视频在线观看视频| 怡红院精品视频| 亚洲女优在线| 亚洲高清资源| 久久成人免费视频| 亚洲精品一区二区三区在线观看| 久久精品国产77777蜜臀| 亚洲免费不卡| 久久天天躁狠狠躁夜夜爽蜜月 | 制服丝袜激情欧洲亚洲| 蜜桃精品久久久久久久免费影院| 亚洲四色影视在线观看| 欧美国产日本在线| 久久aⅴ国产欧美74aaa| 欧美午夜精品久久久| 亚洲精品久久久久久久久久久| 国产欧美综合一区二区三区| 亚洲视频在线视频| 在线成人免费观看|