分布式机器学习

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这样的几个简单函数直接分发这个执行任务。当然这里就不局限在机器学习的任务上,可能后续还回有一些爆破之类的任务。

后续(20221226)

最近重新跑起了实验,遇到的一个问题,跟这部分内容很像。感觉当时我并没有说明白。由于编程环境的问题,那么我需要把所有的数据都转移到新的环境,这里采用的是docker形式,虽然其实一开始的时候,就应该按照他们的工作方法,就是把环境剖除掉,然后只执行docker的命令。(这里其实算是我自己的一个使用方法错误。)但是一直以来,都是把docker用成了一个服务器的形式,毕竟太多东西需要编程了,直接进去SSH进行调整也更快。(但后续的时候,还是应该直接利用那种形式)

这个就先不说了,前面算是我自己的一个使用方式的错误。也不完全算是吧,毕竟之前的时候也是利用他开一个jupyter服务。

那么问题是,我现在有很多台机器,我想充分利用这些资源,当然,这里不需要那种需要分布式计算的算法。我只是要训练多个模型,我想让多个模型同时跑,这样速度提升起来。现在为了利用这些资源,都是把数据,把什么东西都拷贝过去,然后开始跑。其实,我简单想了想,可以有这么几个方式来进行提升。当然,本质上,前面spark肯定是能实现的。我说说我的想法。

首先,要解决数据的问题,那么你想把别的计算资源利用起来,那这个数据,可以直接复制过去,但这种,毕竟也比较冗余。其实可以直接部署一个http之类的服务器,让他自己来进行下载,然后本地跑。这就是可行的过程。

然后,把代码弄过去。这样代码直接跑就行了。!!

感觉还是怪怪的。就是最后还是少不了,各种复制的过程。

感觉还是前面说的那样,我本质上需要的,就是一个完整的接口,这个接口实现的过程,如果把数据部署好之后,那么我可以直接远程跑各种命令,而且需要的只是把代码复制过程。可能。。。直接代码只有一行脚本,然后把所有的程序都是下载的。。

(我也不知道自己在说什么了,感觉其实就是想要一个各种服务器的远程控制一样,把东西丢过去,让他自己跑)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值