筆者の業務用PCのOSは現在Windows11です。
その中でPython関連のプログラムを動かす際にはWindows+Pythonという形で動かさず、
Windows Subsystem for Linux 2(以下WSL2と表記)内にDocker-CEをインストールし、
Dockerコンテナを建ててその中でPythonを動かしています。
「なぜわざわざ面倒くさそうなこの方法を使うのか?」について説明する機会があったため、整理を兼ねてこの記事を書くことにします。
1. Windows VS Linux
基本的にPythonの実行速度はWindowsよりもLinux環境のほうが速いというのが通説です。
(様々なエンジニアの方が検証されていますので、詳細は省きます)
またデファクトスタンダードもLinux環境であることから、インターネット上の情報もLinuxで動かすことを前提としているものが多い印象があります。
基本的に実行環境によってプログラムの書き方が大幅に変わることは無いのですが、
頻繁に行うことの多いファイル操作処理がWindowsとLinuxでは異なるため、共通化するのが難しい事情があったりもします。
こういった観点からLinux+Pythonを実行環境に選択しています。
2. Linuxを使うのは分かった。じゃあなんでWSL2を使うの?
Windowsマシン上でLinux環境を構築するには色々な方法があります。
- そもそもデュアルブートしちゃう
完全に分けてしまうのが一番安全ではあるがハードルは一番高い - Hyper-V・VMWare・VirtualBox等のツール利用
ネットワーク設定周り・環境の使い回しが効きやすい等のメリットはあるが、Pythonを動かしたいだけなのでそこまでする必要は今回無いと判断。(あとWSL2より実行速度が多少遅いらしい(当方では未検証)) - WSL2
Windows上から機能を有効化してインストールすれば使い始められる手軽さ。
起動も非常に速い。
メイン環境はDockerコンテナの中なので、ホストOS自体はシンプルな環境で良いという理由で選択。
(WSL2もHyper-Vを使っているがなぜ各種速度が向上するのかについて同僚の方よりWSLバージョンの比較のドキュメントを教えていただきました)
あくまでお手軽にPython+Linuxの仮想環境を作ることが本目的なので、一番簡単なWSL2を使うというのが主な理由になります。
3. わざわざDockerを使う理由って?
WSL2でインストール出来るLinux(主にUbuntu20.04を使用)はピュアな環境で、例えば筆者のように深層機械学習用のPythonプログラムを効率的に動かしたいのであれば、GPUを計算に使えるように各種ドライバーをインストールしていく必要があります。
これが結構手間な作業であること、依存関係を壊すリスクもあることからWSL上のUbuntuに直接ドライバーやPythonをインストールして使うという選択肢は取りづらいです。
一方これらの手順をすっ飛ばしてコンテナさえ建ててしまえば、上記より簡単にPythonを動かせるのがDockerのメリットです。
またDockerfileやDocker-Compose等を使えば同様の環境が使い回せるし、失敗しても建て直しが簡単に出来ることも理由の一つです。
4. Docker使うんならWindows上からでも良いんでは?
Windows上でもDocker Desktopを使ってDocker環境は建てられるんですが、商用利用は基本的に有償なのがデメリットになります。
一方LinuxではDockerのCommunity Editionをインストールすれば無償で利用できます。
大規模開発となってくるとEnterprise Editionの利用が必要になる場合もあるでしょうが、今回の用途(機械学習用のPython環境を作る)ではCEで十分ではないでしょうか?
というわけで選択肢はWSL2+Dockerに限られることになります。
おまけ. 強力すぎるVisual Studio Codeの拡張機能支援
筆者はエディタにVSCodeを使用していますが、Dockerの拡張機能をインストールすればマウスポチポチでDockerコンテナを立ち上げたり、消したりと様々な操作が簡単に出来ます。
PythonやJupyterその他諸々の拡張機能も用意されているので環境構築のハードルの低さから懐柔されまくってます…。
???「お前もVSCode使いにならないか?」
まとめ
今回の疑問に対する回答を順番にしていくと上記のようになりますが、
結局のところ再配布可能・再現性が取りやすい環境を作るためのハードルの低い方法がDockerだったため、という理由が根底にはあります。
WSLも無くDockerも今ほどは普及していないぺーぺーだった頃は、デュアルブート環境にNvidia DriverやCUDA・cuDNNを入れては失敗して毎度痛い目を見ていたのですが、これが無くなるだけでも超絶ありがたいので…もうホントにホントに助かります~~~~~~(泣)
皆さんも使いましょう!