PythonのDEAPフレームワークを並列処理で動作させる方法を現役エンジニアが解説【初心者向け】

初心者向けにPythonのDEAPフレームワークを並列処理で動作させる方法について現役エンジニアが解説しています。DEAPとは、Pythonで遺伝的アルゴリズムを実行するときに使われるライブラリです。DEAPフレームワークの使い方や並列処理としてmultiprocessingの使い方を解説します。

TechAcademyマガジンは受講者数No.1のオンラインプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。

PythonのDEAPフレームワークを並列処理で動作させる方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して、初心者向けに解説します。

 

Pythonについてそもそもよく分からないという方は、Pythonとは何なのか解説した記事を読むとさらに理解が深まります。

 

なお本記事は、TechAcademyのオンラインブートキャンプ、Python講座の内容をもとに紹介しています。

 

田島悠介

今回は、Pythonに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

PythonのDEAPフレームワークを並列処理で動作させる方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

目次

 

DEAPとは

DEAPとは、Pythonで遺伝的アルゴリズムを実行するときに使われるライブラリです。

遺伝的アルゴリズムとは、生物の進化を模倣する解の探査手法として紹介されたもので、1975年にミシガン大学のJohn Hollandが提案しました。

遺伝的アルゴリズムを使うことで生物の進化を行われるように最適化問題の目的関数を求めることができます。プログラムで一からアルゴリズムを組むのは難しいですが、PythonであればDEAPを使うことで簡単に遺伝的アルゴリズムを実装できます。
 

[PR] Pythonで挫折しない学習方法を動画で公開中

DEAPの使い方

DEAPはpipで配布されているので、以下のコマンドでインストールできます。

pip install deap

遺伝子アルゴリズムにおいて、遺伝子は設計変数のことを指します。この設計変数のセットを定義するときにはcreatorモジュールを使います。

これにより適正度を保存するメンバ変数を簡単に定義できます。標準ではいくつかのクラスが存在します。

creator.create("FitnessMin", base.Fitness, weights=(-1.0,))

関数を作成するときにはToolboxモジュールを使用します。base.Toolbox()でオブジェクトを定義してそのオブジェクトからcreateメソッドで使いたい関数を呼び出します。

たとえば、遺伝子を生成するattr_geneを呼び得だすときには、以下のように呼び出せます。

toolbox.register("attr_gene", random.uniform, -500, 500)

 

プロセスを並列化する方法

Deapで並列処理を行うときにはDeapで提供されていない外部モジュールを使って簡単に並列処理を実装できます。

公式ドキュメントではmultiprocessingやSCOOPを使う方法が紹介されていますが、ここではmultiprocessingを使った方法を紹介します。

multiprocessingを使うときには、multiprocessing.Pool()を使い、さらに先程のcreateモジュールでmapアルゴリズムを呼び出すことで並列化を行なうことができます。

具体的には以下の2行を実行すれば並列処理が完了します。

pool = multiprocessing.Pool()
creator.create('map', pool.map)

Windowsでmultiprocessingを使う場合はガイドラインでも記載されていますが、プロセスの初期化を行なうために、上記の2行は必ずif __name__ == “__main__”:以下でセクションを保護する必要があります。

あとは、ここから続けてDeapを使ってアルゴリズムを実装すればプロセスを並列化できます。

それでは、次にサンプルコードで並列化をしてみましょう。
 

実際に書いてみよう

それではサンプルコードを使ってDeapのプロセスの並列化をやってみましょう。

今回は公式ドキュメントで紹介されているものを参考に遺伝的アルゴリズムを使って実装してみます。

以下のコードを任意のフォルダに保存しましょう。

import random
from deap import creator, base, tools, algorithms
import multiprocessing

creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)

toolbox = base.Toolbox()

def evalOneMax(individual):
    return sum(individual),

if __name__ == "__main__":
    pool = multiprocessing.Pool(2)
    toolbox.register("map", pool.map)

    toolbox.register("attr_bool", random.randint, 0, 1)
    toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, n=100)
    toolbox.register("population", tools.initRepeat, list, toolbox.individual)

    toolbox.register("evaluate", evalOneMax)
    toolbox.register("mate", tools.cxTwoPoint)
    toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
    toolbox.register("select", tools.selTournament, tournsize=3)
    
    population = toolbox.population(n=300)

    NGEN=40
    for gen in range(NGEN):
        offspring = algorithms.varAnd(population, toolbox, cxpb=0.5, mutpb=0.1)
        fits = toolbox.map(toolbox.evaluate, offspring)
        for fit, ind in zip(fits, offspring):
            ind.fitness.values = fit
        population = toolbox.select(offspring, k=len(population))
    top10 = tools.selBest(population, k=10)

 

まとめ

今回はDeapフレームワークを使ってプロセスの並列化を行う方法について紹介しました。

Deapは最適化問題を解くアルゴリズムが多く揃っており、さらにプロセスの並列化も簡単に行えるので効率よく最適化問題を解くことが出来るライブラリとなっています。
 

監修してくれたメンター

メンター三浦

モバイルゲームを運用している会社のエンジニアをしています。趣味でWEB開発やクラウドコンピューティングもやっており、ソフトもハードもなんでもやります。

TechAcademyジュニアではPythonロボティクスコースを担当しています。好きな言語はPython, Node.js。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

TechAcademyでは、初心者でも最短4週間で、Pythonを使った人工知能(AI)や機械学習の基礎を習得できる、オンラインブートキャンプを開催しています。

また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。