Arm 架構(gòu)在服務(wù)器領(lǐng)域發(fā)展勢(shì)頭前景看好。目前已有許多頭部云服務(wù)提供商和服務(wù)器制造商推出了基于 Arm Neoverse 平臺(tái)的服務(wù)器產(chǎn)品,例如 AWS Graviton、阿里云的倚天 710 系列等。這些廠商提供了完整的軟硬件支持和優(yōu)化,使得大模型推理在基于 Arm 架構(gòu)的服務(wù)器上運(yùn)行更加便捷和高效。
Arm 架構(gòu)的服務(wù)器通常具備低功耗的特性,能帶來(lái)更優(yōu)異的能效比。相比于傳統(tǒng)的 x86 架構(gòu)服務(wù)器,Arm 服務(wù)器在相同功耗下能夠提供更高的性能。這對(duì)于大模型推理任務(wù)來(lái)說(shuō)尤為重要,因?yàn)榇竽P屯ǔP枰罅康挠?jì)算資源,而能效比高的 Arm 架構(gòu)服務(wù)器可以提供更好的性能和效率。
Armv9 新特性提高大模型推理的計(jì)算效率
Armv9 架構(gòu)引入了 SVE2 (Scalable Vector Extension,可擴(kuò)展向量延伸指令集)。SVE2 是一種可擴(kuò)展的向量處理技術(shù),它允許處理器同時(shí)執(zhí)行多個(gè)數(shù)據(jù)元素的操作,可以提供更高效的向量計(jì)算和人工智能 (AI) 硬件加速,從而加快了 AI 任務(wù)的執(zhí)行速度,提高了能效和性能。這對(duì)于在 Arm 架構(gòu)的服務(wù)器上進(jìn)行大規(guī)模 AI 推理和訓(xùn)練任務(wù)非常有益,不論是實(shí)現(xiàn)更好的用戶體驗(yàn)或是更高的計(jì)算效率。
SVE2 對(duì) AI 推理引擎的支持有效地使用了 BFloat16 (BF16) 格式,BF16 是一種浮點(diǎn)數(shù)格式,它使用 16 位表示浮點(diǎn)數(shù),其中 8 位用于指數(shù)部分,7 位用于尾數(shù)部分,還有 1 位用于符號(hào)位。相比于傳統(tǒng)的 32 位浮點(diǎn)數(shù)格式(如 FP32),BF16 在表示范圍和精度上有所減少,但仍然能夠滿足大多數(shù) AI 推理任務(wù)的需求。
圖 1:BFloat16 格式
BF16 格式可以在減少存儲(chǔ)和帶寬需求之余,同時(shí)提供足夠的精度,來(lái)滿足大多數(shù) AI 推理任務(wù)的要求。由于 SVE2 提供了針對(duì) BF16 的向量指令,可以在同一條指令中同時(shí)處理多個(gè) BF16 數(shù)據(jù)元素,從而提高計(jì)算效率。理論上來(lái)說(shuō),采用 BF16 可以實(shí)現(xiàn)雙倍的 FP32 的性能。
SVE2 的矩陣運(yùn)算在 AI 推理中扮演著重要的角色,它可以顯著提高計(jì)算效率和性能。比如矩陣乘法 (Matrix Multiplication) 是許多 AI 任務(wù)中常見的運(yùn)算,如卷積運(yùn)算和全連接層的計(jì)算。SVE2 的向量指令可以同時(shí)處理多個(gè)數(shù)據(jù)元素,使得矩陣乘法的計(jì)算能夠以向量化的方式進(jìn)行,從而提高計(jì)算效率。指令 FMMLA 可以實(shí)現(xiàn) FP32 格式下兩個(gè) 2x2 矩陣乘法運(yùn)算,指令 BFMMLA 可以通過(guò)單指令實(shí)現(xiàn) BF16 格式下 4x2 矩陣和 2x4 矩陣的乘法,UMMLA、SMMLA 等可以實(shí)現(xiàn) INT8 格式下 8x2 矩陣和 2x8 矩陣的矩陣乘法運(yùn)算。通過(guò) SVE2 的硬件加速功能,AI 推理可以在 Arm 架構(gòu)中獲得更高效的矩陣運(yùn)算執(zhí)行,提高計(jì)算效率和性能。
圖 2:矩陣乘指令
ACL 實(shí)現(xiàn) PyTorch 的計(jì)算加速
PyTorch 可以支持 Arm 架構(gòu)的硬件加速資源,但需要安裝適用于 Arm 架構(gòu)的 PyTorch 版本,或者是從開源源代碼編譯支持 Arm 架構(gòu)硬件加速的 PyTorch 版本。Arm Compute Library (ACL, Arm 計(jì)算庫(kù)) 實(shí)現(xiàn)了 Arm 架構(gòu)的硬件加速資源的優(yōu)化封裝,通過(guò) OneDNN 來(lái)使 PyTorch 對(duì) Arm 優(yōu)化加速調(diào)用。下面介紹如何生成帶 ACL 加速的 PyTorch 版本。
圖 3:Arm Neoverse 平臺(tái) AI/ML 軟件組合
ACL 是開源軟件,下載后編譯并設(shè)定相應(yīng)的系統(tǒng)路徑。
鏈接:https://github.com/arm-software/ComputeLibrary
# git clone https://github.com/ARM-software/ComputeLibrary.git
# scons arch=armv8.6-a-sve debug=0 neon=1 os=linux opencl=0 build=native -j 32 Werror=false
validation_tests=0 multi_isa=1 openmp=1 cppthreads=0 fixed_format_kernels=1
# export ACL_ROOT_DIR=/path_to_ACL/ComputeLibrary
開源軟件 OpenBLAS 也實(shí)現(xiàn)了部分 Neon 的加速,PyTorch 同樣也要依賴 OpenBLAS,下載相應(yīng)源代碼編譯和安裝。
鏈接:https://github.com/OpenMathLib/OpenBLAS
# git clone https://github.com/OpenMathLib/OpenBLAS.git
# cmake & make & make install
獲取開源的 PyTorch 代碼,下載相應(yīng)的依賴開源軟件,指定使能 ACL 的方法進(jìn)行編譯,獲取 PyTorch 的安裝包并更新。
# git clone https://github.com/pytorch/pytorch
# git submodule update --init –recursive
# MAX_JOBS=32 PYTORCH_BUILD_VERSION=2.1.0 PYTORCH_BUILD_NUMBER=1 OpenBLAS_HOME=/opt/openblas
BLAS="OpenBLAS" CXX_FLAGS="-O3 -mcpu=neoverse-n2 -march=armv8.4-a" USE_OPENMP=1 USE_LAPACK=1 USE_CUDA=0
USE_FBGEMM=0 USE_DISTRIBUTED=0 USE_MKLDNN=1 USE_MKLDNN_ACL=1 python setup.py bdist_wheel
# pip install --force-reinstall dist/torch-2.x.x-cp310-cp310-linux_aarch64.whl
配置了運(yùn)行環(huán)境,就可以利用 Arm 架構(gòu)的硬件加速資源來(lái)加速 PyTorch 的計(jì)算。盡管 PyTorch 可以在 Arm 架構(gòu)上利用硬件加速資源,但針對(duì)具體模型和應(yīng)用場(chǎng)景,需要對(duì)模型和代碼進(jìn)行一些調(diào)整以最大程度地發(fā)揮硬件的加速優(yōu)勢(shì)。
基于 FunASR 的優(yōu)化實(shí)踐
FunASR 是阿里巴巴達(dá)摩院開發(fā)的開源的基于 Paraformer 的大模型語(yǔ)音識(shí)別模型,提供包括語(yǔ)音識(shí)別 (ASR)、語(yǔ)音端點(diǎn)檢測(cè) (VAD)、標(biāo)點(diǎn)恢復(fù)、語(yǔ)言模型、說(shuō)話人驗(yàn)證、說(shuō)話人分離和多人對(duì)話語(yǔ)音識(shí)別等在內(nèi)的多種功能。本文以 FunASR 在 Arm Neoverse 平臺(tái)上優(yōu)化的過(guò)程做為大模型的優(yōu)化實(shí)踐案例。
倉(cāng)庫(kù)地址:https://github.com/alibaba-damo-academy/FunASR
圖 4:FunASR
本次優(yōu)化是基于 ACL v23.08、oneDNN v3.3、PyTorch v2.1 進(jìn)行,測(cè)試平臺(tái)基于阿里云的 ECS 公有云,包括 C8Y、C8I、C7 等云實(shí)例。
為了確保 PyTorch 已經(jīng)啟動(dòng) ACL 進(jìn)行加速,可以加上 “DNNL_VERBOSE=1” 來(lái)查看運(yùn)行的日志輸出。
# OMP_NUM_THREADS=16 DNNL_VERBOSE=1 python runtimes.py
圖 5:使能 ACL 的 PyTorch 運(yùn)行日志
得到如上的輸出結(jié)果,可以看到已經(jīng)啟用了 ACL。
為了使優(yōu)化有明確的目標(biāo),在運(yùn)行大模型時(shí),用 PyTorch 的 profiler 做整個(gè)模型的數(shù)據(jù)統(tǒng)計(jì),即在調(diào)用大模型之前加上統(tǒng)計(jì)操作,為了減少單次運(yùn)行的統(tǒng)計(jì)誤差,可以在多次運(yùn)行之后做統(tǒng)計(jì)并輸出統(tǒng)計(jì)結(jié)果,如下面的示例:
默認(rèn)運(yùn)行是用 FP32 的格式,如果需要指定 BF16 的格式運(yùn)行,需要加上 “ONEDNN_DEFAULT_FPMATH_MODE=BF16” 的參數(shù)。
# OMP_NUM_THREADS=16 ONEDNN_DEFAULT_FPMATH_MODE=BF16 python profile.py
得到 profile 的統(tǒng)計(jì)數(shù)據(jù):
圖 6:統(tǒng)計(jì)分析日志
分析運(yùn)行的結(jié)果,找出需要優(yōu)化的算子,在這個(gè)示例中,mkldnn_convolution 運(yùn)行的時(shí)間顯著較長(zhǎng)。
圖 7:優(yōu)化前統(tǒng)計(jì)分析
通過(guò)分析定位,發(fā)現(xiàn)在 OMP 的操作中,數(shù)據(jù)并沒有按照多處理器進(jìn)行并行數(shù)據(jù)處理,修復(fù)問(wèn)題后,再次測(cè)試,發(fā)現(xiàn) Convolution 的效率大大提升。
圖 8:卷積優(yōu)化后統(tǒng)計(jì)分析
在 Arm 架構(gòu)處理器中,SVE2 可以對(duì) INT8 進(jìn)行并行數(shù)據(jù)處理,比如單指令周期可以做到 16 個(gè) INT8 的乘累加操作,對(duì) INT8 的執(zhí)行效率非常高,在對(duì)模型執(zhí)行效率有更高要求的場(chǎng)景下,可以用 INT8 來(lái)動(dòng)態(tài)量化模型,進(jìn)一步提高效率。當(dāng)然,也可以把 INT8 和 BF16 相結(jié)合,模型用 INT8 量化,中間計(jì)算用 BF16 格式,相較其他平臺(tái),有 1.5 倍的效率提升。
圖 9:動(dòng)態(tài)量化優(yōu)化
圖 10:優(yōu)化結(jié)果對(duì)比
綜上,通過(guò)充分利用 Armv9 架構(gòu)中的 SVE2 指令、BF16 數(shù)據(jù)類型等特性,并引入動(dòng)態(tài)量化等技術(shù),能夠?qū)崿F(xiàn)以 FunASR 為例的大模型在 Arm Neoverse 平臺(tái)的服務(wù)器上高效率運(yùn)行。
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
20069瀏覽量
242782 -
ARM
+關(guān)注
關(guān)注
135文章
9450瀏覽量
385713 -
語(yǔ)音識(shí)別
+關(guān)注
關(guān)注
39文章
1795瀏覽量
115056 -
pytorch
+關(guān)注
關(guān)注
2文章
812瀏覽量
14426
原文標(biāo)題:FunASR 語(yǔ)音大模型在 Arm Neoverse 平臺(tái)上的優(yōu)化實(shí)踐
文章出處:【微信號(hào):Arm社區(qū),微信公眾號(hào):Arm社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
3Dfindit上發(fā)布世嘉智尼的上萬(wàn)個(gè)3D CAD模型,優(yōu)化用戶設(shè)計(jì)流程
西門子 Veloce CS 助力 Arm Neoverse 計(jì)算子系統(tǒng)驗(yàn)證與確認(rèn)
Arm Neoverse N2平臺(tái)實(shí)現(xiàn)DeepSeek-R1滿血版部署

2.0.0版本的ST Edge AI Core在linux平臺(tái)上可以把量化后的onnx模型轉(zhuǎn)換為.nb,但是運(yùn)行報(bào)錯(cuò),缺少文件,為什么?
解讀基于Arm Neoverse V2平臺(tái)的Google Axion處理器
智能語(yǔ)音交互方案在客服領(lǐng)域的應(yīng)用
Arm助力開發(fā)者加速遷移至Arm架構(gòu)云平臺(tái) Arm云遷移資源分享
如何在基于Arm Neoverse平臺(tái)的CPU上構(gòu)建分布式Kubernetes集群

利用Arm Kleidi技術(shù)實(shí)現(xiàn)PyTorch優(yōu)化

HAL庫(kù)在Arduino平臺(tái)上的使用
Arm Neoverse如何加速實(shí)現(xiàn)AI數(shù)據(jù)中心
基于Arm Neoverse N2實(shí)現(xiàn)自動(dòng)語(yǔ)音識(shí)別技術(shù)

評(píng)論