如何存储 sklearn RF 模型以使其具有最快的加载时间?

Posted

技术标签:

【中文标题】如何存储 sklearn RF 模型以使其具有最快的加载时间?【英文标题】:How to store an sklearn RF model such that it has fastest load time? 【发布时间】:2021-05-24 14:06:46 【问题描述】:

我有一个 RF 模型,我试图在部署期间加快加载速度。第一次创建并保存为压缩的 joblib 文件。但是加载时间太长了,无法满足我的需要。这是我尝试对我拥有的东西进行基准测试的 sn-p:

# load the base file:
print("Loading compressed joblib...")
MODEL = f"base_path/data/model_files/dataset_RF_C.compressed"
tic = time.perf_counter()
with open(MODEL, "rb") as f:
    model = joblib.load(f)
    mem = sys.getsizeof(model) / 1024 / 1024
toc = time.perf_counter()
load_time = toc - tic
size = os.path.getsize(MODEL) / 1024 / 1024
print(f"file on disk: size:0.2f MB\nfile on RAM: mem:0.2f MB\nload time: load_time:0.3f seconds\n")

输出:

Loading compressed joblib...
file on disk: 52.22 MB
file on RAM: 0.00 MB
load time: 9.510 seconds

我不确定为什么没有显示加载到 RAM 中的文件大小。如果你知道,也请帮忙。

未压缩的作业库:

# create uncompressed joblib, save it, load it, benchmark
print("Saving uncompressed joblib...")
MODEL = f"base_path/data/model_files/dataset_RF_C.uncompressed.joblib"
tic = time.perf_counter()
with open(MODEL, "wb") as f:
    joblib.dump(model, f, compress=False)
toc = time.perf_counter()
save_time = toc - tic
size = os.path.getsize(MODEL) / 1024 / 1024
print(f"file on disk: size:0.2f MB\nsave time: save_time:0.3f seconds\n")
del model

print("Loading uncompressed joblib...")
tic = time.perf_counter()
with open(MODEL, "rb") as f:
    model = joblib.load(f)
    mem = sys.getsizeof(model) / 1024 / 1024
toc = time.perf_counter()
load_time = toc - tic
size = os.path.getsize(MODEL) / 1024 / 1024
print(f"file on disk: size:0.2f MB\nfile on RAM: mem:0.2f MB\nload time: load_time:0.3f seconds")

输出:

Saving uncompressed joblib...
file on disk: 4376.51 MB
save time: 8.718 seconds

Loading uncompressed joblib...
file on disk: 4376.51 MB
file on RAM: 0.00 MB
load time: 7.645 seconds

可以看出,通过将 50MB 压缩换成 4.3GB 文件大小,我并没有在加载时间上获得太多收益。

【问题讨论】:

【参考方案1】:

根据您的描述,听起来您正在将模型加载到部署环境中,以便它可以返回实时预测。

如果是这样,我建议调查以下几件事:

将模型加载到内存中之前它需要开始服务实时请求/在 5-10 秒无关紧要的时间。例如,当您使用的服务或 lambda 函数正在启动时,将模型加载到内存中。 按照this guide 将模型转换为ONNX 格式。正如this blog post describes,使用 ONNX 尤其有助于缩短推理时间。 考虑通过增加max_depthmin_samples_split 和/或min_samples_leaf 参数来训练更小的随机森林模型(未压缩模型的 4.3GB 听起来相当大)

【讨论】:

以上是关于如何存储 sklearn RF 模型以使其具有最快的加载时间?的主要内容,如果未能解决你的问题,请参考以下文章

您如何重写/重新编码网站以使其具有可扩展性? [关闭]

我应该如何覆盖 VideoView 的 onDraw 以使其具有透明的圆角?

如何在 C# List 中存储 IP 地址列表以使其也可搜索子网?

如何将具有文件外依赖项的 sklearn 模型保存到磁盘?

如何修复无效的随机字符串以使其 JSON 有效

如何将引导卡从水平堆叠到垂直以使其响应?