僕の考えた最強の Python 開発環境 (2024)
はじめに
こんにちは, 普段は情報科学専攻の大学院生をしながらバックエンドエンジニアをやっている @koki-algebra です.
普段は Go をよく書いているのですが, 大学でやっている機械学習の研究では Python を使うことがほとんどです. Go のエコシステムに慣れきった私は Python の混沌とした環境に耐えきれず, 最強の開発環境を整えることを決意しました.
具体的には Package Manager, Formatter, Linter, Type Checker, Test Tool を選定し, VSCode の DevContainer を用いてポータビリティに優れた開発環境を作ることを目指します.
また, Deep Learning では GPU が必須である場合が多いので, GPU 環境も同時に整えたいと思います.
以下のレポジトリが今回考えた開発環境のテンプレートになります.
VSCode DevContainer であれば数クリックで使えるのでよければお使いください.
GPU 環境を除けば VSCode には依存しないので, 他のエディターをお使いの方にもご利用いただけます.
それでは使用ツールについてみていきましょう.
Package Manager
Package Manager には Rust 製の rye を選びました.
Python の Package Manager は特に混沌としています.
例えば Go は Go Modules
, Rust は cargo
と, 標準で強力な Package Manager があるため, 選択肢は一つしかありません. 一方 Python では pip
単体では cargo
のような機能は達成できないため, 次々と新しい Package Manager が出現しているものと思われます.
rye
はそんな混沌とした Python の環境に終止符を打つべく開発された Package Manager です.
プロジェクトごとに仮想環境を作り, Python のバージョンやパッケージのバージョンを独立して管理することができます. パッケージの管理だけでなく, Python のバージョン管理まで行ってくれるのが他の Package Manager とは異なる点だと思います.
例えば
rye pin 3.12
のように実行すると, .python-version
というファイルが生成され, プロジェクトの Python のバージョンを固定することができます.
3.12.2
ただし, 公式ドキュメントにもあるように, cargo
のような機能を目指すための実験的なツールだといっているため, Production 環境に rye
を用いるには慎重に検討する必要があります.
私個人で rye
を使っている分には全く問題ないどころか, むしろ使い勝手の良さに感動しています.
Formatter & Linter
ruff という Rust 製の Formatter & Linter を選びました.
今まで Python の Linter といえば flake8, Formatter といえば black + isort でしたが, ruff
1 つで同等以上の機能を提供してくれます.
ruff
の設定は, pyproject.toml
に書くか, ruff.toml
または .ruff.toml
というファイルに書いて, プロジェクトルートに設置すると反映されます.
line-length = 120
indent-width = 4
[lint.per-file-ignores]
"__init__.py" = ["F401", "F403"]
また, VSCode で ruff
を使用するには以下の拡張機能をインストールすれば良いです.
Type Checker
Type Checker には mypy を選びました.
そもそも Type Check とは, 例えば 関数の引数や戻り値に指定した Type Hint 通りに値を渡しているかなどを静的解析するツールです.
Python は動的型付け言語なので, Go などの静的型付け言語のようにコンパイラが厳密に型をチェックするわけではないのですが, Type Checker を導入することでバグをみつけやすくなります.
mypy の設定は mypy.ini
または .mypy.ini
というファイルに書いてプロジェクトルートに設置すれば反映されます.
[mypy]
ignore_missing_imports = False
[mypy-sklearn.model_selection]
ignore_missing_imports = true
Test Tool
Test Tool には pytest を選びました.
pytest
は有名なユニットテストツールであり, 現状はデファクトスタンダードといえると思います.
Docker 用の GPU 環境構築
Docker で GPU を動かすために必要なものは
- NVIDIA Driver
- NVIDIA Container Toolkit
の2つです. それぞれインストールを行っていきます.
NVIDIA Driver のインストール
既に NVIDIA Driver や CUDA がインストールされている場合は全て削除しておくことをおすすめします.
sudo apt --purge remove nvidia-*
sudo apt --purge remove cuda-*
sudo apt autoremove
インストール可能な NVIDIA Driver を探します.
ubuntu-drivers devices
適当なドライバーを選んでインストールします.
sudo apt install <driver-name>
PC の再起動を行います.
sudo reboot
最後に NVIDIA Driver が正しくインストールされていることを確認しましょう.
nvidia-smi
NVIDIA Container Toolkit のインストール
公式ドキュメントに従い, インストールを行なってください.
以下のコマンドで正しくインストールされていることを確認します.
nvidia-container-cli info
最後に Docker の再起動を行います.
sudo systemctl restart docker
VSCode DevContainer
最後に VSCode DevContainer の設定をしていきます.
まず Dockerfile ですが, DevContainer の ubuntu のベースイメージに rye
をインストールして, パスを通しているだけです.
FROM mcr.microsoft.com/devcontainers/base:jammy
USER vscode
RUN curl -sSf https://rye-up.com/get | RYE_INSTALL_OPTION="--yes" bash \
&& echo 'source "$HOME/.rye/env"' >> ~/.bashrc
次に devcontainer.json
ですが, ファイル全体は以下を参照してください.
重要なのは 3 箇所だけです.
まず以下部分では Docker で GPU を使う設定をしています. GPU を使わない場合はコメントアウトします. CUDA の設定などは DevContainer に任せられるので非常に楽です.
{
"runArgs": [
"--gpus",
"all"
],
"features": {
"ghcr.io/devcontainers/features/nvidia-cuda": {
"cudaVersion": 11.8
}
}
}
次に以下の部分で, コンテナが立ち上がった後に rye
が uv を使う設定と, rye sync
を自動実行するようにしています.
{
"onCreateCommand": "rye config --set-bool behavior.use-uv=true && rye sync"
}
これにより, コンテナが立ち上がると自動で Python およびパッケージのインストールが始まります.
最後に以下の部分で, VSCode に rye
仮想環境の Python を認識させています.
{
"customizations": {
"vscode": {
"settings": {
"python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python"
}
}
}
}
これをしないと VSCode が Python を認識せず, 補完や静的解析などの恩恵を受けられなくなります.
まとめ
以上が私の考えた開発体験がいいと思う Python 環境です.
- Package Manager:
rye
- Linter & Formatter:
ruff
- Type Checker:
mypy
- Test Tool:
pytest
Go や Rust ほどの開発体験を得るのはさすがに難しいかと思いますが, 静的解析ツールのおかげで多くのバグを未然に防ぐことができると思います.
タイトルには "最強の開発環境" とありますが, Python に関しては素人も同然なのでいい案があればご教示いただけると幸いです.
Discussion
NVIDIA Driver のインストールはまだ試したことがなかった。後程試してみたい