conda 備忘録: スパコンとUbuntuで Python環境構築

Minicondaにおけるcondaの備忘録です．[スパコンWisteria-O](https://www.cc.u-tokyo.ac.jp/supercomputer/wisteria/service/) や [スパコン ITO ](https://www.cc.kyushu-u.ac.jp/scp/index.html)のログインノード（bashです）において，[Miniconda](https://docs.conda.io/projects/miniconda/en/latest/)でローカル環境を構築します．ライセンスの関係で，Anacondaは不可，**Miniconda + conda-forge** とする必要があるようです．Linux（bash）環境一般に適用できると思います．~~また，Intel の Python 向け Distribution を積極的に活用します．~~
**追記（2023.10.11）：** Minicondaのインストール方法を改訂しました．
**追記（2022.4.24）：** Minicondaのアンインストールに失敗した後の後遺症でVsCodeのRemote-SSHに不具合
**追記（2021.1.22）：** ITO-AのPython実行で `Segmentation fault` に悩まされましたが，以下のインストールに追記した方法で回避されました．
**追記（2020.4.11）：** Python向け Intel Distribution は不具合に遭遇しましたので，積極的に活用することは止めました．

# [Miniconda](https://docs.conda.io/en/latest/miniconda.html) のインストール
**追記（2021.1.22；2023.10.11）：ITO-AでPython環境の原因不明のコンフリクトが発生しました．`~/.bashrc` の最後の方に `export PYTHONPATH=` を追記して，`PYTHONPATH` を消去しておきます．あるいは `unset PYTHONPATH` を追記しておきます．これは Intel oneAPI のIntel PythonやシステムにインストールされたPythonとのコンフリクトでしたので，setvars.sh をsourceした直後に追記するのが有効です．**

ローカル環境に[Miniconda](https://docs.conda.io/projects/miniconda/en/latest/) をインストールし，仕事毎に仮想環境を作って運用するのがお勧めです．
ログインノードでログインし，ホームディレクトリで以下を実行します．

```bash
mkdir -p ~/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm -rf ~/miniconda3/miniconda.sh
~/miniconda3/bin/conda init bash
```

再ログインすると (base) 環境が使えます．最初にconda-forgeをデフォルトにし，updateします．

```bash
conda config --add channels conda-forge
conda update conda
```

さらに，ログインしたときに自動的に (base) 環境がアクティべートされるのを抑止します．
```bash
conda config --set auto_activate_base false
```
再ログインすると反映されます．baseをアクティベートするには以下のようにします．
```bash
conda activate base
```
もし仮想環境が存在すれば，baseの代わりに仮想環境名を指定して直接アクティベートできます．
なお，これにより `~/.condarc` に 以下が追記されます．上記コマンドを使わず，このファイルを直接書き換えても同じです．
```bash
auto_activate_base: false
``` 

# Miniconda のアンインストール
Miniconda のアンインストールは簡単ですので，挙動がどうしてもおかしくなってきたら，[アンインストール](https://docs.conda.io/projects/conda/en/latest/user-guide/install/linux.html)し，再度インストールするのがお勧めです．
Minicondaがインストールされているディレクトリをすべて消去します．

```bash
$ rm -rf ~/miniconda3
```

さらに，ホームディレクトリに作成されている，関連する隠しファイルや隠しディレクトリ（存在するもののみ）を以下のように削除します．

```bash
$ rm -rf ~/.condarc ~/.conda
```

最後に，ホームディレクトリに存在する，.bashrc ファイルの以下のような部分を削除します．

```bash
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/usr1/m70161a/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/home/usr1/m70161a/miniconda3/etc/profile.d/conda.sh" ]; then
        . "/home/usr1/m70161a/miniconda3/etc/profile.d/conda.sh"
    else
        export PATH="/home/usr1/m70161a/miniconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

```

### Windows 10での注意
アプリと機能で削除する前に，**envs**と**pkgs**フォルダを削除しておきます．これをしないとアンインストールに非常に時間がかかることがあります．
最後に**miniconda3**，**.conda** **.jupyter** **.matplotlib** **.ipython**等のフォルダを削除します．

### Windows 10 のMinicondaのアンインストール失敗後の不具合
**2022.4.24追記**

原因不明ですが，Minicondaのアンインストールに失敗し，関連するレジストリを手動で消去したことがあります．それ以降，PowerShellでバッチファイルが起動しなくなり，不思議に思っていました．その後，WindowsのVScodeを用いて，ITOのファイルを編集をしようとして，remote-ssh接続を試みましたが，何度やってもうまく行かない不具合に悩まされました．その症状と解決策は [**こちらの記事**](https://githubhot.com/repo/microsoft/vscode-remote-release/issues/5693) にある通りで，この現象を理解したのは [**こちらの記事**](https://qiita.com/IntenF/items/6a588029ab41f59c2b31) のおかげです．

記事の通り，レジストリの以下の部分を（私の場合は後者のみ存在）を削除することで，この問題がすべて解決しました．

```bash
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun
```

# パッケージのリポジトリについて（`channel`）
**2022.4.24追記： Anacondaはライセンスの関係で使用を止めました．Miniconda + conda-forgeとします．**
パッケージ の リポジトリ（保管場所） を channel といいます．様々な機関（個人）がパッケージを提供しています．Anaconda Cloud（Anaconda によるパッケージ管理サービス） で調べることができます．例えば，TensorFlow については [こちらのページ](https://anaconda.org/search?q=tensorflow) にあるように，数多くの channel が存在します．channelには代表的なものが存在し，通常はそれらの代表的な channel からパッケージをインストールするのが普通です．しかし，専門的なパッケージになると，channel を指定したインストールが必要になる場合もあります．
公式リポジトリの channel は `defaults` です．また，コミュニティベースのリポジトリの `conda-forge` は公式channelよりも多くのパッケージが管理されており，しばしば利用されます．

# channel の操作
channelの一覧を取得する方法，channelを追加・削除する方法，およびchannelの優先順位を変更する方法を紹介します．

### channel 一覧の取得 `conda config --get channels`
現在の channel の一覧を確認してみましょう．Minicondaインストール直後は何も表示されないようです．

```bash
conda config --get channels
```

`conda-forge` をデフォルトにします．`conda-forge` が `highest priority` （先頭）となっていますので，`conda-forge` のパッケージが優先的にインストールされる状態です．

```bash
conda config --add channels conda-forge
conda config --get channels
```

以降では channel操作 を項目別に紹介します．

### channelを先頭に追加 `conda config --add channels channel_name`
Intel が提供する `intel` channel を先頭（highest priority）に追加します．

```bash
$ conda config --add channels intel

$ conda config --get channels
--add channels 'defaults'   # lowest priority
--add channels 'conda-forge'
--add channels 'intel'   # highest priority
```

### channelを削除 `conda config --remove channels channel_name`
intel の channelを削除します．

```bash
$ conda config --remove channels intel

$ conda config --get channels
--add channels 'defaults'   # lowest priority
--add channels 'conda-forge'   # highest priority
```

### channel を末尾に追加 `conda config --append channels channel_name`
intelのchannelを末尾（lowest priority）に追加します．

```bash
$ conda config --append channels intel

$ conda config --get channels
--add channels 'intel'   # lowest priority
--add channels 'defaults'
--add channels 'conda-forge'    # highest priority
```

### 先頭 channel を変更 `conda config --add channels channel_name`
既に存在する intel の channel を先頭（highest priority）にします．先頭にするには， `--add` です．末尾にするには，`--append` です．

```bash
$ conda config --add channels intel
Warning: 'intel' already in 'channels' list, moving to the top

$ conda config --get channels
--add channels 'defaults'   # lowest priority
--add channels 'conda-forge'
--add channels 'intel'   # highest priority
```

### ファイルでchannelの設定

channel は `~/.condarc` に以下のように設定されます．これを直接編集することも可能です．

```bash
channels:
  - conda-forge
  - defaults
```

# 仮想環境
Miniconda のデフォルト環境（base）でパッケージをインストールしていくと，しばしば依存関係に不具合が生じ，Miniconda の再インストールに陥ることがあります．そのため，目的別に仮想環境（virtual environment，略して v_env）を用意するのが鉄則です．

### 仮想環境の構築 `conda create -n v_env [python=version]`
仮想環境 my_env を構築します．

```bash
$ conda create -n my_env
```

Pythonのバージョンを指定することもできます．以下ではバージョン3.6を指定しました．

```bash
$ conda create -n my_env python=3.6
```

インテルディストリビューションを用いた仮想環境 my_intel_env を構築するには，次のように特別な操作が必要です．

```bash
$ conda create -n my_intel_env intelpython3_core python=3
```

intelpython3_core の部分を intelpython3_full に変更すると，完全なインテルディストリビューションが構築されます．また，python=3 を python=2 に変更すると，Python のバージョンが 2 になります．なお，Python 2 を使用することは普通はありません．

### 仮想環境の確認 `conda info -e`
利用可能な仮想環境と選択されている環境を確認します．実行結果は スパコンITO での筆者の環境で，m00000a はスパコンのユーザーホームディレクトリ名（仮称）です．`*` が現在選択されている環境で，base になっています．

```bash
$ conda info -e
# conda environments:
#
base                  *  /home/usr1/m00000a/local/miniconda3
my_env                   /home/usr1/m00000a/local/miniconda3/envs/my_env
my_intel_env             /home/usr1/m00000a/local/miniconda3/envs/my_intel_env

```

### 仮想環境に入る `conda activate v_env`
仮想環境my_intel_envを有効にし（アクティベート），仮想環境を確認します．

```bash
$ conda activate my_intel_env

$ conda info -e
# conda environments:
#
base                     /home/usr1/m00000a/local/miniconda3
my_env                   /home/usr1/m00000a/local/miniconda3/envs/my_env
my_intel_env          *  /home/usr1/m00000a/local/miniconda3/envs/my_intel_env
```

* が 移動し，仮想環境の my_intel_env がアクティベートされたことが分かります．

### 仮想環境から抜ける `conda deactivate`
仮想環境から抜け，base に戻るには `conda deactivate` を実行します．`conda info -e` を実行すると，* が base に戻っていることが確認できます．

```bash
$ conda deactivate

$ conda info -e
# conda environments:
#
base                  *  /home/usr1/m00000a/local/miniconda3
my_env                   /home/usr1/m00000a/local/miniconda3/envs/my_env
my_intel_env             /home/usr1/m00000a/local/miniconda3/envs/my_intel_env
```

### 仮想環境を削除 `conda remove -n v_env --all`
仮想環境 my_env を削除するには以下のようにします．

```bash
$ conda remove -n my_env --all
```

# パッケージの管理
仮想環境 my_intel_env において，パッケージを管理しましょう．

### 準備
現在は base 環境とします．最初に conda を最新にします．

```bash
$ conda update conda
```

次にパッケージをインストールする仮想環境 my_intel_env をアクティベートします．

```bash
$ conda activate my_intel_env
```

### パッケージのインストール `conda install package_list`
パッケージ名をスペース区切りで並べ，複数のパッケージを一括してインストールすることもできます．以下に例を示します．

```bash
$ conda install jupyterlab matplotlib netCDF4 pandas xarray
```

### channelを指定したパッケージのインストール `conda install -c channel_name package_list`
専門性が高くなると，channel を指定したパッケージのインストールが必要になる場合があります．また，channelを指定することで，どの channel からパッケージをインストールするか，明確になり，お勧めです．
anaconda channel から tensorflow をインストールするには次のようにします．

```bash
$ conda install -c anaconda tensorflow
```

また，仮想環境を構築する際にもchannelを指定できます．以下は，anaconda channelを指定して，仮想環境 tf を構築する例です．

```bash
$ conda create -c anaconda -n tf
```

### インストール済みのパッケージの確認 `conda list`
現在の環境においてインストール済みのパッケージを確認するには以下のようにします．

```bash
$ conda list
```

`-n` に仮想環境名を与えると，その仮想環境でインストール済みのパッケージを確認できます．

```bash
$ conda list -n my_env
```

### パッケージのアンインストール `conda uninstall package_list`
パッケージ xarray のアンインストールは以下のようにします．複数のパッケージをスペース区切りで並べれば一括でアンインストールできます．

```bash
$ conda uninstall xarray 
```

### 仮想環境設定の書き込み `conda env export -n v_env > file.yaml`
仮想環境の情報をファイルに書き込んでおくと，他のマシンで同じ環境を構築することが簡単にできるようになります．base で実行します．仮想環境 my_intel_env の環境をmy_intel_env.yaml ファイルに書き込みます．このyamlファイルは現在のディレクトリに作成されます．なお，[yaml](https://yaml.org/) の説明は [Wikipedia](https://ja.wikipedia.org/wiki/YAML)（[英語版](https://en.wikipedia.org/wiki/YAML)）を参照ください．

```bash
$ conda env export -n my_intel_env > my_intel_env.yaml
```

ただし，仮想環境を作成しただけで，パッケージを何もインストールしていない状態では，うまくいかないようです．

### 仮想環境の再構築 `conda env create -f file.yaml`
`my_intel_env.yaml`を使って別のマシンで環境を再構築するには以下の様にします．

```bash
$ conda env create -f my_intel_env.yaml
```

# スパコン ベンダー環境のクローン作成
スパコンITOではベンダーがインストールしている Intel Python の環境があります．これをそのまま使用する場合は上記のインストール作業は不要ですが，そのままではパッケージのインストールができません．そのため，ベンダー環境のクローンをローカルの仮想環境として作成する必要があります．この方法はベンダー環境に依存し，必ずしも十分にメンテされているわけではないので，お勧めはできません．実際，筆者は numpy が import できない不具合に遭遇しました．以下に参考まで，まとめておきます．本件は九州大学情報基盤研究開発センターの利用相談で得た情報です．

### サーバーの conda 環境をローカルにクローンする
仮想環境名を intel2019up4 として以下のように構築します．実行には時間がかかります（7分程度でした）．クローン可能な対象はベンダーの整備状況に依存します．

```bash
$ source /home/app/intel/intel2019_up4/intelpython3/bin/activate
$ conda create -n intel2019up4 --clone="/home/app/intel/intel2019_up4/intelpython3"
$ source activate intel2019up4
```

確認してみましょう．

```bash
$ conda info -e
# conda environments:
#
intel2019up4          *  /home/usr1/m00000a/.conda/envs/intel2019up4
root                     /home/app/intel/intel2019_up4/intelpython3
```

この環境を抜けるには以下の様にします．

```bash
$ source deactive intel2019up4
```