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

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

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

如何設(shè)計(jì)MLIR的Dialect來在GPU上生成高性能的代碼?

jf_pmFSk4VX ? 來源:GiantPandaCV ? 2023-05-10 14:57 ? 次閱讀

前言

為什么又要開一個(gè)新坑?原因是,最近在做的項(xiàng)目都是和MLIR有關(guān),并且發(fā)現(xiàn)自己已經(jīng)在MLIR的研發(fā)道路上越走越遠(yuǎn)了。剛剛好前段時(shí)間大家都在跟風(fēng)各種GPT,就去看了看openai目前放出來的產(chǎn)品,無意間發(fā)現(xiàn)了triton這把瑞士軍刀。其實(shí)早在一些年前就聽過triton,那會(huì)的triton代碼還沒有被MLIR進(jìn)行重構(gòu),代碼內(nèi)部的某些邏輯寫的也沒有看的很明白,結(jié)合"Triton: An Intermediate Language and Compiler for Tiled Neural Network Computations"這篇論文其實(shí)也沒有看出太多新的東西。這次在重新?lián)炱饋砜吹臅r(shí)候,發(fā)現(xiàn)其中很多不錯(cuò)的優(yōu)化,其實(shí)還是抱著學(xué)習(xí)如何設(shè)計(jì)MLIR的Dialect來在GPU上生成高性能的代碼為初衷,來對(duì)triton進(jìn)行一個(gè)深入的分析。

什么是Triton?

Triton是openai針對(duì)gpu上的算子優(yōu)化提出的一個(gè)programming language & compiler。以NVIDIA GPU為例,使用triton可以越過cuda的閉源生態(tài),直接將自己的后端接入llvm IR,通過走NVPTX來生成在GPU上的代碼。這樣做相比傳統(tǒng)的手寫cuda代碼的好處是可以不需要借助NVIDIA的nvcc compiler就可以得到在GPU上能跑的machine code。同時(shí),triton的一些設(shè)計(jì)理念對(duì)于 不管是深度學(xué)習(xí)領(lǐng)域還是其他數(shù)據(jù)科學(xué)領(lǐng)域來做高性能計(jì)算來說都可以提供豐富的指導(dǎo)意義。同時(shí),triton不僅僅只支持nv的gpu,它同時(shí)對(duì)amd的gpu,intel的gpu都會(huì)推出后續(xù)的支持方案,這其所就彰顯出了mlir的優(yōu)勢(shì),可以通過設(shè)計(jì)Dialect來支持更多的后端。

源碼編譯Triton

接下來帶大家一起從源碼來編譯下triton的代碼,后續(xù)我準(zhǔn)備分為幾章,對(duì)triton的設(shè)計(jì)以及具體的優(yōu)化細(xì)節(jié)展開分析,能夠給大家一個(gè)較為全面的理解。畢竟triton作為mlir中為數(shù)不多成功的end-to-end的例子,對(duì)于編譯技術(shù)和系統(tǒng)優(yōu)化的研究者或者工程師來說,都是不可或缺的好資料了。

0x0 先去官網(wǎng)clone triton的官方repo

$gitclonehttps://github.com/openai/triton.git
$cdtriton
$gitcheckout132fe1bb01e0a734d39c60835c76da257dbe7151

0x1 安裝第三方依賴

Triton 整個(gè)源碼編譯的過程中,需要使用到兩個(gè)最為重要的依賴,一個(gè)是llvm,一個(gè)是pybind11,我在編譯和構(gòu)建triton的過程中,都是通過手動(dòng)將llvm和pybind11編譯安裝好后,在編譯triton的過程中通過CMakLists.txt來指定對(duì)應(yīng)的路徑。

0x10 LLVM的下載與配置

為什么要使用llvm?其實(shí)大家都知道,這就是triton最吸引人的地方,通過將高層的python代碼一步一步lower到llvm IR,然后通過llvm生態(tài)得到最終可以跑在具體設(shè)備上的machine code,將llvm作為最重要的后端,并且triton內(nèi)部的實(shí)現(xiàn)也被MLIR進(jìn)行重構(gòu),MLIR剛剛好也是llvm中非常重要的一個(gè)子項(xiàng)目。那么,llvm的安裝對(duì)于想要基于triton來進(jìn)行二次開發(fā)的工程師或者研究人員來說就顯得非常重要了。

$gitclonehttps://github.com/llvm/llvm-project
$cdllvm-project
$gitcheckoutf733b4fb9b8b
$mkdirbuild
$cdbuild
$cmake-GNinja../llvm
-DLLVM_ENABLE_PROJECTS=mlir
-DLLVM_BUILD_EXAMPLES=ON
-DLLVM_TARGETS_TO_BUILD="X86;NVPTX;RISCV;AMDGPU"
-DMLIR_ENABLE_CUDA_RUNNER=ON
-DCMAKE_BUILD_TYPE=Release
-DLLVM_ENABLE_ASSERTIONS=ON
-DCMAKE_C_COMPILER=clang
-DCMAKE_CXX_COMPILER=clang++
-DLLVM_ENABLE_RTTI=ON
-DLLVM_INSTALL_UTILS=ON
-DMLIR_INCLUDE_INTEGRATION_TESTS=ON

ninja-j8
sudoninjainstall

經(jīng)過一定時(shí)間的等待,就可以將llvm裝好了

0x11 pybind11的下載與配置

為什么要使用pybind11?pybind11已經(jīng)是目前主流的ai開發(fā)工具中必不可少的組件了。大部分的框架都以python的DSL暴露給用戶,然后用戶通過寫對(duì)應(yīng)的python語法,調(diào)用已經(jīng)用C++/CUDA或者assemble寫好的高性能組件。那么,裝配pybind11的目的就是為了能夠讓我們通過import triton,然后絲滑調(diào)用對(duì)應(yīng)的python api來完成高性能算子生成的任務(wù)。

$pipinstallpytest
$gitclonehttps://github.com/pybind/pybind11.git
$cdpybind11
$mkdirbuild
$cdbuild
$cmake..
$makecheck-j8
$sudomakeinstall

0x2 編譯Triton

$cdtriton
$vimCMakeLists.txt(option(TRITON_BUILD_PYTHON_MODULE"BuildPythonTritonbindings"ON))
$mkdirbuild
$cdbuild
$cmake..
$make-j8
c53e544c-eeff-11ed-90ce-dac502259ad0.pngimg

編輯切換為居中

添加圖片注釋,不超過 140 字(可選)

可以看到最終生成了一個(gè).so文件,libtriton.so

那么接下來只要將libtriton.so文件移動(dòng)到triton/python/triton/_C目錄下,將triton的python路徑下入bashrc

exportTRITON_HOME=/home/Documents/compiler/triton
exportPYTHONPATH=$TRITON_HOME/python:${PYTHONPATH}

然后通過簡(jiǎn)單的import triton,沒有任何錯(cuò)誤則可以通過triton進(jìn)行開發(fā)了

c5670180-eeff-11ed-90ce-dac502259ad0.pngimg

編輯切換為居中

添加圖片注釋,不超過 140 字(可選)

接下來進(jìn)入triton/python/tutorials,隨便找一個(gè)例子進(jìn)行驗(yàn)證,這里我們選擇最常見和實(shí)用的03-matrix-multiplication.py,直接python 03-matrix-multiplication.py,稍等片刻則可以得到最終結(jié)果。

c579b41a-eeff-11ed-90ce-dac502259ad0.pngimg

編輯

添加圖片注釋,不超過 140 字(可選)

可以看到,triton最終生成的代碼,在3090上,對(duì)應(yīng)單batch的gemm在部分size上已經(jīng)超過了cuBLAS。

同時(shí),可以在build目錄下去檢查對(duì)應(yīng)的三個(gè)bin tool: triton-opt, triton-reduce, triton-translate

然后將本機(jī)下的ptxas復(fù)制到該build目錄下,我的ptxas在(/usr/local/cuda-11.6/bin)下。關(guān)于這些工具的使用將會(huì)在后續(xù)的解讀中根據(jù)不同層的dialect之間的conversion來進(jìn)行詳細(xì)介紹。

0x3 為什么采用這樣的編譯方式?

其實(shí)有的同學(xué)說,直接按照triton教程里的pip install -e . 不就行了么?這樣做的原因是因?yàn)楹罄m(xù)我們需要對(duì)triton以及對(duì)應(yīng)的llvm進(jìn)行改進(jìn),每次改進(jìn)后,都需要對(duì)triton和llvm分別進(jìn)行編譯。這種分離的方式,可以使得我們?cè)诟倪M(jìn)完對(duì)應(yīng)的llvm代碼或者triton的源碼后,分步編譯,然后再整合成一個(gè)新的shared library (libtriton.so)

在后續(xù)的教程中,我將會(huì)從triton的frontend, optimizer,backend來作為切入點(diǎn),分別講講triton是如何通過將用戶手寫的python dsl編譯成能跑在gpu上的machine code的。

Triton目前的設(shè)計(jì)

從triton的源碼來看,triton目前在NV的GPU上已經(jīng)有了一套自己比較成熟的mapping路線,通過先對(duì)python語言層,也就是triton DSL進(jìn)行抽象,得到AST,然后將AST中的每個(gè)節(jié)點(diǎn)lower到Triton Dialect上,Triton Dialect則是一個(gè)比較貼近上層語言表達(dá)的IR,他的主要作用則是為了保持用戶在書寫對(duì)應(yīng)算法時(shí)的準(zhǔn)確性。接下來會(huì)進(jìn)一步被map到TritonGPU Dialect上,那么TritonGPU Dialect則是一個(gè)更加貼近GPU層面的IR,它則是為了具體的性能優(yōu)化而設(shè)計(jì)。圖中其他的藍(lán)色模塊,比如SCF,Arith,Tensor等都是MLIR生態(tài)中已經(jīng)被實(shí)現(xiàn)好并且廣為使用的Dialect。

這些Dialect會(huì)一起和TritonGPU Dialect共存,然后被lower到對(duì)應(yīng)的LLVM Dialect,LLVM Dialect則是最貼近LLVM IR的一層設(shè)計(jì),從LLVM Dialect到LLVM IR的轉(zhuǎn)換是非常容易的,最終代碼就會(huì)被接入到LLVM的NVPTX的后端,從而生成后續(xù)能跑在GPU上的高性能machine code.

c5962668-eeff-11ed-90ce-dac502259ad0.pngimg

編輯切換為居中

添加圖片注釋,不超過 140 字(可選)

Triton 未來的支持

通過下圖可以看到,triton的未來計(jì)劃和大多數(shù)的compiler有著一樣的發(fā)展藍(lán)圖,向上去支持各種各樣具有不同表達(dá)能力的前端。向下對(duì)接各種不同廠商的hardware,最終將一個(gè)application高效的map到一個(gè)硬件上。

從哦的

c5ba0b6e-eeff-11ed-90ce-dac502259ad0.pngimg

編輯切換為居中





審核編輯:劉清

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

    關(guān)注

    27

    文章

    4591

    瀏覽量

    128144
  • Triton
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    7007

原文標(biāo)題:OpenAI/Triton MLIR 第零章: 源碼編譯

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何編寫高性能的Rust代碼

    為了最大限度地提高Rust應(yīng)用程序的性能,你需要了解支持代碼的底層硬件架構(gòu),如何優(yōu)化算法和數(shù)據(jù)結(jié)構(gòu),以及如何對(duì)代碼進(jìn)行配置和基準(zhǔn)測(cè)試。本文中,我們將簡(jiǎn)要介紹這些主題,希望能更好地理解
    的頭像 發(fā)表于 11-03 14:28 ?686次閱讀
    如何編寫<b class='flag-5'>高性能</b>的Rust<b class='flag-5'>代碼</b>

    AMD GPU如何安裝和配置triton?

    最近在整理python-based的benchmark代碼,反過來NV的GPU又把Triton裝了一遍,發(fā)現(xiàn)Triton的github repo已經(jīng)給出了對(duì)應(yīng)的llvm的commi
    的頭像 發(fā)表于 02-22 17:04 ?1984次閱讀
    <b class='flag-5'>在</b>AMD <b class='flag-5'>GPU</b><b class='flag-5'>上</b>如何安裝和配置triton?

    TPU-MLIR開發(fā)環(huán)境配置時(shí)出現(xiàn)的各種問題求解

    /workspace/model-zoo 2.4. 代碼編譯? docker的容器中, 代碼編譯方式如下: $ cd tpu-mlir$ source ./envsetup.sh$
    發(fā)表于 01-10 08:02

    【書籍評(píng)測(cè)活動(dòng)NO.43】 算力芯片 | 高性能 CPU/GPU/NPU 微架構(gòu)分析

    力量關(guān)注算力芯片的發(fā)展,希望我們的國(guó)家能夠更獨(dú)立自主地設(shè)計(jì)制造高性能算力芯片。 內(nèi)容簡(jiǎn)介: 本書介紹了超級(jí)計(jì)算機(jī)算力和AI算力的異同,從CPU流水線開始,描述主要的眾核處理器架構(gòu)和功能部件設(shè)計(jì)。GPU
    發(fā)表于 09-02 10:09

    GPU

    的核心處理器。GPU是顯卡的“心臟”,也就相當(dāng)于CPU電腦中的作用,它決定了該顯卡的檔次和大部分性能,同時(shí)也是2D顯示卡和3D顯示卡的區(qū)別依據(jù)。圖形處理芯片。GPU能夠從硬件
    發(fā)表于 01-16 08:59

    NVIDIA火熱招聘GPU高性能計(jì)算架構(gòu)師

    GPU架構(gòu)設(shè)計(jì)者提供反饋,以改善和推進(jìn)未來GPU的架構(gòu)設(shè)計(jì)基本要求(其一即可): * 嚴(yán)謹(jǐn)?shù)倪壿嬎季S和分析能力* 有CUDA代碼調(diào)優(yōu)經(jīng)驗(yàn)(或者SIMD等架構(gòu)的調(diào)優(yōu)經(jīng)驗(yàn))* 熟悉矩陣計(jì)算的優(yōu)化和加速* 較強(qiáng)C++編程能力、算法分析
    發(fā)表于 09-01 17:22

    探求NVIDIA GPU極限性能的利器

    1、探求 NVIDIA GPU 極限性能的利器  通常的 CUDA 編程中,用戶主要通過 CUDA C/C++ 或 python 語言實(shí)現(xiàn) CUDA 功能的調(diào)用。 NVIDIA 對(duì)
    發(fā)表于 10-11 14:35

    如何使用iMX8mmini提高GPU性能?

    支持 1000 MHz)。我需要幫助提高 GPU 性能,即將 GPU 頻率提高到 800 MHz。目前我正在使用內(nèi)核 5.4.142,以下是 GP
    發(fā)表于 04-18 07:17

    智能網(wǎng)卡簡(jiǎn)介及其高性能計(jì)算中的作用

    最先進(jìn)的人工智能模型不到五年的時(shí)間內(nèi)經(jīng)歷了超過 5,000 倍的規(guī)模擴(kuò)展。這些 AI 模型嚴(yán)重依賴復(fù)雜的計(jì)算和大量?jī)?nèi)存實(shí)現(xiàn)高性能深度神經(jīng)網(wǎng)絡(luò) (DNN)。只有使用 CPU、GPU
    發(fā)表于 07-28 10:10

    如何將高性能計(jì)算和科學(xué)計(jì)算應(yīng)用軟件更好的部署到GPU計(jì)算平臺(tái)

    NVIDIA 與智東西公開課共同策劃推出「GPU 加速高性能計(jì)算(HPC)經(jīng)典應(yīng)用在線研討會(huì)」。研討會(huì)將聚焦經(jīng)典高性能計(jì)算和科學(xué)計(jì)算應(yīng)用,以及如何在 GPU 平臺(tái)更好的加速這些應(yīng)用。
    的頭像 發(fā)表于 05-27 09:53 ?1465次閱讀

    【開源硬件】從PyTorch到RTL - 基于MLIR的高層次綜合技術(shù)

    決FPGA的可編程性問題,實(shí)現(xiàn)從算法到RTL設(shè)計(jì)的快速編譯,我們引入了基于MLIR(多級(jí)別中間表示)的高層次綜合框架ScaleHLS,對(duì)算法的高層次描述進(jìn)行多級(jí)別的抽象和優(yōu)化,并生成高性能的RTL實(shí)現(xiàn)。 本次
    的頭像 發(fā)表于 11-24 08:15 ?1730次閱讀

    ClaudeMLIR代碼分析完全超越了ChatGPT

    EliminateAllocOpsPass用來消除IR中的無效memref.alloc指令,AppendOneFlowStreamPass給GPU相關(guān)的函數(shù)添加GPU啟動(dòng)kernel需要
    的頭像 發(fā)表于 04-19 10:25 ?1206次閱讀

    ClaudeMLIR代碼分析完全超越了ChatGPT并表現(xiàn)十分驚艷

    EliminateAllocOpsPass用來消除IR中的無效memref.alloc指令,AppendOneFlowStreamPass給GPU相關(guān)的函數(shù)添加GPU啟動(dòng)kernel需要
    的頭像 發(fā)表于 04-24 14:28 ?3161次閱讀
    Claude<b class='flag-5'>在</b><b class='flag-5'>MLIR</b><b class='flag-5'>代碼</b>分析<b class='flag-5'>上</b>完全超越了ChatGPT并表現(xiàn)十分驚艷

    TPU-MLIR之量化感知訓(xùn)練

    TPU-MLIR之量化感知訓(xùn)練(
    的頭像 發(fā)表于 08-21 10:47 ?703次閱讀
    TPU-<b class='flag-5'>MLIR</b>之量化感知訓(xùn)練

    如何適配新架構(gòu)?TPU-MLIR代碼生成CodeGen全解析!

    背景介紹TPU-MLIR的CodeGen是BModel生成的最后一步,該過程目的是將MLIR文件轉(zhuǎn)換成最終的Bmodel。本文介紹了CodeGen的基本原理和流程,并記錄了針對(duì)BM1684X等新架構(gòu)
    的頭像 發(fā)表于 11-02 08:34 ?1416次閱讀
    如何適配新架構(gòu)?TPU-<b class='flag-5'>MLIR</b><b class='flag-5'>代碼</b><b class='flag-5'>生成</b>CodeGen全解析!