入れ子構造の並列処理が手に負えなくなったときにどうするか? インテル® TBB 向け Python* モジュールを 30 分で導入する

この記事は、インテル® デベロッパー・ゾーンに公開されている「What to do when Nested Parallelism Runs Amuck? Getting Started with Python* module for Threading Building Blocks (Intel® TBB) in Less than 30 Minutes!」の日本語参考訳です。


製品の概要

インテル® スレッディング・ビルディング・ブロック (インテル® TBB) は、並列処理のエキスパートであるインテルが提供する、移植性に優れたオープンソースの並列プログラミング・ライブラリーです。インテル® Distribution for Python* に含まれるインテル® TBB 向け Python* モジュールは、入れ子構造の並列処理の一般的な問題に対応する、すぐに使えるスケジューリング機能です。プロセス内とプロセス間の同時実行を調整します。この記事は、インテル® TBB 向け Python* モジュールを使用して Python* プログラムを起動し、NumPy* や SciPy* などの一般的な Python* モジュールの数学処理をインテル® マス・カーネル・ライブラリー (インテル® MKL) のスレッド・スケジュールで並列化する方法を示します。インテル® MKL もインテル® Distribution for Python* に無料でバンドルされています。インテル® TBB は、豊富な機能の Python* API (英語) を備えたハイパフォーマンスな解析パッケージであるインテル® データ・アナリティクス・ライブラリー (インテル® DAAL) 向けのネイティブスレッド化ライブラリーです。さらに、インテル® Distribution for Python* のフルパッケージを使用している場合、Numba、OpenCV*、および一部の scikit-learn アルゴリズム (インテル® DAAL により高速化されている) をネイティブスレッド化します。

インテル® TBB の入手方法

インテル® Distribution for Python* のフルパッケージ (インテル® TBB を含む) をインストールするには、以下のインストール・ガイドを参照してください。

Anaconda* パッケージ
YUM リポジトリー
APT リポジトリー
Docker* イメージ (英語)

Anaconda* クラウドをインストールするには、次のコマンドを実行します。

conda install -c intel tbb4py

インタープリター呼び出しでの使用 (コード変更不要)

インテル® TBB をドロップインして、問題に適したソリューションを決定するだけです。

入れ子構造の並列呼び出しが原因でオーバーサブスクリプション状態となりパフォーマンスが低下することがありますが、多くの場合、ユーザーはこれに気付きません。スクリプト環境ではこのような「問題」が起こりやすいことが知られています。インテル® TBB は、コード変更を必要とせず、デフォルト設定のスレッド・スケジュールで簡単に調整できます。Python* コミュニティーで多用されるスクリプトでは、インテル® TBB のパフォーマンス回復のチェックは簡単です。既存の数学処理コードがある場合、次のように “-m tbb” インタープリター・フラグとスクリプト名、スクリプトに必要な引数を指定して、簡単に起動できます。

python -m tbb script.py args*

注: 利用可能なフラグの一覧は、「インタープリター・フラグ・リファレンス」を参照してください。

インタープリター・フラグ・リファレンス

コマンドライン構文
python -m tbb [-h] [--ipc] [-a] [--allocator-huge-pages] [-p P] [-b] [-v] [-m] script.py args*
コマンドライン・ヘルプの表示方法
python -m tbb --help
pydoc tbb
現在利用可能なインタープリター・フラグの一覧
インタープリター・フラグ 説明
-h、
–help
ヘルプメッセージを表示します。
-m モジュールとして実行します (デフォルト: False)。
-a、
–allocator
標準のメモリー・アロケーターの代わりに、インテル® TBB のスケーラブル・アロケーターを有効にします (デフォルト: False)。
–allocator-huge-pages インテル® TBB アロケーターでラージページを有効にします (暗黙で -a が有効になります) (デフォルト: False)。
-p P、
–max-num-threads P
プロセスごとの最大スレッド数 P でインテル® TBB を初期化します (デフォルト: システムで利用可能な論理プロセッサー数)。
-b、
–benchmark
スクリプトを続行する前に、すべてのスレッドが生成されるまでインテル® TBB の初期化をブロックします。パフォーマンス・ベンチマークの測定にインテル® TBB の初期化を含めたくない場合、これが必要です (デフォルト: False)。
-v、
–verbose
詳細とバージョン情報を要求します (デフォルト: False)。
–ipc インテル® TBB スケジューラーの間でプロセス間の調整 (IPC) を有効にします (デフォルト: False)。

関連情報 (英語)

インテル® TBB の製品ページ
簡単な紹介ビデオ (英語)
SciPy* 2017 会議録 (英語)
SciPY 2016 紹介ビデオ (英語)
DASK* でのインテル® TBB の利用に関するブログ

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事