Facebook が Instagram で使用される CPython のフォークである Cinder をオープンソース化

Facebook は、Python プログラミング言語の主要なリファレンス実装である CPython 3.8.5 のフォークである Project Cinder のソース コードを公開しました。 Cinder は Instagram を強化するために Facebook の運用インフラストラクチャで使用されており、パフォーマンスを向上させるための最適化が含まれています。

このコードは、準備された最適化をメインの CPython フレームワークに移植する可能性について議論し、CPython のパフォーマンスの向上に関与する他のプロジェクトを支援するために公開されています。 Facebook は Cinder を別個のオープンソース プロジェクトの形でサポートするつもりはなく、コードは追加の調査やドキュメント化を行わずに、会社のインフラストラクチャで使用される形式で提供されます。 また、Cinder を CPython の代替として推進しようともしていません。開発の主な目標は、CPython 自体を改善することです。

Cinder コードはかなり信頼性が高く、実稼働環境でテストされているとされていますが、Facebook は外部エラー メッセージやプル リクエストに応答することを保証していないため、問題が特定された場合は自分で解決する必要があります。 同時に、Facebook はコミュニティとの建設的な協力を排除するものではなく、Cinder をさらに高速化する方法や、準備された変更の CPython 主要部分への転送を高速化する方法についてアイデアを議論する用意があります。

Cinder に実装された主な最適化:

  • バイトコードのインライン キャッシュ (「シャドウ バイトコード」)。 この方法の本質は、最適化できる典型的なオペコードが実行される状況を特定し、そのようなオペコードをより高速な特殊なオプションに動的に置き換えることです (たとえば、頻繁に呼び出される関数を置き換える)。
  • 熱心なコルーチン評価。 すぐに処理される非同期関数呼び出しの場合 (await では待機が発生せず、関数が早く return ステートメントに到達します)、そのような関数の結果は、コルーチンを作成したりイベント ループを関与させたりすることなく、直接置換されます。 async/await を多用する Facebook コードでは、最適化により約 5% の速度向上が得られます。
  • 個々のメソッドおよび関数のレベルでの選択的な JIT コンパイル (一度にメソッド)。 「-X jit」オプションまたは PYTHONJIT=1 環境変数で有効にすると、多くのパフォーマンス テストの実行を 1.5 ~ 4 倍高速化できます。 JIT コンパイルは頻繁に実行される関数にのみ関連するため、コンパイルのオーバーヘッドによってプログラムの実行が遅くなるだけであるため、めったに使用されない関数に JIT コンパイルを使用することはお勧めできません。

    オプション「-X jit-list-file=/path/to/jitlist.txt」または環境変数「PYTHONJITLISTFILE=/path/to/jitlist.txt」を使用して、JIT が適用される関数のリストを含むファイルを指定できます。を使用できます (パス形式 .to.module:funcname または path.to.module:ClassName.method_name)。 JIT を有効にする必要がある関数のリストは、プロファイリングの結果に基づいて決定できます。 将来的には、関数呼び出し頻度の内部分析に基づいて動的 JIT コンパイルのサポートが期待されますが、Instagram でのプロセス起動の特性を考慮すると、JIT コンパイルは初期段階では Facebook にも適しています。

    JIT は、まず Python バイトコードを高レベル中間表現 (HIR) に変換します。これは Python バイトコードにかなり近いものですが、スタックベースの仮想マシンではなくレジスタベースの仮想マシンを使用するように設計されており、型情報や追加の情報も使用します。パフォーマンスに重要な詳細 (参照カウントなど)。 次に、HIR は SSA (静的単一割り当て) 形式に変換され、参照カウントの結果とメモリ消費データを考慮した最適化手順が実行されます。 その結果、アセンブリ言語に近い低レベル中間表現 (LIR) が生成されます。 LIR ベースの最適化の別のフェーズの後、asmjit ライブラリを使用してアセンブリ命令が生成されます。

  • モジュールの厳密モード。 この機能には、StrictModule 型という XNUMX つのコンポーネントが含まれています。 モジュールの実行がそのモジュールの外部のコードに影響を与えないことを判断できる静的アナライザー。 モジュールが strict モード (コードでは「import __strict__」と指定されている) であることを判断し、他のモジュールとの交差がないことを確認して、strict モジュールを StrictModule オブジェクトとして sys.modules にロードするモジュール ローダー。
  • Static Python は、型アノテーションを使用して型固有のバイトコードを生成する実験的なバイトコード コンパイラーであり、JIT コンパイルのおかげでより高速に実行されます。 一部のテストでは、静的 Python と JIT の組み合わせにより、標準の CPython と比較して最大 7 倍のパフォーマンス向上が実証されました。 多くの状況では、結果は MyPyC および Cython コンパイラーを使用した場合に近いと推定されます。

出所: オープンネット.ru

コメントを追加します