作者:Arm 工程部資深軟件工程師 Kevin Mooney
OpenRNG 是一個(gè)開(kāi)源隨機(jī)數(shù)生成器 (RNG) 庫(kù),最初隨 Arm Performance Libraries 24.04 一同發(fā)布。OpenRNG 旨在提升人工智能 (AI) 框架性能,有助于科學(xué)應(yīng)用及金融軟件的開(kāi)發(fā),因而廣受歡迎。而在去年晚些時(shí)候,Arm 推出了 OpenRNG 的首個(gè)開(kāi)源版本。
OpenRNG 可直接替代英特爾矢量統(tǒng)計(jì)庫(kù) (Vector Statistics Library, VSL) 的隨機(jī)數(shù)生成組件,開(kāi)發(fā)者從而能夠更輕松地將應(yīng)用移植到 Arm 平臺(tái)。VSL 是 OneMKL 的一部分,專(zhuān)為 x86 架構(gòu)處理器而設(shè)計(jì)。OpenRNG 有助于提升性能,例如與 Arm 平臺(tái)上已有實(shí)現(xiàn)相比,OpenRNG 僅需很少的代碼改動(dòng),就使 PyTorch 的 Dropout 層的性能提高了 44 倍。OpenRNG 的性能也較 C++ 標(biāo)準(zhǔn)庫(kù)提高了 2.7 倍。
雖然起初的優(yōu)化是針對(duì)基于 Arm 架構(gòu)的系統(tǒng),但我們的目標(biāo)是將 OpenRNG 發(fā)展成為跨平臺(tái)項(xiàng)目,因此我們歡迎針對(duì)任何架構(gòu)的補(bǔ)丁。
英特爾按照知識(shí)共享許可協(xié)議向我們開(kāi)放了這個(gè)接口。該許可協(xié)議使我們能夠?yàn)榛?Arm 架構(gòu)系統(tǒng)的用戶(hù)實(shí)現(xiàn)這一功能,從而在不修改代碼的情況下實(shí)現(xiàn)不同架構(gòu)之間軟件的可移植性。
源代碼現(xiàn)已公開(kāi)在 Arm 的 GitLab 上,可查閱 Arm Performance Libraries 參考指南獲取相關(guān)信息。
隨機(jī)數(shù)為什么實(shí)用?
隨機(jī)數(shù)在各種應(yīng)用中都非常重要,可用于模擬本質(zhì)上不可預(yù)測(cè)的自然過(guò)程。例如,在物理學(xué)中,隨機(jī)數(shù)常用于建立隨機(jī)模型,模擬確定性模型無(wú)法解決的問(wèn)題;在金融領(lǐng)域,隨機(jī)數(shù)常用于模擬金融市場(chǎng);在游戲中則常用于實(shí)現(xiàn) AI。
物理過(guò)程和金融市場(chǎng)錯(cuò)綜復(fù)雜,涉及很多輸入,不可能進(jìn)行完全的理解、建模和預(yù)測(cè)。而一些輸入被視為隨機(jī)變量,需要快速、可重復(fù)地生成;銀行在計(jì)算風(fēng)險(xiǎn)敞口時(shí),不應(yīng)該因?yàn)橹匦逻\(yùn)行相同的模型得到不同的隨機(jī)數(shù)而發(fā)生變化。
為游戲開(kāi)發(fā) AI 時(shí),行為動(dòng)作應(yīng)是不可預(yù)測(cè)的,因此要引入隨機(jī)性。隨機(jī)數(shù)生成的速度越快,同時(shí)生成的 AI 就越多。同樣,多人游戲需要在多臺(tái)設(shè)備上生成相同的隨機(jī)數(shù)。不同玩家應(yīng)該在同一個(gè)位置看到敵人,隨機(jī)性很重要。
庫(kù)里有什么?
OpenRNG 實(shí)現(xiàn)了多種生成器和分布方式。生成器算法可生成“看似隨機(jī)”并具有某些統(tǒng)計(jì)特性的序列,我們將在下文進(jìn)行討論。分布方式會(huì)將序列映射到常見(jiàn)的概率分布概念,如高斯分布或二項(xiàng)分布。
OpenRNG 還提供復(fù)制和保存序列的工具,以及在不同線程間分發(fā)序列的工具。這些工具可實(shí)現(xiàn)高效的多線程處理和檢查點(diǎn)等功能。
隨機(jī)數(shù)生成器
OpenRNG 實(shí)現(xiàn)了三種類(lèi)型的隨機(jī)數(shù)生成器:偽隨機(jī)數(shù)生成器、準(zhǔn)隨機(jī)數(shù)生成器、非確定性隨機(jī)數(shù)生成器。
偽隨機(jī)數(shù)生成器 (PRNG) 算法生成的數(shù)字序列在統(tǒng)計(jì)學(xué)上看似隨機(jī),但卻能重復(fù)生成。PRNG 通常能通過(guò)很多隨機(jī)性統(tǒng)計(jì)測(cè)試,但一旦知道當(dāng)前序列中的位置,就能確定下一個(gè)數(shù)字;這就是我們說(shuō)它看似隨機(jī)的原因。OpenRNG 采用了多種類(lèi)型的 PRNG,如線性同余生成器 (LCG)、多重遞歸生成器 (MRG)、梅森旋轉(zhuǎn)算法(如 MT19937)和基于計(jì)數(shù)器的生成器(如 Philox)。
準(zhǔn)隨機(jī)數(shù)生成器 (QRNG) 的算法可生成低差異序列。該類(lèi)工具無(wú)法通過(guò)隨機(jī)性統(tǒng)計(jì)測(cè)試,但能生成在 n 維超立方體上均勻分布的 n 維向量,從而均勻地填充空間。OpenRNG 提供用于生成低差異序列的 SOBOL 生成器。
大多數(shù)現(xiàn)代硬件都配備了非確定性隨機(jī)數(shù)生成器,也稱(chēng)真隨機(jī)數(shù)生成器 (TRNG),OpenRNG 為這些生成器提供了一個(gè)接口,以便開(kāi)發(fā)者訪問(wèn)。TRNG 可以提供高質(zhì)量隨機(jī)數(shù),其序列來(lái)自于外部。TRNG 通常比 PRNG 速度慢,且序列不可再現(xiàn)。
我們盡力確保使用的生成器和初始化方式與 oneMKL 文檔中定義的相同。這意味著,在可能的情況下,OpenRNG 和 oneMKL 之間的序列可以按位替換。
概率分布
除了實(shí)現(xiàn) RNG 之外,OpenRNG 還提供了將隨機(jī)序列轉(zhuǎn)換為常見(jiàn)概率分布的便捷方法。OpenRNG 可以生成具有常見(jiàn)概率分布(離散和連續(xù))的隨機(jī)數(shù)。
連續(xù)分布是實(shí)數(shù)的概率分布,例如 0 和 1 之間的可表示小數(shù)。連續(xù)分布可以請(qǐng)求為單精度或雙精度浮點(diǎn)數(shù)。OpenRNG 支持多種連續(xù)分布,包括均勻分布、高斯分布和指數(shù)分布。
離散分布是僅限于整數(shù)的概率分布。OpenRNG 采用了常見(jiàn)的離散分布,如均勻分布、泊松分布、二項(xiàng)分布和伯努利分布。
OpenRNG 分布生成的確切值可能與 oneMKL 的值略有不同,因?yàn)閮蓚€(gè)庫(kù)之間各種操作的精度不同。
高效多線程
很多應(yīng)用都需要生成長(zhǎng)序列的隨機(jī)數(shù)。多線程運(yùn)行時(shí),擁有不同的獨(dú)立序列非常重要。OpenRNG 有兩種不同的方法可供選擇:跳過(guò)和跳躍。
跳過(guò)法讓序列跳過(guò)一定數(shù)量的元素。此時(shí)效率至關(guān)重要,這種方法可以跳過(guò)很多元素,例如 2 的 32 次方的倍數(shù),單獨(dú)生成這些元素會(huì)產(chǎn)生大量不必要的開(kāi)銷(xiāo)。
跳躍法適用于線程交錯(cuò)消耗元素的情況。例如,在有 n 個(gè)線程的情況下,第 k 個(gè)線程從“全局”序列的第 k 個(gè)元素開(kāi)始,則該線程序列中的第 i 個(gè)元素就是“全局”序列的第 (k + i*n) 個(gè)元素。
性能
C++ 標(biāo)準(zhǔn)庫(kù)
C++ 標(biāo)準(zhǔn)庫(kù)提供三種類(lèi)型的生成器:線性同余生成器、梅森旋轉(zhuǎn)算法生成器和帶進(jìn)位減法生成器。OpenRNG 未采用帶進(jìn)位減法生成器,而是采用了線性同余生成器和梅森旋轉(zhuǎn)算法,只需稍加配置,我們就能比較 OpenRNG 和 C++ 標(biāo)準(zhǔn)庫(kù)中的 MCG31 和 MT19937 實(shí)現(xiàn)情況。C++ 標(biāo)準(zhǔn)庫(kù)和 OpenRNG 包含多種常見(jiàn)分布,我們選擇了兩種廣泛使用的分布,即均勻分布和高斯分布(也稱(chēng)正態(tài)分布)。
下圖展示了 AWS Graviton3 上使用 GCC 14 和 -O3 的基準(zhǔn)數(shù)據(jù)?;鶞?zhǔn)測(cè)試包括重復(fù)填充一個(gè)包含 5,000 個(gè)元素的緩沖區(qū),并計(jì)算每個(gè)庫(kù)在熱點(diǎn)循環(huán)中花費(fèi)的總時(shí)間的比例。我們對(duì)所選生成器和分布的所有組合重復(fù)執(zhí)行了基準(zhǔn)測(cè)試。
對(duì)于均勻分布,大部分運(yùn)行時(shí)間都用于生成隨機(jī)序列。組合使用 MCG31 生成器與均勻分布實(shí)現(xiàn)了更大地提速比,比率高達(dá) 2.73。
對(duì)于高斯分布,大部分運(yùn)行時(shí)間都用于將隨機(jī)序列轉(zhuǎn)換為高斯分布。與 libstdc++ 相比,使用 MT19937 生成器的最大提速比為 1.88。

柱狀圖展示了 OpenRNG 相較于 C++ 標(biāo)準(zhǔn)庫(kù)的性能優(yōu)勢(shì)。每個(gè)柱形的高度是使用兩個(gè)庫(kù)生成隨機(jī)數(shù)所花時(shí)間的比率。大于 1 表示 OpenRNG 的速度更快。
PyTorch
下圖顯示了在 Arm 平臺(tái)上使用 VSL RNG 進(jìn)行 PyTorch 機(jī)器學(xué)習(xí) (ML) 獲得的優(yōu)勢(shì)。PyTorch 可以配置為在 Dropout 層使用 OpenRNG 的 VSL RNG,從伯努利分布中提取隨機(jī)值。例如,當(dāng)批次大小為 16,輸入張量為 [16, 128, 3072] 時(shí),與使用 PyTorch 中的默認(rèn) RNG 相比,順序執(zhí)行時(shí)性能提高了四倍。此外,當(dāng)啟用 VSL 接口時(shí),PyTorch 會(huì)使用跳過(guò)法來(lái)并行生成隨機(jī)值。如果不使用 VSL,隨機(jī)值始終是按順序生成的,沒(méi)有并行。使用 16 個(gè)線程為輸入張量 [16, 128, 3072] 實(shí)現(xiàn)并行處理可以進(jìn)一步提高性能,在 Dropout 層中使用 OpenRNG 的速度比默認(rèn)的速度快 44 倍左右。

柱狀圖展示了結(jié)合 OpenRNG 與 PyTorch 的性能優(yōu)勢(shì)。每個(gè)柱形的高度表示平均耗時(shí)。配置速度越快,高度越低。
歡迎提供補(bǔ)丁
我們很高興能發(fā)布 OpenRNG 并涵蓋了 VSL 的大部分功能,但仍有一些領(lǐng)域需進(jìn)一步開(kāi)發(fā)。目前某些功能還未實(shí)現(xiàn)。此外,目前所有的優(yōu)化都專(zhuān)門(mén)針對(duì)基于 Arm 架構(gòu)的系統(tǒng)。我們希望 OpenRNG 能成為一個(gè)跨平臺(tái)項(xiàng)目,因此我們歡迎針對(duì)任何架構(gòu)的新參考實(shí)現(xiàn)和性能優(yōu)化補(bǔ)丁。如果你想提交自己的開(kāi)發(fā)工作、報(bào)告錯(cuò)誤、提交功能請(qǐng)求或其他任何事項(xiàng),請(qǐng)?jiān)?GitLab 上提出問(wèn)題并與我們聯(lián)系。
Arm Performance Libraries 未來(lái)將繼續(xù)包含 OpenRNG,并在 GitLab 中標(biāo)記發(fā)布的代碼。OpenRNG 倉(cāng)庫(kù)將保持開(kāi)放,以供開(kāi)發(fā)者使用。GitLab 上有貢獻(xiàn)指南。我們已盡力確保 OpenRNG 采用 MIT 和 Apache-2.0 技術(shù)授權(quán)許可,讓用戶(hù)可以將源代碼添加到自己的項(xiàng)目中,而不會(huì)受到繁瑣的限制。
相關(guān)鏈接:
[1]Arm GitLab:https://gitlab.arm.com/libraries/openrng
[2] Arm Performance Libraries 參考指南:
https://developer.arm.com/documentation/101004/2404/Open-Random-Number-Generation--OpenRNG--Reference-Guide
[3] Arm GitLab 提問(wèn)頁(yè)面:
https://gitlab.arm.com/libraries/openrng/issues
[4]貢獻(xiàn)指南:
https://gitlab.arm.com/libraries/openrng/-/blob/main/CONTRIBUTING.md
* Arm 原創(chuàng)文章
-
ARM
+關(guān)注
關(guān)注
135文章
9552瀏覽量
391851 -
生成器
+關(guān)注
關(guān)注
7文章
322瀏覽量
22707
原文標(biāo)題:利用隨機(jī)數(shù)生成器庫(kù) OpenRNG,實(shí)現(xiàn)移植到 Arm 平臺(tái)時(shí)的最佳性能
文章出處:【微信號(hào):Arm社區(qū),微信公眾號(hào):Arm社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
飛凌嵌入式ElfBoard-系統(tǒng)信息與資源之產(chǎn)生隨機(jī)數(shù)
如何在LTspice仿真中實(shí)現(xiàn)偽隨機(jī)數(shù)和真隨機(jī)數(shù)的生成
德思特應(yīng)用 | 前沿量子隨機(jī)數(shù)研究:多特蒙德工業(yè)大學(xué)如何通過(guò)高速數(shù)字化儀保障信息安全
如何通過(guò)地址生成器實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)特征圖的padding?
?基于RNG90的真隨機(jī)數(shù)生成器技術(shù)解析與應(yīng)用指南
非對(duì)稱(chēng)密鑰生成和轉(zhuǎn)換規(guī)格詳解
真隨機(jī)數(shù)和偽隨機(jī)數(shù)的區(qū)別
DS28S60具有ChipDNA的DeepCover加密協(xié)處理器技術(shù)手冊(cè)
labview求助:想寫(xiě)一個(gè)labview輸出不重復(fù)隨機(jī)數(shù)的程序,有沒(méi)有大佬幫忙看看這個(gè)假分支要怎么寫(xiě)?
基于RV1126開(kāi)發(fā)板移植NCNN部署庫(kù)方法
開(kāi)源隨機(jī)數(shù)生成器庫(kù)OpenRNG助力實(shí)現(xiàn)移植到Arm平臺(tái)時(shí)的最佳性能
評(píng)論