我需要在不能安装rapids/cuml的GPU-less Windows虚拟机上对cuml.dask.ensemble.RandomForestClassifier执行推断。
我已经考虑过使用treelite,所以我必须将模型导入树脂树并生成一个共享库(windows的.dll文件)。之后,我将使用treelite_runtime.Predictor导入共享库,并在目标机器上执行推理。
问题是,我不知道如何将RandomForestClassifier模型导入树脂层来创建树脂层模型。
我曾尝试使用'convert_to_treelite_model‘,但获得的对象不是树脂树模型,我不知道如何使用它。
请看附件中的代码(在Linux下执行,所以我尝试使用gcc工具链并生成一个'.so‘文件……
当我试图调用‘cuml.fil.fil.TreeliteModel’函数时,我得到了异常“'export_lib‘对象没有属性'export_lib'”...
import numpy as np
import pandas as pd
import cudf
from sklearn import model_selection, datasets
from cuml.dask.common import utils as dask_utils
from dask.distributed import Client, wait
from dask_cuda import LocalCUDACluster
import dask_cudf
from cuml.dask.ensemble import RandomForestClassifier as cumlDaskRF
import treelite
import treelite_runtime
if __name__ == '__main__':
# This will use all GPUs on the local host by default
cluster = LocalCUDACluster(threads_per_worker=1)
c = Client(cluster)
# Query the client for all connected workers
workers = c.has_what().keys()
n_workers = len(workers)
n_streams = 8 # Performance optimization
# Data parameters
train_size = 10000
test_size = 100
n_samples = train_size + test_size
n_features = 10
# Random Forest building parameters
max_depth = 6
n_bins = 16
n_trees = 100
X, y = datasets.make_classification(n_samples=n_samples, n_features=n_features,
n_clusters_per_class=1, n_informative=int(n_features / 3),
random_state=123, n_classes=5)
X = X.astype(np.float32)
y = y.astype(np.int32)
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=test_size)
n_partitions = n_workers
# First convert to cudf (with real data, you would likely load in cuDF format to start)
X_train_cudf = cudf.DataFrame.from_pandas(pd.DataFrame(X_train))
y_train_cudf = cudf.Series(y_train)
X_test_cudf = cudf.DataFrame.from_pandas(pd.DataFrame(X_test))
# Partition with Dask
# In this case, each worker will train on 1/n_partitions fraction of the data
X_train_dask = dask_cudf.from_cudf(X_train_cudf, npartitions=n_partitions)
y_train_dask = dask_cudf.from_cudf(y_train_cudf, npartitions=n_partitions)
x_test_dask = dask_cudf.from_cudf(X_test_cudf, npartitions=n_partitions)
# Persist to cache the data in active memory
X_train_dask, y_train_dask, x_test_dask= dask_utils.persist_across_workers(c, [X_train_dask, y_train_dask, x_test_dask], workers=workers)
cuml_model = cumlDaskRF(max_depth=max_depth, n_estimators=n_trees, n_bins=n_bins, n_streams=n_streams)
cuml_model.fit(X_train_dask, y_train_dask)
wait(cuml_model.rfs) # Allow asynchronous training tasks to finish
# HACK: comb_model is None if a prediction isn't performed before calling to 'get_combined_model'.
# I don't know why...
cuml_y_pred = cuml_model.predict(x_test_dask).compute()
cuml_y_pred = cuml_y_pred.to_array()
del cuml_y_pred
comb_model = cuml_model.get_combined_model()
treelite_model = comb_model.convert_to_treelite_model()
toolchain = 'gcc'
treelite_model.export_lib(toolchain=toolchain, libpath='./mymodel.so', verbose=True) # <----- EXCEPTION!
del cuml_model
del treelite_model
predictor = treelite_runtime.Predictor('./mymodel.so', verbose=True)
y_pred = predictor.predict(X_test)
# ......注意:我正尝试在一个带有2个NVIDIA RTX2080ti GPU的Ubuntu机器上运行代码,使用的库版本如下:
cudatoolkit 10.1.243
cudnn 7.6.0
cudf 0.15.0
cuml 0.15.0
dask 2.30.0
dask-core 2.30.0
dask-cuda 0.15.0
dask-cudf 0.15.0
rapids 0.15.1
treelite 0.92
treelite-runtime 0.92发布于 2020-11-18 04:24:47
目前,Treelite还没有可以直接使用的序列化方法。我们有一个内部序列化方法,用来pickle cuML的RF模型。
我建议在Treelite的github repo (https://github.com/dmlc/treelite)中创建一个特性请求,并请求一个用于序列化和反序列化Treelite模型的特性。
此外,convert_to_treelite_model函数的输出是一个Treelite模型。它显示为:
In [2]: treelite_model
Out[2]: <cuml.fil.fil.TreeliteModel at 0x7f11ceeca840>当我们在cython中公开C++ Treelite代码以直接访问Treelite的C++句柄时。
https://stackoverflow.com/questions/64865678
复制相似问题