MATLAB實現整合系列第四期:GPU Coder(上)

Fred Liu
9 min readJan 24, 2024

--

GPU Coder 簡介

精簡一句介紹,能將MATLAB Code轉成CUDA Code,並且實現演算法於NVDIA環境上加速與部屬在嵌入式CUDA GPU環境中。

詳細Documentation介紹:https://www.mathworks.com/help/gpucoder/

機翻介紹內容:
GPU Coder™能夠從MATLAB®代碼和Simulink®模型生成優化的CUDA®代碼。生成的代碼包括用於深度學習、嵌入式視覺和信號處理算法中可並行的部分的CUDA內核。為了實現高性能,生成的代碼調用了優化的NVIDIA® CUDA庫,包括TensorRT、cuDNN、cuFFT、cuSolver和cuBLAS。代碼可以作為源代碼、靜態庫或動態庫集成到您的項目中,並且可以編譯為運行在桌面、服務器和嵌入在NVIDIA Jetson™、NVIDIA DRIVE®和其他平台上的GPU上的代碼。您可以在MATLAB中使用生成的CUDA來加速深度學習網絡和算法中的其他計算密集部分。GPU Coder允許您將手寫的CUDA代碼合併到您的算法中以及生成的代碼中。

當與Embedded Coder®一起使用時,GPU Coder允許您通過軟件在環(SIL)和處理器在環(PIL)測試來驗證生成代碼的數值行為。

GPU Coder架構介紹與優點效用

可以很輕易的將MATLAB語言轉換成CUDA Code,並且有以下三種效用:

2. 能將轉好的CUDA Code封裝成.mex的格式,此格式可以在MATLAB中直接使用CUDA與C++語法,這也是常用於MATLAB中使用C++ Code的方式,而轉成CUDA Code的優勢在於,能夠有效提速,並且來到2~6倍以上Inference效率。

3.可以將轉好的CUDA Code放到C++的環境中做實現,因為拿到的是Source Code,所以可以很容易的做整合使用。

4.可以直接在Windows的環境中連接嵌入式GPU環境(通常是Linux),並且將演算法直接燒入板子,還能做到SIL與HIL模擬。

比較不同情境下的運作速度(這是多年前做的demo影片了)

在Coder家族中,GPU Coder最常被用於做AI模型的加速與部屬,在MATLAB中可以透過以下三種Coder將MATLAB中開發的深度學習演算法(或MATLAB Code)轉換成對應的語言與函式庫。

例如在GPU Coder中就可以轉成NVDIA的TensorRT與cuDNN兩種不同的函式庫做使用。

GPU Coder 環境建立

在建立Coder的環境往往是覺得挫折的開始,因此可以參考以下的流程來完成環境建立。

  1. 確認C++編譯器
  2. 確認對應的Library安裝
  3. CUDA Toolkit
  4. CuDNN
  5. TensorRT
  6. Jetson
  7. GPU Performance Analyzer

1.確認 C++編譯器

先在MATLAB的Command Window中輸入mex -setup,確認是否有C++編譯器,因為需要轉換成C語言,所以編譯器是一定需要的,如果有Visual C++建議優先選擇使用。

下方的選項可以更改編譯器

如果沒有C++的編譯器,那可以使用MATLAB Addon上的MinGW-64 C/C++

2.確認對應ToolKit與Lib安裝

在大約2021年後的GPU Coder版本中,有了GPU Environment Check的工具可以做使用,使用方式就是在Command Windows中輸入gpucoderSetup做呼叫。

可以使用GPU Environment Check做設定,除了擁有使用者介面的好處外,還能很方便的做多種不同的設定。

原生畫面(沒有安裝Lib的狀況)

如果CUDA Installation Path 為空時需下載CUDA包,如以下(版本號可調整)

cuda_12.1.1_531.14_windows

如果CuDNN 為空時需下載CuDNN(需配合CUDA版本)

cudnn-windows-x86_64–8.9.2.26_cuda12-archive

3.CUDA Toolkit
下載 CUDA Toolkit 12.1(下載最新的穩定版即可)

下載安裝後,在使用GPU Environment Check來做檢查,設置方式如下:

使用左方Basic Code Generation檢測即可

點選下方的Run Checks,就可以得到檢測後的結果:

到這步驟完成的話,就是擁有了基本轉CUDA的能力,但如果要轉換的是深度學習演算法,那還需要進一步安裝CuDNN的Library,才有辦法做到右方的測試。

4.CuDNN

可以到NVDIA的網站上下載CuDNN,但我記得在此步驟是需要申請NVDIA的會員帳號後,才有辦法做下載。

以上是cuDNN所支援的加速框架

cuDNN Download
需根據不同的CUDA版本與作業系統環境下載不同的cuDNN。

接著就是回到GPU Environment Check做cuDNN的檢查,記得在環境Path的部分要做好設定,假設在GPU Environment Check設置的Path無法使用,那會建議在windows中做好設定。

詳細設定參考此處:
https://www.mathworks.com/help/gpucoder/gs/setting-up-the-toolchain.html

接著就是測試cuDNN,因此將右方的Deep Learning Code Generation打勾,並且選擇Generate and Execute,Target選擇cuDNN,記得在下方的GPU Environment Checks中要設定好CUDA與cuDNN的Path。

如果成功通過的話就可以得到以下的畫面,如果有失敗請在詳細看一下在Path設定中是不是有些問題。

像是這邊的Warning訊息就是載的cuDNN版本較新,但大多時候其實不會有影響

5. TensorRT

如果有實現上的增速需求,就可以考慮使用TensorRT,一樣可以去官網上下載。

並且選擇對應的版本資訊。

接下來使用GPU Environment Checks來做檢測,測試TensorRT是否有正常運作。

Target選擇TensorRT 還可以選擇Data Type Check

Data Type Check有幾種不同的格式可以做選擇FP32,FP16,INT8。

這是測試結束後的狀況

接著我們可以測試TensorRT的INT8版本。

6. Jetson

另外大家應該也有注意到,在上方的Select Hardware中可以有Host(for MEX)、Drive、Jetson,因此也可以透過GPU Environmet Check去直接連接到硬體做實測,這部分預計會是在之後跟大家做介紹。

GPU Performance Analyzer

轉出來的CUDA Code可以透過GPU Performance Analyzer來分析 GPU 和 CPU 活動,並且依照時間順序顯示 GPU 和 CPU 活動事件和效能指標,以視覺化、識別和解決產生的 CUDA® 程式碼中的效能瓶頸。

並可以追蹤且觀察時間序的狀況。

詳細介紹內容:
https://www.mathworks.com/help/gpucoder/ug/gpu-performance-analyzer-overview.html

下一篇呢會再介紹怎麼撰寫,並且編譯成mex檔做使用,不過...下一篇可能會是2月中以後在更新了。

--

--