この記事は、インテルの The Parallel Universe Magazine 25 号に収録されている、インテル® VTune™ Amplifier XE を利用して非常に低いオーバーヘッドで Python* コードのプロファイリング情報を得る方法に関する章を抜粋翻訳したものです。
インテル® VTune™ Amplifier XE 2017 (インテル® Parallel Studio XE に含まれる) では、Python* スクリプトを解析してアプリケーションで時間が費やされている場所を正確に特定できるようになりました。この記事では、この新しいインテル® VTune™ Amplifier XE の Python* 機能の使用方法について説明します。
Python* の最適化が必要な理由
- Python* は、アプリケーションのパフォーマンスが重要なケースを含め、広範なソフトウェアで使用されています。例: Web サーバーコード、複雑な自動化スクリプト (ビルドシステムを含む)、科学計算。
- Python* はコードを素早く記述できますが、プロセスに十分なワークロードが与えられないと、コードが適切にスケーリングしません。
最適化が必要なコードの場所の特定
次のような方法があります。
- コードの調査。コードエディター以外のツールを必要としない、最も簡単な方法ですが、作業は簡単ではありません。特定のコードがどのように実行されるか正しく理解している必要があります。理解すべき情報が多すぎるため、非常に小さなコードベースを除いて適していません。
- ログ収集。タイムスタンプを記録する特別なバージョンのソースコードを作成する方法です。記録を確認してコードの遅い部分を調べます。この解析は骨の折れる作業であり、ソースの変更も必要です。
- プロファイル。プロファイルは、特定のワークロードの下でアプリケーションの動作を示すいくつかのメトリックを収集します。この記事では、CPU hotspot プロファイル (大量の CPU サイクルを費やしている関数の検索およびチューニング) について説明します。ロックの待機、メモリー消費などのプロファイルも可能ですが、典型的な Python* アプリケーションでは、CPU 使用率が問題になることが多く、CPU hotspot を調べることにより、メモリー消費ポイントを特定できます (特に大きな Python* シーケンス・オブジェクトを処理する場合、メモリーの割り当てと解放により CPU 使用率が非常に高くなります)。
アプリケーションをプロファイルするツールが必要になりますが、ツールの導入により得られる生産性の向上は十分に価値のあるものです。
既存のツールの概要
イベントベースのツールは、関数の入口/出口、クラスのロード/アンロードなど、特定のイベントでデータを収集します。ビルトイン Python* cProfile プロファイラー (および sys.setprofile /sys.settrace API) はイベントベース収集の例です。
インストルメンテーションベースのツールは、データを収集するためにターゲット・アプリケーションを変更します。この変更は、手動で行うか、コンパイラーやほかのツールを使用して行います。
統計ツールは、一定の間隔でデータを収集します。最も頻繁に実行された関数が、「関数別サンプル」分布の一番上になります。これらのツールはおおよその結果を提供し、プログラムの実行にあまり干渉しません (ターゲット・アプリケーションへの影響はわずかで、小さな関数の頻繁な呼び出しにも影響を受けません)。また、プロファイル・オーバーヘッドはワークロードにほとんど依存しません。
インテル® VTune™ Amplifier XE を利用した Python* コードのプロファイル
インテル® VTune™ Amplifier XE で、Python* コードをプロファイルできるようになりました。非常に低いオーバーヘッド (Grand Unified Python* Benchmark で約 1.1 倍から 1.6 倍) で、行レベルのプロファイル情報を取得できます。Windows® および Linux* をサポートしています。主な機能は次のとおりです。
- Python* 32 ビットおよび 64 ビット
- 2.7.x および 3.4.x ブランチ (2.7.10 および 3.4.3 でテスト)
- SSH によるリモート収集のサポート
- マルチスレッドのサポート、ズームおよびフィルター、ソースのドリルダウンを含む UI
次のワークフローをサポートしています。
- アプリケーションを開始して、終了を待機する。
- アプリケーションにアタッチし、すぐに短いプロファイルを行い、デタッチする。
- インタープリターの初期化および終了時に実行される多くの Python* コードを含む、すべての段階でコードをプロファイルする。
Python* コードを解析する手順は次のとおりです。
- インテル® VTune™ Amplifier XE プロジェクトを作成する。
- Basic Hotspots 解析を実行する。
- 結果データを解釈する。