今すぐ Python* を高速化

インテル® oneAPI

この記事は、The Parallel Universe Magazine 50 号に掲載されている「Accelerate Python* Today」の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。


parallel_v50_06

Python* は、優れた汎用性とパフォーマンスで、常に多くの人を驚かせています。私は生粋の C と Fortran のプログラマーですが、ハイパフォーマンスを実現するため C++ もかなり使いこなすことができます。Python* もハイパフォーマンスを実現できますが、先に挙げた言語とは一線を画す利便性を備えているため、私は Python* のファンでもあります。

高度に最適化された主要なライブラリーと、プリコンパイルされないコードに対する (実行時の) JIT コンパイルサポートにより、Python* はハイパフォーマンスを実現します。しかし、Python* コードは、大きなデータセットや複雑なアルゴリズムでは遅くなる傾向があります。本記事では、以下の項目について説明します。

  1. 「ヘテロジニアスな未来」を考えることの重要性
  2. オープン・ソリューションで解決すべき 2 つの重要な課題
  3. 利用可能な CPU パフォーマンスを効率良く活用する並列実行
  4. アクセラレーターを使用してパフォーマンスをさらに向上する

3 番目の並列実行だけで 12 倍高速化でき、4 番目のアクセラレーターの使用によりさらに高速化することができます。これらの手法は、Python* プログラマーがパフォーマンスを向上させたいときに非常に有効であり、簡単に取り入れることができます。ここで紹介する手法は、結果が出るまでにあまり時間がかかりません。

「ヘテロジニアスな未来」を考える

Python* コードを高速に実行したいだけなら、ヘテロジニアスを理解することは重要ではありませんが、現在コンピューティングで起きている大きな変化を知っておく価値はあります。コンピューターは年々高速化しています。当初は、より巧妙で複雑なアーキテクチャーが、パフォーマンスの向上を牽引していました。1989年から 2006年にかけては、クロック周波数の向上が主な原動力となりました。そして、2006年に突然、クロック周波数の向上が鈍化し、パフォーマンスを向上するには再びアーキテクチャーの変更が必要になったのです。

マルチコア・プロセッサーは、プロセッサー内の (同種の) コアの数を増やすことで、より高いパフォーマンスを提供するものでした。クロック周波数の向上とは異なり、マルチコアのパフォーマンスを引き出すには、ソフトウェアを変更する必要がありました。Herb Sutter 氏の名著「The Free Lunch Is Over (フリーランチは終わった)」 (英語) は、並行処理の必要性を強調しました。並列化は必要でしたが、この変化はソフトウェア開発者に困難な課題をもたらしました。

次に、CPU の計算処理を専用のデバイスで補強するアクセラレーターが登場しました。その中で最も成功したのが GPU です。GPU は元々、グラフィックス処理をコンピューターのディスプレイにオフロードするために導入されました。GPU の計算能力を利用するいくつかのプログラミング・モデルが登場しましたが、結果をディスプレイに送るのではなく、CPU 上で動作するプログラムに送り返すものでした。その中で最も成功したモデルは、NVIDIA* GPU 向けの CUDA* です。現在では、同じシステム内の (ヘテロジニアスな) プロセッサーの処理能力は同等ではありません。しかし、一般的なプログラミング言語は、単一の計算デバイスを前提としているため、コードの一部を別の計算デバイスで実行する場合、「オフロード」という用語が使われます。

数年前、業界のレジェンドである John Hennessey 氏と David Patterson 氏が、「A New Golden Age for Computer Architecture (コンピューター・アーキテクチャーの新しい黄金時代)」 (英語) に入ったと発表しました。ヘテロジニアス・コンピューティングは、多くのドメイン専用のプロセッサーの登場により、爆発的に増加しています。成功するものもあれば失敗するものもありますが、もはやすべての計算を 1 つのデバイスで行う時代は終わり、コンピューティングは永遠に変化し続けるでしょう。

2 つの重要な課題を 1 つの優れたソリューションで解決

CUDA* は人気がありますが、その対象は NVIDIA* GPU に限定されています。複数のベンダーから登場する新しいアクセラレーター・アーキテクチャーに対応するには、オープンなソリューションが必要です。ヘテロジニアス・プラットフォームで実行されるプログラムは、実行時に利用可能なデバイスを検出する必要があります。また、これらのデバイスに計算をオフロードする仕組みも必要です。

CUDA* は、NVIDIA* GPU のみが利用可能であると仮定し、デバイスの検出を行いません。Python* ユーザーは、NVIDIA* CUDA* や AMD* ROCm* で GPU を活用するため、CuPy (英語) を選択できます。CuPy は堅実な選択肢ですが、CPU パフォーマンスを向上したり、ほかのベンダーやアーキテクチャー向けに汎用化することはできません。複数のベンダーに移植可能で、新しいハードウェア・イノベーションをサポートできるプログラミング・ソリューションがあれば、もっと良い結果が得られるでしょう。アクセラレーターへのオフロードを検討する前に、ホスト CPU を最大限に活用していることを確認します。並列性を引き出す方法とコンパイルされたコードを理解すれば、アクセラレーターでも同様の並列処理を利用できます。

Numba (英語) は、Anaconda 社によって開発された、オープンソースの Python* 用 NumPy* 対応最適化 (JIT) コンパイラーです。LLVM コンパイラーを使って Python* バイトコードからマシンコードを生成します。Numba は、多くの NumPy* 関数を含む、数値計算に特化した Python* の大部分をコンパイルできます。また、ループの自動並列化、GPU アクセラレーション・コードの生成、ユニバーサル関数 (ufuncs) と C コールバックの生成をサポートしています。

タイトルとURLをコピーしました