Warning

注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

環境作成の概要

これは、環境初期化プロセスに関する詳細を説明する高度なガイドです。初期化パフォーマンスに影響を与える技術的な検討事項に興味があるユーザー向けです。一般的な環境関連の問題に関するガイダンスについては、Environment Troubleshooting Guide をご覧ください。

Conda はオープンソースの言語非依存のパッケージおよび環境マネージャです。Mamba は Conda パッケージマネージャのオープンソースの再実装です。Hawk は Palantir が開発した Conda パッケージマネージャの再実装です。Code Repositories では、Commit 後に Checks を実行する際に、Hawk を使ってパッケージの依存関係を解決します。Hawk は Mamba や Conda よりもパッケージ解決の速度が向上し、アクティブなメンテナンスと開発が行われている点で、いくつかの利点があります。

このページでは、最も重要な概念を紹介し、環境作成プロセスの概要を説明します。詳細については、公式の Conda ドキュメント ↗Mamba ドキュメント ↗ を参照してください。

重要な用語

パッケージ

パッケージとは、メタデータ、ライブラリ、および/またはバイナリを含むファイルの集まりです。Code Repository は、コア言語機能を補完するために、多くのパッケージ(例:numpy)にアクセスできます。

パッケージにはバージョンがあり、ほとんどの場合、依存関係があります。依存関係とは、パッケージが正常に機能するために必要な他のパッケージのことです。依存関係は、特定のバージョンのパッケージ、許容されるバージョンの範囲、またはすべてのバージョンが対象となることがあります。

チャネル

チャネルとは、パッケージが格納されている場所のことで、リポジトリとも呼ばれることがあります。チャネルの一つは、ローカルファイルシステム内のディレクトリであり、もう一つは、ウェブサーバーにホストされたディレクトリであることがあります。

タイプに関係なく、各チャネルは、プラットフォームアーキテクチャ別にパッケージを分離するディレクトリツリーです。各プラットフォームのサブディレクトリには、そのサブディレクトリ内のすべてのパッケージをインデックスした repodata.json というファイルが含まれています。

Conda は、パッケージを取得する必要があるたびに、事前に設定されたチャネルのセットを検索します。Foundry のチャネル管理に関する詳細は、パッケージドキュメントを参照してください。

環境

Conda の環境とは、特定のパッケージのコレクションが含まれるディレクトリです。環境は、Environment Configuration パネルで指定されたパッケージを Conda に渡すことで、リポジトリごとに作成されます。Conda は、設定とすべての依存関係を満たすパッケージのセットを構築し、リポジトリを支える Spark モジュールにこれらのパッケージをインストールします。

パフォーマンス

以下のパフォーマンスの説明は、この Anaconda のブログ記事 ↗ に基づいています。これは Conda のパフォーマンスについて詳しく説明していますが、Mamba や Hawk の実装にも同様に適用されます。次の2つのセクションでは、この資料を要約し、Code Repositories に最も関連するパフォーマンス要因を概説しています。

環境の作成

環境作成は、解決ステップインストールステップの2つの主要なステップで構成されています。

解決ステップ

解決ステップでは、指定されたパッケージマネージャ(Conda、Mamba、または Hawk)が、すべての遷移的依存関係を満たすパッケージとバージョンを見つけようとします。遷移的依存関係とは、Environment Configuration パネルで指定されたパッケージの依存関係、それらの依存関係の依存関係などを指します。このステップには以下の4つの段階があります。

  1. パッケージインデックスのダウンロードと処理。パッケージマネージャは、設定された各チャネルから repodata.json ファイルをダウンロードし、インデックスエントリをメモリ内のオブジェクトに変換します。
  2. インデックスの縮小。パッケージマネージャは、環境で使用される可能性があるすべてのパッケージのセットを構築します。このアルゴリズムは、提供されたパッケージ仕様から始め、すべての依存関係を再帰的に処理します。依存関係グラフにない不要なパッケージは、主に剪定されます。
  3. 依存関係の制約をブールの充足可能性(SAT)問題として表現します。パッケージマネージャは、パッケージの最新バージョンなど、特定のタイプの解決策を好むことがあり、これらのバイアスは節の構築に組み込まれています。
  4. SAT ソルバーの実行。

インストールステップ

解決が成功した場合、次にインストールステップが行われます。ここでは、各アーティファクトが適切なチャネルから取得され、パッケージマネージャがこれらのアーティファクトを使用して環境を構築します。このステップには以下の3つの段階があります。

  1. 解決された環境内のすべてのパッケージをダウンロードし、展開します。
  2. パッケージの内容を確認します。設定によっては、Conda はチェックサムを使用するか、ファイルサイズが正しいことを確認します。
  3. パッケージを環境にリンクします。

制約事項

上記で説明したステップは、特定の状況で遅くなることがあります。遅さの原因は、通常以下の3つのカテゴリのいずれかに分類されます。

上流の変更

遅さの大部分は、Foundry 外部の要因によるものです。

  • チャネルインデックスのダウンロードと処理は、インデックスファイルの合計サイズに比例します。考慮する必要があるチャネルの数が多く、これらのチャネルのサイズが大きいほど、これらのステップにかかる時間が長くなります。
  • インデックスの縮小も、遷移的依存関係の数に比例します。遷移的依存関係の数は、パッケージがどの依存関係を宣言するかによって決まります。

これらの要因は外部で不透明であるため、パフォーマンスの後退原因を分析するのは難しいことがあります。環境が突然、ロードに時間がかかるようになるのは、チャネルが最近サイズが大きくなったため、またはパッケージが最新リリースで新しい依存関係をいくつか宣言したためです。

環境仕様

より一般的には、遅い初期化は、環境仕様自体に直接関連しています。解決ステップは環境サイズと超線形的にスケールするため、一般的な経験則として、パッケージが多い環境ほど、初期化にかかる時間が比例して長くなります。

これらの状況を解決する方法は2つあります。

  • まず、環境定義から不要なパッケージを削除します。小さく特化した環境を持つ方が、大きく汎用性のある環境を持つよりも、はるかにパフォーマンスが向上します。
  • 次に、Environment Configuration パネルでいくつかのパッケージにバージョン制約を追加してみてください。python のような多くのビルドが存在するパッケージや、scipy のような複雑な依存関係グラフを持つパッケージのバージョンを固定するのが最も効果的です。これにより、Conda はインデックスをより積極的に縮小できるため、SAT 解決において多くのパッケージバージョンを考慮する必要がありません。

パッケージサイズ

パッケージサイズは、このセクションの他の要因に比べて問題が少ないことが多いですが、一部のケースでは関連性があります。

たとえば、pytorch パッケージは約 460 MB のサイズがあり、抽出に 35 秒以上かかることがあります。

ダウンロード、展開、および検証は、環境内のパッケージのサイズと数に比例してスケールします。遷移的依存関係のため、解決された環境には、環境定義で明示的に指定されたものよりもはるかに多くのパッケージが含まれており、パッケージの増加が遅さを引き起こすことがあります。

この場合の改善方法は、環境仕様の提案と同様です。環境をできるだけ小さく保つようにしてください。