1.介绍
Python因易于学习而广为人知,并且它仍然是数据科学,机器学习和科学计算中使用最广泛的语言。根据最近的一项民意的调查,该调查对1,800多名研究人员分析,数据科学和机器学习偏好的参与者进行了调查,Python在2019 保持其依然使用最广泛的编程语言。
然而,Python编译器和解释器使用最广泛的实现CPython在单个线程中执行CPU绑定代码,并且其多处理程序包还伴随着其他重大的性能折衷。
现在收集和生成的数据量非常庞大,而且数量还在以创纪录的速度增长,这导致人们需要使用性能出色且易于使用的工具。充分利用Python的优势(例如在确保计算效率的同时易于使用)的最常见方法是开发高效的Python库,以实现用静态类型的语言(如Fortran,C / C ++和CUDA)编写的低级代码。近年来,在用于科学计算和机器学习的高性能但用户友好的库的开发上花费了大量的精力。
1.1PYTHON中的科学计算和机器学习
机器学习和科学计算应用通常使用多维数组上的线性代数运算表示,多维数组是用于表示矢量,矩阵和高阶张量的计算数据结构。由于这些操作通常可以在许多处理核心上并行化,因此诸如NumPy之类的库
Oliphant2007和SciPy 2020SciPy-NMeth利用C / C ++,Fortran和第三方BLAS实现在可能的情况下绕过线程和其他Python限制。NumPy是具有基本线性代数例程的多维数组库,SciPy库将NumPy数组装饰有许多重要的原语,从数值优化器和信 处理到统计和稀疏线性代数。截至2019年,发现GitHub virtanen2020scipy上几乎所有机器学习项目中都使用了SciPy。
图1:用于机器学习,数据科学和科学计算的标准Python生态系统。
虽然NumPy和Pandas mckinny(图 1)都提供了对数据点集合的抽象,并且其操作对整个数据集都有效,但Pandas通过提供支持异类列类型以及行和列元数据的类数据框对象扩展了NumPy。近年来,Pandas库已成为事实上的格式,用于表示Python中的表格数据以进行提取,转换和加载。
(ETL)上下文和数据分析。自2008年首次发布12年后,又是25个版本之后,熊猫的第一个1.0版本于2020年发布。语义版本控制标准 preston2013semantic(1.0版)表明,库已达到成熟度的主要水平,并具有稳定的API。
1.2优化PYTHON在数值计算和数据处理方面的性能
除了其线程限制外,CPython解释器还没有充分利用现代处理器硬件,因为它需要与fedotov2016speeding的大量计算平台 兼容。针对CPU的特殊优化指令集(例如Intel的Streaming SIMD扩展(SSE)和IBM的AltiVec)在许多低级库规范下使用,例如二进制线性代数子例程(BLAS) blackford2002 updated和线性代数包(LAPACK) angerson1990 lapack库,用于有效的矩阵和向量运算。
OpenBLAS的开发上投入了大量心血,OpenBLAS是BLAS API的开源实现,它支持多种不同的处理器类型。尽管所有主要的科学库都可以通过OpenBLAS集成openblas2020进行编译,但是 不同CPU指令集的制造商通常还会提供自己的BLAS和LAPACK子例程的硬件优化实现。例如,英特尔的数学内核库(Intel MKL) intel2020mkl和IBM的Power ESSL diefendorff2000altivec为科学计算应用程序提供可插拔的效率。这种标准化的API设计提供了可移植性,这意味着通过针对不同的实现构建,相同的代码可以在具有不同指令集的不同体系结构上运行。
当数字库(例如NumPy和SciPy)通过硬件优化的子例程获得显着的性能提升时,性能提升会自动扩展到更高级别的机器学习库(例如Scikit-lear),后者主要使用NumPy和SciPy Pedregosa FABIANPEDREGOSA 2011;buitinck2013api。英特尔还提供了一个面向高性能科学计算的Python发行版,其中包括MKL加速 intel2020 python较早前提过。该Python发行版背后的吸引力在于它是免费使用的,可以直接使用,可以加速Python本身,而不是挑选大量的库,并且可以代替标准CPython发行版而无需任何代码需要更改。但是,主要缺点之一是仅限于Intel处理器。
一次操作一组值(而不是单个值)的机器学习算法的开发通常也称为向量化。前述的CPU指令集通过使处理器有可能在多个数据点上并行调度单个指令,而不必为每个数据点调度不同的指令,从而实现矢量化。将单个指令应用于多个数据点的向量运算也称为单指令多数据(SIMD),自1960年代以来,它已存在于并行和高性能计算领域。SIMD范式在库中进一步通用化,用于扩展数据处理工作负载,例如MapReduce dean2008 mapreduce,Spark Zaharia和Dask Rocklin2015,其中将相同的数据处理任务应用于数据点的集合,以便可以并行处理它们。一旦组成,数据处理任务可以在线程或进程级别执行,从而使并行性能够跨越多个物理机。
Pandas的数据框格式使用列来分隔数据集中的不同字段,并允许每一列具有不同的数据类型(在NumPy的ndarray容器中,所有项目都具有相同的类型)。与其连续地将每个记录的字段(例如,在逗 分隔值(CSV)文件中)存储在一起,它不连续地存储列。通过按列连续布置数据,可以通过允许处理器对行级处理的内存访问进行分组或合并来启用SIMD,从而有效利用缓存,同时减少了对主内存的访问次数。
用于内存中数据的Apache Arrow跨语言开发平台 apache2020 arrow对列格式进行了标准化,以便可以在不同的库之间共享数据,而无需花费一定的成本来复制和重新格式化数据。另一个利用列格式的库是Apache Parquet apache2020 parquet。诸如Pandas和Apache Arrow之类的库在设计时考虑到了内存使用,而Parquet则主要是为数据序列化和存储在磁盘上而设计的。Arrow和Parquet彼此兼容,现代高效的工作流程涉及Parquet,用于将磁盘上的数据文件加载到Arrow的列式数据结构中进行内存计算。
类似地,NumPy支持基于行和列的布局,其n维数组(ndarray)格式也将下面的数据与对其进行操作的操作分开。这使NumPy中的大多数基本操作都可以使用SIMD处理。
Dask和Apache Spark zaharia2016 apache为可扩展到多个节点的数据帧和多维数组提供了抽象。与Pandas和NumPy相似,这些抽象也将数据表示与处理操作的执行分开。通过将数据集视为可以在可用硬件上安排的数据转换任务的有向无环图(DAG),可以实现这种分离。Dask之所以吸引许多数据科学家,是因为其API受到Pandas的极大启发,因此很容易集成到现有的工作流程中。但是,喜欢对现有代码进行最少更改的数据科学家也可以考虑使用Modin(
https://github.com/modin-project/modin)它可以直接替换Pandas DataFrame对象,即modin.pandas.DataFrame。Modin的DataFrame具有与Pandas相同的API,但是它可以利用外部框架在后台进行分布式数据处理,例如Ray 2020或Dask。开发人员的基准显示,与Pandas相比,在具有四个物理内核modin2020modin的笔记本电脑上,数据处理速度最高可提高四倍 。
2.经典机器学习
深度学习代表机器学习的一个子类别,该子类别专注于DNN的参数化。为了提高清晰度,我们将基于非深度学习的机器学习称为经典机器学习(经典ML),而机器学习是一个概括性术语,包括深度学习和经典ML。
尽管在过去几年中深度学习已迅速普及,但是经典ML(包括决策树,随机森林,支持向量机等)在不同的研究领域和行业中仍然非常流行。在大多数应用中,从业人员使用的数据集不适用于当代深度学习方法和体系结构。深度学习对于处理大型非结构化数据集(例如文本和图像)特别有吸引力。相反,大多数经典机器学习技术是在头脑中的结构化数据;也就是说,以表格形式的数据,其中训练示例存储为行,而随附的观察值(特征)存储为列。
在本节中,我们将回顾Scikit-learn的最新发展,Scikit-learn仍然是经典ML最受欢迎的开源库之一。在简短介绍了Scikit-learn核心库之后,我们讨论了开源 区开发的几个扩展库,重点是用于处理类不平衡,集成学习和可扩展的分布式机器学习的库。
2.1SCIKIT-LEARN,经典机器学习的行业标准
Scikit-learn Pedregosa FABIANPEDREGOSA 2011(图 1)已成为行业标准Python库,用于对中小型数据集进行特征工程和经典ML建模, 在此情况下,根据经验,我们认为训练少于1000的数据集小型示例,
而数据集包含中等规模的1000到100,000个示例
因为它具有干净,一致且直观的API,因此在很多方面都是如此。此外,在开源 区的帮助下,Scikit学习团队仍将重点放在代码质量和综合文档上。开拓简单的“ fit() / 预测()API模型,其设计成为许多库的灵感和蓝图,因为它呈现出熟悉的面孔并在用户探索不同的建模选项时减少了代码更改。
除了用于数据处理和建模的众多类(称为估计器)外,Scikit-learn还包括一流的API,用于统一机器学习管道的构建和执行:管道API(图 2)。
它使一组估计器可以包括数据处理,特征工程和建模估计器,这些估计器可以组合起来以端到端的方式执行。此外,Scikit-learn提供了一个API,用于使用诸如交叉验证之类的通用技术评估经过训练的模型。
图2: Scikit学习管道的图示。一个代码示例,展示了如何从Iris数据集中拟合线性支持向量机特征,这些特征已通过z-score归一化进行了归一化,然后使用管道对象通过主成分分析压缩到了两个新的特征轴上。
b)说明了对训练数据执行拟合方法和对测试数据执行预测方法时管道内部的各个步骤。
为了在提供有用的功能和维护高质量代码的能力之间找到适当的平衡,Scikit-learn开发团队仅考虑将完善的算法纳入库中。然而,过去十年来机器学习和人工智能研究的爆炸式增长创造了许多算法,最好将其作为扩展而不是集成到核心中。更新的和通常为人所知的算法是作为Scikit-learn兼容库或所谓的“ Scikit-contrib”包提供的,后者由Scikit-learn 区在共享的GitHub组织Scikit-learn-contrib下(
https://github.com/scikit-learn-contrib)当这些单独的软件包遵循Scikit-learn API时,它们可以从Scikit-learn生态系统中受益,使用户能够免费继承Scikit-learn的某些高级功能,例如流水线和交叉验证。
在以下各节中,我们重点介绍其中一些最著名的,与Scikit-learn兼容的库。
2.2解决班级失衡
当使用真实数据集Lematre 2016时,倾斜的类标签分布是最重大的挑战 之一。这样的标签分布偏斜或类别失衡会导致强烈的预测偏差,因为模型可以通过学习大多数时间来预测多数标签来优化训练目标。为防止此问题,通常手动实施重采样技术以平衡标签。修改数据还需要验证哪种重采样策略对结果模型产生最积极的影响,同时确保不会由于重采样而引入其他偏差。
不平衡学习Lematre2016 是Scikit-contrib库,用于通过四种用于平衡偏斜数据集中的类的技术来解决上述问题。前两种技术通过减少造成过分代表类的数据样本的实例数(欠采样)或生成代表不足类的新数据样本(过采样)来对数据进行重新采样。由于过采样往往会训练过拟合数据的模型,因此第三种技术将过采样与清除欠采样技术结合在一起,从而消除了大多数分类中的极端离群值。不平衡学习为平衡类提供的最终技术是将袋装与AdaBoost相结合
Galar2011,其中模型集合是由多数类的不同欠采样集合构成的,而少数类的整个数据集则用于训练每个学习者。此技术允许将来自过多代表的类的更多数据用作单独重采样的替代方法。尽管研究人员在此方法中使用AdaBoost,但此方法的潜在增强可能涉及其他集成技术。在下一节中,我们将讨论最近开发的集成方法的实现。
2.3集成学习:梯度提升机和模型组合
被称为集成技术的多种机器学习算法或模型的组合被广泛用于提供稳定性,提高模型性能以及控制偏差-方差折衷
raschka 2018 model。众所周知,高度可并行化的引导聚合元算法(也称为装袋) breiman1996 bagging的集成技术传统上已用于诸如随机森林 breiman2001 random之类的算法中
对单个决策树的预测取平均,同时成功减少过度拟合。与装袋相反,增强型元算法本质上是迭代的,可以逐步拟合弱学习者,例如预修剪的决策树,其中模型会根据先前迭代的较差预测(叶节点)相继进行改进。梯度增强对早期的自适应增强算法(例如AdaBoost)进行了改进
freund1995年的决定,通过添加梯度下降的元素来逐步建立新的模型,该模型优化了与以前的迭代 Friedman2001中的误差有区别的成本函数 。
最近,在许多Kaggler的工具带中,梯度提升机(GBM)已成为 瑞士军刀;陈2016。梯度提升的一个主要性能挑战是它是一种迭代而不是并行算法,例如装袋。梯度提升算法中另一个耗时的计算是在构造决策树Ke时评估用于分割节点的不同特征阈值 。Scikit-learn的原始梯度提升算法特别低效,因为它会枚举每个功能的所有可能分割点。这种方法被称为精确贪婪
该算法昂贵,浪费内存,无法很好地扩展到较大的数据集。由于Scikit-learn的实现存在明显的性能缺陷,因此出现了XGBoost和LightGBM之类的库,它们提供了更有效的替代方法。当前,这是用于梯度提升机的两个最广泛使用的库,并且它们都与Scikit-learn很大程度上兼容。
XGBoost于2014年Chen2016引入开源 区, 并为精确的贪婪拆分查找算法提供了有效的近似值,该算法仅在每个节点上使用一部分可用的训练示例将特征分类为直方图。LightGBM被介绍给开源 区在2017年,并在深度优先的方式建立的树木,而不是使用广度优先的方法,因为它在许多其他GBM库进行 柯。LightGBM还实施了升级的拆分策略,以使其与XGBoost竞争,XGBoost是当时使用最广泛的GBM库。LightGBM拆分策略的主要思想是仅保留具有较大渐变的实例,因为它们对信息增益的贡献最大,而对较低渐变的实例进行了欠采样。这种更有效的采样方法有可能显着加快训练过程。
XGBoost和LightGBM都支持分类功能。虽然LightGBM可以直接解析它们,但是XGBoost要求类别必须是一键编码的,因为其列必须是数字。这两个库均包含可有效利用稀疏特征(例如已进行一次热编码的稀疏特征)的算法,从而可以更有效地利用基础特征空间。Scikit-learn(v0.21.0)最近还添加了新的梯度提升算法受LightGBM启发的HistGradientBoosing具有与LightGBM相似的性能,但唯一的缺点是它不能直接处理分类数据类型,并且需要类似于XGBoost的一键编码。
已经证明将多个模型组合到集合中可以提高泛化精度,并且如上所述,通过结合重采样方法/ citeraschka2019python可以改善类不平衡。模型组合是集成学习的一个子领域,它允许不同的模型为共享的目标做出贡献,而与构成它们的算法无关。例如,在模型组合算法中,逻辑回归模型可以与k最近邻分类器和随机森林组合。
堆叠算法是组合模型的一种较常用的方法,它在一组单个模型的预测上训练聚合器模型,以便学习如何将单个预测组合为一个最终预测 Wolpert1992。常见的堆叠变体还包括sill2009 feature元特性 或实现多层的lorbieski2018 impact堆叠 ,这也称为多层堆叠。自2016年以来,Mlxtend中已提供Scikit-learn兼容的堆栈分类器和回归器 raschka2018 mlxtend并且最近也在v0.22中添加到了Scikit-learn中。叠加的另一种选择是动态选择算法,该算法仅使用最胜任的分类器或整体来预测样本的类别,而不是组合预测 Cruz2018。
Combo是一个相对较新的专门用于集成学习的库,它在统一的Scikit-learn-compatible API下提供了几种常用算法,因此它与Scikit-learn生态系统zhao2019cominging的许多估计器都兼容。
Combo库提供了能够组合用于分类,聚类和异常检测任务的模型的算法,并且在Kaggle预测建模 区中已得到广泛采用。使用单个库(例如Combo)的好处是可以为方便的实验和模型比较提供便利,该库可以为不同的集成方法提供统一的方法,同时仍与Scikit-learn兼容。
2.4可扩展的分布式机器学习
尽管Scikit学习针对中小型数据集,但现代问题通常需要可以扩展到更大数据量的库。使用Joblib
https://github.com/joblib/joblib ,可以通过Python的多处理并行化Scikit-learn中的一些算法。不幸的是,这些算法的潜在规模受限于一台机器上的内存和物理处理核心的数量。
Dask-ML通过Scikit-learn兼容的API提供了Scikit-learn的经典ML算法的子集的分布式版本。这些包括监督学习算法,如线性模型,无监督学习算法,如k均值,和降维算法,如主成分分析和截断奇异向量分解。Dask-ML使用多重处理,其附加好处是算法的计算可以分布在计算集群中的多个节点上。
许多经典的ML算法都与拟合一组参数有关,这些参数通常假定小于训练数据集中的数据样本数量。在分布式环境中,这是一个重要的考虑因素,因为模型训练通常需要各个工人共享本地状态时进行交流,以便收敛于一组全局学习参数。训练后,模型推理通常可以以令人尴尬的并行方式执行。
超参数调整是机器学习中非常重要的用例,需要在许多不同的配置上对模型进行训练和测试,以找到具有最佳预测性能的模型。如第2.3节所述,当组合多个模型时,并行训练多个较小模型的能力变得尤为重要,尤其是在分布式环境中 。
Dask-ML还提供了支持任何Scikit-learn兼容API的超参数优化(HPO)库。Dask-ML的HPO在Dask工人集群上分配针对不同参数配置的模型训练,以加快模型选择过程。第3节“自动机器学习” 中讨论了它使用的确切算法以及其他用于HPO的方法 。
与Dask和Spark这样的系统形成对比的是消息传递接口(MPI)。MPI提供了一个经过时间测试的标准API,可用于编写分布式算法,在该算法中,可以实时在工作线程(称为等级)之间传递内存位置,就好像它们是共享相同内存空间的所有本地进程一样 barker2015message。LightGBM利用MPI进行分布式训练,而XGBoost可以在Dask和Spark环境中进行训练。H2O机器学习库能够使用MPI在分布式环境中执行机器学习算法。通过名为Sparkling Water
https://github.com/h2oai/sparkling-water的适配器,H2O算法也可以与Spark一起使用。
虽然深度学习在机器学习的当前研究中占主导地位,但它远未使经典的ML算法变得无用。尽管确实存在用于表格数据的深度学习方法,但CNN和LSTM始终在从图像分类到语言翻译的任务中始终展示出一流的性能。但是,经典的ML模型往往更易于分析和反思,通常用于深度学习模型的分析中。在第6节中,经典ML与深度学习之间的共生关系将变得尤为明显。
3.自动机器学习(AUTOML)
诸如Pandas,NumPy,Scikit-learn,PyTorch和TensorFlow之类的库以及具有Scikit-learn兼容API的各种库集合,为用户提供了手动执行端到端机器学习管道的工具。自动机器学习(AutoML)工具旨在自动化这些机器学习管道的一个或多个阶段(图 3),使非专家更容易构建机器学习模型,同时消除重复的任务,并使经验丰富的机器学习工程师能够更快地构建更好的模型。
自2013年首次引入Auto-Weka thornton2013auto以来,几个主要的AutoML库已经变得非常流行 。目前,Auto-sklearn feurer2019auto, TPOT olson2019tpot,H2O-AutoML h2o2020h2o,Microsoft的NNI
https://github.com/microsoft/nni,而AutoKeras jin2019auto是从业者中最受欢迎的,本节将对此进行进一步讨论。
虽然AutoKeras提供Scikit学习般的类似于自动sklearn API,它的重点是AutoML与训练有素的DNNs Keras以及神经结构的搜索,这是第单独讨论 。Microsoft的神经 络智能(NNI)AutoML库除了提供经典ML之外,还提供神经体系结构搜索,支持Scikit-learn兼容模型和自动化特征工程。
Auto-sklearn的API与Scikit-learn直接兼容,而H2O-AutoML,TPOT和auto-keras提供类似于Scikit-learn的API。这三种工具中的每一种在提供的机器学习模型的集合方面有所不同,这些模型可以通过AutoML搜索策略进行探索。尽管所有这些工具都提供了受监督的方法,并且某些工具(例如H20-AutoML)将堆叠或集成最佳性能的模型,但是开源 区目前缺乏自动进行无监督模型调整和选择的库。
随着对AutoML的研究和创新方法的数量不断增加,它遍及不同的学习目标,并且 区开发用于比较这些目标的标准化方法非常重要。这是在2019年完成的,开源基准的贡献是在39个分类任务gijsbers2019open的数据集上比较AutoML算法 。
以下各节涵盖了可以自动化的机器学习管道的三个主要组成部分:
(1)初始数据准备和特征工程
(2)超参数优化和模型评估以及
(3)神经体系结构搜索。
3.1数据准备和特征工程
机器学习管道通常从数据准备步骤开始,该步骤通常包括数据清理,将各个字段映射到数据类型以进行特征工程准备以及估算缺失值
费勒 ; He2019automl。一些库(例如H2O-AutoML)试图通过自动推断不同的数据类型来自动化数据准备过程的数据类型映射阶段。其他工具,例如Auto-Weka和Auto-sklearn,要求用户手动指定数据类型。
图3:(a)AutoML过程的不同阶段,用于选择和调整经典ML模型。(b)使用神经体系结构搜索生成和调整模型的AutoML阶段。
一旦知道了数据类型,特征工程过程就会开始。在特征提取阶段,通常会转换这些字段以创建具有改进的信噪比的新特征,或者对特征进行缩放以帮助优化算法。常见的特征提取方法包括特征归一化和缩放,将特征编码为一种或另一种格式以及生成多项式特征组合。特征提取也可以用于降维,例如,使用类似主成分分析,随机投影,线性判别分析和决策树的算法对特征进行去相关和减少。这些技术可能会增加功能的判别能力,同时减少来自维数的诅咒。
上面提到的许多工具都试图使要素工程过程的至少一部分自动化。像TPOT这样的库直接在端到端机器学习管道中建模,因此除了通过预测性能选择模型外,他们还可以评估功能工程技术的变化。但是,尽管在建模管道中包含要素工程非常引人注目,但这种设计选择还大大增加了要搜索的超参数的空间,这在计算上可能会被禁止。
对于需要大量数据的模型(例如DNN),AutoML的范围有时可能包括数据合成和扩充的 自动化He2019 automl。数据扩充和合成在计算机视觉中尤其常见,在计算机视觉中,通过翻转,裁剪或对图像数据集的各个部分进行过采样而引入了干扰。最近,这还包括使用生成对抗 络根据训练数据分布生成全新的图像 antoniou2017 data。
3.2超参数优化和模型评估
超参数优化(HPO)算法构成了AutoML的核心。最幼稚的寻找最佳性能模型的方法将详尽地选择和评估所有可能的配置,以最终选择最佳性能模型。HPO的目标是通过优化对超参数配置的搜索或对所得模型的评估来改进这种详尽的方法。 格搜索是一种基于蛮力的搜索方法,可探索用户指定参数范围内的所有配置。通常,搜索空间用固定的端点均匀地划分。尽管可以从粗到精的方式对 格进行量化和搜索,但是 格搜索已显示出对不重要的超参数bergstra2012random进行了过多的试验 。
与 格搜索有关,随机搜索是一种蛮力方法。但是,与其完全穷尽用户指定参数范围内的所有配置,不如从总搜索空间的边界区域中随机选择配置。在这些选定配置上评估模型的结果将用于迭代地改进将来的配置选择并进一步限制搜索空间。理论和经验分析表明,随机搜索比 格搜索更有效 bergstra2012random ; 也就是说,在短短的计算时间内就可以找到具有相似或更好的预测性能的模型。
一些算法(例如,Dask-ML,Auto-sklearn和H2O-AutoML中使用的超带算法)求助于随机搜索,并专注于优化模型评估阶段以获得良好的结果。Hyperband使用一种称为早期停止的评估策略,其中针对多个配置的多轮交叉验证并行启动 Li2018a。在交叉验证分析完成之前,将终止具有较差的初始交叉验证准确性的模型,从而释放资源以探索其他配置。从本质上讲,超带宽可以概括为一种方法,该方法首先随机运行超参数配置,然后为更长的运行选择候选配置。与纯随机搜索He2019automl相比,Hyberband是优化资源利用以更快地获得更好结果的理想选择 。与随机搜索相反,贝叶斯优化(BO)等方法着重于使用概率模型选择更好的配置。正如Hyperband的开发者所描述的那样,贝叶斯优化技术始终优于随机搜索策略。但是,他们只做少量 Li2018a。实验结果表明,与贝叶斯优化方法( snoek2015scalable)相比,进行随机搜索的时间长两倍是更好的结果 。
几个库使用BO的形式主义,即基于顺序模型的优化(SMBO),通过反复试验来建立概率模型。该Hyperopt库带来SMBO星火ML,使用被称为一种算法概率密度函数估计的树 NIPS2011_4443。该贝叶斯优化的超频(BOHB)falkner2018 bohb库将BO和超频带,同时提供其自身的内置分布式优化能力。Auto-sklearn使用一种称为顺序模型算法配置(SMAC) Feurer的SMBO方法。与提前停止类似,SMAC使用一种称为自适应赛车的技术仅在需要与其他竞争模型进行比较时评估模型
https://github.com/automl/SMAC3
BO和Hyperband随机搜索是广义HPO中用于配置选择的最广泛使用的优化技术。作为一种选择,TPOT已被证明是一种非常有效的方法,它利用进化计算来随机搜索合理参数的空间。由于其固有的并行性,TPOT算法也可以在Dask中执行
https://examples.dask.org/machine-learning/tpot.html 可以在分布式计算群集中的其他资源可用时缩短总运行时间。
3.3神经架构搜索
先前讨论的HPO方法由通用HPO算法组成,这些算法与基础机器学习模型完全无关。这些算法的基本假设是,如果要考虑一个超参数配置的子集,则可以客观地验证该模型。
最近的AutoML深度学习研究不是从一组经典的ML算法或著名的DNN架构中进行选择,而是专注于从一组预定义的低层构建块组成主题或整个DNN架构的方法。这种类型的模型生成称为神经架构搜索(NAS) Zoph2017,它是real2019regularized的架构搜索 的子字段;Negrinho2019。
架构搜索算法开发的总体主题是定义搜索空间,该搜索空间是指可以组成的所有可能的 络结构或超参数。搜索策略是搜索空间上的HPO,用于定义NAS算法如何生成模型结构。与经典ML模型的HPO一样,神经体系结构搜索策略也需要一种模型评估策略,当给定要评估的数据集时,该模型可以产生模型的客观得分。
根据事先提供的神经 络结构多少,神经搜索空间可以分为四类之一:
- 整个结构:通过选择并将一系列原语(例如卷积,串联或池化)链接在一起,从头开始生成整个 络。这称为宏搜索。
- 基于单元的:搜索固定数量的手工构建块(称为单元)的组合。这称为微搜索。
- 层次结构:通过引入多个级别并链接固定数目的单元格来扩展基于单元格的方法,迭代地使用较低层中定义的基元来构造较高层。这结合了宏搜索和微搜索。
- 基于形态的结构:将知识从现有性能良好的 络转移到新的体系结构。
与上面所述的传统HPO相似 ,NAS算法可以利用各种通用优化和模型评估策略从神经搜索空间中选择性能最佳的体系结构。
Google已参与NAS的大部分开创性工作。2016年,来自Google Brain项目的研究人员发布了一篇论文,描述了如何将强化学习用作整个结构搜索空间的优化器,能够构建递归和卷积神经 络(CNN)
进化计算是在AmoebaNet-A的NASNet搜索空间中进行的,Google Brain的研究人员在其中提出了一种新颖的比赛选择 Goldberg方法。分层搜索空间由Google的DeepMind团队 Liuc提出。这种方法使用进化计算来导航搜索空间,而斯坦福大学的Melody Guan和GoogleBrain团队的成员一起使用强化学习以一种称为ENAS Pham2018的方法来导航分层搜索空间。
由于所有生成的 络都用于同一任务,因此ENAS使用转移学习来减少训练所花费的时间,从而研究了不同生成模型之间权重共享的影响。
渐进式神经体系结构搜索(PNAS)研究了贝叶斯优化策略SMBO的使用,它通过在确定是否搜索更复杂的单元Liub之前探索更简单的单元来使CNN体系结构的搜索效率 更高。同样,NASBOT为生成的体系结构定义了距离函数,该函数用于构建内核以将高斯过程用于BO Liu。AutoKeras引入了基于形态学的搜索空间,从而可以修改而不是重新生成高性能模型。与NASBOT一样,AutoKeras为NAS体系结构定义了一个内核,以便对BO jin2019auto使用高斯过程 。
谷歌DeepMind团队在2018年发表的另一篇论文中提出了DARTS,它允许使用基于梯度的优化方法(例如梯度下降)直接优化神经架构空间 Liua。在2019年提出了SNAS,它对DARTS进行了改进,使用采样来实现梯度Xie的更平滑近似 。
4.GPU加速的数据科学和机器学习
有一个连接硬件,软件及其市场状态的反馈环。构建软件体系结构以利用可用的硬件,而构建硬件以启用新的软件功能。当性能至关重要时,将对软件进行优化,以最低的成本使用最有效的硬件选件。2003年,当硬盘存储商品化时,谷歌GFS ghemawat2003 google和MapReduce dean2004 mapreduce之类的软件系统 利用快速顺序的读写操作,利用服务器集群(每个服务器都有多个硬盘)来实现规模化。2011年,磁盘性能成为瓶颈,内存商品化,Apache Spark Zaharia等库 优先考虑在内存中缓存数据,以尽可能减少磁盘的使用。
从1999年首次引入GPU时起,计算机科学家就开始利用其潜力来加速高度可并行化的计算。但是,直到2007年CUDA发行,通用GPU计算(GPGPU)才开始普及。上述示例来自推动更快地支持更多数据,同时提供了扩展和扩展的能力,从而使硬件投资可以随着用户的个人需求而增长。以下各节介绍在Python环境中使用GPU计算。在简要概述GPGPU之后,我们讨论了GPU在端到端加速数据科学工作流中的使用。我们还将讨论GPU如何在Python中加速数组处理以及各种可用工具如何协同工作。
4.1机器学习的通用GPU计算
即使使用高效的库和优化,通过CPU绑定计算可以实现的并行性数量也受到物理内核数量和内存带宽的限制。此外,很大程度上受CPU限制的应用程序也可能与操作系统争用。
在GPU上使用机器学习的研究早于深度学习的兴起。CUDA的创建者伊恩·巴克(Ian Buck)曾在2005年尝试2层全连接神经 络,然后在2006年以steinkraus2005的身份加入NVIDIA 。此后不久,在GPU之上实现了卷积神经 络,与高度优化的CPU实现相比,观察到了惊人的端到端加速。。此时,在存在专用的GPU加速的BLAS库之前就已经获得了性能优势。第一个CUDA工具包的发布赋予了GPU通用并行计算的生命力。最初,只能通过C,C ++和Fortran接口访问CUDA,但是在2010年,PyCUDA库开始使CUDA可以通过Python和klockner2010pycuda进行访问 。
GPU改变了传统机器学习和深度学习的格局。从1990年代末到2000年代末,支持向量机一直保持着大量的研究兴趣 lloyd2010svm,并被认为是最新技术。在2010年,GPU为claudiu2010深度学习领域注入了新的活力,推动了大量研究和开发。
与SIMD相比,GPU支持单指令多线程(SIMT)编程范例,更高的吞吐量和更多的并行模型,并且高速内存跨越多个多处理器(块),每个多处理器包含多个并行内核(线程)。内核还具有与同一多处理器中其他内核共享内存的能力。与CPU领域中一些经过硬件优化的BLAS和LAPACK实现所使用的基于CPU的SIMD指令集一样,SIMT架构可以很好地并行化机器学习算法(例如BLAS子例程)所需的许多基本操作,从而加速GPU天生的合身。
4.2端到端数据科学:RAPIDS
GPU加速数据科学工作流的能力所占空间比机器学习任务大得多。通常由高度可并行化的转换组成,这些转换可以充分利用SIMT处理的优势,已证明数据科学流水线的整个输入/输出和ETL阶段在性能上均取得了巨大的进步。通过针对不同的实现进行设置。
RAPIDS https://rapids.ai于2018年引入,是一项开源工作,旨在支持和发展用于数据科学,机器学习和科学计算的GPU加速Python工具生态系统。RAPIDS支持现有的库,通过为开源库提供Python 区所缺少的关键组件来填补空白,并通过支持跨库的互操作性来促进整个生态系统的凝聚力。
受到Scikit-learn统一的API外观及其启用的功能强大的API的多样化集合的积极影响,RAPIDS建立在一组行业标准Python库的核心之上,将基于CPU的实现交换为GPU加速的变体。通过使用Apache Arrow的列格式,它使多个库能够利用此功能并完全在GPU上构成端到端的工作流。结果是,主机内存和GPU内存之间的传输和转换被最小化,并且很多时候被完全消除了,如图4所示 。
RAPIDS核心库包括分别替换为cuDF,cuML和cuGraph的Pandas,Scikit-learn和Network-X库的直接替代品。其他组件填补了更集中的空白,同时在适用的情况下仍然可以替代行业标准的Python API。cuIO提供许多流行数据格式的存储和检索,例如CSV和Parquet。cuStrings使在GPU上表示,搜索和处理字符串成为可能。cuSpatial提供了用于构建和查询空间数据结构的算法,而cuSignal提供了对SciPy信令子模块scipy.signal的近乎替代。
图4: RAPIDS是开源工作,旨在支持和发展用于数据科学,机器学习和科学计算的GPU加速Python工具生态系统。RAPIDS支持现有的库,通过为开源库提供Python 区所缺少的关键组件来填补空白,并通过支持跨库的互操作性来促进整个生态系统的凝聚力。
4.3NDARRAY和向量化运算
虽然NumPy可以调用BLAS实现来优化SIMD操作,但其矢量化功能的能力有限,几乎没有提供性能优势。Numba库提供即时(JIT)编译 lam2015numba,使矢量化函数能够利用SSE和AltiVec等技术。将计算与数据分开描述的这种分离还使Numba能够在GPU上编译和执行这些功能。除了JIT之外,Numba还定义了DeviceNDArray,在NumPy的NDArray中提供GPU加速的许多常用功能的实现。
CuPy定义了GPU加速的NDArray,其作用域与Numba nishino 2017 cupy略有不同 。CuPy是为GPU专门构建的,遵循NumPy的相同API,并包括SciPy API的许多功能,例如scipy.stats和scipy.sparse,它们会尽可能使用相应的CUDA工具包库。CuPy还包装了NVRTC
https://docs.nvidia.com/cuda/nvrtc/index.html,以提供能够在运行时编译和执行CUDA内核的Python API。CuPy的开发旨在为深度学习库Chainer tokui2015chainer提供多维数组支持 ,此后已被许多库用作NumPy和SciPy的GPU加速直接替换。
TensorFlow和PyTorch库定义Tensor对象,它们是多维数组。这些库与Chainer一起提供类似于NumPy的API,但构建计算图以允许将张量上的操作序列与其执行分开定义。这是由于它们在深度学习中的使用而引起的,在深度学习中,跟踪操作之间的依赖性使他们能够提供自动区分等功能,而在一般的数组库(如Numba或CuPy)中则不需要。深度学习和自动分化的更详细讨论可以在第5节中找到 。
Google的加速线性代数(XLA)库 google 2017 xla提供了自己的特定于域的格式,用于表示和JIT编译计算图;还为优化器提供了了解操作之间的依赖关系的好处。TensorFlow和Google的JAX库frostig2018compiling都使用XLA ,该库 使用NumPy填充程序为Python提供自动区分和XLA,该NumPy填充程序根据连续的转换构建计算图,类似于TensorFlow,但直接使用NumPy API。
4.4互操作性
最近发现有两个标准可以在这些库之间交换指向设备内存的指针-__cuda_array_interface__
https://numba.pydata.org/numba-doc/latest/cuda/cuda_array_interface.html和DLPack
https://github.com/dmlc/dlpack。这些标准使设备内存可以轻松表示并在不同库之间传递,而无需复制或转换基础数据。这些序列化格式的灵感来自于NumPy的适当名称__array_interface__,该名称自2005年以来一直存在。有关Numba,CuPy和PyTorch库之间的互操作性的Python示例,请参见图 5。
图5:不同GPU加速的Python库之间的零复制互操作性示例。
4.5GPU上的经典机器学习
矩阵乘法在计算机科学领域中,矩阵乘法扩展到矩阵-矩阵和矩阵-矢量乘法
从凸优化到特征值分解,线性模型,贝叶斯统计到基于距离的算法,这是机器学习操作的重要部分。因此,机器学习算法需要高性能的BLAS实现。GPU加速的库需要以与NumPy和SciPy在下面使用C / C ++和Fortran代码的方式相同的方式使用有效的低级线性代数基元,主要区别在于调用的库需要GPU加速。其中包括CUDA Toolkit中包含的选项,例如cuBLAS,cuSparse和cuSolver库。
适用于Python的GPU加速的机器学习库的空间分散了不同类别的专用算法。在GBM 类别中,XGBoost Chen2016和LightGBM Zhang都提供了GPU加速的实现 。IBM的SnapML和H2O为线性模型Dunner2018提供了高度优化的GPU加速实现 。ThunderSVM具有支持向量机的GPU加速实现,以及用于分类和回归任务的标准内核集。它还包含一类SVM,这是一种用于检测离群值的无监督方法。SnapML和ThunderSVM都具有与Scikit-learn兼容的Python API。
Facebook的FAISS库加速了最近邻居的搜索,提供了近似和精确的实现以及K-Means Johnson2019的高效版本 。CannyLabs提供了非线性降维算法T-SNE maaten2008visualizing的有效实现,该算法 已被证明对于可视化和学习任务都是有效的。T-SNE通常禁止在CPU上使用,即使对于百万个数据样本Chan2019的中型数据集也是 如此。
cuML被设计为用于机器学习的通用库,其主要目标是填补Python 区中缺少的空白。除了用于构建机器学习模型的算法之外,它还在Scikit-learn中提供了GPU加速的其他软件包的版本,例如preprocessing,feature_extraction和model_selection蜜蜂。通过关注GPU加速工具生态系统中缺少的重要功能,cuML还提供了Scikit学习中未包含的一些算法,例如时间序列算法。尽管仍保持类似于Scikit-learn的界面,但仍使用某些更特定算法的其他行业标准API来捕获可提高可用性的细微差异,例如Statsmodels seabold 2010 。
4.6GPU上的分布式数据科学和机器学习
GPU已成为高性能和灵活的通用科学计算中的关键组件。尽管GPU提供了诸如高速内存带宽,共享内存,极端并行性以及对其全局内存进行合并的读写等功能,但单个设备上可用的内存量小于主机(CPU)内存中可用的容量。此外,即使CUDA流允许并行执行不同的CUDA内核,在具有大量数据工作负载的环境中,高度可并行化的应用程序也可能会受到单个设备上可用内核数量的限制。
可以组合使用多个GPU来克服此限制,从而为更大的数据集上的计算提供总体上更多的内存。例如,可以通过在单个计算机上安装多个GPU来扩展单个计算机。使用这项技术,重要的是这些GPU能够直接访问彼此的内存,而不会因通过诸如PCI-express这样的慢速传输而造成性能负担。但是向上扩展可能还不够,因为可以在一台计算机上安装的设备数量有限。为了保持较高的横向扩展性能,GPU能够跨物理机器边界共享其内存也很重要,例如通过NIC(如以太 )和高性能互连(如Infiniband)。
Nvidia在2010年推出了GPUDirect Shared Access shainer2011development,这是一组硬件优化和低级驱动程序,用于加速GPU和同一PCI Express桥上的第三方设备之间的通信。在2011年,引入了GPUDirect对等技术,从而可以通过高速DMA传输在多个GPU之间移动内存。CUDA进程间通信(CUDA IPC)使用此功能,因此同一物理节点中的GPU可以访问彼此的内存,从而提供了扩展能力。在2013年,启用GPUDirect RDMA的 卡绕过CPU并直接在GPU上访问内存。这消除了多余的副本,并在不同的物理机器上创建的GPU之间的直线 potluri2013efficient,正式为横向扩展提供支持。
尽管自1999年SETI @ home发明并于2002年成立之初就存在使用GPU进行分布式计算的幼稚策略 ,但是通过让多个工作人员运行本地CUDA内核,GPUDirect提供的优化使包含多个GPU的分布式系统具有更加全面的编写方式可扩展算法。
可以在CUDA支持下构建第2.4节中介绍的MPI库
https://www.open-mpi.org/faq/?category=runcuda,从而可以在多个GPU设备之间传递CUDA指针。例如,LightGBM(第2.3节 )使用OpenCL支持AMD和NVIDIA设备,对具有MPI的GPU进行分布式训练。Snap ML还可以通过MPI Dunner2018执行分布式GPU训练 。通过将CUDA支持添加到OpenMPI康达包装中,Mpi4py库
https://github.com/mpi4py/mpi4py现在向Python公开了支持CUDA的MPI ,从而减轻了科学家在Python数据生态系统中构建分布式算法的障碍。
但是,即使使用支持CUDA的MPI,也可以在主机上执行诸如减少和广播之类的集体通信操作,这些操作允许一组等级共同参与数据操作。NVIDIA集体通信库(NCCL)提供了类似于MPI的API,可完全在GPU上执行这些简化操作。这使得NCCL在诸如PyTorch,Chainer,Horovod和TensorFlow之类的分布式深度学习库中非常受欢迎。它也用在许多具有分布式算法的经典ML库中,例如XGBoost,H2OGPU和cuML。
MPI和NCCL均假设等级可用于实时同步通信。用于通用可伸缩分布式计算的异步(延迟)任务计划系统(例如Dask和Apache Spark)与该设计形成了鲜明的对比,方法是构建有向非循环计算图(DAG),该图表示任意任务之间的依赖关系并执行它们懒惰或异步。在执行图形之前,这些任务的返回类型以及由此产生的尺寸是未知的。PyTorch和TensorFlow也构建DAG,并且由于假定张量用于输入和输出,因此通常在执行图形之前就知道尺寸。
端到端数据科学需要ETL作为开发流程的主要阶段。这个事实与PyTorch和TensorFlow等张量处理库的范围背道而驰。RAPIDS通过为Dask和Spark等系统中的GPU提供更好的支持来填补这一空白,同时促进使用互操作性在这些系统之间移动,如第4.4节所述 。
每个GPU的单进程(OPG)范例是使用GPU进行多处理的一种流行布局,因为它允许在单节点多GPU和多节点多GPU环境中使用相同的代码。RAPIDS提供了一个名为Dask-CUDA的库,该库可以轻松初始化OPG工人群集,自动检测每台物理计算机上的可用GPU,并且仅将一个GPU映射到每个工人。
RAPIDS提供了由cuDF支持的Dask DataFrame。通过在其分布式数组而不是NumPy 下支持CuPy ,Dask可以立即使用GPU进行多维数组的分布式处理。Dask支持使用Unified Communications-X(UCX) shamis2015ucx传输抽象层,允许工作人员使用最快的机制传递CUDA支持的对象,例如cuDF DataFrame,CuPy NDArray和Numba DeviceNDArrays。Dask中的UCX支持由RAPIDS UCX-py项目提供,该项目使用干净简洁的界面将UCX中的低级C代码包装起来,因此可以轻松地与其他基于Python的分布式系统集成。在同一物理机(节点内)的不同GPU之间传递GPU内存时,UCX将使用CUDA IPC。如果已安装GPUDirect RDMA,则将用于跨物理机(节点间)的通信,但是,由于它需要在操作系统中安装兼容的 络设备和内核模块,因此内存将转储到主机上。
通过结合Dask对通用分布式GPU计算的全面支持以及第2.4节中概述的分布式机器学习的通用方法 ,RAPIDS cuML能够端到端分布和加速机器学习流程。图 6示出了DASK系统在训练阶段的状态下,通过对包含从训练数据集的数据分区的DASK工人执行训练任务。训练后的DASK系统的状态在图中示出 6湾 在此阶段,参数仅保留在单个工作程序的GPU上,直到在模型上调用预测为止。图 6c显示了预测过程中的系统状态,其中,训练后的参数会广播给所有拥有预测数据集分区的工作人员。通常,只有fit()任务或一组任务才需要与其他工作人员共享数据。同样,预测阶段通常不需要工人之间的任何通信,从而使每个工人都可以独立运行其本地预测。该设计涵盖了大多数经典的ML模型算法,只有少数例外。
图6:使用Dask的通用分布式GPU计算。(a)分布式cuML训练。该拟合()函数是在包含在训练数据集数据的所有工人执行。(b)训练后的分布式cuML模型参数。将训练后的参数带给一个工人。(c)分布式cuML模型用于预测。训练后的参数会广播到预测数据集中包含分区的所有工作人员。预测以一种令人尴尬的并行方式进行。
Apache Spark的MLLib支持GPU,尽管集成不如Dask全面,缺少对本机序列化或GPU内存传输的支持,因此每个功能都需要从主机到GPU再到主机的不必要副本。Ray Project
https://github.com/ray-project/ray是相似的–尽管TensorFlow间接支持GPU计算,但集成不再进行。2016年,Spark引入了与Ray类似的概念,他们将其命名为TensorFrame。此功能已被弃用。RAPIDS当前正在Spark 3.0中增加对分布式GPU计算的更全面的支持
https://medium.com/rapids-ai/nvidia-gpus-and-apache-spark-one-step-closer-2d99e37ac8fd,内置对GPU的感知调度以及对端到端列式布局的支持,从而在整个处理阶段将数据保留在GPU上。
XGBoost(第2.3节 )支持在GPU上进行分布式训练,并且可以与Dask和Spark一起使用。除了MPI,Snap ML库还为Spark提供了一个后端。如2.4节 所述,使用Sparkling库使H2O能够在Spark上运行,并且GPU支持自动继承。Dask可以使用通用库cuML中的分布式算法,其中也包括数据准备和特征工程。
5.深度学习
使用经典ML,预测性能在很大程度上取决于数据处理和用于构建将用于训练模型的数据集的特征工程。第2节中提到的经典ML方法 在处理高维数据集时通常会出现问题-该算法对于从原始数据(例如文本和图像lecun2015 deep)中提取知识而言不是 最理想的。另外,将训练数据集转换为合适的表格(结构化)格式通常需要人工特征工程。例如,为了构建表格数据集,我们可以将文档表示为单词频率的向量 raschka2014 naive,或者我们可以通过制表叶子尺寸的表格来表示(虹膜)花,而不是使用照片中的像素作为输入 fisher1936use。
对于大多数基于表格数据集的建模任务,经典ML仍然是推荐的选择。但是,除了上面第3节中提到的AutoML工具外 ,它还取决于仔细的功能工程,这需要大量的领域专业知识。数据预处理和特征工程可以被视为一门艺术,其目的是从收集的原始数据中提取有用且重要的信息,从而保留与进行预测有关的大多数信息。粗心或无效的特征工程可能会导致删除重要信息,并严重阻碍预测模型的性能。
虽然某些深度学习算法能够接受表格数据作为输入,但是大多数发现最佳预测性能的最新方法都是通用的,并且能够以某种自动化的方式从原始数据中提取重要信息。这种自动特征提取是其优化任务和建模体系结构的固有组成部分。因此,深度学习通常被描述为一种表示或特征学习方法。但是,深度学习的一个主要缺点是它不适用于较小的表格数据集,而参数化DNN可能需要较大的数据集,而有效训练需要5万至1500万个训练示例。
以下各节回顾了基于GPU和Python的深度学习库的早期开发,这些库着重于通过静态图的计算性能,向动态图的融合以提高用户友好性,以及当前为提高计算效率和可伸缩性而做出的努力,以应对不断增长的数据集和架构大小。
5.1静态数据流图
Caffe深度学习框架于2014年首次发布,旨在提高计算效率,同时提供易于使用的API来实现常见的CNN架构。
Caffe在计算机视觉 区中非常受欢迎。除了专注于CNN之外,它还支持循环神经 络和长短期记忆单元。尽管Caffe的核心部分是用C ++实现的,但它通过使用配置文件作为实现深度学习架构的接口来实现用户友好。这种方法的一个缺点是很难开发和实现自定义计算。
Theano最初于2007年发布,是另一个学术深度学习框架,在2010年代获得了发展 team 2016 theano。与Caffe相比,Theano允许用户直接在Python运行时中定义DNN。但是,为了提高效率,Theano将深度学习算法和架构的定义与执行分开了。Theano和Caffe都将计算表示为静态计算图或数据流图,在执行之前先对其进行编译和优化。在Theano中,此编译可能需要花费几秒钟到几分钟的时间,并且在调试深度学习算法或体系结构时可能会成为主要的摩擦点。此外,将图形表示与执行分离开来,很难与代码进行实时交互。
在2016 abadi2016tensorflow中,谷歌发布了TensorFlow,它采用了与Theano类似的方法,即使用了静态图形模型。虽然图形定义与执行之间的这种分离仍然不允许实时交互,但TensorFlow减少了编译时间,使用户可以更快地迭代不同的想法。TensorFlow还专注于分布式计算,当时很少有DNN库提供。这种支持使深度学习模型可以一次定义并部署在不同的计算环境中,例如服务器和移动设备,这一功能使其对行业特别有吸引力。TensorFlow还被学术界广泛采用,变得如此受欢迎,以至于Theano的开发在2017年停止了发展。
在2016年至2019年之间的几年中,发布了其他几个带有静态图范式的开源深度学习库,包括微软的CNTK seide2016cntk,索尼的Nnabla :
https://github.com/sony/nnabla,
Neon
:https://github.com/NervanaSystems/neon、
Facebook的Caffe2 markham2017 caffe2和百度的PaddlePaddle ma2019 paddle。与其他深度学习库不同,Nervana Neon(后来被英特尔收购,现已停产)没有使用cuDNN来实现神经 络组件。相反,它具有通过英特尔MKL(第1.2节)优化的CPU后端 。MXNet chen2015mxnet受Amazon,Baidu和Microsoft的支持,它是Apache Software Foundation的一部分,并且仍然是唯一一家主要由主要的营利性技术公司开发的,主动开发的,主要的开源深度学习库。
虽然静态计算图对于在生产环境中应用代码优化,模型导出和可移植性很有吸引力,但是缺乏实时交互性仍然使它们在研究环境中难以使用。下一节重点介绍了一些主要的深度学习框架,这些框架正在拥抱一种称为动态计算图的替代方法,该方法允许用户直接实时地与计算交互。
5.2具有急切执行的动态图库
Torch在将近二十年前的2002年首次发布,是一个非常有影响力的开源机器学习和深度学习库。在像其他深度学习框架一样使用C / C ++和CUDA的同时,Torch基于脚本语言Lua,并利用即时编译器LuaJIT
collobert 2011 torch7。与Python相似,Lua是一种易于学习和使用的解释型语言。使用自定义C / C ++代码进
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!