【问题标题】:How to store an sklearn RF model such that it has fastest load time?如何存储 sklearn RF 模型以使其具有最快的加载时间?
【发布时间】: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 文件大小,我并没有在加载时间上获得太多收益。

【问题讨论】:

    标签: scikit-learn pickle random-forest joblib


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-16
      • 2021-04-03
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 2018-12-19
      • 2013-06-16
      相关资源
      最近更新 更多