web-dev-qa-db-ja.com

マルチプロセッシングpython Docker内のプログラム

Dockerコンテナー内でpython=のマルチプロセッシングをテストしようとしていますが、プロセスが正常に作成された場合(8 CPUと8プロセスが作成された場合)でも、物理CPUは常に1つしか使用しません。これが私のコードです:

_from sklearn.externals.joblib.parallel import Parallel, delayed
import multiprocessing
import pandas
import numpy
from scipy.stats import linregress
import random
import logging

def applyParallel(dfGrouped, func):
    retLst = Parallel(n_jobs=multiprocessing.cpu_count())(delayed(func)(group) for name, group in dfGrouped)
    return pandas.concat(retLst)

def compute_regression(df):
    result = {}

    (slope,intercept,rvalue,pvalue,stderr) = linregress(df.date,df.value)
    result["slope"] = [slope]
    result["intercept"] = [intercept]

    return pandas.DataFrame(result)

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    logging.info("start")
    random_list = []
    for i in range(1,10000):
        for j in range(1,100):
            random_list.append({"id":i,"date":j,"value":random.random()})

    df = pandas.DataFrame(random_list)

    df = applyParallel(df.groupby('id'), compute_regression)

    logging.info("end")
_

--cpusや--cpusetなどの起動時に複数のDockerオプションを試しましたが、常に1つの物理CPUしか使用していません。 Docker、python、OSの問題ですか? Dockerバージョンは1.13.1です

cpu_count()の結果:

_>>> import multiprocessing
>>> multiprocessing.cpu_count()
8
_

ランニング中、こちらがトップです。メインプロセスと8つの子プロセスを確認できますが、パーセンテージが変です。 top screenshot

そして、4つのプロセスに変更した場合、使用されるCPUの合計量は常に同じです: top with 4 threads

8
hanego

multiprocessing.cpu_count()--cpuオプションを渡さずに私のマシンに2を与えます

dockerコンテナーリソースの詳細については、 https://docs.docker.com/engine/admin/resource_constraints/#cp をご覧ください。

3
beastreload