速度杠杠的,部署机器学习模型的这7个要点要谨记

news2024/11/20 15:27:31

在模型部署时,模型的性能和耗时都非常重要。但是我们在构建模型时,往往没有考虑模型的预测速度。虽然性能优化会损害预测准确性,但更简单的模型通常运行得更快,也不容易过拟合。

预测延迟被测量为进行预测所需的经过时间。延迟通常被视为一个分布,而运维工程师通常关注此分布的给定百分位数的延迟,如50%或99%情况下的耗时。

文章目录

    • 技术交流
    • 要点1:影响延迟的因素
    • 要点2:关注模型本身
    • 要点3:保留有效的特征
    • 要点4:存储稀疏数据
    • 要点5:限制模型复杂度
    • 要点6:注意底层实现
    • 要点7:线性模型稀疏转换
    • 参考文献

技术交流

本文技术由粉丝群小伙伴分享汇总。源码、数据、技术交流提升,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

方式①、添加微信号:dkl88191,备注:来自CSDN +研究方向
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

要点1:影响延迟的因素

对于机器学习模型,影响预测延迟的主要因素是:

  • 特征个数

  • 数据的稀疏性

  • 模型复杂度

  • 特征提取耗时

其中特征是否能够并行提取 & 模型能够批量预测,对预测耗时影响非常大。

要点2:关注模型本身

由于不同的模型原理上存在区别,本质由多种原因(分支可预测性、CPU 缓存、线性代数库优化等)导致模型速度存在差异。

模型速度存在以下规律:

  • 树模型速度比线性模型的速度慢

  • SVM速度比线性模型慢

  • 线性模型和贝叶斯模型速度相当

  • KNN速度会受到训练数据量影响

要点3:保留有效的特征

当特征数量增加时每个示例的内存消耗也会增加,此外也会影响运算速度。当特征数量增加时,模型计算速度增加的速度不同。删除线格式 一般情况下,模型预测速度与特征个数成正比。

要点4:存储稀疏数据

Scipy中包含稀疏矩阵结构,只会存储非0的数据,这样占用的内存会少很少。在线性模型上使用稀疏输入可以大大加快预测速度,因为只有非零值特征会影响点积,从而影响模型预测。

使用如下代码可以统计数据的稀疏比例:

def sparsity_ratio(X):  
    return 1.0 - np.count_nonzero(X) / float(X.shape[0] * X.shape[1])  
print("input sparsity ratio:", sparsity_ratio(X))  

但对于非稀疏的数据,如果强行存储为的稀疏矩阵,反而会增加模型的预测速度。因此需要稀疏度通常非常高(非零数据只占比10%),这样才会有速度的增益。

要点5:限制模型复杂度

当模型复杂性增加时,模型精度和预测延迟应该会增加。对于sklearn.linear_model中很多模型,例如LassoElasticNetSGDClassifier/RegressorRidge & RidgeClassifierPassiveAgressiveClassifier/RegressorLinearSVCLogisticRegression在预测时应用的决策函数是相同的,因此预测延迟应该差不多。

但在线性模型中我们可以调节模型的惩罚因子,然后控制模型的稀疏性,然后进一步可以减少模型的复杂度。这里我们需要在精度和预测延迟之间进行一个折中,可以参考下面的统计逻辑。

要点6:注意底层实现

scikit-learn 依赖 Numpy/Scipy 底层函数,因此明确关注这些库的版本是有意义的。首先需要确保 Numpy 是使用优化的 BLAS / LAPACK库构建的。

可以使用以下命令显示 NumPy/SciPy/scikit-learn底层的 BLAS/LAPACK支持:

from numpy.distutils.system_info import get_info  
print(get_info('blas_opt'))  
print(get_info('lapack_opt'))  

BLAS / LAPACK实现包括:

  • Atlas

  • OpenBLAS

  • MKL

当然如果你的CPU支持scikit-learn-intelex,你也可以获得更多的加速比:

要点7:线性模型稀疏转换

scikit-learn中的线性模型支持将系数矩阵转换为稀疏格式,其内存和存储效率比Numpy高得多。

clf = SGDRegressor(penalty='elasticnet', l1_ratio=0.25)  
clf.fit(X_train, y_train).sparsify()  
clf.predict(X_test)  

当模型和输入都是稀疏的,上述操作可以加速30%的速度,还可以对内容更加友好。

支持sparsify的模型包括:

  • LogisticRegression

  • LogisticRegressionCV

  • PassiveAggressiveClassifier

  • Perceptron

  • SGDClassifier

  • SGDOneClassSVM

  • SGDRegressor

  • LinearSVC

参考文献

  • https://scikit-learn.org/0.15/modules/computational_performance.html

  • https://scikit-learn.org/0.15/developers/performance.html

  • https://github.com/scikit-learn/scikit-learn/blob/main/benchmarks/bench_sparsify.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127717.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

降维和特征选择的对比介绍

在machine learning中,特征降维和特征选择是两个常见的概念,在应用machine learning来解决问题的论文中经常会出现。特征降维和特征选择的目的都是使数据的维数降低,使数据维度降小。但实际上两者的区别是很大,他们的本质是完全不…

Java整合RocketMQ实现生产消费

文章目录参考文档环境搭建生产者普通消息同步发送异步发送单向传输顺序消息延迟消息批量消息事务消息消费者Push消费Pull 消费代码仓库参考文档 RocketMQ作为阿里系开源项目,有非常成熟的中文文档可以快速了解并上手。 环境部署控制台安装RocketMQ常见问题 环境搭…

【现代机器人学】学习笔记八:轨迹生成

这节课的内容主要讲述如何通过插值等方式生成一条满足运动学约束的运动轨迹。这节的内容在全书中较少,相比前一章开链动力学而言,可以说内容少了许多。但是这节的内容却是目前在机械臂应用方面使用最广泛的一节。 闲话休提,马上开始&#xf…

ThreeJS:创建第一个三维场景

场景效果 ThreeJS与WebGL WebGL使得开发者可以直接使用显卡的计算资源,创建高性能的二维和三维计算机图形效果,然后在JavaScript脚本中进行WebGL编程,创建三维场景并生成动画。但是,原生的WebGL编程是十分复杂的,且容易出错。然而,Three.JS库可以简化WebGL的开发过程。 基…

十、Java 17 新特性

十、Java 17 新特性 JDK 17 在 2021 年 9 月 14 号正式发布了!根据发布的规划,这次发布的 JDK 17 是一个长期维护的版本(LTS)。Java 17 提供了数千个性能、稳定性和安全性更新,以及 14 个 JEP(JDK 增强提案&#xff09…

示波器应用(二)

前篇我们对场景六基色色相和白平衡还有明度进行了验证,对黑白场做了微调。后面我们还需要对场景调光。 本篇主要涉及一些画面美术知识,不感兴趣可以跳过。 我们需要先了解一个摄影知识 曝光 下面要说到一种颜色模式HSB,HSB分别表示&#…

Redhat-ansible-合集

1.安装 2.部署ANSIBLE 2.1INVENTORY 2.2ANSIBLE配置文件 2.3AD HOC命令 3.PLAYBOOK 4.变量 5.ansible vault加密变量 6.ansible_facts 7.loop 8.条件判断 9.handler处理 10.错误处理 11.tags标签 12.管理文件 13.template模板 14.host-pattern 15.动态Inventory 16.ro…

玻纤效应对skew的影响(一)

在高速SerDes传输系统中,随着信号速率的提高,UI会越来越小,传输线的对内skew会越来越大。以PCIe信号来说,PCIe4.0速率的一个UI是62.5ps,当速率提高到PCIe5.0时,每个UI就只有31.25ps,更进一步&am…

SparkSQL源码分析系列01-Catalyst作用

SparkSQL 是如何将SQL语句转化为Spark任务的呢? 详细过程如下图 通过拉去 github 的 Spark 源码,查看 SparkSQL 模块的 readme.txt 文件可以看出,SparkSQL 包含4个方面的内容 SparkSQL源码主要包含4大模块 Catalyst (sql/catalyst)&…

Solidity之为什么 ++i 比 i++ 省gas

文章目录为什么 i 比 i 省gas测试验证demo1demo2为什么 i 比 i 省gas为什么 i 比 i 省gas i通常更昂贵,因为它必须增加一个值并“返回”旧值,因此可能需要在内存中保存两个数字我在记忆中只使用过一个数字。在许多情况下,在编译器优化之后&a…

【SVM】简单介绍(四)

1、Soft Margin SVM 对偶求解 构造拉格朗日函数 L12∥w∥2C∑i1nξi−∑i1nαi(yi(wTxib)−1ξi)−∑i1nγiξiαi≥0γi≥0\begin{aligned} & L\frac{1}{2}\|w\|^2C \sum_{i1}^n \xi_i-\sum_{i1}^n \alpha_i\left(y_i\left(w^T x_ib\right)-1\xi_i\right)-\sum_{i1}^n \ga…

dagum基尼系数分析全流程

Dagum系数分析 Dagum基尼系数是传统基尼gini系数的升级,其可分解为组内系数、组间系数和超变密度系数,即Dagum 组内Gw 组间Gb 超变密度Gt。 组内Gw分别反映各地区内部水平的差距、组间Gb反映各地区之间水平的差距,以及超变密度Gt反映各地区…

Strtus2漏洞 - Struts2-052 Struts2-057 Struts2-059

文章目录S2-052(CVE-2017-9805)环境搭建漏洞复现S2-057(CVE-2018-11776)环境搭建漏洞复现S2-059(CVE-2019-0230)环境搭建漏洞复现S2-052(CVE-2017-9805) 原理:Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序…

为什么说DeFi隐私协议Unijoin.io具备趋势性

区块链技术以点对点、去中心化、公开透明、不可逆等作为其主要特点,而基于区块链的加密货币原生的具备了区块链技术的种种特性,这意味着通常每一笔链上交易都是透明可查的。虽然加密账户以“伪匿名”作为主要特点,但我们也同样看到&#xff0…

强大的ANTLR4(1)

以前对于《编译原理》这门课有一种恐惧,现在强大的工具越来越多,有些原理并不一定要非常清楚,也是可以设计一种编程语言的,那就是ANTLR4。 Antlr4(全名:ANother Tool for Language Recognition&#xff09…

Redis集群系列六 —— 分片集群搭建

Redis 常用集群中,常用的几种集群方案有:主从集群、哨兵集群、分片集群,不同的集群对应着不同的场景,并且各种集群也都有不同的优劣,本篇将以 redis 分片集群为切入点。 主从和哨兵虽然解决了高可用、高并发读的问题&…

spring之IoC注解(二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、Spring注解的使用1、加入aop的依赖2、在配置文件中添加context命名空间3、在配置文件中指定扫描的包4、在Bean类上使用注解二、Bean的选择性实例化1、需求2、…

二十三种设计模式--系列篇(一)

一、软件设计模式的产生背景 “设计模式”最初并不是出现在软件设计中,而是被用于建筑领域的设计中。 1977年,美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大(Christopher Alexander)在他的著作《…

(五)devops持续集成开发——jenkins发布一个maven流水线项目

前言 本节内容使用jenkins的maven流水线组件发布一个springboot项目,实现自动化部署一个后端项目。在开始流水化部署前我们需要准备好一个git项目,并在jenkins所在的服务器安装好git客户端便于源码的拉取。并且需要安装一个ssh插件,将我们的…

C++学习:多态与运算符(Day.7~)

总结让人明白。 表明覆盖意图的限定符 override 如图: 说明:1.使用关键字const后,由于函数特征不同,派生类不会再隐藏基类方法 2.想要覆盖基类方法可使用关键字override,此关键字会强制覆盖基类方法,若…