基于树模型的模型加速工具Treelite

传统编译器

AI编译器

AI 编译器前端优化

前端优化作为AI编译器的整体架构主要模块,主要优化的对象是计算图,而计算图是通过AI框架产生的,值得注意的是并不是所有的AI框架都会生成计算图,有了计算图就可以结合深度学习的原理知识进行图的优化。

  • 计算图层(Graph IR)
  • 算子融合(OP Fusion)
  • 布局转换(Layout Transform)
  • 内存分配(Memory Allocation)
  • 常量折叠(Constant Fold)
  • 公共子表达式消除(CSE)
  • 死代码消除(DCE)
  • 代数简化(ARM)

AI 编译器后端优化

后端优化作为AI编译器跟硬件之间的相连接的模块,更多的是算子或者Kernel进行优化,而优化之前需要把计算图转换称为调度树等IR格式,然后针对每一个算子/Kernel进行循环优化、指令优化和内存优化等技术。

  • 算子循环优化
  • 指令和内存优化

树模型

树模型算法预测的时候太慢怎么办,我这里介绍一种基于树模型的模型加速工具,叫做Treelite。Treelite : model compiler for decision tree ensembles

该工作流涉及两台不同的机器:从给定树模型生成预测子例程的主机和运行该子例程的目标机器。这两台机器交换一个C文件,其中包含有关树模型的所有相关信息。只有主机需要安装Treelite;目标机器只需要一个正常工作的C编译器。

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

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

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, 100, [(dtrain, 'train')])


model = treelite.Model.from_xgboost(bst)

toolchain = 'gcc'   # change this value as necessary
model.export_lib(toolchain=toolchain, libpath='./mymodel.so', verbose=True)

import treelite_runtime     # runtime module
predictor = treelite_runtime.Predictor('./mymodel.so', verbose=True)

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)
    
    dmat = treelite_runtime.DMatrix(data)
    start = time.time()
    _ = predictor.predict(dmat)
    tree_lite.append(time.time() - start)

from matplotlib import pyplot as plt
plt.plot(nrows, xgb_time, "-*b", label="xgb")
plt.plot(nrows, tree_lite, "-*r", label="treelite")
plt.legend(loc="upper left")
plt.xticks(rotation=30)
plt.show()
import lightgbm as lgb

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

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

gbm.save_model('model.txt')

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)
#TreeLite模型加载

import treelite_runtime     # runtime module
predictor = treelite_runtime.Predictor('./mymodel.so', verbose=True)
#LightGBM不同Batch大小预测速度对比

nrows = [1000, 10000, 100000, 200000]
lgb_time = []
tree_lite = []
for nrow in nrows:
    data = np.random.random((nrow, 1000))
#     dtrain = lgb.Dataset(data)
    
    start = time.time()
    _ = gbm.predict(data)
    lgb_time.append(time.time() - start)
    
    dmat = treelite_runtime.DMatrix(data)
    start = time.time()
    _ = predictor.predict(dmat)
    tree_lite.append(time.time() - start)

plt.plot(nrows, lgb_time, "-*b", label="lgb")
plt.plot(nrows, tree_lite, "-*r", label="treelite")
plt.legend(loc="upper left")
plt.xticks(rotation=30)
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值