# 【プレ輪講】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 ``` ## おまけ1 - 研究室サーバーのディレクトリ構造 - 基本どの計算サーバー(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の正体 ... ``` ## おまけ2 - Linuxのscreenコマンドについて - **マルチタスクしたいときに重要!** - 普通、サーバーの接続を切ったら、実行しているスクリプトの処理も止まる。しかし、screenを使えばサーバーに繋げなくても実験はできる! - 新たなスクリーン(プロセス)を作成 ``` screen -S <screen_name> ``` - スクリーンから脱出 - **脱出後、サーバー接続を切ってもプロセスの処理は続く** ``` (ctrl + a & d) ``` - スクリーン一覧を見る ``` screen -ls ``` - スクリーン復帰 ``` screen -r <screen_name> ``` ## おまけ3 - 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>`ブランチに合併する ## おまけ4 - 昨年度の資料 [接続ツール](https://hackmd.io/@5TWbCjhjQ5CfDDrpO65Iyw/ryN0bnU7c)の資料