在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

如何使用triton的language api來(lái)實(shí)現(xiàn)gemm的算子

jf_pmFSk4VX ? 來(lái)源:GiantPandaCV ? 2023-05-29 14:34 ? 次閱讀

前言

通過(guò)前兩章對(duì)于triton的簡(jiǎn)單介紹,相信大家已經(jīng)能夠通過(guò)從源碼來(lái)安裝triton,同時(shí)通過(guò)triton提供的language前端寫(xiě)出自己想要的一些計(jì)算密集型算子。這章開(kāi)始,我們通過(guò)構(gòu)建一套比較標(biāo)準(zhǔn)的batch gemm的benchmark,來(lái)看看目前這些主流的代碼生成工具,高性能模板庫(kù),與廠商提供的vendor library的差距。因?yàn)橹挥忻鞔_了目前的差距,后期關(guān)于針對(duì)性的優(yōu)化才能做到點(diǎn)上。這一章,我將使用一個(gè)batch的gemm作為例子,來(lái)看看triton目前對(duì)其的優(yōu)化能力。選batch gemm的原因是因?yàn)槟壳暗腖LM中不可避免會(huì)有對(duì)應(yīng)的attention操作,而attention操作中,核心的計(jì)算密集型算子就是batch的gemm,如果你能夠?qū)atch的gemm有一個(gè)很好的優(yōu)化思路,那么在MLSys中大部分的算子優(yōu)化類的工作對(duì)你來(lái)說(shuō)將不會(huì)顯得那么無(wú)從下手。

通過(guò)Triton實(shí)現(xiàn)一個(gè)batch GEMM算子

在triton的官方tutorial中給出了如何使用triton的language api來(lái)實(shí)現(xiàn)gemm的算子,在上一章的最后,我也給出了對(duì)應(yīng)的例子以及他通過(guò)和調(diào)用torch.matmul實(shí)現(xiàn)的gemm在3090上的性能比較。最終可以發(fā)現(xiàn),針對(duì)某些size的gemm,triton在TFLOPS這個(gè)指標(biāo)層面是能夠超過(guò)cublas的實(shí)現(xiàn),但是后面我通過(guò)nsight system對(duì)每個(gè)kernel的具體執(zhí)行時(shí)間進(jìn)行了profiling,發(fā)現(xiàn)在torch.matmul或者torch.bmm底層所調(diào)用的cuBLAS的kernel并不是對(duì)應(yīng)輸入輸出datatype以及computetype中最快的那個(gè)。所以,這樣的比較就顯得有些沒(méi)有意義。不過(guò),沒(méi)事,這對(duì)我們建立起如何優(yōu)化一個(gè)計(jì)算密集型算子來(lái)說(shuō)是一個(gè)不錯(cuò)的入門。

其實(shí)想要通過(guò)triton實(shí)現(xiàn)一個(gè)batch的gemm非常簡(jiǎn)單,我們只需要將triton中原先例子里的tl.program_id(axis=0),在這個(gè)program_id上再添加一個(gè)axis來(lái)表示batch維度的并行就可以了,然后針對(duì)每個(gè)數(shù)組的變化由單batch到多batch,只用增加一個(gè)大小為矩陣size的stride偏置即可,這種實(shí)現(xiàn)方式其實(shí)也是cuBLAS中cublasGemmStridedBatched命名的得來(lái)。具體的代碼如下所示:

@triton.jit
defmatmul_kernel(
#Pointerstomatrices
A_ptr,B_ptr,C_ptr,
#Matrixdimensions
B,M,N,K,
#Thestridevariablesrepresenthowmuchtoincreasetheptrbywhenmovingby1
#elementinaparticulardimension.E.g.stride_amishowmuchtoincreasea_ptr
#bytogettheelementonerowdown(AhasMrows)
stride_ab,stride_am,stride_ak,
stride_bb,stride_bk,stride_bn,
stride_cb,stride_cm,stride_cn,
#Meta-parameters
BLOCK_SIZE_M:tl.constexpr,BLOCK_SIZE_N:tl.constexpr,BLOCK_SIZE_K:tl.constexpr,
GROUP_SIZE_M:tl.constexpr,
ACTIVATION:tl.constexpr,
):
pid=tl.program_id(axis=0)
offs_b=tl.program_id(axis=1)
num_pid_m=tl.cdiv(M,BLOCK_SIZE_M)
num_pid_n=tl.cdiv(N,BLOCK_SIZE_N)
num_pid_k=tl.cdiv(K,BLOCK_SIZE_K)
num_pid_in_group=GROUP_SIZE_M*num_pid_n
group_id=pid//num_pid_in_group
first_pid_m=group_id*GROUP_SIZE_M
group_size_m=min(num_pid_m-first_pid_m,GROUP_SIZE_M)
pid_m=first_pid_m+(pid%group_size_m)
pid_n=(pid%num_pid_in_group)//group_size_m

offs_m=pid_m*BLOCK_SIZE_M+tl.arange(0,BLOCK_SIZE_M)
offs_n=pid_n*BLOCK_SIZE_N+tl.arange(0,BLOCK_SIZE_N)
offs_k=tl.arange(0,BLOCK_SIZE_K)

A_ptr=A_ptr+(offs_b*stride_ab+offs_m[:,None]*stride_am+offs_k[None,:]*stride_ak)
B_ptr=B_ptr+(offs_b*stride_bb+offs_k[:,None]*stride_bk+offs_n[None,:]*stride_bn)

#initializeanditerativelyupdateaccumulator
acc=tl.zeros((BLOCK_SIZE_M,BLOCK_SIZE_N),dtype=tl.float32)
forkinrange(0,K,BLOCK_SIZE_K):

a=tl.load(A_ptr)
b=tl.load(B_ptr)

acc+=tl.dot(a,b)

A_ptr+=BLOCK_SIZE_K*stride_ak
B_ptr+=BLOCK_SIZE_K*stride_bk

c=acc.to(tl.float16)
C_ptr=C_ptr+(offs_b*stride_cb+offs_m[:,None]*stride_cm+offs_n[None,:]*stride_cn)
c_mask=(offs_b

然后寫(xiě)一個(gè)簡(jiǎn)單的單元測(cè)試,確保通過(guò)triton寫(xiě)出來(lái)的kernel能夠和torch.matmul/torch.bmm對(duì)上即可。

torch.manual_seed(0)
a=torch.randn((4,512,512),device='cuda',dtype=torch.float16)
b=torch.randn((4,512,512),device='cuda',dtype=torch.float16)
torch_output=torch.bmm(a,b)
triton_output=matmul(a,b,activation=None)
print(f"triton_output={triton_output}")
print(f"torch_output={torch_output}")
iftorch.allclose(triton_output,torch_output,atol=1e-2,rtol=0):
print("TritonandTorchmatch")
else:
print("TritonandTorchdiffer")

其實(shí)triton的language語(yǔ)法確實(shí)很簡(jiǎn)單,相比較cuda來(lái)說(shuō),它能夠幫我們快速驗(yàn)證一些idea,同時(shí)給出比cublas性能相當(dāng)?shù)乃阕印H绻阆胍肅UDA從0開(kāi)始實(shí)現(xiàn)一個(gè)batch GEMM并且調(diào)用tensor core,借助shared memory,register files去幫你加速運(yùn)算或者優(yōu)化data movement,那么這個(gè)過(guò)程是非常需要一定的高性能計(jì)算和架構(gòu)的經(jīng)驗(yàn),你才可能拿到和cuBLAS的kernel接近的性能。OK,有了triton的具體kernel實(shí)現(xiàn),接下來(lái)其實(shí)就是要去寫(xiě)一個(gè)triton需要被調(diào)優(yōu)的模版,需要triton從你定義的這個(gè)比較小的搜索空間中,去得到對(duì)應(yīng)的最優(yōu)解,從而作為本次batch gemm的最優(yōu)實(shí)現(xiàn),我在autotuner這塊并沒(méi)有花太大的精力去改進(jìn),依舊GEMM例子中的模版拿來(lái)作為一個(gè)參考,具體代碼如下:

@triton.autotune(
configs=[
triton.Config({'BLOCK_SIZE_M':128,'BLOCK_SIZE_N':256,'BLOCK_SIZE_K':64,'GROUP_SIZE_M':8},num_stages=3,num_warps=8),
triton.Config({'BLOCK_SIZE_M':64,'BLOCK_SIZE_N':256,'BLOCK_SIZE_K':32,'GROUP_SIZE_M':8},num_stages=4,num_warps=4),
triton.Config({'BLOCK_SIZE_M':128,'BLOCK_SIZE_N':128,'BLOCK_SIZE_K':32,'GROUP_SIZE_M':8},num_stages=4,num_warps=4),
triton.Config({'BLOCK_SIZE_M':128,'BLOCK_SIZE_N':64,'BLOCK_SIZE_K':32,'GROUP_SIZE_M':8},num_stages=4,num_warps=4),
triton.Config({'BLOCK_SIZE_M':64,'BLOCK_SIZE_N':128,'BLOCK_SIZE_K':32,'GROUP_SIZE_M':8},num_stages=4,num_warps=4),
triton.Config({'BLOCK_SIZE_M':128,'BLOCK_SIZE_N':32,'BLOCK_SIZE_K':32,'GROUP_SIZE_M':8},num_stages=4,num_warps=4),
triton.Config({'BLOCK_SIZE_M':64,'BLOCK_SIZE_N':32,'BLOCK_SIZE_K':32,'GROUP_SIZE_M':8},num_stages=5,num_warps=2),
triton.Config({'BLOCK_SIZE_M':32,'BLOCK_SIZE_N':64,'BLOCK_SIZE_K':32,'GROUP_SIZE_M':8},num_stages=5,num_warps=2),
],
key=['M','N','K'],
)

然后通過(guò)調(diào)用Triton的do_bench就可以將你寫(xiě)的算子跑起來(lái)了,do_bench處在python/triton/testing.py下,其中會(huì)對(duì)每個(gè)kernel進(jìn)行25次的warm_up和100次iteration,最后會(huì)根據(jù)你設(shè)置的分位數(shù)得到一個(gè)相對(duì)穩(wěn)定的性能。切記,在測(cè)試每個(gè)kernel的運(yùn)行情況的時(shí)候,需要將GPU的頻率鎖在最高頻,通過(guò)下面的代碼就可以做到,由于我用到的A10,A10最大頻率在1695 MHz

sudonvidia-smi--lock-gpu-clocks=1695,1695

這是通過(guò)對(duì)fp16的輸入,acc_type = fp32,最終輸出為fp16的batch gemm (16x4096x4096, 16x4096x4096)

通過(guò)nsight system + nvtx就可以看到每個(gè)kernel的具體實(shí)現(xiàn)情況:

3b5928a8-fca4-11ed-90ce-dac502259ad0.pngimg

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

使用torch.bmm/torch.matmul來(lái)實(shí)現(xiàn)batch-gemm,其中調(diào)用的kernel名字為ampere_fp16_s1688gemm_fp16_256x64_Idg8_f2f_stages_32x1_nn,該kernel運(yùn)行的時(shí)間是46.059ms

那么,當(dāng)我們運(yùn)行triton的時(shí)候,通過(guò)同樣的方式來(lái)得到同樣迭代次序的kernel,nsight分析如下

3b89cc7e-fca4-11ed-90ce-dac502259ad0.pngimg

該kernel的名字為matmul_kernel_0d1d2d3d4d5d6d7d8d9c10d11d12c13d14d15c,運(yùn)行時(shí)間為35.067ms

當(dāng)然通過(guò)torch.matmul調(diào)用的cuBLAS這個(gè)算子,顯然不是我們想要的那個(gè),我們就需要去深入到cuBLAS的具體文檔,翻一翻,找出其最快的API。在后面的benchmark中,我選用了cublasHgemmStridedBatched和cublasGemmStrideBatchedEx這兩個(gè)API來(lái)分別實(shí)現(xiàn)batch GEMM。通過(guò)cublasHgemmStridedBatched啟動(dòng)kernel名字為ampere_h16816gemm_256x128_Idg8_stages_32x3_nn,其運(yùn)行時(shí)間為30.330ms

3bb28696-fca4-11ed-90ce-dac502259ad0.pngimg

通過(guò)cuBLAS的cublasGemmStridedBatchedEx API構(gòu)建算子性能標(biāo)準(zhǔn)

在cuBLAS中,針對(duì)batch gemm的實(shí)現(xiàn)有很多種方式,我也踩了不少坑。第一次調(diào)用成了cublasHgemmStridedBatched,該kernel的性能其實(shí)是不如cublasGemmStridedBatchedEx,因?yàn)閏ublasGemmStridedBatchedEx給了一個(gè)cublasGemmAlgo_t algo的參數(shù),該參數(shù)可以幫我們選擇對(duì)應(yīng)batch gemm的不同實(shí)現(xiàn),關(guān)于algo又具有如下這么多種:

CUBLAS_GEMM_DEFAULT,
CUBLAS_GEMM_ALGO0,
CUBLAS_GEMM_ALGO1,
CUBLAS_GEMM_ALGO2,
CUBLAS_GEMM_ALGO3,
CUBLAS_GEMM_ALGO4,
CUBLAS_GEMM_ALGO5,
CUBLAS_GEMM_ALGO6,
CUBLAS_GEMM_ALGO7,
CUBLAS_GEMM_ALGO8,
CUBLAS_GEMM_ALGO9,
CUBLAS_GEMM_ALGO10,
CUBLAS_GEMM_ALGO11,
CUBLAS_GEMM_ALGO12,
CUBLAS_GEMM_ALGO13,
CUBLAS_GEMM_ALGO14,
CUBLAS_GEMM_ALGO15,
CUBLAS_GEMM_ALGO16,
CUBLAS_GEMM_ALGO17,
CUBLAS_GEMM_DFALT_TENSOR_OP,
CUBLAS_GEMM_ALGO0_TENSOR_OP,
CUBLAS_GEMM_ALGO1_TENSOR_OP,
CUBLAS_GEMM_ALGO2_TENSOR_OP,
CUBLAS_GEMM_ALGO3_TENSOR_OP,
CUBLAS_GEMM_ALGO4_TENSOR_OP,
CUBLAS_GEMM_ALGO18,
CUBLAS_GEMM_ALGO19,
CUBLAS_GEMM_ALGO20,
CUBLAS_GEMM_ALGO21,
CUBLAS_GEMM_ALGO22,
CUBLAS_GEMM_ALGO23,
CUBLAS_GEMM_ALGO5_TENSOR_OP,
CUBLAS_GEMM_ALGO6_TENSOR_OP,
CUBLAS_GEMM_ALGO7_TENSOR_OP,
CUBLAS_GEMM_ALGO8_TENSOR_OP,
CUBLAS_GEMM_ALGO9_TENSOR_OP,
CUBLAS_GEMM_ALGO10_TENSOR_OP,
CUBLAS_GEMM_ALGO11_TENSOR_OP,
CUBLAS_GEMM_ALGO12_TENSOR_OP,
CUBLAS_GEMM_ALGO13_TENSOR_OP,
CUBLAS_GEMM_ALGO14_TENSOR_OP,
CUBLAS_GEMM_ALGO15_TENSOR_OP,

其中,帶有_TENSOR_OP后綴的則為調(diào)用tensor core來(lái)加速運(yùn)算的。看到這么多種實(shí)現(xiàn),不要慌,通過(guò)一個(gè)for-loop的遍歷,就可以方便的找到速度最快的那一個(gè),然后對(duì)應(yīng)就可以得到TFLOPS,對(duì)應(yīng)實(shí)現(xiàn)如下:

floatmin_time=0xffff;
cublasGemmAlgo_talgo_index;
for(constauto&algo:algoList){
floattotal_time=0.0;
for(inti=0;i(algo));
cudaEventRecord(end,0);
cudaEventSynchronize(end);
floatelapsed_time;
cudaEventElapsedTime(&elapsed_time,start,end);
total_time+=elapsed_time;
}
floatcurrent_time=total_time/iteration;
std::cout<

通過(guò)CUTLASS實(shí)現(xiàn)batch GEMM算子

CUTLASS這里就不花過(guò)多的篇幅進(jìn)行介紹了,知乎上有很多比較詳細(xì)的文章,建議做GPU性能優(yōu)化的同學(xué)都能夠好好研究下CUTLASS,不得不說(shuō),CUTLASS的抽象層級(jí)做的確實(shí)很好,通過(guò)暴露出對(duì)應(yīng)的C++模版,就可以通過(guò)這些模版組合成很多工程開(kāi)發(fā)實(shí)際中可以跑的很快的算子,而且相比于直接寫(xiě)CUDA嵌入PTX的匯編來(lái)說(shuō),開(kāi)發(fā)的難易程度也被很大程度的降低,同時(shí)能帶來(lái)和cuBLAS肩比肩的效果。在本次benchmark的構(gòu)建中,我使用的是2.9.1版本的CUTLASS,在編譯的時(shí)候一定要打開(kāi)所有的kernel,然后通過(guò)下面的命令進(jìn)行配置:

1.gitclonehttps://github.com/NVIDIA/cutlass.git
2.gitcheckoutv2.9.1
3.exportCUDACXX=/usr/local/cuda/bin/nvcc
4.mkdirbuild&&cdbuild
5.cmake..-DCUTLASS_NVCC_ARCHS=80-DCUTLASS_LIBRARY_KERNELS=all
6.makecutlass_profiler-j16

然后我們可以通過(guò)使用cutlass_profiler來(lái)找到目前CUTLASS中針對(duì)應(yīng)尺寸算子的TFLOPS最優(yōu)的那個(gè)實(shí)現(xiàn)。這里直接使用如下代碼就可以得到CUTLASS對(duì)應(yīng)的實(shí)現(xiàn),同時(shí)只要在對(duì)應(yīng)的workload添加不同尺寸的GEMM。

Triton, CUTLASS, cuBLAS性能對(duì)比

通過(guò)上述的講解,我們將所有的輸入和計(jì)算過(guò)程與cublasGemmStridedBatchedEx中的參數(shù)對(duì)齊,輸入為fp16,輸出為fp16,Accumulator_type也改為fp16。在triton中需要將如下代碼進(jìn)行替換:

#acc=tl.zeros((BLOCK_SIZE_M,BLOCK_SIZE_N),dtype=tl.float32)
acc=tl.zeros((BLOCK_SIZE_M,BLOCK_SIZE_N),dtype=tl.float16)

#acc+=tl.dot(a,b)
acc+=tl.dot(a,b,out_dtype=tl.float16)

然后把他們?nèi)慨?huà)出來(lái),縱坐標(biāo)表示的TFLOPS,橫坐標(biāo)對(duì)應(yīng)矩陣的shape,batch=16。我們可以看出來(lái),目前我這個(gè)版本的tirton代碼其實(shí)性能并不是很好,原因有很多,這個(gè)后面我給大家慢慢分析,最重要的其實(shí)就是triton.autotune中那些參數(shù)的選取和設(shè)定,以及后端的一些優(yōu)化。cublasGemmStridedBatchedEx中最快的那個(gè)algo可以看出來(lái)目前基本上占據(jù)了領(lǐng)先位置,也就是為什么會(huì)被稱為目前GPU上去做計(jì)算密集型算子優(yōu)化的上屆,CUTLASS在某些尺寸上的batch gemm還是表現(xiàn)的很優(yōu)秀的,但是距離最快的cublasGemmStridedBatchedEx仍然有一些差距,不過(guò)只能說(shuō)CUTLASS的優(yōu)化真的牛逼,至少我知道目前國(guó)內(nèi)很多HPC的組在開(kāi)發(fā)對(duì)應(yīng)的kernel的時(shí)候,都是選擇直接魔改拼接CUTLASS的組件來(lái)加快整個(gè)開(kāi)發(fā)流程。

3bca2166-fca4-11ed-90ce-dac502259ad0.pngimg

總結(jié)

通過(guò)上述對(duì)batch gemm性能的分析,我們可以看出來(lái)triton距離cuBLAS的性能還有一定的距離要走,在后續(xù)的教程中,我們將結(jié)合Triton Dialect, TritonGPU Dialect, 以及Triton中autotuner作為核心組件來(lái)對(duì)Triton的所有優(yōu)化過(guò)程中有一個(gè)清晰的認(rèn)識(shí)。以及通過(guò)編譯手段,一步一步來(lái)逼近c(diǎn)uBLAS的性能,甚至超越他。

審核編輯:彭靜
聲明:本文內(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)投訴
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    4778

    瀏覽量

    129366
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    652

    瀏覽量

    29458
  • Triton
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    7061
  • 算子
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    7275

原文標(biāo)題:【連載】OpenAITriton MLIR 第二章 Batch GEMM benchmark

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問(wèn)一下拉普拉斯算子的FPGA實(shí)現(xiàn)方法是什么?

    如何利用QuartusⅡ軟件提供的宏功能模塊,通過(guò)配置調(diào)用的宏功能模塊來(lái)實(shí)現(xiàn)Laplacian算子
    發(fā)表于 05-08 08:24

    基于GFO算子的圖像增強(qiáng)算法如何去實(shí)現(xiàn)

    基于GFO算子(廣義模糊算子)的圖像增強(qiáng)算法如何去實(shí)現(xiàn)?怎樣對(duì)圖像增強(qiáng)算法進(jìn)行分析?
    發(fā)表于 06-04 06:24

    LOG算子在FPGA中的實(shí)現(xiàn)

    介紹了一種高斯拉普拉斯LOG算子在FPGA中的實(shí)現(xiàn)方案!并通過(guò)對(duì)一幅BMP圖像的處理!論證了在FPGA中實(shí)現(xiàn)的LOG算子的圖像增強(qiáng)效果
    發(fā)表于 05-16 17:12 ?50次下載
    LOG<b class='flag-5'>算子</b>在FPGA中的<b class='flag-5'>實(shí)現(xiàn)</b>

    Laplacian算子的FPGA實(shí)現(xiàn)方法

    拉普拉斯算子是一種重要的圖像增強(qiáng)算子,它是一種各向同性濾波器,即濾波器的響應(yīng)與濾波器作用圖像的突變方向無(wú)關(guān),而且實(shí)現(xiàn)簡(jiǎn)單,被廣泛用于圖像銳化和高頻增強(qiáng)等算法中。在此,提出一種使用QuartusⅡ開(kāi)發(fā)環(huán)境的Megafunction
    的頭像 發(fā)表于 06-16 17:47 ?3338次閱讀
    Laplacian<b class='flag-5'>算子</b>的FPGA<b class='flag-5'>實(shí)現(xiàn)</b>方法

    使用CUTLASS實(shí)現(xiàn)高性能矩陣乘法

      CUTLASS 實(shí)現(xiàn)了高性能卷積(隱式 GEMM )。隱式 GEMM 是作為 GEMM 的卷積運(yùn)算的公式。這允許 Cutslass 通過(guò)重用高度優(yōu)化的 warp-wide
    的頭像 發(fā)表于 04-15 10:03 ?3004次閱讀

    Laplacian算子的硬件實(shí)現(xiàn)及結(jié)果

    使用Laplacian算子濾波是將模板與圖像做卷積運(yùn)算,然后將得到的結(jié)果取絕對(duì)值后,再進(jìn)行防治溢出(灰度值大于255)處理。所以在用硬件實(shí)現(xiàn)Laplacian算子時(shí)可分成三個(gè)步驟:構(gòu)造模板;使用模板對(duì)圖像進(jìn)行卷積運(yùn)算;對(duì)卷積后的
    發(fā)表于 07-21 09:27 ?1163次閱讀

    Sobel算子原理介紹與實(shí)現(xiàn)方法

    索貝爾算子(Sobel operator)主要用作邊緣檢測(cè),在技術(shù)上,它是一離散性差分算子,用來(lái)運(yùn)算圖像亮度函數(shù)的灰度之近似值。在圖像的任何一點(diǎn)使用此算子,將會(huì)產(chǎn)生對(duì)應(yīng)的灰度矢量或是其法矢量Sobel 卷積因子為:
    的頭像 發(fā)表于 07-21 17:27 ?1.3w次閱讀

    如何通過(guò)ApiFox來(lái)構(gòu)建API場(chǎng)景測(cè)試

    在開(kāi)發(fā)前后臺(tái)分離項(xiàng)目并且通過(guò)不同團(tuán)隊(duì)來(lái)實(shí)現(xiàn)的時(shí)候,如何將后臺(tái)設(shè)計(jì)的 API 準(zhǔn)確的傳達(dá)到前臺(tái),是一個(gè)非常重要的工作。為了簡(jiǎn)化這個(gè)過(guò)程,開(kāi)源社區(qū)做了很多努力,比如 protobuf技術(shù),swagger
    的頭像 發(fā)表于 09-01 10:48 ?1692次閱讀

    NVIDIA Triton系列文章:開(kāi)發(fā)資源說(shuō)明

    與 Getting Started 屬于入門范疇,其余 User Guide、API Guide、Additional Resources 與 Customization Guide 等四個(gè)部分,都是 Triton 推理服務(wù)器非常重要的技術(shù)內(nèi)容。
    的頭像 發(fā)表于 11-09 16:17 ?788次閱讀

    解析OneFlow Element-Wise算子實(shí)現(xiàn)方法

    雖然這種寫(xiě)法非常簡(jiǎn)單明了,但卻存在明顯的性能問(wèn)題。所以這篇文章將基于OneFlow開(kāi)源的Element-Wise CUDA算子方案來(lái)解釋如何寫(xiě)一個(gè)高性能的Element-Wise CUDA算子
    的頭像 發(fā)表于 12-12 10:54 ?1639次閱讀

    如何對(duì)GPU中的矩陣乘法(GEMM)進(jìn)行優(yōu)化

    本篇文章是GEMM優(yōu)化的第一個(gè)部分,在這篇文章中,只說(shuō)優(yōu)化思路和分析。
    的頭像 發(fā)表于 05-25 09:03 ?3108次閱讀
    如何對(duì)GPU中的矩陣乘法(<b class='flag-5'>GEMM</b>)進(jìn)行優(yōu)化

    什么是Triton-shared?Triton-shared的安裝和使用

    經(jīng)過(guò)前面幾章關(guān)于triton在nv gpu上調(diào)優(yōu)的講解,我們這章開(kāi)始來(lái)看看triton的一個(gè)third_party庫(kù),該庫(kù)是為了讓triton去支持更多其他的backend。該項(xiàng)目的地址如下所示
    的頭像 發(fā)表于 12-19 09:47 ?1378次閱讀
    什么是<b class='flag-5'>Triton</b>-shared?<b class='flag-5'>Triton</b>-shared的安裝和使用

    使用NVIDIA Triton推理服務(wù)器來(lái)加速AI預(yù)測(cè)

    這家云計(jì)算巨頭的計(jì)算機(jī)視覺(jué)和數(shù)據(jù)科學(xué)服務(wù)使用 NVIDIA Triton 推理服務(wù)器來(lái)加速 AI 預(yù)測(cè)。
    的頭像 發(fā)表于 02-29 14:04 ?635次閱讀

    摩爾線程攜手智源研究院完成基于Triton的大模型算子庫(kù)適配

    近日,摩爾線程與北京智源人工智能研究院(簡(jiǎn)稱:智源研究院)已順利完成基于Triton語(yǔ)言的高性能算子庫(kù)FlagGems的適配工作。得益于摩爾線程自研統(tǒng)一系統(tǒng)計(jì)算架構(gòu)MUSA,雙方在短短一周多的時(shí)間
    的頭像 發(fā)表于 08-02 11:06 ?978次閱讀

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

    Triton 是一個(gè)開(kāi)源的編譯器前端,它支持多種編程語(yǔ)言,包括 C、C++、Fortran 和 Ada。Triton 旨在提供一個(gè)可擴(kuò)展和可定制的編譯器框架,允許開(kāi)發(fā)者添加新的編程語(yǔ)言特性和優(yōu)化技術(shù)
    的頭像 發(fā)表于 12-24 17:23 ?649次閱讀
    主站蜘蛛池模板: 四虎国产精品免费久久影院 | 国产产一区二区三区久久毛片国语 | 色狠狠综合网 | 91视频观看 | 一级aaaaaa片毛片在线播放 | 亚洲精品在线视频观看 | 日本理论午夜中文字幕第一页 | 成人欧美一区二区三区视频 | 簧 色 成 人| 2019天天干天天操 | 国产精品欧美精品国产主播 | 天天搞夜夜| www一区二区三区 | 免费看又爽又黄禁片视频1000 | 人人添人人澡人人澡人人人爽 | 国产网站免费 | 无遮挡一级毛片视频 | 国产在线一卡 | 亚洲网站在线看 | 能看毛片的网址 | 国模大胆一区二区三区 | 亚洲狠狠狠一区二区三区 | 性欧美高清强烈性视频 | 亚洲欧美视频 | 国产亚洲美女精品久久久2020 | 日韩免费一级毛片 | 黄色小毛片 | 啪啪黄色片 | 久久久久四虎国产精品 | 午夜精品一区二区三区在线观看 | 黄色亚洲 | 欧美大全| 国产精品久久久亚洲456 | 日本在线色视频 | 在线免费观看视频 | 看黄在线观看 | 啪啪调教所29下拉式免费阅读 | 日本www黄 | 性xxxx黑人与亚洲 | 一本到中文字幕高清不卡在线 | 伊人狼人在线 |