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

環境作成の概要

このガイドは、環境の初期化プロセスを詳しく説明する高度なガイドです。初期化のパフォーマンスに影響する技術的な考慮事項に関心のあるユーザーを対象としています。環境に関連する一般的な問題への対処については、環境のトラブルシューティングガイドを参照してください。

Conda は、言語に依存しないオープンソースのパッケージおよび環境マネージャーです。Mamba は、Conda パッケージマネージャーを再実装したオープンソースのソフトウェアです。Hawk は、Palantir が開発した Conda パッケージマネージャーの再実装です。Code Repositories は、コミット後にチェックを実行する際、Hawk を使用してパッケージの依存関係を解決します。Hawk は、Mamba や Conda と比べてパッケージの依存関係の解決にいくつかの利点があり、特に処理速度の向上と、活発な保守および開発が挙げられます。

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

重要な用語

パッケージ

パッケージはファイルの集まりで、通常はメタデータ、ライブラリ、バイナリのいずれか、またはそれらの組み合わせを含みます。Code Repository では、言語の基本機能を補うために、幅広いパッケージ(たとえば numpy)を利用できます。

パッケージにはバージョンが付けられており、ほぼ必ず依存関係があります。依存関係とは、そのパッケージが正常に機能するために併せてインストールする必要がある、ほかのパッケージです。依存関係として、パッケージの特定のバージョン、許容されるバージョンの範囲、または任意のバージョンが指定されることがあります。

チャネル

チャネルは、リポジトリと呼ばれることもあり、パッケージが保存されている場所を指します。あるチャネルはローカルファイルシステム内のディレクトリで、別のチャネルは Web サーバー上でホストされているディレクトリである場合があります。

種類にかかわらず、チャネルはそれぞれ、プラットフォームのアーキテクチャごとにパッケージを分けたディレクトリツリーです。プラットフォームごとのサブディレクトリには、それぞれ repodata.json というファイルがあり、そのサブディレクトリ内のすべてのパッケージのインデックスが格納されています。

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

環境

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

パフォーマンス

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

環境を作成する

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

依存関係の解決ステップ

依存関係の解決ステップでは、指定されたパッケージマネージャー(Conda、Mamba、Hawk のいずれか)が、すべての間接的な依存関係を満たすパッケージとバージョンを探します。間接的な依存関係には、環境設定パネルで指定されたパッケージの依存関係、それらの依存関係のさらに依存関係、といったものが含まれます。このステップには4つの段階があります。

  1. パッケージのインデックスをダウンロードして処理します。パッケージマネージャーは、設定された各チャネルから関連する repodata.json ファイルをダウンロードし、インデックスのエントリをメモリー内のオブジェクトに変換します。
  2. インデックスを絞り込みます。パッケージマネージャーは、その環境で使用される可能性のあるすべてのパッケージを集めます。そのために、アルゴリズムは指定されたパッケージ仕様を起点として、すべての依存関係を再帰的にたどります。不要なパッケージ(主に依存関係グラフに含まれないもの)はすべて除外されます。
  3. 依存関係の制約をブール充足可能性(SAT)問題として表現します。パッケージマネージャーは、可能な限り新しいバージョンのパッケージを使うなど、特定の種類の解を優先します。こうした優先傾向は、節の構成に組み込まれます。
  4. SAT ソルバーを実行します。

インストールステップ

依存関係の解決に成功すると、次にインストールステップに進みます。このステップでは、適切なチャネルから各アーティファクトを取得し、パッケージマネージャーがこれらのアーティファクトを使用して環境を構成します。このステップには3つの段階があります。

  1. 依存関係の解決後の環境に含まれるすべてのパッケージをダウンロードして抽出します。
  2. パッケージの内容を検証します。設定に応じて、Conda はチェックサムを使用するか、ファイルサイズが正しいことを検証します。
  3. パッケージを環境にリンクします。

制限事項

上記のすべてのステップは、特定の状況で処理が遅くなる可能性があります。通常、処理が遅くなる原因は次の3つのカテゴリーのいずれかに分類されます。

上流の変更

処理が遅くなる原因のかなりの部分は、Foundry の外部要因にあります。

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

これらの要因は外部にあり、その詳細も把握できないため、パフォーマンス低下の根本原因を分析するのは難しい場合があります。チャネルのサイズが最近大きくなったり、パッケージが最新リリースでいくつかの新しい依存関係を宣言したりしたことで、環境の読み込みに突然時間がかかるようになることがあります。

環境仕様

より一般的には、初期化の遅さは環境仕様そのものに直接関連しています。依存関係の解決ステップにかかる時間は、環境のサイズに対して線形を超える割合で増加するため、一般的な目安として、パッケージが多い環境ほど、初期化にかかる時間は不釣り合いに長くなります。

こうした状況を改善するには、2つの方法があります。

  • まず、環境定義から不要なパッケージを削除します。大規模で汎用的な環境よりも、小規模で特定の用途に特化した環境の方が、パフォーマンスははるかに高くなります。
  • 次に、環境設定パネルで、一部のパッケージにバージョン制約を追加してみてください。python のように多数のビルドが存在するパッケージや、scipy のように複雑な依存関係グラフを持つパッケージのバージョンを固定すると、最も効果的です。これにより、Conda はインデックスをより大幅に絞り込めるようになるため、SAT ソルバーが考慮する必要のあるパッケージバージョンの数が減ります。

パッケージサイズ

パッケージサイズは、通常、このセクションのほかの要因ほど問題にはなりませんが、それでも影響する場合があります。

1個のパッケージであっても、ダウンロードと抽出に無視できない時間がかかる場合があります。たとえば、pytorch パッケージのサイズは約 460 MB で、抽出に35秒以上かかることがあります。

ダウンロード、抽出、検証にかかる時間はいずれも、環境内のパッケージのサイズと数に線形に比例します。推移的依存関係により、依存関係の解決後の環境には通常、環境定義で明示的に指定されたものよりもはるかに多くのパッケージが含まれ、このパッケージ数の増加が処理の遅さにつながる場合があります。

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