分布式机器学习

20221216 -

(本文为在进行大量的实验过程中的一些思考,主要关注利用分布式平台进行实验的相关内容,内容暂时不加整理,想到什么写什么)
(非专业人士,碎碎念)

0. 引言

本部分文章来源于最近在进行一些机器学习的实验时,发现在大量测试各种参数的时候,某些模型的运行时间非常长,虽然通过多线程、多进程技术能够有效提升一些速度,但是每次进行一次完整的实验仍然需要非常久的时间。

在此之前,尝试过在测试不同模型的时候,在不同的机器上进行测试,算是一个简单的扩展版,这样不同的程序同时跑,最后一起收结果。这样算是一个比较简单的方法,利用这种方法的时候,我也是利用docker容器化的形式来方便环境的部署。

那么是不是已经有分布式的程序能够让我直接使用呢?其实之前学习spark的时候就已经对这部分内容了解过,但当时好像并没有操作过实际的数据集。

1. 需求

那么既然有了这么一个契机,对自己的需求也需要好好分析一下。在机器学习中,分为训练过程和测试过程,某些模型可能训练时间久,但测试时间就很短,例如神经网络这种;而有些,例如KNN训练时间非常短,而可能两者都比较久,例如SVM这种。对于测试时间久的,可以通过多线程的方式来提升,当然,这种本身就属于计算密集型的任务,必然要多个CPU才会体现出来速度。

那么根据这些情形,可能需要从多个角度来提升速度,对于训练时间久的,如果需要分布式计算支持,首先训练算法是不是支持,这是一个关键问题,例如这部分当时最开始学习spark时候(几年前了),他支持的算法并不是很多,现在不知道是不是更多了。最近就是看到利用OCSVM进行训练的时候,那么多核都空着 ,只有一个核在跑。

同时,平时比较消耗时间的参数选择部分,这种我觉得类似spark这种应该能比较方便的支持,只需要把每个参数组合作为一个任务,分配到机器即可。

总结来说,我现在能够想到的一些需求:

  • 对支持分布式训练的模型提升速度
  • 不支持分布式训练的模型,同时训练多个模型,这样让任务同时进行

那么简单来说,**如果想利用集群的方式来提升速度,那么就需要把这个任务分解,然后让每个任务都在子节点上来进行运算。**这个其实也是我最近在实验过程中的感觉。

(但是说归到底,本质上还是计算能力的问题。目前实验室是提供了多台机器,这是非常方便的,但是毕业之后,可能自己的计算资源就少了,可能还是没用。)

2. 实际考虑

虽然说,前面的说法很简单,但实际上操作起来要复杂的多。要用分布式形式,那么首先你要考虑一个分布式的文件系统,例如HDFS这种。同时训练集和测试集的划分等。

运算环境,比如我采用的是sklearn中的一个模型,亦或者我利用了torch写了一个模型,某些spark可能都不支持的模型(需要考察)。那么从这个角度来说,你的分布式运算子节点,肯定是需要支持这些库的(问题应该不大,之前也尝试装过)

最后一个就是代码接口问题。就目前来说,我接触到的分布式计算框架,就是hadoop的mapreduce和spark两种计算方式,但当时使用他们的时候,采用的形式,基本上就是把数据分片,然后分片之后分别进行这个相应的计算,最后再汇总。那么在这种形式之下,我前面所说的那种划分成子任务(单个模型)的形式是不是就不能原生的支持了呢?这让我想起了两年前用spark做的一个爆破任务,但当时也是自己把任务下发下去的。哦,想起来了,当时是吧这个任务按照行的形式,每行数据算一个任务,然后来执行,哦,那这样就没有问题了。

再具体来解释一下前面的接口,(这个也是刚刚有点忘记了,但是仔细回想了一下自己spark爆破时候的任务,就有点明白了)。我当时应该是创建了一个的矩阵,每个矩阵记录这自己要干的事情的参数,然后分别来执行。

但是这是我自己对这部分任务的理解,我觉得应该有这种接口,可以将spark用作threadpool的形式?!暂时不清楚,后续再来分析。

3. 相关工具

简单搜索了一下,看了挺多文章,发现我有些想法,已经被实现了,也有一些开源项目,我个人觉得,其实这部分需求还是挺高的,毕竟越来越多的数据,同时可能需要大量的重复训练模型。这里简单记录一下把,暂时不进行深入,后续的时候再来看。

10 Python Frameworks for Parallel and Distributed Machine Learning Tasks
3 Methods for Parallelization in Spark
Auto-scaling scikit-learn with Apache Spark
Train sklearn 100x faster
Boosting Parallelism for ML in Python using scikit-learn, joblib & PySpark
Distributed Training: Frameworks and Tools

后记

本来这部分算是我的一个简单思考,之前的时候也关注过一些分布式机器学习平台。刚才也看到了一些论文有所分析。但是我觉得,我可能还是要理解一下前面这个内容,就是怎么利用spark,将他作为一种threadpool的形式,我提交任务,然后分布式执行,虽然说,前面的那种,将任务构造一下,然后分发到下面是可以的,但是感觉这样就变成了一种去贴合他的输入形式的任务。这个还是需要再思考思考。但,其实本质上, 我也感觉到,就是这里,你还是需要去定义你的输入,除非你就是你弄了个一个函数进去。。。挺乱的,还是很久没有关注这部分内容了,有点遗忘。

说的简单点,还是前面那句话,我希望的是,能够脱离那种文本式分发任务的桎梏,而是类似使用多线程的map这样的几个简单函数直接分发这个执行任务。当然这里就不局限在机器学习的任务上,可能后续还回有一些爆破之类的任务。

你可能感兴趣的:(Spark,机器学习,分布式,人工智能)