🐍

僕の考えた最強の Python 開発環境 (2024)

2024/04/17に公開
1

はじめに

こんにちは, 普段は情報科学専攻の大学院生をしながらバックエンドエンジニアをやっている @koki-algebra です.

普段は Go をよく書いているのですが, 大学でやっている機械学習の研究では Python を使うことがほとんどです. Go のエコシステムに慣れきった私は Python の混沌とした環境に耐えきれず, 最強の開発環境を整えることを決意しました.

具体的には Package Manager, Formatter, Linter, Type Checker, Test Tool を選定し, VSCode の DevContainer を用いてポータビリティに優れた開発環境を作ることを目指します.

また, Deep Learning では GPU が必須である場合が多いので, GPU 環境も同時に整えたいと思います.

以下のレポジトリが今回考えた開発環境のテンプレートになります.

https://github.com/koki-algebra/python_docker

VSCode DevContainer であれば数クリックで使えるのでよければお使いください.
GPU 環境を除けば VSCode には依存しないので, 他のエディターをお使いの方にもご利用いただけます.

それでは使用ツールについてみていきましょう.

Package Manager

Package Manager には Rust 製の rye を選びました.

https://rye-up.com

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 のバージョンを固定することができます.

.python-version
3.12.2

ただし, 公式ドキュメントにもあるように, cargo のような機能を目指すための実験的なツールだといっているため, Production 環境に rye を用いるには慎重に検討する必要があります.

私個人で rye を使っている分には全く問題ないどころか, むしろ使い勝手の良さに感動しています.

Formatter & Linter

ruff という Rust 製の Formatter & Linter を選びました.

https://docs.astral.sh/ruff

今まで Python の Linter といえば flake8, Formatter といえば black + isort でしたが, ruff 1 つで同等以上の機能を提供してくれます.

ruff の設定は, pyproject.toml に書くか, ruff.toml または .ruff.toml というファイルに書いて, プロジェクトルートに設置すると反映されます.

.ruff.toml
line-length = 120
indent-width = 4

[lint.per-file-ignores]
"__init__.py" = ["F401", "F403"]

また, VSCode で ruff を使用するには以下の拡張機能をインストールすれば良いです.

https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff

Type Checker

Type Checker には mypy を選びました.

https://mypy-lang.org

そもそも Type Check とは, 例えば 関数の引数や戻り値に指定した Type Hint 通りに値を渡しているかなどを静的解析するツールです.

Python は動的型付け言語なので, Go などの静的型付け言語のようにコンパイラが厳密に型をチェックするわけではないのですが, Type Checker を導入することでバグをみつけやすくなります.

mypy の設定は mypy.ini または .mypy.ini というファイルに書いてプロジェクトルートに設置すれば反映されます.

.mypy.ini
[mypy]
ignore_missing_imports = False

[mypy-sklearn.model_selection]
ignore_missing_imports = true

Test Tool

Test Tool には pytest を選びました.

https://docs.pytest.org

pytest は有名なユニットテストツールであり, 現状はデファクトスタンダードといえると思います.

Docker 用の GPU 環境構築

Docker で GPU を動かすために必要なものは

  1. NVIDIA Driver
  2. 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 のインストール

公式ドキュメントに従い, インストールを行なってください.

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

以下のコマンドで正しくインストールされていることを確認します.

nvidia-container-cli info

最後に Docker の再起動を行います.

sudo systemctl restart docker

VSCode DevContainer

最後に VSCode DevContainer の設定をしていきます.

https://code.visualstudio.com/docs/devcontainers/containers

まず Dockerfile ですが, DevContainer の ubuntu のベースイメージに rye をインストールして, パスを通しているだけです.

.devcontainer/Dockerfile
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 ですが, ファイル全体は以下を参照してください.

https://github.com/koki-algebra/python_docker/blob/main/.devcontainer/devcontainer.json

重要なのは 3 箇所だけです.

まず以下部分では Docker で GPU を使う設定をしています. GPU を使わない場合はコメントアウトします. CUDA の設定などは DevContainer に任せられるので非常に楽です.

.devcontainer/devcontainer.json
{
	"runArgs": [
		"--gpus",
		"all"
	],
	"features": {
		"ghcr.io/devcontainers/features/nvidia-cuda": {
			"cudaVersion": 11.8
		}
	}
}

次に以下の部分で, コンテナが立ち上がった後に ryeuv を使う設定と, rye sync を自動実行するようにしています.

.devcontainer/devcontainer.json
{
    "onCreateCommand": "rye config --set-bool behavior.use-uv=true && rye sync"
}

これにより, コンテナが立ち上がると自動で Python およびパッケージのインストールが始まります.

最後に以下の部分で, VSCode に rye 仮想環境の Python を認識させています.

.devcontainer/devcontainer.json
{
    "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 のインストールはまだ試したことがなかった。後程試してみたい