樹集成模型仍然是表格數據的首選,因為它們準確、訓練成本相對較低且速度快。但是,如果您需要低于 10 毫秒的延遲或每秒數百萬次的預測,那么在 CPU 上部署 Python 推理很快就會成為瓶頸。
2019 年,Forest Inference Library (FIL) 首次出現在 cuML 0.9 中,一直圍繞著一件事:為梯度提升樹和在 XGBoost、LightGBM、scikit-learn 或 NVIDIA cuML 中訓練的隨機森林提供快速推理。一般來說,如果您的模型可以轉換為 Treelite,則可以使用 FIL。
FIL 已在 RAPIDS 25.04 中重新設計,新的亮點包括:
- 新的 C++ 實現,允許您在 GPU 或 CPU 上執行批量推理
- 用于調整推理模型的 optimize() 函數
- 全新高級推理 API (predict_per_tree, apply)
- GPU 吞吐量比 cuML 25.02 FIL 快高達 4 倍
在本博文中,您將了解 cuML 25.04 中 FIL 的新功能、性能和特性,并了解它比以前的 cuML 版本具有的優勢。
快速入門示例 (XGBoost → FIL)
用戶可以像往常一樣在 XGBoost LightGBM 或 Scikit-learn 中訓練模型,將其保存到磁盤中,然后使用 FIL 重新加載這些模型并將其應用于新數據。這可能發生在部署服務器中,也可能發生在與訓練完全不同的硬件中。以下是易于使用的 Python API 的簡單示例:
import xgboost as xgb from cuml.fil import ForestInference # Train your model as usual and save it xgb_model = xgb.XGBClassifier() xgb_model.fit(X_train, y_train) xgb_model.save_model( "xgb_model.ubj" ) # Load into FIL and auto-tune for 10 k-row batches fil_model = ForestInference.load( "xgb_model.ubj" ) # Now you can predict with FIL directly preds = fil_model.predict(X_test) probs = fil_model.predict_proba(X_test) |
cuML 中 FIL 的新功能
自動優化
cuML 中的森林推理功能允許用戶使用各種超參數微調性能。對于任何給定的模型和批量大小,很難預測最優值,因此通常需要根據經驗確定這些值。新版本的 FIL 通過在任何給定批量大小下自動優化的內置方法顯著簡化了這一過程:
fil_model = ForestInference.load( "xgb_model.ubj" ) fil_model.optimize(batch_size = 1_000_000 ) result = fil_model.predict(data) |
調用 .optimize
后,后續的預測調用將使用針對指定批量大小找到的最佳性能 hyperparameters。您還可以通過查看 .layout
和 .default_chunk_size
屬性來檢查所選擇的 hyperparameters。
print (fil_model.layout) print (fil_model.default_chunk_size) |
新的預測 API
通常,我們只需輸出森林模型的最終輸出,無論是類預測還是所有樹的組合數字輸出。但是,有時,獲取有關集成中單個樹的更詳細的信息會很有用。因此,我們引入了兩種新的預測方法:.predict_per_tree
和 .apply
。
第一個是 .predict_per_tree
,分別給出每棵樹的預測。這對于試驗新的集成技術或分析集成如何達到整體預測非常有用。例如,用戶可以根據樹齡、out-of-bag AUC 甚至數據漂移分數對每棵樹加權,然后對樹進行平均投票,以做出更明智的最終決策,而無需重新訓練。另一個示例是快速提供預測間隔,無需引導或不同的訓練:
per_tree = fil_model.predict_per_tree(X) mean = per_tree.mean(axis = 1 ) lower = cupy.percentile(per_tree, 10 , axis = 1 ) upper = cupy.percentile(per_tree, 90 , axis = 1 ) |
第二個參數 .apply
為給定輸入提供每棵樹的葉節點的節點 ID。這為森林模型開辟了新的用途,超越了簡單的回歸或分類。一個非常簡單的應用是通過計算兩行發送到同一葉的樹的數量來測量它們的“相似性”:
leaf = fil_model. apply (X) sim = (leaf[i] = = leaf[j]).mean() # fraction of matching leaves print (f "{sim:.0%} of trees agree on rows {i} & {j}" ) |
GPU 和 CPU 支持
雖然 cuML 中的森林推理功能最初始于加速 GPU 上的森林推理,但用戶希望在沒有 NVIDIA GPU 的系統上開發森林推理應用。一個常見用例是在將模型部署到生產環境之前對小型數據子集進行本地測試。另一個有價值的用例是能夠在流量較少時縮小到僅使用 CPU 的機器,并使用 GPU 進行擴展,以便在流量增加時從速度和成本節約中受益。
您可以在 CPU 模式下編譯 FIL,并從 C++ 調用它。這允許您在不依賴任何 CUDA 的情況下使用它,同時仍然加載兼容 Treelite 的模型,并使用 OpenMP 在所有可用的 CPU 核心中分散推理。
對于 Python 用戶,您可以嘗試使用 cuML 25.04 中引入的新上下文管理器在 CPU 中執行 FIL。
from cuml.fil import ForestInference, get_fil_device_type, set_fil_device_type with set_fil_device_type( "cpu" ): fil_model = ForestInference.load( "xgboost_model.ubj" ) result = fil_model.predict(data) |
未來版本還將提供可安裝在 CPU-only 系統中的 Python 包。
FIL 如何加快速度
這個新版本通過降低從內存中提取數據的頻率,加快了基于樹的模型的速度。現在,樹的每個決策點或節點都以所需的最小大小 (通常為 8 或 16 字節) 自動存儲,并且節點以更智能的布局排列。大多數時候,處理器可以在單個快速讀取中抓取下一個節點,而不是幾個緩慢的節點。默認情況下,使用 depth_first
布局,該布局最適合更深的樹 (深度 ≥ 4) 。如果您的樹很淺,請嘗試將 layered
用于較小的批量 (1–128 行) 或 breadth_first
用于較大的批量—but 記住,內置的 .optimize
函數可以為您測試它們。
此外,還引入了新的性能超參數 align_bytes
,以便對 depth_first
和 breadth_first
布局中的樹進行對齊,使其從緩存行邊界開始。這有時 (但并不總是) 會帶來性能提升。CPU 上的 64 字節對齊可為大多數模型提供最佳性能。在 GPU 上,這種對齊很少能帶來好處,但一些模型確實受益于 128 字節對齊。
性能
為了最全面地了解新 FIL 的性能特征,我們對其中每個變量進行了全面的掃描,如下表所示:
變量 | 價值 |
---|---|
最大樹深度 | 2;4;8;16;32 |
樹數量 | 16;128;1024;2048 |
特征計數 | 8;32;128;512 |
批量大小 | 1;16;128;1,024;1,048,576;16,777,216 |
A RandomForestRegressor
模型使用 10,000 行合成生成的數據,使用最大樹深度、樹數量和特征數量的每種組合進行訓練。對于 cuML 25.04,我們使用了新的 .optimize
方法,并在之前的版本中使用了手動網格搜索。
然后,使用從與訓練數據相同的分布中合成生成的輸入批量來測試運行時性能。輸入通過用于 GPU FIL 的 CuPy 數組和用于 CPU FIL 的 NumPy 數組提供。兩個版本都進行了三次熱身。然后,對每個批量大小進行五輪推理來測量性能,并在這些回合中使用最小運行時間。
GPU 結果使用了單個 NVIDIA H100 (80GB HBM3) ,CPU 結果使用了雙路 Intel Xeon Platinum 8480CL 計算機。在所有這些場景中,cuML 25.04 在 75% 的情況下都優于上一個版本。下表顯示了最佳、最差和中值的相對和絕對性能變化。如果相對提速低于 1,則表示性能回歸。請注意,最差的絕對速度減慢是 62 毫秒,而最佳的絕對速度加快是 5 秒。
? | 加速 ( cuML 25.04 與 25.02) |
最低 | 0.73 倍 |
中值 | 1.16 倍 |
最大值 | 4.1 倍 |
雖然這些高層次的匯總統計數據可以大致了解新 FIL 的性能改進,但審查特定用例的性能也很有用。通常最值得關注的兩個場景是批量大小 1 的性能和在任何批量大小下可獲得的最大吞吐量。這些用例代表必須一次處理一個推理請求或最大限度地減少延遲至關重要的用例,以及可以批量推理以減少處理時間和費用的用例。

如圖所示,在批量大小為 1 時,在 81% 的測試模型中,25.04 的性能優于之前的版本。對于包含許多深度樹的模型而言,它的性能略遜一籌,但總體速度中值提高了 1.6x 倍。
下面的類似熱圖中顯示了最大吞吐量性能。

在此情況下,在 76% 的模型中,cuML 25.04 的性能仍然優于上一個版本的原始 FIL,加速中值為 1.4 倍,在淺樹情況下略有下降。
為全面了解性能,我們將 cuML 25.04 與 scikit-learn 的 RandomForest
性能進行了比較。scikit-learn 代碼庫的一大特色是其許多實現的簡潔性。用戶可以查看算法的實現,并快速了解其工作原理及其修改方式。
然而,對于 RandomForest
模型,這種方法并不總是能產生最高的推理性能。此次更新的一個重要目標是直接加速 scikit-learn 森林模型,以便用戶在不增加 scikit-learn 代碼庫本身復雜性的情況下獲得出色的推理性能。
在所有這些場景中,通過將 AMD EPYC 9654P 96 核 CPU 與單個 H100 (80GB HBM3) GPU 進行比較,FIL 的表現優于 scikit-learn 原生執行。與之前一樣,我們在下表中總結了整體性能:
? | 加速 (用于森林推理的全新 FIL 與原生 Sklearn 對比) |
最低 | 13.9 倍 |
中值 | 147x |
最大值 | 882x |
批量大小 1 的加速如下所示:

從熱圖中可以計算出,批量大小 1 的中值加速為 239 倍。與 scikit-learn native 相比,我們通過以下方式展示了最大吞吐量性能:

立即開始在 NVIDIA cuML 中使用 FIL
cuML 中森林推理庫的新重寫提供了許多有用的新功能,并且相對于之前的版本,性能有了顯著提升。新的自動優化功能可以更輕松地充分利用新的性能增強功能。
這使得 FIL 成為許多場景的理想選擇:
- 面向用戶的 API,其中每一毫秒都至關重要
- 大批量批處理作業 (廣告點擊評分、IoT analytics)
- 混合部署 – 相同的模型文件,在運行時選擇 CPU 或 GPU
- 在本地進行原型設計并部署到 GPU 加速的生產服務器
- 降低成本 – 一個 GPU 可以取代 50 個或更多核心的 CPU。
立即下載 cuML 25.04 版本,試用 FIL 中包含的新森林推理功能。這些功能也將在 Triton Inference Server 的未來版本中提供。
即將發布的博客文章將分享此新實現的技術細節、進一步的基準測試,以及 FIL 與 NVIDIA Triton Inference Server 的集成。
如需詳細了解 FIL (包括性能、API 文檔、基準測試和更多內容) ,請參閱 cuML FIL 文檔。如需了解有關加速數據科學的更多信息,請查看我們的 DLI 學習路徑中的實戰課程。
?