【拆·應用】是為開源鴻蒙應用開發者打造的技術分享平臺,是匯聚開發者的技術洞見與實踐經驗、提供開發心得與創新成果的展示窗口。誠邀您踴躍發聲,期待您的真知灼見與技術火花!
引言
本期內容由AI Model SIG提供,介紹了在開源鴻蒙中,利用圖形接口Vulkan的計算著色器能力,在端側部署大模型的的整體思路和實踐分享。
開源鴻蒙是由開放原子開源基金會孵化及運營的開源項目,目標是面向全場景、全連接、全智能時代,搭建一個智能終端設備操作系統的框架和平臺,促進萬物互聯產業的繁榮發展。在人工智能時代下,與其它成熟的操作系統相比,開源鴻蒙部署AI LLM模型的能力欠缺。為了補齊開源鴻蒙在端側部署大模型的能力,筆者將分享如何在端側打通大模型部署的整體思路和實踐。
軟硬件選型
在硬件上選取國產CPU飛騰D2000,顯卡選用AMD GPU。目前能夠在OpenHarmony5.0.0 Release上點亮AMD GPU,包括RX 550、RX 580和RX 7900 XTX。
其次是推理框架的選擇,筆者選取了llama.cpp這個開源的推理框架,倉庫地址為:github.com/ggml-org/llama.cpp。目前很火的ollama,其也是選用了llama.cpp作為推理后端。llama.cpp是一個專注于在邊緣設備、個人PC上進行llm部署的高性能推理框架。其相比于vllm等主流llm推理框架來說,有以下明顯的優點:
純 C++/C 實現,在Windows、mac、Linux等多種系統下編譯都非常簡單。
豐富的后端支持:如圖所示,支持x86、arm、Nidia_GPU、AMD_GPU、Vulkan甚至華為昇騰NPU_CANN。
支持CPU AVX指令集進行矢量計算加速、CPU多核并行計算、CPU+GPU混合計算
支持低精度量化:1.5bit、2 bit、3 bit、4 bit、5 bit、6 bit和 8 bit整數量化,可加快推理速度并減少內存使用。

llama.cpp支持的后端及其硬件
在上圖中,llama.cpp支持Vulkan后端。筆者通過查閱相關資料和閱讀llama.cpp關于Vulkan的相關代碼,發現其是利用圖形接口Vulkan的計算著色器(Compute Shader)的能力來運行大模型的。計算著色器(Compute Shader) 是GPU上用于通用計算(GPGPU) 的特殊程序,與傳統圖形渲染管線解耦,可直接操作GPU并行處理非圖形任務(如AI推理、物理模擬、數據處理)等。下表是計算著色器的特點:

綜合多因素的考量,在軟硬件上最終選用飛騰D2000 + AMD GPU + OpenHarmony 5.0.0 Release的組合,利用圖形接口Vulkan的計算著色器能力,在終端設備上高效運行大模型。
在開源鴻蒙部署大模型的難點
在第一部分提到將利用圖形接口Vulkan的計算著色器的能力,在端側高效運行大模型。在開源鴻蒙社區有個Vulkan的demo樣例,倉庫地址為:https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Native/NdkVulkan,通過筆者的實踐,目前在HarmonyOS能跑通該樣例,但是在開源鴻蒙上尚不能跑通該樣例。通過閱讀該例子的文檔說明,如下圖,發現核心原因是缺少AMD GPU的Vulkan用戶態驅動庫libvulkan_radeon.so以及Vulkan的sdk。因此核心難點是要能將Vulkan的計算著色器在開源鴻蒙上正常跑起來。

NdkVulkan例子
整體思路
為了能夠利用圖形接口Vulkan的計算著色器的能力跑大模型。筆者總結了以下四個的關鍵步驟:
在開源鴻蒙上正常點亮AMD GPU。
交叉編譯出AMD的Vulkan用戶態驅動。
交叉編譯出Vulkan sdk。
移植llama.cpp到OpenHarmony上。
實踐要點
點亮AMDGPU
1.確保AMD GPU 內核態是正常的選用的內核版本為linux 6.6.22,需要將內核的以下選項打開。

系統正常啟動后,采用modetest工具進行測試,在測試前需要關閉render_service、composer_host和allocator_host這三個進程,具體的命令如下:

在hdc shell中運行以下命令:

如果能夠在顯示屏上看到彩色的條紋,如下圖,說明AMD GPU的內核態是正常的。
modetest測試結果
2.確保AMD GPU的用戶態是正常的
首先通過mesa3d交叉編譯出AMD GPU的用戶態驅動,主要為libEGL.so.1.0.0、libgallium_dri.so、libgbm.so.1.0.0、libglapi.so.0.0.0、libGLESv1_CM.so.1.1.0和libGLESv2.so.2.0.0這個5個動態庫。

大家可以參考laval社區的《開源鴻蒙開源GPU庫Mesa3D適配說明》這篇文章,了解GPU的適配過程,鏈接地址為:https://laval.csdn.net/64804567ade290484cb2ed06.html
這篇文章主要講的是mali gpu的mesa3d點亮過程。由于跑Vulkan的計算著色器可以不用到顯示的功能,因此在這里具體的適配過程就不展開,感興趣的讀者可在AI Model SIG的ohos_vulkan倉庫獲取相關的AMD GPU 的mesa用戶態驅動的庫,倉庫地址為:https://gitcode.com/ai_model_sig/ohos_vulkan 成功適配后,可以在顯示屏正常看到開源鴻蒙的桌面。
Vulkan用戶態驅動
這一步的核心是能夠獲得libvulkan_radeon.so這個動態庫。在mesa3d中有Vulkan用戶態驅動的實現,因此通過編譯mesa3d這個開源項目編譯出libvulkan_radeon.so這個Vulkan用戶態驅動庫。
在build_ohos.py文件中需要指定 -Dgallium-drivers=amd 和 -Dvulkan-drivers=amd這兩個參數,如下圖:

通過以下指令:

便可以編譯出libvulkan_radeon.so這個動態庫,如下圖所示

Vulkan sdk
Vulkan sdk的構成主要包含以下11個項目:
https://github.com/KhronosGroup/glslang.git
https://github.com/KhronosGroup/SPIRV-Headers.git
https://github.com/KhronosGroup/SPIRV-Tools.git
https://github.com/zeux/volk.git
https://github.com/KhronosGroup/Vulkan-ExtensionLayer.git
https://github.com/KhronosGroup/Vulkan-Headers.git
https://github.com/KhronosGroup/Vulkan-Loader.git
https://github.com/KhronosGroup/Vulkan-Tools.git
https://github.com/KhronosGroup/Vulkan-Utility-Libraries.git
https://github.com/KhronosGroup/Vulkan-ValidationLayers.git
在這里需要通過交叉編譯的方式獲得aarch64版本的產物,如下圖所示。

Vulkan sdk的編譯比較復雜,這里不進行展開,讀者可以通過這個鏈接下載:
https://gitcode.com/ai_model_sig/ohos_vulkan/pull/1
下面介紹一下如何將Vulkan sdk部署在開源鴻蒙上:

通過運行vulkaninfo可以獲取vulkan的相關信息,也能獲取我們所用GPU的型號。


目前我們能將Vulkan在開源鴻蒙上正式跑起來了,接下來需要寫一個簡單的例子來驗證Vulkan的計算著色器是否正常。筆者提供了一個簡單的利用計算著色器來進行矩陣并行計算,大家可以通過laval社區的這篇文章詳細了解一下,文章鏈接:
https://laval.csdn.net/685bdb3d965a29319f2773cb.html
該例子的核心就是矩陣A和矩陣B相乘的到矩陣C,矩陣C的每個元素需要做256次乘法和255次加法。

下面是例子的具體內容:
整體流程:初始化Vulkan → 創建矩陣緩沖區 → 構建計算管線 → 提交計算任務 → 同步獲取結果 → 驗證輸出 → 資源釋放;
編寫計算著色器,如下圖;
并行策略:每個線程計算輸出矩陣的一個元素;
工作組配置:每個工作組包含16x16=256個并行線程;
執行粒度:與主程序中的vkCmdDispatch(MATRIX_SIZE/16, MATRIX_SIZE/16, 1)配合,共調度 (256/16)^2 = 256個工作組覆蓋整個矩陣;
線程總數:256 * 256 = 65536 個并行線程。

計算著色器
假設矩陣A的元素全為1,矩陣B的元素全為2,那么矩陣C的計算結果應該全為512。如下圖可見矩陣C的計算結果正確,總耗時大概在5毫秒左右。通過對比矩陣C的結果和耗時,初步可以確認Vulkan的計算著色器能在開源鴻蒙上正常運行。

矩陣C的計算結果
推理框架 llama.cpp
利用前一步得到的Vulkan sdk,接下來需要交叉編譯出llama.cpp。下面是交叉編譯的命令。

最終我們將編譯的產物拷貝至開源鴻蒙設備上,然后運行。可以看到llama.cpp能夠正確識別我們的AMD GPU并將模型的權重加載至顯卡上。


總結
本文主要分享了如何在端側打通大模型部署的整體思路和實踐,從而補齊開源鴻蒙在端側部署大模型的能力。目前能夠利用圖形接口Vulkan的計算著色器的能力,能夠在端側的AMD的消費級顯卡AMD 7900XTX上部署類似DeepSeek 32B這類的大模型,從而打造了AI能力的算力底座,為AI應用提供支撐。
-
cpu
+關注
關注
68文章
11277瀏覽量
224938 -
AI
+關注
關注
91文章
39755瀏覽量
301354 -
開源
+關注
關注
3文章
4203瀏覽量
46122 -
大模型
+關注
關注
2文章
3648瀏覽量
5179
原文標題:拆·應用丨第6期:基于Vulkan的端側AI運算
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
端側AI浪潮已來!炬芯科技發布新一代端側AI音頻芯片,能效比和AI算力大幅度提升
首創開源架構,天璣AI開發套件讓端側AI模型接入得心應手
榮耀引領端側AI新時代
中信建投建議關注端側AI模組機會
廣和通Fibocom AI Stack:加速端側AI部署新紀元
AI大模型端側部署正當時:移遠端側AI大模型解決方案,激活場景智能新范式
AI大模型端側部署正當時:移遠端側AI大模型解決方案,激活場景智能新范式
炬芯科技探索端側AI技術與應用
借助谷歌LiteRT構建下一代高性能端側AI
基于Vulkan的端側AI運算
評論