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

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

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

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

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

前言

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

什么是Triton?

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

源碼編譯Triton

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

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

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

0x1 安裝第三方依賴

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

0x10 LLVM的下載與配置

為什么要使用llvm?其實大家都知道,這就是triton最吸引人的地方,通過將高層的python代碼一步一步lower到llvm IR,然后通過llvm生態(tài)得到最終可以跑在具體設(shè)備上的machine code,將llvm作為最重要的后端,并且triton內(nèi)部的實現(xiàn)也被MLIR進行重構(gòu),MLIR剛剛好也是llvm中非常重要的一個子項目。那么,llvm的安裝對于想要基于triton來進行二次開發(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)過一定時間的等待,就可以將llvm裝好了

0x11 pybind11的下載與配置

為什么要使用pybind11?pybind11已經(jīng)是目前主流的ai開發(fā)工具中必不可少的組件了。大部分的框架都以python的DSL暴露給用戶,然后用戶通過寫對應(yīng)的python語法,調(diào)用已經(jīng)用C++/CUDA或者assemble寫好的高性能組件。那么,裝配pybind11的目的就是為了能夠讓我們通過import triton,然后絲滑調(diào)用對應(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 字(可選)

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

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

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

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

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

編輯切換為居中

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

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

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

編輯

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

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

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

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

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

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

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

Triton目前的設(shè)計

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

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

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

編輯切換為居中

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

Triton 未來的支持

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

從哦的

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

編輯切換為居中





審核編輯:劉清

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

    關(guān)注

    27

    文章

    4650

    瀏覽量

    128490
  • Triton
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    7016

原文標題:OpenAI/Triton MLIR 第零章: 源碼編譯

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

收藏 人收藏

    評論

    相關(guān)推薦

    如何編寫高性能的Rust代碼

    為了最大限度地提高Rust應(yīng)用程序的性能,你需要了解支持代碼的底層硬件架構(gòu),如何優(yōu)化算法和數(shù)據(jù)結(jié)構(gòu),以及如何對代碼進行配置和基準測試。本文中,我們將簡要介紹這些主題,希望能更好地理解
    的頭像 發(fā)表于 11-03 14:28 ?752次閱讀
    如何編寫<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)給出了對應(yīng)的llvm的commi
    的頭像 發(fā)表于 02-22 17:04 ?2148次閱讀
    <b class='flag-5'>在</b>AMD <b class='flag-5'>GPU</b><b class='flag-5'>上</b>如何安裝和配置triton?

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

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

    名單公布!【書籍評測活動NO.43】 算力芯片 | 高性能 CPU/GPU/NPU 微架構(gòu)分析

    力,全球范圍內(nèi),對于推動科技進步、經(jīng)濟發(fā)展及社會整體的運作具有至關(guān)重要的作用。隨著信息技術(shù)的高速發(fā)展,高性能計算(HPC)和人工智能(AI)等技術(shù)多個領(lǐng)域的應(yīng)用變得日益廣泛,芯片算力成為支持這些
    發(fā)表于 09-02 10:09

    GPU

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

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

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

    探求NVIDIA GPU極限性能的利器

    1、探求 NVIDIA GPU 極限性能的利器  通常的 CUDA 編程中,用戶主要通過 CUDA C/C++ 或 python 語言實現(xiàn) CUDA 功能的調(diào)用。 NVIDIA 對
    發(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)卡簡介及其高性能計算中的作用

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

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

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

    ClaudeMLIR代碼分析完全超越了ChatGPT

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

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

    EliminateAllocOpsPass用來消除IR中的無效memref.alloc指令,AppendOneFlowStreamPass給GPU相關(guān)的函數(shù)添加GPU啟動kernel需要
    的頭像 發(fā)表于 04-24 14:28 ?3182次閱讀
    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 ?741次閱讀
    TPU-<b class='flag-5'>MLIR</b>之量化感知訓(xùn)練

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

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

    GPU高性能服務(wù)器配置

    GPU高性能服務(wù)器作為提升計算速度和效率的關(guān)鍵設(shè)備,各大應(yīng)用場景中發(fā)揮著越來越重要的作用。在此,petacloud.ai小編為你介紹GPU高性能
    的頭像 發(fā)表于 10-21 10:42 ?98次閱讀