私はDEAPで働いています。大規模なデータセット (200 浮動小数点の 400.000 列) に対して人口 (現在 50 人) を評価しています。マルチプロセッシングなしでアルゴリズムのテストに成功しました。実行時間は約 40 秒/世代です。より多くの人口とより多くの世代で作業したいので、マルチプロセッシングを使用して高速化しようとしています。
私の質問は、DEAP よりもマルチプロセッシングに関連していると思います。この質問は、プロセス間でメモリ/変数を共有することとは直接関係ありません。主な問題は、ディスク アクセスを最小限に抑える方法です。
Python マルチプロセッシング モジュールの使用を開始しました。
コードは次のようになります
toolbox = base.Toolbox()
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
PICKLE_SEED = 'D:\\Application Data\\Dev\\20150925173629ClustersFrame.pkl'
PICKLE_DATA = 'D:\\Application Data\\Dev\\20150925091456DataSample.pkl'
if __name__ == "__main__":
pool = multiprocessing.Pool(processes = 2)
toolbox.register("map", pool.map)
data = pd.read_pickle(PICKLE_DATA).values
そして、もう少し:
def main():
NGEN = 10
CXPB = 0.5
MUTPB = 0.2
population = toolbox.population_guess()
fitnesses = list(toolbox.map(toolbox.evaluate, population))
print(sorted(fitnesses, reverse = True))
for ind, fit in zip(population, fitnesses):
ind.fitness.values = fit
# Begin the evolution
for g in range(NGEN):
評価関数は、グローバルな「データ」変数を使用します。そして最後に:
if __name__ == "__main__":
start = datetime.now()
main()
pool.close()
stop = datetime.now()
delta = stop-start
print (delta.seconds)
つまり、メイン処理ループとプール定義は によって保護されていif __name__ == "__main__":
ます。
それは何とか機能します。実行時間: 1 プロセス: 398 秒 2 プロセス: 270 秒 3 プロセス: 272 秒 4 プロセス: 511 秒
マルチプロセッシングは実行時間を劇的に改善するわけではなく、さらには害を及ぼす可能性さえあります。
4 プロセスの (不足している) パフォーマンスは、メモリの制約によって説明できます。私のシステムは基本的に、処理ではなくページングです。
他の測定値は、データの読み込みによって説明できると思います。
私の質問:
1) モジュールが別のプロセスとして開始されるたびに、ファイルが読み取られ、ピクル解除されることを理解しています。これは正しいです?これは、含まれる関数の 1 つが map によって呼び出されるたびに読み取られることを意味しますか?
2) unpickling をif __name__ == "__main__":
ガードの下に移動しようとしましたが、評価関数を呼び出したときに「データ」が定義されていないというエラー メッセージが表示されます。ファイルを一度読み取ってから、配列のみをプロセスに渡す方法を説明していただけますか