介紹
RAPIDS森林推理庫,親切地稱為 FIL ,極大地加速了基于樹的模型的推理(預(yù)測),包括梯度增強(qiáng)的決策樹模型(如 XGBoost 和 LightGBM 的模型)和隨機(jī)森林 ( 要深入了解整個(gè)庫,請(qǐng)查看 最初的 FIL 博客 。原始 FIL 中的模型存儲(chǔ)為密集的二叉樹。也就是說,樹的存儲(chǔ)假定所有葉節(jié)點(diǎn)都出現(xiàn)在同一深度。這就為淺樹提供了一個(gè)簡單、運(yùn)行時(shí)高效的布局。但對(duì)于深樹,它也需要 lot 的 GPU 內(nèi)存2d+1-1深度樹的節(jié)點(diǎn) d 。為了支持最深的森林, FIL 支持
稀疏樹存儲(chǔ)。如果稀疏樹的分支早于最大深度 d 結(jié)束,則不會(huì)為該分支的潛在子級(jí)分配存儲(chǔ)。這可以節(jié)省大量內(nèi)存。雖然深度為 30 的 稠密的 樹總是需要超過 20 億個(gè)節(jié)點(diǎn),但是深度為 30 的最瘦的 稀疏 樹只需要 61 個(gè)節(jié)點(diǎn)。
在 FIL中使用稀疏森林
在 FIL 使用稀疏森林并不比使用茂密森林困難。創(chuàng)建的林的類型由新的 storage_type 參數(shù)控制到 ForestInference.load() 。其可能值為:
DENSE 為了營造一片茂密的森林,
SPARSE 要?jiǎng)?chuàng)建稀疏的森林,
AUTO (默認(rèn))讓 FIL 決定,當(dāng)前總是創(chuàng)建一個(gè)密林。
無需更改輸入文件、輸入數(shù)據(jù)或預(yù)測輸出的格式。初始模型可以由 scikit learn 、 cuML 、 XGBoost 或 LightGBM 進(jìn)行訓(xùn)練。下面是一個(gè)將 FIL 用于稀疏森林的示例。
from cuml import ForestInference import sklearn.datasets # Load the classifier previously saved with xgboost model_save() model_path = 'xgb.model' fm = ForestInference.load(model_path, output_class=True, storage_type='SPARSE') # Generate random sample data X_test, y_test = sklearn.datasets.make_classification() # Generate predictions (as a gpu array) fil_preds_gpu = fm.predict(X_test.astype('float32'))
實(shí)施
圖 1 :在 FIL 中存儲(chǔ)稀疏森林。
圖 1 描述了稀疏森林是如何存儲(chǔ)在 FIL 中的。所有節(jié)點(diǎn)都存儲(chǔ)在單個(gè)大型 nodes 陣列中。對(duì)于每個(gè)樹,其根在節(jié)點(diǎn)數(shù)組中的索引存儲(chǔ)在 trees 數(shù)組中。每個(gè)稀疏節(jié)點(diǎn)除了存儲(chǔ)在密集節(jié)點(diǎn)中的信息外,還存儲(chǔ)其左子節(jié)點(diǎn)的索引。由于每個(gè)節(jié)點(diǎn)總是有兩個(gè)子節(jié)點(diǎn),所以左右節(jié)點(diǎn)相鄰存儲(chǔ)。因此,右子級(jí)的索引總是可以通過將左子級(jí)的索引加 1 來獲得。在內(nèi)部, FIL 繼續(xù)支持密集節(jié)點(diǎn)和稀疏節(jié)點(diǎn),這兩種方法都來自一個(gè)基林類。
與內(nèi)部更改相比,對(duì) pythonapi 的更改保持在最低限度。新的 storage_type 參數(shù)指定是創(chuàng)建密集林還是稀疏林。此外,一個(gè)新的值 ‘AUTO’ 已經(jīng)成為推斷算法參數(shù)的新默認(rèn)值;它允許 FIL 自己選擇推理算法。對(duì)于稀疏林,它當(dāng)前使用的是 ‘NAIVE’ 算法,這是唯一受支持的算法。對(duì)于密林,它使用 ‘BATCH_TREE_REORG’ 算法。
基準(zhǔn)
為了對(duì)稀疏樹進(jìn)行基準(zhǔn)測試,我們使用 sciket learn 訓(xùn)練了一個(gè)隨機(jī)林,具體來說就是 sklearn.ensemble.RandomForestClassifier 。然后,我們將得到的模型轉(zhuǎn)化為一個(gè) FIL 林,并對(duì)推理的性能進(jìn)行了測試。數(shù)據(jù)是使用 sklearn.datasets.make_classification() 生成的,包含 200 萬行,在訓(xùn)練和驗(yàn)證數(shù)據(jù)集之間平分, 32 列。對(duì)于基準(zhǔn)測試,在一百萬行上執(zhí)行推斷。
我們使用兩組參數(shù)進(jìn)行基準(zhǔn)測試。
深度限制設(shè)置為 10 或 20 ;在這種情況下,密集或稀疏的 FIL 林都可以放入 GPU 內(nèi)存中。
無深度限制;在這種情況下, SKLearn 訓(xùn)練的模型包含非常深的樹。在我們的基準(zhǔn)測試運(yùn)行中,樹的深度通常在 30 到 50 之間。試圖創(chuàng)建一個(gè)稠密的 FIL-forest 會(huì)耗盡內(nèi)存,但是可以順利創(chuàng)建一個(gè)稀疏的 forest 。
在這兩種情況下,林本身的大小仍然相對(duì)較小,因?yàn)闃渲械娜~節(jié)點(diǎn)數(shù)限制為 2048 個(gè),并且林由 100 棵樹組成。我們測量了 CPU 推理和 GPU 推理的時(shí)間。 GPU 推理是在 V100 上進(jìn)行的, CPU 推理是在一個(gè)有兩個(gè)插槽的系統(tǒng)上進(jìn)行的,每個(gè)插槽有 16 個(gè)內(nèi)核,帶有雙向超線程?;鶞?zhǔn)測試結(jié)果如圖 2 所示。
圖 2 : FIL (密集稀疏樹)和 SKLearn 的基準(zhǔn)測試結(jié)果 。
稀疏和密集 FIL 預(yù)測器(如果后者可用)都比 SKLearn CPU 預(yù)測器快 34-60 倍。對(duì)于淺層森林,稀疏 FIL 預(yù)報(bào)器比稠密 FIL 預(yù)報(bào)器慢,但是對(duì)于較深的森林,稀疏 FIL 預(yù)報(bào)器可以更快;具體的性能差異各不相同。例如,在圖 2 中, max \ u depth = 10 時(shí),密集預(yù)測器比稀疏預(yù)測器快 1 。 14 倍,但 max \ u depth = 20 時(shí),速度較慢,僅達(dá)到稀疏預(yù)測器的 0 。 75 倍。因此,對(duì)于淺層森林應(yīng)采用稠密 FIL 預(yù)報(bào)。
然而,對(duì)于深林,稠密預(yù)測器的內(nèi)存不足,因?yàn)樗目臻g需求隨著森林深度呈指數(shù)增長。稀疏預(yù)測器沒有這個(gè)問題,即使對(duì)于非常深的樹,它也能在 GPU 上提供快速的推斷。
結(jié)論
在稀疏森林的支持下, FIL 適用于更廣泛的問題。無論您是使用 XGBoost 構(gòu)建梯度增強(qiáng)的決策樹,還是使用 cuML 或 sciket learn 構(gòu)建隨機(jī)林, FIL 都應(yīng)該是一個(gè)方便的選擇,可以加速您的推理。
關(guān)于作者
Andy Adinets 自2005年以來一直從事GPU編程工作,自2017年7月底以來一直在Nvidia擔(dān)任AI開發(fā)人員技術(shù)工程師近4年。他目前正在從事多個(gè)項(xiàng)目,包括Forest Inference Library(FIL) )和GPU排序。 當(dāng)機(jī)會(huì)出現(xiàn)時(shí),他還喜歡優(yōu)化各種GPU算法。
審核編輯:郭婷
-
cpu
+關(guān)注
關(guān)注
68文章
11077瀏覽量
217023 -
gpu
+關(guān)注
關(guān)注
28文章
4944瀏覽量
131217
發(fā)布評(píng)論請(qǐng)先 登錄
信而泰×DeepSeek:AI推理引擎驅(qū)動(dòng)網(wǎng)絡(luò)智能診斷邁向 “自愈”時(shí)代
大模型推理顯存和計(jì)算量估計(jì)方法研究
詳解 LLM 推理模型的現(xiàn)狀

英偉達(dá)GTC25亮點(diǎn):NVIDIA Dynamo開源庫加速并擴(kuò)展AI推理模型
為什么無法在運(yùn)行時(shí)C++推理中讀取OpenVINO?模型?
中國電提出大模型推理加速新范式Falcon

阿里云開源推理大模型QwQ
高效大模型的推理綜述

FPGA和ASIC在大模型推理加速中的應(yīng)用

澎峰科技高性能大模型推理引擎PerfXLM解析

評(píng)論