0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Triton編譯器的原理和性能

jf_pmFSk4VX ? 來(lái)源:GiantPandaCV ? 2023-12-16 11:22 ? 次閱讀

我們推出了一個(gè)新的系列,對(duì)PytorchConference2023 的博客進(jìn)行中文編譯,會(huì)陸續(xù)在公眾號(hào)發(fā)表。

Triton是一種用于編寫(xiě)高效自定義深度學(xué)習(xí)原語(yǔ)的語(yǔ)言和編譯器。Triton的目的是提供一個(gè)開(kāi)源環(huán)境,以比CUDA更高的生產(chǎn)力編寫(xiě)快速代碼,但也比其他現(xiàn)有DSL具有更大的靈活性。Triton已被采用為T(mén)orch inductor的基本組件,以合成針對(duì)GPU的高效內(nèi)核。與傳統(tǒng)庫(kù)使用相比,這具有多種優(yōu)勢(shì)。它允許創(chuàng)建各種各樣的融合,它可以獨(dú)立調(diào)整,并且它的內(nèi)存占用更小。本次演講將介紹Triton編譯器,并描述使其能夠以最少的用戶(hù)努力生成閃電般快速內(nèi)核的過(guò)程。

全文

今天我要和大家談?wù)劦氖荰riton。那么,我將要討論的大致內(nèi)容是Triton是什么?我們?yōu)槭裁匆獎(jiǎng)?chuàng)建這個(gè)工具?它可以用來(lái)做什么?然后,我將討論如何將其集成在ML編譯器堆棧中。最后,我將簡(jiǎn)要介紹其背后的原理以及編譯器是如何簡(jiǎn)化管理的。

Triton是一個(gè)Python DSL(領(lǐng)域特定語(yǔ)言),旨在用于編寫(xiě)機(jī)器學(xué)習(xí)內(nèi)核。 最初,它嚴(yán)格用于GPU內(nèi)核,但慢慢地?cái)U(kuò)展以支持用于機(jī)器學(xué)習(xí)的任何硬件,包括CPU、ASIC等。Triton的目標(biāo)是讓那些沒(méi)有GPU經(jīng)驗(yàn)的研究人員能夠編寫(xiě)高性能代碼。如果你看到幻燈片底部的圖表,那真的是Triton想要達(dá)到的地方。通過(guò)少量的開(kāi)發(fā)工作,你可以非常接近峰值性能。

95e409ca-9bb7-11ee-8b88-92fbcf53809c.jpg

簡(jiǎn)而言之,Triton是一個(gè)幫助研究人員輕松編寫(xiě)高性能機(jī)器學(xué)習(xí)內(nèi)核的工具,無(wú)論他們是否有GPU經(jīng)驗(yàn)。

當(dāng)然,總是會(huì)有像CUDA或匯編語(yǔ)言這樣的其他語(yǔ)言,它們能讓你獲得同樣或更高的性能,但通常你需要對(duì)硬件有更多的了解,并花費(fèi)更多的時(shí)間。為什么我們需要這種新的語(yǔ)言呢?如果你看看現(xiàn)有的選擇,例如在不同的硬件上編程機(jī)器學(xué)習(xí),有PyTorch這樣的工具,它允許你輕松地將不同類(lèi)型的操作映射到硬件上,并且非常容易從中獲得高性能。

但問(wèn)題在于你對(duì)它的控制非常有限。如果現(xiàn)有的操作集中沒(méi)有你需要的東西,你就只能束手無(wú)策,唯一的解決辦法是走向另一個(gè)極端,例如編寫(xiě)CUDA或編寫(xiě)PTX,甚至直接編寫(xiě)匯編代碼。但問(wèn)題在于,要編寫(xiě)這些語(yǔ)言,你需要真正成為硬件方面的專(zhuān)家,并且用這些語(yǔ)言編寫(xiě)高效的內(nèi)核可能非常棘手 。所以Triton實(shí)際上是嘗試在這里找到一個(gè)中間地帶,它允許用戶(hù)編寫(xiě)高效的內(nèi)核,并有大量的控制權(quán),但又不必關(guān)心那些微小的細(xì)節(jié)。

是的,硬件的細(xì)節(jié)以及如何在特定硬件上獲得性能。實(shí)際上,設(shè)計(jì)的難點(diǎn)在于找到這個(gè)最佳平衡點(diǎn)。Triton的設(shè)計(jì)方式就是找到這個(gè)抽象的平衡點(diǎn),即你想向用戶(hù)暴露什么,以及你想讓編譯器做什么?

95fd4ebc-9bb7-11ee-8b88-92fbcf53809c.jpg

編譯器是生產(chǎn)力工具,真的……在這方面,Triton的目標(biāo)是讓編譯器為你完成你不想做的工作,但仍然讓你能夠控制算法、你想要用來(lái)進(jìn)行調(diào)整的任何tuning。Triton介于Cuda和Torch之間,因?yàn)槟闳匀豢梢跃帉?xiě)自己的算法,你仍然可以控制自己的類(lèi)型,你仍然需要決定是否需要以某種類(lèi)型來(lái)保存中間值,你控制所有的精度。你不必關(guān)心如何處理共享內(nèi)存、在目標(biāo)有張量核時(shí)使用張量核、如何很好地處理負(fù)載聚合,以便你有良好的內(nèi)存訪(fǎng)問(wèn)模式。 這些人們?cè)诰帉?xiě)GPU內(nèi)核時(shí)經(jīng)常要考慮的事情。你總是要擔(dān)心這些問(wèn)題,或者弄清楚我的中間數(shù)據(jù)的布局是什么等等。編譯器會(huì)為你完成這些工作。

讓我們來(lái)看一個(gè)例子。這是一個(gè)softmax內(nèi)核的示例。這是一個(gè)工作解決方案的復(fù)制品,它是有效的。

#https://github.com/openai/triton/blob/main/python/tutorials/02-fused-softmax.py
@triton.jit
defsoftmax_kernel(output_ptr,input_ptr,input_row_stride,output_row_stride,n_cols,BLOCK_SIZE:tl.constexpr):
#Therowsofthesoftmaxareindependent,soweparallelizeacrossthose
row_idx=tl.program_id(0)
#Thestriderepresentshowmuchweneedtoincreasethepointertoadvance1row
row_start_ptr=input_ptr+row_idx*input_row_stride
#Theblocksizeisthenextpoweroftwogreaterthann_cols,sowecanfiteach
#rowinasingleblock
col_offsets=tl.arange(0,BLOCK_SIZE)
input_ptrs=row_start_ptr+col_offsets
#LoadtherowintoSRAM,usingamasksinceBLOCK_SIZEmaybe>thann_cols
row=tl.load(input_ptrs,mask=col_offsets

第一個(gè)有趣的事情是這段代碼相對(duì)較短。如果你用CUDA編寫(xiě)同樣的內(nèi)核,它實(shí)際需要更多的努力。我們可以注意到一些有趣的事情。例如,你可以控制如何在計(jì)算機(jī)上分配工作。多虧了這些編程思想。你可以看到,你仍然可以控制你的內(nèi)存訪(fǎng)問(wèn),因?yàn)槟憧梢栽L(fǎng)問(wèn)指針。你可以基于一些原始指針加載一大塊數(shù)據(jù)。然后編譯器將在后臺(tái)決定將其映射到硬件的最佳方式,以及如何進(jìn)行聚合,如何處理所有事情,以便這個(gè)加載將是有效的,并將分布到你的GPU的不同線(xiàn)程和warp上。但你不必?fù)?dān)心這些。在底部,我們可以看到有一個(gè)歸約操作,通常它會(huì)隱式地使用共享內(nèi)存,但你不必?fù)?dān)心它。編譯器將確保你為其選擇最佳實(shí)現(xiàn),并為你使用共享內(nèi)存。

之后我將討論,如何在典型的設(shè)備上使用triton,除了內(nèi)核他還可以集成到完整的graph編譯器堆棧中:

960f1f20-9bb7-11ee-8b88-92fbcf53809c.jpg

Triton為你提供了一個(gè)非常容易、非常自然的從graph表示直接到實(shí)現(xiàn)的lowering過(guò)程,并且它實(shí)際上允許更簡(jiǎn)單的graph表示實(shí)現(xiàn),因?yàn)槟悴槐匾淮涡陨梢粋€(gè)完美的內(nèi)核。你可以只生成Triton部分,然后Triton編譯器將完成繁重的工作,找出如何有效地將其映射到硬件上。

Triton可以被用作的另一個(gè)地方是它可以被用作自定義操作語(yǔ)言 。像PyTorch這樣的工具,因?yàn)槿绻阆萑肜Ь常鳳yTorch中沒(méi)有實(shí)現(xiàn)某些功能,添加自定義操作是你能夠完成你想要做的事情的唯一解決方案。

讓我們稍微看一下編譯器架構(gòu)。這是一個(gè)非常高層次的查看Triton架構(gòu)的方式。

9629dcca-9bb7-11ee-8b88-92fbcf53809c.jpg

Triton被構(gòu)建為一個(gè)老式編譯器,包括前端、中端和后端。這里有趣的部分是這兩個(gè)塊,Triton IR和Triton GPU IR,它們是Triton的中間IR,這里有很多魔法發(fā)生。你可以在這里看到的另一件有趣的事情是,Triton IR真的允許你針對(duì)不同的硬件進(jìn)行定位,因?yàn)門(mén)riton IR本身對(duì)于這硬件是完全無(wú)關(guān)的。如果我們放大這個(gè)有趣的部分,即基本上發(fā)生在Triton IR和最終的LLVM IR之間的事情,LLVM IR是最終的目標(biāo)。

963d65b0-9bb7-11ee-8b88-92fbcf53809c.jpg

基本上,編譯器首先接收Triton IR,Triton IR與語(yǔ)言本身非常相似。然后,編譯器要做的第一件事是為描述張量如何分布到線(xiàn)程上的布局進(jìn)行關(guān)聯(lián)。這真的是編譯器的核心機(jī)制,因?yàn)榛谶@些布局,有多種路徑可以改變這些布局,并能夠生成一些能夠有效地映射到硬件上的東西。因此,我們會(huì)像進(jìn)行coalesce一樣,嘗試選擇一個(gè)布局,以便加載存儲(chǔ)聚合能夠高效進(jìn)行。

如果機(jī)器有tensorcore,我們會(huì)嘗試使用非常適合tensorcore的布局。然后,我們會(huì)嘗試避免任何布局轉(zhuǎn)換,應(yīng)用一系列典型的編譯器傳遞,然后在此基礎(chǔ)上進(jìn)行轉(zhuǎn)換,基于分析轉(zhuǎn)到llvm ir。

這是非常高層次的,但這就是編譯器的工作原理。嗯,這就是我想告訴你的全部?jī)?nèi)容。Triton正在完全開(kāi)源的情況下進(jìn)行開(kāi)發(fā),非常歡迎貢獻(xiàn)者。我們每個(gè)月都會(huì)舉行社區(qū)會(huì)議。

Triton IR本身對(duì)硬件無(wú)關(guān)。但是,如果你把一個(gè)在目標(biāo)上運(yùn)行良好的內(nèi)核拿過(guò)來(lái),你可能需要重新調(diào)整它,以便在另一個(gè)目標(biāo)上運(yùn)行良好。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1377

    瀏覽量

    40338
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    4759

    瀏覽量

    129111
  • Triton
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    7048
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1637

    瀏覽量

    49188
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5509

    瀏覽量

    121323

原文標(biāo)題:《PytorchConference2023 翻譯系列》6-Triton編譯器

文章出處:【微信號(hào):GiantPandaCV,微信公眾號(hào):GiantPandaCV】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    編譯器是如何工作的_編譯器的工作過(guò)程詳解

    隨著計(jì)算機(jī)的發(fā)展,編譯器已經(jīng)發(fā)揮著十分重要的作用。本文主要介紹了編譯器的種類(lèi)、編譯器的工作原理以及編譯器工作的具體操作過(guò)程及步驟詳解。
    發(fā)表于 12-19 12:54 ?1.6w次閱讀

    王垠談編譯器

    由于早期的 Lisp 編譯器生成的代碼效率普遍低下,成為了 Lisp 失敗的主要原因之一。而現(xiàn)在的高性能 Lisp 編譯器(比
    的頭像 發(fā)表于 03-30 10:45 ?2105次閱讀

    交叉編譯器安裝教程

    交叉編譯器中“交叉”的意思就是在一個(gè)架構(gòu)上編譯另外一個(gè)架構(gòu)的代碼,相當(dāng)于兩種架構(gòu)“交叉”起來(lái)了。Ubuntu 自帶的 gcc 編譯器是針對(duì) X86 架構(gòu)的,而我們現(xiàn)在要編譯的是 ARM
    的頭像 發(fā)表于 09-29 09:12 ?3551次閱讀

    編譯器的優(yōu)化選項(xiàng)

    一個(gè)程序首先要保證正確性,在保證正確性的基礎(chǔ)上,性能也是一個(gè)重要的考量。要編寫(xiě)高性能的程序,第一,必須選擇合適的算法和數(shù)據(jù)結(jié)構(gòu);第二,應(yīng)該編寫(xiě)編譯器能夠有效優(yōu)化以轉(zhuǎn)換成高效可執(zhí)行代碼的源代碼,要做到
    的頭像 發(fā)表于 11-24 15:37 ?931次閱讀
    <b class='flag-5'>編譯器</b>的優(yōu)化選項(xiàng)

    Triton編譯器功能介紹 Triton編譯器使用教程

    Triton 是一個(gè)開(kāi)源的編譯器前端,它支持多種編程語(yǔ)言,包括 C、C++、Fortran 和 Ada。Triton 旨在提供一個(gè)可擴(kuò)展和可定制的編譯器框架,允許開(kāi)發(fā)者添加新的編程語(yǔ)言
    的頭像 發(fā)表于 12-24 17:23 ?473次閱讀

    Triton編譯器與其他編譯器的比較

    Triton編譯器與其他編譯器的比較主要體現(xiàn)在以下幾個(gè)方面: 一、定位與目標(biāo) Triton編譯器 : 定位:專(zhuān)注于深度學(xué)習(xí)中最核心、最耗時(shí)的
    的頭像 發(fā)表于 12-24 17:25 ?403次閱讀

    Triton編譯器支持的編程語(yǔ)言

    Triton編譯器支持的編程語(yǔ)言主要包括以下幾種: 一、主要編程語(yǔ)言 Python :Triton編譯器通過(guò)Python接口提供了對(duì)Triton
    的頭像 發(fā)表于 12-24 17:33 ?391次閱讀

    Triton編譯器安裝步驟詳解

    1. 系統(tǒng)要求 在開(kāi)始安裝之前,請(qǐng)確保您的系統(tǒng)滿(mǎn)足以下要求: 操作系統(tǒng) :支持 Linux 或 Windows(通過(guò) WSL 或 Cygwin)。 編譯器 :GCC 或 Clang。 CMake
    的頭像 發(fā)表于 12-24 17:35 ?385次閱讀

    Triton編譯器的常見(jiàn)問(wèn)題解決方案

    Triton編譯器作為一款專(zhuān)注于深度學(xué)習(xí)的高性能GPU編程工具,在使用過(guò)程中可能會(huì)遇到一些常見(jiàn)問(wèn)題。以下是一些常見(jiàn)問(wèn)題的解決方案: 一、安裝與依賴(lài)問(wèn)題 檢查Python版本 Triton
    的頭像 發(fā)表于 12-24 18:04 ?550次閱讀

    Triton編譯器在機(jī)器學(xué)習(xí)中的應(yīng)用

    1. Triton編譯器概述 Triton編譯器是NVIDIA Triton推理服務(wù)平臺(tái)的一部分,它負(fù)責(zé)將深度學(xué)習(xí)模型轉(zhuǎn)換為優(yōu)化的格式,以便
    的頭像 發(fā)表于 12-24 18:13 ?428次閱讀

    Triton編譯器的優(yōu)勢(shì)與劣勢(shì)分析

    Triton編譯器作為一種新興的深度學(xué)習(xí)編譯器,具有一系列顯著的優(yōu)勢(shì),同時(shí)也存在一些潛在的劣勢(shì)。以下是對(duì)Triton編譯器優(yōu)勢(shì)與劣勢(shì)的分析:
    的頭像 發(fā)表于 12-25 09:07 ?295次閱讀

    Triton編譯器的優(yōu)化技巧

    在現(xiàn)代計(jì)算環(huán)境中,編譯器性能對(duì)于軟件的運(yùn)行效率至關(guān)重要。Triton 編譯器作為一個(gè)先進(jìn)的編譯器框架,提供了一系列的優(yōu)化技術(shù),以確保生成的
    的頭像 發(fā)表于 12-25 09:09 ?259次閱讀

    Triton編譯器在高性能計(jì)算中的應(yīng)用

    性能計(jì)算(High-Performance Computing,HPC)是現(xiàn)代科學(xué)研究和工程計(jì)算中不可或缺的一部分。隨著計(jì)算需求的不斷增長(zhǎng),對(duì)計(jì)算資源的要求也越來(lái)越高。Triton編譯器作為一種
    的頭像 發(fā)表于 12-25 09:11 ?277次閱讀

    Triton編譯器如何提升編程效率

    在現(xiàn)代軟件開(kāi)發(fā)中,編譯器扮演著至關(guān)重要的角色。它們不僅將高級(jí)語(yǔ)言代碼轉(zhuǎn)換為機(jī)器可執(zhí)行的代碼,還通過(guò)各種優(yōu)化技術(shù)提升程序的性能。Triton 編譯器作為一種先進(jìn)的
    的頭像 發(fā)表于 12-25 09:12 ?264次閱讀

    Triton編譯器與GPU編程的結(jié)合應(yīng)用

    Triton編譯器簡(jiǎn)介 Triton編譯器是一種針對(duì)并行計(jì)算優(yōu)化的編譯器,它能夠自動(dòng)將高級(jí)語(yǔ)言代碼轉(zhuǎn)換為針對(duì)特定硬件優(yōu)化的低級(jí)代碼。
    的頭像 發(fā)表于 12-25 09:13 ?270次閱讀