0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何设计MLIR的Dialect来在GPU上生成高性能的代码?

jf_pmFSk4VX 来源:GiantPandaCV 2023-05-10 14:57 次阅读

前言

为什么又要开一个新坑?原因是,最近在做的项目都是和MLIR有关,并且发现自己已经在MLIR的研发道路上越走越远了。刚刚好前段时间大家都在跟风各种GPT,就去看了看openai目前放出来的产品,无意间发现了triton这把瑞士军刀。其实早在一些年前就听过triton,那会的triton代码还没有被MLIR进行重构,代码内部的某些逻辑写的也没有看的很明白,结合"Triton: An Intermediate Language and Compiler for Tiled Neural Network Computations"这篇论文其实也没有看出太多新的东西。这次在重新捡起来看的时候,发现其中很多不错的优化,其实还是抱着学习如何设计MLIR的Dialect来在GPU上生成高性能的代码为初衷,来对triton进行一个深入的分析。

什么是Triton?

Triton是openai针对gpu上的算子优化提出的一个programming language & compiler。以NVIDIA GPU为例,使用triton可以越过cuda的闭源生态,直接将自己的后端接入llvm IR,通过走NVPTX来生成在GPU上的代码。这样做相比传统的手写cuda代码的好处是可以不需要借助NVIDIA的nvcc compiler就可以得到在GPU上能跑的machine code。同时,triton的一些设计理念对于 不管是深度学习领域还是其他数据科学领域来做高性能计算来说都可以提供丰富的指导意义。同时,triton不仅仅只支持nv的gpu,它同时对amd的gpu,intel的gpu都会推出后续的支持方案,这其所就彰显出了mlir的优势,可以通过设计Dialect来支持更多的后端。

源码编译Triton

接下来带大家一起从源码来编译下triton的代码,后续我准备分为几章,对triton的设计以及具体的优化细节展开分析,能够给大家一个较为全面的理解。毕竟triton作为mlir中为数不多成功的end-to-end的例子,对于编译技术和系统优化的研究者或者工程师来说,都是不可或缺的好资料了。

0x0 先去官网clone triton的官方repo

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

0x1 安装第三方依赖

Triton 整个源码编译的过程中,需要使用到两个最为重要的依赖,一个是llvm,一个是pybind11,我在编译和构建triton的过程中,都是通过手动将llvm和pybind11编译安装好后,在编译triton的过程中通过CMakLists.txt来指定对应的路径。

0x10 LLVM的下载与配置

为什么要使用llvm?其实大家都知道,这就是triton最吸引人的地方,通过将高层的python代码一步一步lower到llvm IR,然后通过llvm生态得到最终可以跑在具体设备上的machine code,将llvm作为最重要的后端,并且triton内部的实现也被MLIR进行重构,MLIR刚刚好也是llvm中非常重要的一个子项目。那么,llvm的安装对于想要基于triton来进行二次开发的工程师或者研究人员来说就显得非常重要了。

$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

经过一定时间的等待,就可以将llvm装好了

0x11 pybind11的下载与配置

为什么要使用pybind11?pybind11已经是目前主流的ai开发工具中必不可少的组件了。大部分的框架都以python的DSL暴露给用户,然后用户通过写对应的python语法,调用已经用C++/CUDA或者assemble写好的高性能组件。那么,装配pybind11的目的就是为了能够让我们通过import triton,然后丝滑调用对应的python api来完成高性能算子生成的任务。

$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进行开发了

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

编辑切换为居中

添加图片注释,不超过 140 字(可选)

接下来进入triton/python/tutorials,随便找一个例子进行验证,这里我们选择最常见和实用的03-matrix-multiplication.py,直接python 03-matrix-multiplication.py,稍等片刻则可以得到最终结果。

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

编辑

添加图片注释,不超过 140 字(可选)

可以看到,triton最终生成的代码,在3090上,对应单batch的gemm在部分size上已经超过了cuBLAS。

同时,可以在build目录下去检查对应的三个bin tool: triton-opt, triton-reduce, triton-translate

然后将本机下的ptxas复制到该build目录下,我的ptxas在(/usr/local/cuda-11.6/bin)下。关于这些工具的使用将会在后续的解读中根据不同层的dialect之间的conversion来进行详细介绍。

0x3 为什么采用这样的编译方式?

其实有的同学说,直接按照triton教程里的pip install -e . 不就行了么?这样做的原因是因为后续我们需要对triton以及对应的llvm进行改进,每次改进后,都需要对triton和llvm分别进行编译。这种分离的方式,可以使得我们在改进完对应的llvm代码或者triton的源码后,分步编译,然后再整合成一个新的shared library (libtriton.so)

在后续的教程中,我将会从triton的frontend, optimizer,backend来作为切入点,分别讲讲triton是如何通过将用户手写的python dsl编译成能跑在gpu上的machine code的。

Triton目前的设计

从triton的源码来看,triton目前在NV的GPU上已经有了一套自己比较成熟的mapping路线,通过先对python语言层,也就是triton DSL进行抽象,得到AST,然后将AST中的每个节点lower到Triton Dialect上,Triton Dialect则是一个比较贴近上层语言表达的IR,他的主要作用则是为了保持用户在书写对应算法时的准确性。接下来会进一步被map到TritonGPU Dialect上,那么TritonGPU Dialect则是一个更加贴近GPU层面的IR,它则是为了具体的性能优化而设计。图中其他的蓝色模块,比如SCF,Arith,Tensor等都是MLIR生态中已经被实现好并且广为使用的Dialect。

这些Dialect会一起和TritonGPU Dialect共存,然后被lower到对应的LLVM Dialect,LLVM Dialect则是最贴近LLVM IR的一层设计,从LLVM Dialect到LLVM IR的转换是非常容易的,最终代码就会被接入到LLVM的NVPTX的后端,从而生成后续能跑在GPU上的高性能machine code.

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

编辑切换为居中

添加图片注释,不超过 140 字(可选)

Triton 未来的支持

通过下图可以看到,triton的未来计划和大多数的compiler有着一样的发展蓝图,向上去支持各种各样具有不同表达能力的前端。向下对接各种不同厂商的hardware,最终将一个application高效的map到一个硬件上。

从哦的

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

编辑切换为居中





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    28

    文章

    4754

    浏览量

    129080
  • Triton
    +关注

    关注

    0

    文章

    28

    浏览量

    7046

原文标题:OpenAI/Triton MLIR 第零章: 源码编译

文章出处:【微信号:GiantPandaCV,微信公众号:GiantPandaCV】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何编写高性能的Rust代码

    为了最大限度地提高Rust应用程序的性能,你需要了解支持代码的底层硬件架构,如何优化算法和数据结构,以及如何对代码进行配置和基准测试。本文中,我们将简要介绍这些主题,希望能更好地理解
    的头像 发表于 11-03 14:28 856次阅读
    如何编写<b class='flag-5'>高性能</b>的Rust<b class='flag-5'>代码</b>

    AMD GPU如何安装和配置triton?

    最近在整理python-based的benchmark代码,反过来NV的GPU又把Triton装了一遍,发现Triton的github repo已经给出了对应的llvm的commi
    的头像 发表于 02-22 17:04 2460次阅读
    <b class='flag-5'>在</b>AMD <b class='flag-5'>GPU</b><b class='flag-5'>上</b>如何安装和配置triton?

    TPU-MLIR开发环境配置时出现的各种问题求解

    /workspace/model-zoo 2.4. 代码编译 docker的容器中, 代码编译方式如下: $ cd tpu-mlir$ source ./envsetup.sh$
    发表于 01-10 08:02

    名单公布!【书籍评测活动NO.43】 算力芯片 | 高性能 CPU/GPU/NPU 微架构分析

    力,全球范围内,对于推动科技进步、经济发展及社会整体的运作具有至关重要的作用。随着信息技术的高速发展,高性能计算(HPC)和人工智能(AI)等技术多个领域的应用变得日益广泛,芯片算力成为支持这些
    发表于 09-02 10:09

    GPU

    的核心处理器。GPU是显卡的“心脏”,也就相当于CPU电脑中的作用,它决定了该显卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。图形处理芯片。GPU能够从硬件
    发表于 01-16 08:59

    NVIDIA火热招聘GPU高性能计算架构师

    GPU架构设计者提供反馈,以改善和推进未来GPU的架构设计基本要求(其一即可): * 严谨的逻辑思维和分析能力* 有CUDA代码调优经验(或者SIMD等架构的调优经验)* 熟悉矩阵计算的优化和加速* 较强C++编程能力、算法分析
    发表于 09-01 17:22

    探求NVIDIA GPU极限性能的利器

    1、探求 NVIDIA GPU 极限性能的利器  通常的 CUDA 编程中,用户主要通过 CUDA C/C++ 或 python 语言实现 CUDA 功能的调用。 NVIDIA 对
    发表于 10-11 14:35

    如何使用iMX8mmini提高GPU性能

    支持 1000 MHz)。我需要帮助提高 GPU 性能,即将 GPU 频率提高到 800 MHz。目前我正在使用内核 5.4.142,以下是 GP
    发表于 04-18 07:17

    智能网卡简介及其高性能计算中的作用

    最先进的人工智能模型不到五年的时间内经历了超过 5,000 倍的规模扩展。这些 AI 模型严重依赖复杂的计算和大量内存实现高性能深度神经网络 (DNN)。只有使用 CPU、GPU
    发表于 07-28 10:10

    【开源硬件】从PyTorch到RTL - 基于MLIR的高层次综合技术

    决FPGA的可编程性问题,实现从算法到RTL设计的快速编译,我们引入了基于MLIR(多级别中间表示)的高层次综合框架ScaleHLS,对算法的高层次描述进行多级别的抽象和优化,并生成高性能的RTL实现。 本次
    的头像 发表于 11-24 08:15 1953次阅读

    ClaudeMLIR代码分析完全超越了ChatGPT

    EliminateAllocOpsPass用来消除IR中的无效memref.alloc指令,AppendOneFlowStreamPass给GPU相关的函数添加GPU启动kernel需要
    的头像 发表于 04-19 10:25 1298次阅读

    ClaudeMLIR代码分析完全超越了ChatGPT并表现十分惊艳

    EliminateAllocOpsPass用来消除IR中的无效memref.alloc指令,AppendOneFlowStreamPass给GPU相关的函数添加GPU启动kernel需要
    的头像 发表于 04-24 14:28 3243次阅读
    Claude<b class='flag-5'>在</b><b class='flag-5'>MLIR</b><b class='flag-5'>代码</b>分析<b class='flag-5'>上</b>完全超越了ChatGPT并表现十分惊艳

    TPU-MLIR之量化感知训练

    TPU-MLIR之量化感知训练(
    的头像 发表于 08-21 10:47 821次阅读
    TPU-<b class='flag-5'>MLIR</b>之量化感知训练

    如何适配新架构?TPU-MLIR代码生成CodeGen全解析!

    背景介绍TPU-MLIR的CodeGen是BModel生成的最后一步,该过程目的是将MLIR文件转换成最终的Bmodel。本文介绍了CodeGen的基本原理和流程,并记录了针对BM1684X等新架构
    的头像 发表于 11-02 08:34 1755次阅读
    如何适配新架构?TPU-<b class='flag-5'>MLIR</b><b class='flag-5'>代码</b><b class='flag-5'>生成</b>CodeGen全解析!

    GPU高性能服务器配置

    GPU高性能服务器作为提升计算速度和效率的关键设备,各大应用场景中发挥着越来越重要的作用。在此,petacloud.ai小编为你介绍GPU高性能
    的头像 发表于 10-21 10:42 235次阅读