《Python大规模机器学习》—1.1.3使用Python进行向上扩展
1.1.3 使用Python进行向上扩展
Python是一种解释性语言,就是说它在运行时将脚本读入内存,并执行它,从而访问必要的资源(文件、内存中的对象等)。除解释性外,使用Python进行数据分析和机器学习时需要考虑的另一个重要方面是Python为单线程。单线程意味着所有Python程序从脚本开始到结束都是按顺序执行的,Python不能利用计算机中多线程和处理器提供的额外处理能力(现在大多数计算机都是多核的)。
考虑到这种情况,可通过不同策略实现对Python的使用进行扩展:
编译Python脚本以实现更高的运行速度。例如,尽管使用PyPy(一种即时编译器,可从http://pypy.org/下载)很容易,但实际上本书中并没有这么做,因为需要从头开始学习使用Python编写算法。
将Python作为打包语言,从而将Python所执行的操作与第三方库和程序(部分支持多核处理)组合在一起。本书中会有很多这样的范例,你可以调用诸如支持向量机库(LIBSVM)等专业库或诸如Vowpal Wabbit(VW)、XGBoost或H2O等程序来实现机器学习。
有效使用矢量化技术,即用于矩阵计算的专用库。这可以通过使用NumPy或pandas来实现,它们都支持GPU计算。GPU犹如多核CPU,每个CPU具有内存和并行处理计算的能力(能计算出有多个微核)。神经网络中,基于GPU的矢量化技术能极大加快计算速度。然而,GPU自身也有局限性;首先,将数据传递到其内存中并将结果返回到CPU时需要执行某些I/O操作,而这需要通过特殊的API进行并行编程,例如,用于由NVIDIA制造的GPU的CUDA(必须安装相应的驱动程序和应用程序)。
将大问题分解为块并在内存中逐个解决每个块(分而治之算法),这需要对内存或磁盘的数据进行分区或子采样,并管理机器学习问题的近似解决方案,这样会非常有效。重要的是要注意,分区和子采样都针对示例和功能(以及两者兼有)进行操作。如果原始数据保存在磁盘中,I/O约束将成为相关性能的决定因素。
根据将要使用的学习算法,有效利用多处理和多线程。某些算法本身就能够将其操作拆分成并行操作。在这种情况下,唯一的约束是CPU和内存(因为你要为将要使用的每个并行工作程序复制数据)。有些算法能在相同内存块上利用多线程,并同时管理更多操作。
- 点赞
- 收藏
- 关注作者
评论(0)