= 機械学習環境を個人用PCにセットアップする: Pythonソースビルド版 = [[PageOutline]] こちらの記事 https://cerldev.kek.jp/trac/EpicsUsersJP/wiki/misc/setup_for_ML との差は、python3.11をソースからビルドすることです。 概略 * WSL2+Ubuntuをインストール * python3をソースからインストール * venv 設定 * !TensorFlow インストール、動作確認 * !PyTorch インストール、動作確認 ※ 【注】以下の手順で!TensorFlow/PyTorchの共存は可能ですが、GPyOpt のコンパイル時に不具合が出ることが分かりました。もしGPyOptを使う予定があるのならば、以下の手順のうち Python 3.11 → 3.10 に変更してください。それだけで問題無く動作します。あとで本記事全体を書き直しますが取り急ぎ連絡まで(2023/05/11; T.Obina) == WSL2のインストール == こちらを参照: https://cerldev.kek.jp/trac/EpicsUsersJP/wiki/misc/setup_for_ML#WSL2%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB == python3インストール == Ubuntu22.04にデフォルトでインストールされているpythonは/usr/bin/pythonに存在。バージョンは 3.10.6なので古くは無いが、システムで使われることも多いのでこれとは別にインストールする方針とする。 /usr/localに入れると他のプログラムと干渉する可能性もあるので、 /opt/python/... 以下にインストールしていく方針としている。ここはお好みで。(EPICSを入れるときに、 /opt/epics に入れているので似たような方針とした) Python.jpサイトでのガイドに従う [Ubuntu環境のPython: Python環境構築ガイド - python.jp](https://www.python.jp/install/ubuntu/index.html) 必要なパッケージをインストール {{{ sudo apt install build-essential libbz2-dev libdb-dev \ libreadline-dev libffi-dev libgdbm-dev liblzma-dev \ libncursesw5-dev libsqlite3-dev libssl-dev \ zlib1g-dev uuid-dev tk-dev }}} 今回はpython公式サイトから、現時点(2023/05)の最新版であるPython3.11.3を入れる。 機械学習環境を構築する目的からは必ずしも最新版が良いとは限らない(ときどき最新バージョンに対応できていないことがある)が、今回はこれで問題なさそう。 あらかじめインストール先として /opt/python/3.11.3 を作成しておく。 ownerを自分に設定することで、後の作業は一般ユーザー権限で行う。 {{{ obina@notepc:~$ cd /opt obina@notepc:/opt$ ls obina@notepc:/opt$ sudo mkdir python obina@notepc:/opt$ sudo chown obina:obina python obina@notepc:/opt$ cd python obina@notepc:/opt/python$ mkdir 3.11.3 obina@notepc:/opt/python$ ls 3.11.3 }}} ホームディレクトリに戻って、作業用のディレクトリ作成。ソースをダウンロード。URLは上の公式サイトから最新のモノを探す。今回の場合は以下の通りとなった。 {{{ obina@notepc:~$ mkdir work obina@notepc:~$ cd work obina@notepc:~/work$ wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz --2023-05-09 20:11:15-- https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz Resolving www.python.org (www.python.org)... 151.101.108.223, 2a04:4e42:1a::223 Connecting to www.python.org (www.python.org)|151.101.108.223|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 26455738 (25M) [application/octet-stream] Saving to: ‘Python-3.11.3.tgz’ Python-3.11.3.tgz 100%[=================================================>] 25.23M 19.5MB/s in 1.3s 2023-05-09 20:11:17 (19.5 MB/s) - ‘Python-3.11.3.tgz’ saved [26455738/26455738] }}} configureでインストール先として /opt/python/3.11.3 を指定する。 lto (Link time optimization) はリンク時間が長くなる替わりに実行速度が上がる...らしい。(自分では未検証) {{{ obina@notepc:~/work$ tar xvfz Python-3.11.3.tgz obina@notepc:~/work$ cd Python-3.11.3/ obina@notepc:~/work/Python-3.11.3$ ls Doc LICENSE Makefile.pre.in Objects Parser README.rst config.guess configure.ac setup.py Grammar Lib Misc PC Programs Tools config.sub install-sh Include Mac Modules PCbuild Python aclocal.m4 configure pyconfig.h.in obina@notepc:~/work/Python-3.11.3$ ./configure --prefix=/opt/python/3.11.3 --enable-optimizations --with-lto obina@notepc:~/work/Python-3.11.3$ make -j8 # 並列化の数はCPU数に応じて適当に .... obina@notepc:~/work/Python-3.11.3$ make install .... }}} 環境設定用のスクリプトを作成。WSLの場合はユーザーが自分だけなので~/.bashrcに直接書いても良いのだが、今後pythonのバージョンによって切り分けたいこともあると思うので/opt/python以下につくっておく {{{ $ vi /opt/python/setup_py3.11.3.sh export PATH=/opt/python/3.11.3/bin:$PATH }}} 念のため確認. 上のスクリプトを source する前後で使うpythonをチェック。 {{{ obina@notepc:~$ which python3 /usr/bin/python3 obina@notepc:~$ source /opt/python/3.11.3/setup_py3.11.3.sh obina@notepc:~$ which python3 /opt/python/3.11.3/bin/python3 }}} 問題ない。 {{{ obina@notepc:~$ which pip3 /opt/python/3.11.3/bin/pip3 obina@notepc:~$ obina@notepc:~$ pip3 list Package Version ---------- ------- pip 22.3.1 setuptools 65.5.0 [notice] A new release of pip available: 22.3.1 -> 23.1.2 [notice] To update, run: pip3 install --upgrade pip }}} pip3を確認して、アップデートする {{{ obina@notepc:~$ pip3 install --upgrade pip Requirement already satisfied: pip in /opt/python/3.11.3/lib/python3.11/site-packages (22.3.1) Collecting pip Downloading pip-23.1.2-py3-none-any.whl (2.1 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 1.8 MB/s eta 0:00:00 Installing collected packages: pip Attempting uninstall: pip Found existing installation: pip 22.3.1 Uninstalling pip-22.3.1: Successfully uninstalled pip-22.3.1 Successfully installed pip-23.1.2 }}} これで基本環境はOK。次はvenvを使って個別のパッケージを入れていく。 == venv 設定 == 次にTensorFlowやPyTorchを入れていく。それぞれでnumpyのバージョンなど、要求されるものが異なることが多いため別の仮想環境を作る方が良い。 ここではvenvを使うのでその設定を行う 基本方針: ホームディレクトリ直下に ".venv" というディレクトリを作成。 ~/.venv/以下に個別の仮想環境用のディレクトリを作成していく。 例えば - TensorFlow用は ~/.venv/tf2.12 - PyTorch用は ~/.venv/torch2.0 のような感じでディレクトリを作っていく 仮にあとで仮想環境を消したいときにはディレクトリ(上の例ではtf2.12とかtorch2.0とか)を削除すれば良いだけ。実際には.venvの下に作る必要はなく、どのディレクトリでも良いし隠しディレクトリである必然性も無いが、慣例に従う。 python.jpサイトの仮想環境構築ガイド - [windows](https://www.python.jp/install/windows/venv.html) - [ubuntu](https://www.python.jp/install/ubuntu/virtualenv.html) === !TensorFlow 用のvenv環境準備 === まずはTensorFlowのバージョンを確認 [tensorflow・PyPI](https://pypi.org/project/tensorflow/) をみると、python3.11に対応したTF2.12.0があることがわかる → venv名称をtf2.12とする方針とする ファイル名を確認する https://pypi.org/project/tensorflow/#files をみると、 tensorflow-2.12.0-cp311-cp311-manylinux_2_17_x86_64....whl というファイルがあるのでCPython3.11に対応しているようだ。 使用するpythonの場所が/opt以下であることを確認してから、venvを構築。このときに指定する名前がプロンプトの先頭に付くので、あまり長い名前を付けると面倒かもしれない(jupyter notebookを使うことが前提ならあまり気にならないが) {{{ obina@notepc:~$ which python3 /opt/python/3.11.3/bin/python3 obina@notepc:~$ python3 -m venv ~/.venv/tf2.12 }}} 念のためディレクトリを確認 {{{ obina@notepc:~$ ls ~/.venv/tf2.12/ bin include lib lib64 pyvenv.cfg obina@notepc:~$ ls ~/.venv/tf2.12/bin/ Activate.ps1 activate activate.csh activate.fish pip pip3 pip3.11 python python3 python3.11 }}} 仮想環境を起動; これ以降はプロンプトの先頭に (tf2.12)が付く {{{ obina@notepc:~$ source ~/.venv/tf2.12/bin/activate (tf2.12) obina@notepc:~$ }}} 終了するのは"deactivate"コマンドで良い {{{ (tf2.12) obina@notepc:~$ which python3 /home/obina/.venv/tf2.12/bin/python3 (tf2.12) obina@notepc:~$ which pip /home/obina/.venv/tf2.12/bin/pip (tf2.12) obina@notepc:~$ deactivate obina@notepc:~$ obina@notepc:~$ which python3 /opt/python/3.11.3/bin/python3 }}} == !TensorFlow インストール == 例によって(念のため)使うpip確認しておく {{{ obina@notepc:~$ source ~/.venv/tf2.12/bin/activate # venv環境を開始 (tf2.12) obina@notepc:~$ which pip3 /home/obina/.venv/tf2.12/bin/pip3 (tf2.12) obina@notepc:~$ pip3 install --upgrade pip # pipの更新 ..... Successfully installed pip-23.1.2 (tf2.12) obina@notepc:~$ pip3 list Package Version ---------- ------- pip 23.1.2 setuptools 65.5.0 (tf2.12) obina@notepc:~$ pip3 install tensorflow ..... Successfully installed MarkupSafe-2.1.2 absl-py-1.4.0 astunparse-1.6.3 cachetools-5.3.0 certifi-2023.5.7 charset-normalizer-3.1.0 flatbuffers-23.3.3 gast-0.4.0 google-auth-2.17.3 google-auth-oauthlib-1.0.0 google-pasta-0.2.0 grpcio-1.54.0 h5py-3.8.0 idna-3.4 jax-0.4.8 keras-2.12.0 libclang-16.0.0 markdown-3.4.3 ml-dtypes-0.1.0 numpy-1.23.5 oauthlib-3.2.2 opt-einsum-3.3.0 packaging-23.1 protobuf-4.23.0 pyasn1-0.5.0 pyasn1-modules-0.3.0 requests-2.30.0 requests-oauthlib-1.3.1 rsa-4.9 scipy-1.10.1 six-1.16.0 tensorboard-2.12.3 tensorboard-data-server-0.7.0 tensorflow-2.12.0 tensorflow-estimator-2.12.0 tensorflow-io-gcs-filesystem-0.32.0 termcolor-2.3.0 typing-extensions-4.5.0 urllib3-2.0.2 werkzeug-2.3.4 wheel-0.40.0 wrapt-1.14.1 (tf2.12) obina@notepc:~$ }}} これだけでOK.次に動作確認は公式サイトにあるコマンドで、 {{{ (tf2.12) obina@notepc:~$ python3 Python 3.11.3 (main, May 9 2023, 20:29:30) [GCC 11.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> >>> import tensorflow as tf ....(((いろいろとwarning))).... >>> >>> print(tf.reduce_sum(tf.random.normal([1000, 1000]))) tf.Tensor(-182.7671, shape=(), dtype=float32) >>> print(tf.reduce_sum(tf.random.normal([1000, 1000]))) tf.Tensor(-268.51474, shape=(), dtype=float32) }}} とりあえず動く。 もう1つ、kereasを使ったサンプル。 https://www.tensorflow.org/tutorials/quickstart/beginner をそのまま実行 {{{ import tensorflow as tf mnist = tf.keras.datasets.mnist (x_train, y_train),(x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=5) model.evaluate(x_test, y_test) }}} 評価結果をみる {{{ >>> model.evaluate(x_test, y_test) 313/313 [==============================] - 0s 778us/step - loss: 0.0758 - accuracy: 0.9757 [0.07577536255121231, 0.9757000207901001] }}} ちゃんと学習出来ているので、インストール自体は問題なさそう。 === Jupyter Notebook, ipython のセットアップ === 次に、利便性のためにipythonやjupyter notebookを入れておく; 依存関係もあるがまとめてnotebookを入れるのが簡単。詳しくは https://jupyter.org/install を参照。 {{{ (tf2.12) obina@notepc:~$ pip3 install notebook .... (tf2.12) obina@notepc:~$ which ipython3 /home/obina/.venv/tf2.12/bin/ipython3 (tf2.12) obina@notepc:~$ (tf2.12) obina@notepc:~$ ipython3 --nosep Python 3.11.3 (main, May 9 2023, 20:29:30) [GCC 11.3.0] Type 'copyright', 'credits' or 'license' for more information IPython 8.13.2 -- An enhanced Interactive Python. Type '?' for help. In [1]: }}} 問題なし。 ノートブックの起動。デフォルトではOS内のブラウザを立ち上がようとしてしまうので、--no-browserオプションを付けて起動し、Windows側のブラウザで接続する。 {{{ (tf2.12) obina@notepc:~$ jupyter notebook --no-browser [I 21:30:41.014 NotebookApp] Writing notebook server cookie secret to /home/obina/.local/share/jupyter/runtime/notebook_cookie_secret _ _ _ _ | | | |_ __ __| |__ _| |_ ___ | |_| | '_ \/ _` / _` | _/ -_) \___/| .__/\__,_\__,_|\__\___| |_| Read the migration plan to Notebook 7 to learn about the new features and the actions to take if you are using extensions. https://jupyter-notebook.readthedocs.io/en/latest/migrate_to_notebook7.html Please note that updating to Notebook 7 might break some of your extensions. [I 21:30:41.133 NotebookApp] Serving notebooks from local directory: /home/obina [I 21:30:41.133 NotebookApp] Jupyter Notebook 6.5.4 is running at: [I 21:30:41.133 NotebookApp] http://localhost:8888/?token=50b97522fe665b6862193efe85be7fe5c703dcbe13116e45 [I 21:30:41.133 NotebookApp] or http://127.0.0.1:8888/?token=50b97522fe665b6862193efe85be7fe5c703dcbe13116e45 [I 21:30:41.133 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). [C 21:30:41.135 NotebookApp] To access the notebook, open this file in a browser: file:///home/obina/.local/share/jupyter/runtime/nbserver-19189-open.html Or copy and paste one of these URLs: http://localhost:8888/?token=50b97522fe665b6862193efe85be7fe5c703dcbe13116e45 or http://127.0.0.1:8888/?token=50b97522fe665b6862193efe85be7fe5c703dcbe13116e45 }}} と出るので、Windowsで起動したブラウザに上のURLを貼り付ける。ブラウザで動くことを確認。たとえばこんな感じで。 [[Image(wsl_python_notebook1.png, 30%)]] ※ Notebook 7 なるものがあるとは知らなかった.... 上のコマンドではmatplotlibが入らなかったので、手動で入れた。 {{{ (tf2.12) obina@notepc:~$ pip install matplotlib }}} 再掲:venv環境を抜けるのはdeactivate コマンドで終了するか、システムから抜ける。 == !PyTorch インストール == 次にPyTorchを入れていく。やはり公式サイトからスタート https://pytorch.org/get-started/locally/ PyTorchのOSやバージョン、GPUの有無などを選択。 [[Image(wsl_python_torch1.png, 40%)]] ここではGPUが無い環境なので {{{ PyTorch Build: Stable(2.0.1) Your OS: Linux Package: Pip Language: Python Compute Platform: CPU }}} を選択する。コマンドは {{{ pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu }}} となったので、これをいれる。 まずは venv として設定するときのバージョンは2.0.1とする。 最初にどのpythonを使っているのかを確認してから。 {{{ obina@notepc:~$ which python3 /opt/python/3.11.3/bin/python3 obina@notepc:~$ python3 -m venv ~/.venv/torch2.0 obina@notepc:~$ source ~/.venv/torch2.0/bin/activate (torch2.0) obina@notepc:~$ }}} ここからは先ほどと同様にpipの更新を行った後で、torch入れる。 {{{ (torch2.0) obina@notepc:~$ which pip /home/obina/.venv/torch2.0/bin/pip (torch2.0) obina@notepc:~$ pip install --upgrade pip .... Successfully installed pip-23.1.2 (torch2.0) obina@notepc:~$ (torch2.0) obina@notepc:~$ pip list Package Version ---------- ------- pip 23.1.2 setuptools 65.5.0 (torch2.0) obina@notepc:~$ pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu .... Installing collected packages: mpmath, urllib3, typing-extensions, sympy, pillow, numpy, networkx, MarkupSafe, idna, filelock, charset-normalizer, certifi, requests, jinja2, torch, torchvision, torchaudio Successfully installed MarkupSafe-2.1.2 certifi-2022.12.7 charset-normalizer-2.1.1 filelock-3.9.0 idna-3.4 jinja2-3.1.2 mpmath-1.2.1 networkx-3.0 numpy-1.24.1 pillow-9.3.0 requests-2.28.1 sympy-1.11.1 torch-2.0.1+cpu torchaudio-2.0.2+cpu torchvision-0.15.2+cpu typing-extensions-4.4.0 urllib3-1.26.13 }}} 動作確認 {{{ (torch2.0) obina@notepc:~$ python Python 3.11.3 (main, May 9 2023, 20:29:30) [GCC 11.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> >>> >>> import torch >>> x = torch.rand(5,3) >>> print(x) tensor([[0.1193, 0.9816, 0.3111], [0.8966, 0.0651, 0.5655], [0.5590, 0.1083, 0.6464], [0.7477, 0.3680, 0.5885], [0.8389, 0.1438, 0.8069]]) >>> }}} 問題無さそう。あとはチュートリアルから適当に選んで動作確認すれば良い。 https://pytorch.org/tutorials/beginner/basics/quickstart_tutorial.html この段階でのパッケージ一覧 {{{ (torch2.0) obina@notepc:~$ pip3 list Package Version ------------------ ---------- certifi 2022.12.7 charset-normalizer 2.1.1 filelock 3.9.0 idna 3.4 Jinja2 3.1.2 MarkupSafe 2.1.2 mpmath 1.2.1 networkx 3.0 numpy 1.24.1 Pillow 9.3.0 pip 23.1.2 requests 2.28.1 setuptools 65.5.0 sympy 1.11.1 torch 2.0.1+cpu torchaudio 2.0.2+cpu torchvision 0.15.2+cpu typing_extensions 4.4.0 urllib3 1.26.13 }}} あとはjupyter notebook, matplotlib, plotly, seabornなど、お好みで。 お手軽に使うには ax-platformを入れるのも楽。 ※ PyTorchでは numpy 1.24.1, TensorFlowでは 1.23.5 を使用している ここでは、!BoTorch, Ax を入れる。notebook, matplotlibも。 {{{ (torch2.0) obina@notepc:~$ pip install botorch ax-platform (torch2.0) obina@notepc:~$ pip install notebook matplotlib }}} BoTorchのgetting startedを実行 https://botorch.org/docs/getting_started 乱数でデータを作成 {{{ import torch from botorch.models import SingleTaskGP from botorch.fit import fit_gpytorch_mll from gpytorch.mlls import ExactMarginalLogLikelihood train_X = torch.rand(10, 2) Y = 1 - (train_X - 0.5).norm(dim=-1, keepdim=True) # explicit output dimension Y += 0.1 * torch.rand_like(Y) train_Y = (Y - Y.mean()) / Y.std() }}} 続いてガウス過程モデル(SingleTaskGP)を定義し、周辺尤度最大化(ExactMarginalLongLikelihood) によってカーネルパラメータを推定します。 {{{ gp = SingleTaskGP(train_X, train_Y) mll = ExactMarginalLogLikelihood(gp.likelihood, gp) fit_gpytorch_mll(mll); }}} 獲得関数としてUCBを使う {{{ from botorch.acquisition import UpperConfidenceBound UCB = UpperConfidenceBound(gp, beta=0.1) }}} 最適化 {{{ from botorch.optim import optimize_acqf bounds = torch.stack([torch.zeros(2), torch.ones(2)]) candidate, acq_value = optimize_acqf( UCB, bounds=bounds, q=1, num_restarts=5, raw_samples=20, ) }}} 結果表示 {{{ print(candidate) }}} そのほか、簡単に確認するにはAxのサンプルを実行するのも良いだろう [Ax ・ Adaptive Experimentation Platform](https://ax.dev/) == GPyOpt == いくつかの注意点のみ - python3.11ではコンパイルできないので python3.10を使用する - numpy, matplotlibのバージョン指定が必要 - venv でGPyOpt用の環境を作成して !TensorFlow/PyTorchと分離するのが簡単 - venvのなかで {{{ $ pip install GPyOpt numpy==1.23.1 notebook matplotlib==3.1.3 }}} でOK == 今後 == ここから先はまだ書いていない * GPU環境 (CUDA)でのセットアップ例 * GPyOptの使用例 * BOTorch, Axの使用例 * EPICS連携