让树模型预测时能加速2-10倍的方案

↑↑↑关注后"星标"kaggle竞赛宝典
  kaggle竞赛宝典  作者:Coggle

Treelite:树模型部署加速工具(支持XGBoost、LightGBM和Sklearn)!

项目链接:https://treelite.readthedocs.io/

项目论文:https://mlsys.org/Conferences/doc/2018/196.pdf

支持模型:XGB、LGB、SKlearn树模型

Treelite介绍

Treelite能够树模型编译优化为单独库,可以很方便的用于模型部署。经过优化后可以将XGBoost模型的预测速度提高2-6倍。

如上图,黑色曲线为XGBoost在不同batch size下的吞吐量,红色曲线为XGBoost经过TreeLite编译后的吞吐量。

Treelite支持众多的树模型,特别是随机森林和GBDT。同时Treelite可以很好的支持XGBoost, LightGBM和 scikit-learn,也可以将自定义模型根据要求完成编译。

Treelite原理

Treelite主要在两方面完成了改进。

逻辑分支

对于树模型而言,节点的分类本质使用if语句完成,而CPU在执行if语句时会等待条件逻辑的计算。

if ( [conditional expression] ) {
  foo();
else {
  bar();
}

如果在构建树模型时候,提前计算好每个分支下面样本的个数,则可以提前预知哪一个叶子节点被执行的可能性更大,进而可以提前执行子节点逻辑。

借助于编译命令,可以完成逻辑计算加速。

/* expected to be false */
if( __builtin_expect([condition],0)){
  ...
else {
  ...
}

逻辑比较

原始的分支比较可能会有浮点数比较逻辑,可以量化为数值比较逻辑。

if (data[3].fvalue < 1.5) {  
/* floating-point comparison */
  ...
}
if (data[3].qvalue < 3) {     
/* integer comparison */
  ...
}

Treelite使用

首先定义数据集:

import treelite
import numpy as np
import time
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=100000, n_features=1000)

Treelite模型打包后,加载和之后的预测代码一样,也就说所有树模型在TreeLite打包后之后的语法都是一样的。

XGBoost

  • XGBoost模型训练
import xgboost
dtrain = xgboost.DMatrix(X, label=y)
params = {'max_depth':3, 'eta':1, 'objective':'reg:squarederror''eval_metric':'rmse'}
bst = xgboost.train(params, dtrain, 20, [(dtrain, 'train')])
  • XGBoost模型打包
model = treelite.Model.from_xgboost(bst)

toolchain = 'gcc'   # change this value as necessary
model.export_lib(toolchain=toolchain, libpath='./mymodel.so', verbose=True)
  • Treelite模型加载
import treelite_runtime     # runtime module
predictor = treelite_runtime.Predictor('./mymodel.so', verbose=True)
  • XGBoost不同Batch大小预测速度对比
nrows = [1000, 10000, 100000, 200000]
xgb_time = []
tree_lite = []
for nrow in nrows:
    data = np.random.random((nrow, 1000))
    dtrain = xgboost.DMatrix(data)
    
    start = time.time()
    _ = bst.predict(dtrain)
    xgb_time.append(time.time() - start)
    
    batch = treelite_runtime.Batch.from_npy2d(data)
    
    start = time.time()
    _ = predictor.predict(batch)
    tree_lite.append(time.time() - start)

LightGBM

  • LightGBM模型训练
import lightgbm as lgb

params = {
    'boosting_type''gbdt',
    'objective''binary',
    'max_depth':3,
    'metric''binary_logloss',
    'bagging_freq': 5,
    'verbose': 0
}

lgb_train = lgb.Dataset(X, y)
gbm = lgb.train(params,
                lgb_train,
                num_boost_round=10)

gbm.save_model('model.txt')
  • LightGBM模型打包
model = treelite.Model.load('model.txt', model_format='lightgbm')

toolchain = 'gcc'   # change this value as necessary
model.export_lib(toolchain=toolchain, libpath='./mymodel.so', verbose=True)
  • LightGBM不同Batch大小预测速度对比

Sklearn

  • 随机森林模型训练
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=1).fit(X, y)
  • 随机森林模型打包
# model = treelite.Model.from_xgboost(bst)
model = treelite.sklearn.import_model(rf)

toolchain = 'gcc'   # change this value as necessary
model.export_lib(toolchain=toolchain, libpath='./mymodel.so', verbose=True)
  • 随机森林不同Batch大小预测速度对比

后记

  1. Treelite是不错的树模型加速部署工具;
  2. Treelite支持将模型部署为.so文件,方便其他语言调用,也可以避免模型参数泄露;
 

相关推荐

  • 又一篇AI顶会!这个idea简直“ 杀疯了 ” ....
  • 如何查看 Spring Security 过滤器链?
  • GPT-4o 会带来哪些颠覆?
  • 如何攀上容量保障的珠峰?讲透全链路压测!
  • 2024 Vue 联邦大会,全明星阵容!探讨 Vue 的未来和问题
  • 你的 React 目录结构是啥样?
  • 30 天倒计时警告,Windows 10 21H2 末日即将来临!
  • 小米高管:支持禁止竞业禁止协议;微信月活 13.59 亿;腾讯混元文生图模型全面开源 | 极客头条
  • 编程 20 载,这位新加坡程序员靠 GPT 图解大模型火了
  • Google“反击战”,一夜放出近10款模型!上下文窗口卷到200万tokens、发布Sora竞品Veo、Android也变身了
  • 一款基于 GO 语言的轻量级视频终端下载项目,好强!
  • 无需OpenAI数据,跻身代码大模型榜单!UIUC发布StarCoder-15B-Instruct
  • 美国机器人应用遥遥落后?时隔15年,十所顶尖高校重启「国家机器人路线图」
  • GPT-4o干掉初创全网实测,马斯克Karpathy等大佬纷表不服:OpenAI不过如此
  • 谷歌2小时疯狂复仇,终极杀器硬刚GPT-4o!Gemini颠覆搜索,视频AI震破Sora
  • Docker Desktop 4.29 带来增强的容器隔离性、改进的错误管理界面以及与 Moby 26 的集成
  • 东软集团:生成式 AI 时代,如何布局 AI 人力资源战略?| DTDS 全球数字人才发展大会
  • “驯服”不受控的大模型,要搞定哪些事?| 专访达观数据副总裁王文广
  • 打磨三年、支持万亿 MoE,腾讯混元模型团队的真实推理实力到底如何?
  • 谷歌这次又“杀疯了”!200万token长文本能力问鼎全球最强,一场大会,AI被提了120次