模型的序列化(Pickling)用于持久化#

本 Notebook 演示了单 GPU 和多 GPU cuML 模型进行简单序列化(Pickling)以实现持久化

[ ]:
import warnings
warnings.filterwarnings("ignore", category=FutureWarning)

单 GPU 模型序列化(Pickling)#

所有单 GPU 估计器都支持序列化(pickleable)。以下示例演示了合成数据集的创建、模型的训练,以及对结果模型进行序列化以进行存储。训练好的单 GPU 模型也可用于在 Dask 集群上分发推理,如下面的 分布式模型序列化(Distributed Model Pickling) 部分所示。

[ ]:
from cuml.datasets import make_blobs

X, y = make_blobs(n_samples=50,
                  n_features=10,
                  centers=5,
                  cluster_std=0.4,
                  random_state=0)
[ ]:
from cuml.cluster import KMeans

model = KMeans(n_clusters=5)

model.fit(X)
[ ]:
import pickle

pickle.dump(model, open("kmeans_model.pkl", "wb"))
[ ]:
model = pickle.load(open("kmeans_model.pkl", "rb"))
[ ]:
model.cluster_centers_

分布式模型序列化(Pickling)#

cuml.dask 中的分布式估计器包装器不打算直接序列化。Dask cuML 估计器提供了一个函数 get_combined_model(),该函数返回训练好的单 GPU 模型以进行序列化。合并后的模型可用于单 GPU 上的推理,而 Dask-ML 库中的 ParallelPostFit 包装器可用于在 Dask 集群上执行分布式推理。

[ ]:
from dask.distributed import Client
from dask_cuda import LocalCUDACluster

cluster = LocalCUDACluster()
client = Client(cluster)
client
[ ]:
from cuml.dask.datasets import make_blobs

n_workers = len(client.scheduler_info()["workers"].keys())

X, y = make_blobs(n_samples=5000,
                  n_features=30,
                  centers=5,
                  cluster_std=0.4,
                  random_state=0,
                  n_parts=n_workers*5)

X = X.persist()
y = y.persist()
[ ]:
from cuml.dask.cluster import KMeans

dist_model = KMeans(n_clusters=5)
[ ]:
dist_model.fit(X)
[ ]:
import pickle

single_gpu_model = dist_model.get_combined_model()
pickle.dump(single_gpu_model, open("kmeans_model.pkl", "wb"))
[ ]:
single_gpu_model = pickle.load(open("kmeans_model.pkl", "rb"))
[ ]:
single_gpu_model.cluster_centers_

导出 cuML 随机森林模型以便在没有 GPU 的机器上进行推理#

从 cuML 21.06 版本开始,您可以导出 cuML 随机森林模型并在没有 NVIDIA GPU 的机器上运行预测。 Treelite 包定义了一种高效的交换格式,允许您将 cuML 随机森林模型便捷地迁移到其他机器。我们将这种交换格式称为“检查点”(checkpoints)。

以下是导出模型的步骤

  1. 调用 to_treelite_checkpoint() 从 cuML 随机森林模型中获取检查点文件。

[ ]:
from cuml.ensemble import RandomForestClassifier as cumlRandomForestClassifier
from sklearn.datasets import load_iris
import numpy as np

X, y = load_iris(return_X_y=True)
X, y = X.astype(np.float32), y.astype(np.int32)
clf = cumlRandomForestClassifier(max_depth=3, random_state=0, n_estimators=10)
clf.fit(X, y)

checkpoint_path = './checkpoint.tl'
# Export cuML RF model as Treelite checkpoint
clf.convert_to_treelite_model().to_treelite_checkpoint(checkpoint_path)
  1. 将生成的检查点文件 checkpoint.tl 复制到您希望运行预测的另一台机器上。

  2. 在目标机器上,通过运行 pip install treeliteconda install -c conda-forge treelite 来安装 Treelite。该机器不需要有 NVIDIA GPU,也不需要安装 cuML。

  3. 您现在可以在目标机器上运行以下命令,从检查点加载模型

[ ]:
import treelite

# The checkpoint file has been copied over
checkpoint_path = './checkpoint.tl'
tl_model = treelite.Model.deserialize(checkpoint_path)
out_prob = treelite.gtil.predict(tl_model, X, pred_margin=True)
print(out_prob)