传统编译器
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()