带EC2的多线程Python

时间:2018-07-17 13:59:06

标签: python-2.7 amazon-ec2 multiprocessing python-multiprocessing

我有一个使用Python 2.7中的multiprocessing.Process并行构建的进程。从理论上讲,它应该在具有大量vCPU的EC2集群上确实可以快速运行,但是并没有达到我的预期。我在96 vCPU机器(m5.24xlarge实例)上运行代码,但是当我尝试并行运行90时,要并行执行的功能在4 vCPU机器上约45分钟内运行所有子流程需要5个小时以上的时间才能完成。

我已经考虑过使用Pool函数来避免发生的批处理,但是被调用的函数运行着大约200个可以长时间运行的模型(有时会陷入怪异的优化循环中),所以我有一个在后台运行的其他进程将在每10分钟落后3个小时的处理器时间后开始向该子进程发送Ctrl + C软命令,以确保对单个子进程的处理不会进行太长时间。

每个运行子进程的vCPU的利用率在40%到99%之间,直到子进程完成。我的问题是,在移到更大的实例时,为什么多处理不能线性扩展?我保留了5个vCPU来运行任何后台进程,因此不会在那里陷入困境。

from multiprocessing import Process
import datetime
import Prod_Modeling_Pipeline as PMP
import boto3
import pandas
import time
import numpy
import os

#Define locations
bucketName = 'bucketgoeshere'
output_location = '/home/ec2-user/'

#Pull ATM Setter Over
client = boto3.client('s3')
transfer = boto3.s3.transfer.S3Transfer(client=client)
transfer.download_file(bucketName,'Root_Folder/Control_Files/'+'execution_file.csv', output_location+'execution_file.csv')

#Read-in id list
execution_data = pandas.read_csv(output_location+'execution_file.csv')
ids = execution_data['id']

ni = 90
id_row = [['AAA']*ni for _ in xrange(int(numpy.ceil(len(tids)/float(ni))))]

for i in xrange(len(ids)):
    id_row[i/ni][i%ni] = ids[i]

Date = datetime.date.today().strftime('%Y-%m-%d')

totalstart = time.time()
for q in xrange(len(tid_row)):
    processes = []
    for m in xrange(len(tid_row[q])):
        temp = tid_row[q]
        try:
            p = Process(target=PMP.Model_Function, args=(temp[m],Date,'VALIDATION'))
            p.start()
            processes.append(p)
            time.sleep(1)
            print("Started "+temp[m]+" as "+str(os.getpid()))
        except:
            print("Invalid Run")

    for p in processes:
        p.join()

    print(processes)

print (time.time() - totalstart)

1 个答案:

答案 0 :(得分:0)

我想我现在明白为什么它不是线性缩放的。这一切都取决于t2 EC2实例和m EC2实例之间的时钟速度。对于较小的实例,最大时钟速度要高得多……对于较小的t2实例,最高为3.3 GHz,对于m型实例,最高为2.5 GHz。

https://aws.amazon.com/ec2/instance-types/

当您更改为较大的实例类型时,这将限制可伸缩性,因为您将其移至了较低的最大时钟速度。

这不是我上面所有的问题,但这可以解释时间增加的一部分。

另一部分似乎是由于使用共享处理器所致,因此,即使EC2花费的时间更少,我组织中的其他人也正在消耗处理能力。不确定如何在公司约束下解决此问题。