Windows向け深層学習用Python環境構築ガイド
前提
- Windows 10 22H2(x64)
- NVIDIA GPU使用(確認した環境は NVIDIA GeForce RTX 3060/12GB)
- NVIDIAドライバ, CUDA ツールキット(11.8), cuDNN 導入済み[1]
- 以下を利用する
- VSCode
- Git
- PowerShell 7.2(LTS)
要件
- 仮想環境を使用して、処理が依存するパッケージを限定・明確化する
- ある仮想環境のパッケージのインストール状況を別の仮想環境に再現できる
- 深層学習におけるデファクトスタンダードとなっているパッケージ「PyTorch」のインストールに対応できる
結論
- フル・インストーラ版の Python をシステム領域(C:\Program Files)下にインストールする
- 仮想環境とパッケージインストールは、venv + pip を用いる
- pip.ini でグローバル環境へのパッケージインストールを禁止する
- 通常は目的のパッケージのみを記載した「requirements.txt」を用いる
- 将来的にパッケージ化する可能性があれば、パッケージを定義して「pyproject.toml」の dependencies を利用する
個々の説明
インストールパッケージの選択
主に、フル・インストーラ版とMicrosoft store版があるが、Microsoft store版は以下の制限があるため、フル・インストーラ版を使う。
Microsoft store版は簡単かつ安全にインストールできる反面、Python Launcher がインストールされない、ディレクトリやレジストリへのアクセスが仮想化される、などの制限があります。
このため、アプリケーションによっては、 不具合が発生する 場合があります。
バージョンの選択
メンテナンスステータスが「bugfix」となっているバージョンのうち、古い方を使う。2023年10月時点で「3.11」である。
インストール方法
インストーラは「Python Releases for Windows」の「Stable Releases」から、選択したバージョンの最新版の「Windows installer(64-bit)」を用いる。
インストーラの仕様から、方針は大きく2つに分かれる。仮想環境を利用しない、インストールユーザーのみが使用するということであれば、ユーザー領域にインストールする。仮想環境を利用する、インストールユーザー以外も利用するということであれば、システム領域にインストールする。ここでは、システム領域にインストールし、各ユーザーが使える設定にする。
画面 | 選択 |
---|---|
Install Python 3.11.6(64bit) | 「Use admin privileges when installing py.exe」をチェックして、「Customize installation」 |
Optional Features | 「for all users」をチェック |
Advanced Options[2] | 「Install Python 3.11 for all users」をチェック |
「Advanced Options」画面では、「Install Python 3.11 for all users」のチェックで、インストール先が切り替わる。また、更新される環境変数も異なる。
チェック | インストールパス | Add python.exe to PATH |
---|---|---|
なし | C:\User\User\AppData\Local\Programs\Python\Pythin311\ | ユーザー環境変数 Path にインストールパスとそのScriptsサブフォルダが追加される |
あり | C:\Program Files\Python311\ | システム環境変数 Path にインストールパスとそのScriptsサブフォルダが追加される |
仮想環境を使うと、仮想環境ごとにサイズが大きいDNNのライブラリやLLMをインストールすることになるのでディスク消費が激しくなるが、昨今のハードウェア事情・インターネット事情からすれば大きな問題にならないであろう。
パッケージ管理手法の選択基準
https://pytorch.org/ の「INSTALL PYTORCH」で案内されている中で、最も簡単な方法を使う。
Conda、Pip、LibTorch、Source があるが、Conda は商用利用に制限があり、会社と自宅で同じ環境が構築できないので、「Pip」を使う。
ここに「Poetry」が出てくるようであれば、移行を考える。
仮想環境とパッケージ管理
参考サイト等を見てもらえればと思うが、議論百出である。
仮想環境中のパッケージ管理について、「venv + pip + requirements.lock[3]」で運用して破綻した[4]ので、「venv + pip(pip.ini) + requirements.lock + requirements.txt」で管理することとする。将来的にパッケージ化する可能性がある場合は「venv + pip(pip.ini) + pyproject.toml」とする。
Python インストール直後、パッケージは「pip」と「setuptools」だけがインストールされている。仮想環境のActivteを忘れて、pip install
をしてしまうと、このグローバル環境が汚染されてしまうので、グローバル環境でのpip install
を禁止する。具体的には、「$HOME\pip\pip.ini」ファイルを作成し、グローバルオプションを指定する。詳細は pip にアクティブな仮想環境が必要です を参照のこと。
[global]
require-virtualenv = true
requirements.lock + requirements.txt による運用
- 手作業で必要なパッケージのみを記載した「requirements.txt」を作成して、
pip install -r requirements.txt
でインストールする。pip install <package>
の実行は禁止する。 - 移行時には移行元で
pip freeze > requirements.lock
を作成し、復元の参考とするが、移行先でのインストールには「requirements.txt」を用いる。
参考サイトとほぼ同じですが、前段の設定でグローバル環境でのpip install
が防げています。また、CUDA対応のPyTorchのpip freeze
の出力はtorch==2.1.0+cu118
となるため、pip install -r <file>
の入力として使うには--find-links=<DIR>
のオプションが必要になります。--find-links=<DIR>
のオプションは「pip.ini」に書くこともできるようです。
pyproject.toml による運用
- 手作業で「pyproject.toml」を作成して、依存関係のみを記載し、同フォルダで
pip install .
する。pip install <package>
の実行は禁止する。 - 移行時には「pyproject.toml」をコピーして、移行先で
pip install .
する。
この依存関係のみのパッケージは、当面、個人での利用のみを想定しており、PyPI等で不特定多数に公開するものではありません。公開パッケージ作成については、公式やリンク先をご参照ください。
プロジェクトの開始手順(requirements.lock + requirements.txtの場合)
プロジェクト用のフォルダを作成して、そこに移動し、仮想環境を作成して、仮想環境をActivateし、フォルダをVSCodeで開いて、作業が開始できる。
mkdir $HOME\source\repos\myproject
cd $HOME\source\repos\myproject
py -m venv .venv
.venv\Scripts\Activate.ps1
code .
以下のような「requirements.txt」を作成して、pip install -r requirements.txt
する。
--find-links https://download.pytorch.org/whl/torch_stable.html
torch==2.1.0+cu118
torchvision==0.16.0+cu118
torchaudio==2.1.0+cu118
プロジェクトの開始手順(pyproject.tomlの場合)
仮想環境のActivateまでは同じ。
パッケージのインストールはプロジェクトフォルダに「pyproject.toml」[5]を作成して、「dependencies」を記載して、pip install .
でインストールする。
[project]
name = "llm-learning-virtual"
version = "0.1.0"
dependencies = [
"torch",
"transformers",
]
PyTorchのCUDA版をインストールする場合は、一度公式のコマンドでインストールし、ログからWhlファイルのパスを把握後、アンインストールし、インストールしなおす。下記のとおり「pyproject.toml」でWhlファイルを直接指定する。おそらく Upgrade できなくなるが、それは諦める。ちなみにWhlファイルを指定してインストールした場合、pip freeze
の出力もWhlファイルの直接指定になる。
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip uninstall torch torchvision torchaudio
# pyproject.toml を下記のように修正
pip install .
[project]
name = "llm-learning-virtual"
version = "0.1.1"
dependencies = [
"torch @ https://download.pytorch.org/whl/cu118/torch-2.1.0%2Bcu118-cp311-cp311-win_amd64.whl",
"torchvision @ https://download.pytorch.org/whl/cu118/torchvision-0.16.0%2Bcu118-cp311-cp311-win_amd64.whl",
"torchaudio @ https://download.pytorch.org/whl/cu118/torchaudio-2.1.0%2Bcu118-cp311-cp311-win_amd64.whl",
"transformers ",
]
あとがき
なるべく公式かデファクトスタンダード、今後の主流になる手法を使いたい、問題の解決に使い慣れていない新しい道具を使いたくない、なるべくシンプルに(構成ファイルを少なく)、という方針で整理したつもりです。考えていたとき、何が良いのか分からなくて本当に頭痛になりました。しかし、今更ですが、Windows開発者であればPython謹製のツールにこだわらず、PowerShellスクリプトで何とかする方が簡単かもしれません。
参考サイト
Python開発環境のベストプラクティス関連
パッケージングとそのインストール
NVIDIA CUDA/cuDNNのインストール
-
PyTorch のインストール時にライブラリが併せてインストールされるので、NVIDIAドライバのみでよいという話もあるのですが、確認できていません。自分はすべて導入済みです。導入方法は参考サイトをご参照ください。 ↩︎
-
ここでは元々パスが通っている「C:\Windows」にランチャー「py.exe」をインストールするため、「Add python.exe to PATH」のチェックは必須ではない。 ↩︎
-
ここでは慣習的に
pip freeze
のリダイレクトで作成するファイルの名前を「requirements.lock」と呼んでいる。 ↩︎ -
あるスクリプトの実行環境で
pip freeze > requirements.lock
し、別の環境でpip install -r requirements.lock
したとき、依存関係のエラーでインストールができなかった。 ↩︎ -
ここで作成している「pyproject.toml」は依存関係解消のための最小限のものであることをご承知おきください。 ↩︎
Discussion