はじめに
あるサーバーに作られた conda 環境を他のサーバーに複製する場面があったため、やり方を調べていました。
複製方法
conda 環境の複製方法には3種類あるようです
conda env
とconda create
を用いる方法conda list
とconda create
を用いる方法conca create --clone
を用いる方法
1, 2 は別のデバイスに複製する際にも使うことができますが、3は同一デバイス内への複製にしか使えないのではないかと思います。
しかし、同一デバイス内に複製するなら3が一番簡単そうです。
別のデバイスに複製するなら1, 同じデバイスに複製するなら3がいいのではないかと思っています。
1. conda env
と conda create
を用いる方法
conda 環境の情報を yaml ファイルに書き出して複製する方法です。
公式ドキュメントの Exporting the environment.yml file に情報が載っています。
手順は以下の通りです。
まず、複製したい conda 環境を activate します。
conda activate 複製したい環境名
次に、conda 環境の情報を yaml ファイルに出力します。
conda env export > 出力ファイル名.yaml
もしくは、activate せずとも、以下のように -n
オプションを用いて複製したい conda 環境を指定することもできます。
conda env export -n 環境名 > 出力ファイル名.yaml
複製先デバイスで次のコマンドを叩けば、yaml ファイルから conda 環境を作成できます。
conda env create -n 環境名 -f 出力ファイル名.yaml
プラットフォームを跨いだ複製の場合は、export の際に --from-history
フラグをつけるとよいです。
すると、インストールされているすべてのパッケージではなく、明示的にインストールしたパッケージのみを出力してくれます。
これにより、互換性のない依存先パッケージが yaml ファイルに出力されることを防ぎ、複数プラットフォームで動作するようにすることができます。
2. conda list
と conda create
を用いる方法
conda でインストールしたパッケージ一覧をテキストファイルに書き出すことで複製する方法です。
公式ドキュメントの Building identical conda environments に情報が載っています。
注意点として、同一のプラットフォーム(OS)での複製しかサポートされていません。異なるプラットフォームへの複製では、conda環境が動作しない可能性があります。
また、pip など conda 以外を用いてインストールしたパッケージは出力に含まれないため、注意してください。
手順は以下の通りです。
1.と同様、複製した conda 環境を activate または -n
オプションで指定します。
次のいずれかのコマンドを用いて、conda 環境の情報をテキストファイルに出力します。
conda list [-n 環境名] --explicit > 出力ファイル名.txt
conda list [-n 環境名] --export > 出力ファイル名.txt
--explicit
と --export
では出力ファイルの形式が異なりますが、どちらの場合でも同じように、新しい環境の作成に用いることができます。
そして、複製先デバイスで 1. と同じく次のコマンドを叩くことで、複製元と同様の環境を作成することができます。
conda create -n 環境名 -f 出力ファイル名.txt
余談ですが、create ではなく install を用いると、既存の環境に 出力ファイル名.txt
の元となった環境のパッケージをインストールすることもできます。
conda install -n 環境名 -f 出力ファイル名.txt
3. conca create --clone
を用いる方法
クローンを作成することで、同一デバイス上に conda 環境を複製することもできます。
公式ドキュメントの Cloning an environment に手順が載っています。
コマンドは以下の通りです。
conda create -n 複製先の環境名 --clone 複製元の環境名
各コマンドの使い方
conda create
, conda env export
, conda list
, conda install
コマンドの公式ドキュメントを貼っておきます。
終わりに
多様な複製方法があり、面白かったです。
conda と pip を併用している場合に、どうやって複製するのかや、複製して本当に動くのかなどが気になります...
とりあえず併用はしていませんし、セオリーは知ることができたと思うので、もし併用している環境に出会ったらそのときに頑張ります。