前回の記事はPysparkの分散処理でビックデータ処理の時間を大きく短縮させる方法を解説しました。今回は複数のCPUコアで並列処理の高速に計算の方法を解説します。 目次 1. joblibの概要 __1.1 分散処理 並列処理の違い __1.2 joblib.Parallelの解説 2. 実験・コード __2.1 ライブラリーのインストール __2.2 環境情報を表示 __2.3. 普通のPythonの処理 __2.4. Joblibの並列処理 __2.5. 結果比較(可視化) 3. まとめ 1. joblibの概要 1.1分散処理 並列処理の違い 並列(Parallel):複数の計算機や複数の計算ユニットで構成される1つの自律的な処理です。1つの自律的なシステムであるため,当該処理系を構成する複数の計算機は,常に同一の状態を維持している必要があります。並列とは、計算速度を向上させるために同時に行うという物理的な概念です。 分散(Distributed):複数の自律的なシステムをネットワークとおして連携する処理です。分散システム技術をレプリケーションと呼びます。クラスター構成を構築して、やるようなSpark等がこれに当てはまります。 この2つは、そもそも目的が違う概念です。並行というのは、世の中一般、同時進行するものごとをプログラムとして表現する際に用いる広い概念です。一方で並列というのは、主に計算速度を稼ぐために計算を同時に進めることを言います。 1.2 joblib.Parallelの解説 joblib.Parallel(n_jobs=None, backend=None, verbose=0, timeout=None, pre_dispatch=’2 * n_jobs’, batch_size=’auto’, temp_folder=None, max_nbytes=’1M’, mmap_mode=’r’, prefer=None, require=None) n_jobsはタスクを何分割するかという指定をする部分です。-1でコア数をマックスで使うように計らってくれます。 verboseは途中経過を表示する頻度を指定する引数で0~10の値です。0ではなにも表示せず、10で最頻になります。 backendで”threading”を選べばマルチスレッドで動作して、オーバーヘッドは減るがPythonのGILにより通常の処理中は並列処理できない(GILをリリースする部分だけが並列で動作できる=DBアクセスの待ちなどが大きいプログラムの場合のみ有効で小さい場合は速度低下の恐れもある)、デフォルトは”multiprocessing”のマルチプロセス動作です。 Timeout 完了する各タスクのタイムアウト制限です。タスクに時間がかかると、TimeOutErrorが発生します。 pre_dispatch 事前発送されるタスクのバッチの数。 batch_size 各ワーカーに一度にディスパッチする自動的のタスクの数。 temp_folder ワーカープロセスとメモリを共有するために大きな配列をマッピングするためにプールで使用されるフォルダーです。 …
PythonのJoblibで並列処理 Read More »