---
# System prepended metadata

title: プレ輪講資料

---

# 【プレ輪講】Pythonの環境構築
## pyenvとAnacondaの導入

### pyenvとAnacondaとは？

- [pyenv](https://github.com/pyenv/pyenv)
    - GitHubの説明によると、「pyenv lets you easily switch between multiple versions of Python.」つまり、Pythonのバージョン管理ツール的なもの。
- [Anaconda](https://www.anaconda.com/)
    - Pythonのパッケージ管理ツール。やることが違うと、使うフレームワーク、ライブラリ、パッケージも違うので、複数のプロジェクトを抱えているときに便利。

## pyenvの導入

まず、サーバーに繋げ、ルートディレクトリに移動

```
cd ~     # 念のため
pwd      # これのアウトプットが/home/mil/<username>であればOK
```

- pyenvをGitHubからダウンロード

```
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

- 以下をコピペし、shell起動時にpyenvとCUDAがロードされるように設定する
    - できたか不安の人は `cat ~/.bashrc` と `cat ~/.bash_profile`で結果を確かめてください

```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

echo 'export CUDA_HOME=/usr/local/cuda-11.0' >> ~/.bash_profile
echo 'export PATH=${CUDA_HOME}/bin:${PATH}' >> ~/.bash_profile
echo 'export CPATH=${CUDA_HOME}/include:$CPATH' >> ~/.bash_profile
echo 'export LIBRARY_PATH=${CUDA_HOME}/lib64:$LIBRARY_PATH' >> ~/.bash_profile
echo 'export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:$LD_LIBRARY_PATH' >> ~/.bash_profile
```

- `~/.bashrc`と`~/.bash_profile`の内容を更新したら、再読み込みする

```
source ~/.bash_profile
```

## Anacondaの導入

- まず、インストールできるAnacondaのバージョンを確認する
下のコマンドを実行すると、名前順（時間順）で一覧が出てくる

```
pyenv install -l | grep anaconda
```

- 現時点で最新のものは anaconda3-2023.03 なので、それをインストールする
    - **ここはちょっと時間かかる（自宅では7分ぐらい）！**
    - あと全員が同じサーバーだと遅くなってしまうので kujira 以外もぜひ使ってください 🥲

```
pyenv install anaconda3-2023.03
```

- インストールが完了したら、最新バージョンのAnacondaを有効化する

```
pyenv version                    # 何もしないと、systemが表示される
pyenv global anaconda3-2023.03   # 先ほどインスールしたものを有効化
pyenv version                    # 今度はanaconda3-2023.03
が表示される
```

- condaコマンドを初期化し、仮想環境を使ってみる

```
conda init bash
source ~/.bashrc                              # すると、プロンプトの先頭に(base)が現れる -> 仮想環境内
conda deactivate                              # 先頭の(base)が消える -> 普通の環境
conda config --set auto_activate_base false   # 任意。base環境の自動起動を抑止。
```

## 仮想環境で実験

### 仮想環境の使い方

- とりあえず、base環境のpythonバージョンを確認してみる

```jsx
conda activate base
python --version # Python 3.10.9 が表示される
```

- Python 3.10をサポートしていないパッケージがまだあるので、もう少しバージョン古いもの使いたい！というときは新たに仮想環境を作る。今回はPython 3.8の環境を作る

```jsx
conda deactivate # とりあえずbase環境から脱出
conda create -n <env_name> python=3.8 # <env_name>は好きな環境名を入れてください
conda activate <env_name>
python --version # Python 3.8.16 になった
```

- 作成した仮想環境の一覧が見たいとき

```jsx
conda info -e
```

### PyTorchのインストール

- ``<env_name>`` 環境に入っていることを確認し（プロンプトの前に(``<env_name>``)があったらOK）、下のコマンドで[PyTorch](https://pytorch.org/)をインストール
    - 基本インストールするときは pip install を使いましょう！conda install でトラブったことがあるのでおすすめしません 😭
    - これも時間かかる + 容量大きい！
```
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
```
- 今回インストールしたバージョンのは、v1.13.1（CUDA 11.6 対応）です。CUDA 11.7ですと、PyTorch 2.0には追いつきません

    - CUDA 11.6のDeprecationについて：[こちら](https://pytorch.org/blog/deprecation-cuda-python-support/)
    - 過去バージョンのインストールについて：[こちら](https://pytorch.org/get-started/previous-versions/)
- インストールしたPyTorchのバージョンを確認するとき、`pip list | grep torch` で確認できる

### PyTorchによる機械学習実験

- CIFAR10の分類器を訓練してみましょう！
    - 使うモデルはVGG19
- まず、訓練のコードをcloneする
```
cd ~
git clone https://github.com/rfukush/prerinko ~/prerinko
```
- 次に、`prerinko`フォルダの下に.envというファイルを作る
```
cd ~/prerinko
touch .env
```
- 下記のコマンドで.envを更新する
    - 安全上<SECRET>でマスクしているが、コマンド詳細は[こちら](https://docs.google.com/document/d/1kE9POc-y6dAlrlPjNsMi_WKDnTurEYfwI5c14OOdBHM/edit)を参考に
```
echo 'CIFAR_ROOT=<SECRET1>' >> .env
echo 'MODEL_OUTPUT=<SECRET2>' >> .env
```
- 上記の準備が整えたら訓練を始めましょう！
    - [GPU番号] については [tai](http://tai:3000/) で使えるGPUを確認する
```
screen -S prerinko
conda activate <env_name>
pip install -r requirements.txt
python ~/prerinko/train.py --gpu [GPU番号] --num_epochs 3 --batch_size 16
```

- 待っている間に他のこともやりたいとき、`ctrl + a & d`でscreenから脱出できる。そして、`screen -r prerinko`で戻れる
- 訓練が終わったらscreenを閉じる
```
screen -r prerinko
exit
```
- 訓練の成果が気になれば、モデル評価をしましょう
    - num_epochs は訓練時に指定した値以下の数値にしないといけない
```
python ~/prerinko/train.py --gpu [GPU番号] --do_eval_only --num_epochs 3 --batch_size 16
```

## おまけ１ - 研究室サーバーのディレクトリ構造

- 基本どの計算サーバー（kujira、makkou など）から入ってもディレクトリは下記の通り
    - <span style="color: red; ">注意点①：asariとmilでスクリプトを実行しない！！！</span>
    - <span style="color: red; ">注意点②：大きいファイル（2GB ↑）は /data/ （データサーバー）に保存</span>
```
/
├── home
│    └── mil
│         └── <username>         # 皆様の `~` ディレクトリに相当
│                                  (この下で実験のスクリプトを書く)
├── data
│    ├── unagi0
│    │    └── <username>         # なければ作成し、データをここに保存
│    │                             (モデルのcheckpointなどもここがいいかも)
│    ├── ugui0
│    │    └── <username>         # なければ作成し、データをここに保存
│    ...                          （保存したいデータサーバーでだけフォルダ作ればOK）
│
├── mnt
...  ├── share
     ...  ├── ResearchArchive    # asariのResearchArchiveの正体
         ...
```

## おまけ２ - Linuxのscreenコマンドについて

- **マルチタスクしたいときに重要！**
    - 普通、サーバーの接続を切ったら、実行しているスクリプトの処理も止まる。しかし、screenを使えばサーバーに繋げなくても実験はできる！
    
- 新たなスクリーン（プロセス）を作成
```
screen -S <screen_name>
```
- スクリーンから脱出
    - **脱出後、サーバー接続を切ってもプロセスの処理は続く**
```
(ctrl + a & d)
```
- スクリーン一覧を見る
```
screen -ls
```
- スクリーン復帰
```
screen -r <screen_name>
```

## おまけ３ - GitHubの基本操作

### 初級
- `git init`

    - .gitファイル（バージョン管理ファイル）を作る

- `git status`
    - ファイルバージョン確認
        - Untracked: まだ更新を追跡できていないファイル
        - Modified: 追跡できて、変更があったファイル

- `git add`

    - ファイルへの変更を追加する
    - 例：`git add <filename>` または `git add .`（全部を追加）

- `git commit`

    - ファイル変更を確定し、チェックポイントを作る
    - 例：`git commit -m "<message>"`で`git add`されたファイルの更新を確定する


- `git remote`

    - GitHubレポジトリ設定用
    - 例：`git remote add origin <repo_url>`でGitHubレポ（リモートブランチ）の情報を設定

- `git push`

    - ローカル変更をリモートブランチにアップロード
    - 例：`git push origin main` でローカルのcommit履歴をGitHubレポ（`origin`ブランチ）にあげる

### 中級
- `git pull`
    - リモートブランチの変更をローカルに反映させる
        - 例：`git pull origin main`
- `git branch`
    - ブランチ一覧を確認する
- `git checkout`
    - ブランチ切り替え
    - 例：`git checkout -b <branch_name>`で新ブランチ作成
    - 例：`git checkout <branch_name>`で既存ブランチに切り替える
- `git merge`
    - ブランチ合併
    - 例：`git checkout <branch_name> -> git merge main`でメインブランチの変更を`<branch_name>`ブランチに合併する

## おまけ４ - 昨年度の資料

[接続ツール](https://hackmd.io/@5TWbCjhjQ5CfDDrpO65Iyw/ryN0bnU7c)の資料