macOSにPythonをインストールして機械学習の環境を構築する
macOSにpythonをインストールして機械学習を構築します。 Pythonをインストールには、以下の方法があります。
- Pythonの公式配布サイトからインストーラをダウンロードしてインストールする。
- MacPortsを使ってインストールする。
- Homebrewを使ってインストールする。
- DockerでPythonのコンテナを用意する。
- パッケージ管理は安全・安心のMacPorts!
- MacPortsをインストール済
- Pythonのバージョンはメジャーバージョンとマイナーバージョンの違いまでを管理して複数インストールできればよい。パッチバージョンまでは管理しない。
- とにかく、さくっと動くところまでやりたい!
まず、MacPortsでPython3とPythonのパッケージマネージャであるpipをインストールします。最新版は3.8ですが、今回は3.7をインストールします。Python2は2020年でサポートが終了することになっています。
> sudo port install python37 py37-pip
python_selectやpython3_selectなど、依存関係のあるパッケージも一緒にインストールされます。 インストールが終了したら、何がインストールされたのかを以下のコマンドで確認します。 他のパッケージの依存関係でPython2がインストールされているかもしれませんが、特に問題ありません。
> port installed | grep py
py27-beaker @1.11.0_0 (active)
py27-funcsigs @1.0.2_0 (active)
py27-mako @1.1.0_0 (active)
py27-markdown @3.1.1_0 (active)
py27-markupsafe @1.1.1_0 (active)
py27-setuptools @43.0.0_0 (active)
py37-beaker @1.11.0_0 (active)
py37-mako @1.1.0_0 (active)
py37-markdown @3.1.1_0 (active)
py37-markupsafe @1.1.1_0 (active)
py37-pip @19.3.1_0 (active)
py37-setuptools @43.0.0_0 (active)
python2_select @0.0_3 (active)
python3_select @0.0_1 (active)
python27 @2.7.17_0 (active)
python37 @3.7.6_0 (active)
python_select @0.3_8 (active)
python2_select、python3_select、python_selectはpythonの実行環境を設定するものです。 それぞれ、python2、python3、pythonの複数のバージョンがインストールされている場合に、どれを使用するかを切り替えます。 例えば、以下のコマンドを実行すると、現在の設定を確認することができます。
> port select --summary
Name Selected Options
==== ======== =======
clang none mp-clang-9.0 none
llvm none mp-llvm-9.0 none
mysql mysql57 mysql57 none
php php72 php72 none
pip pip37 pip37 none
pip2 none none
pip3 pip37 pip37 none
python python37 python27 python27-apple python37 none
python2 none python27 python27-apple none
python3 python37 python37 none
この設定では、pythonを実行するとpython37が呼ばれ、python3を実行するとpython37が呼ばれますが、python2を実行すると何が呼ばれるか設定されていないため、エラーが発生します。
> python -V
Python 3.7.6
> python3 -V
Python 3.7.6
> python2 -V
-bash: python2: command not found
設定を変更するには、以下のようにコマンドを呼び出します。 selectで環境を変更する場合、シンボリックリンクを張り替えるため、ルート権限が必要です。
> port select python python37
Selecting 'python37' for 'python' failed: error deleting "/opt/local/bin/python": permission denied
> sudo port select python python37
Password:
Selecting 'python37' for 'python' succeeded. 'python37' is now active.
> sudo port select python2 python27
Selecting 'python27' for 'python2' succeeded. 'python27' is now active.
> sudo port select python3 python37
Selecting 'python37' for 'python3' succeeded. 'python37' is now active.
変更した設定が正しく反映されていることを確認します。
> port select --summary
Name Selected Options
==== ======== =======
clang none mp-clang-9.0 none
llvm none mp-llvm-9.0 none
mysql mysql57 mysql57 none
php php72 php72 none
pip pip37 pip37 none
pip2 none none
pip3 pip37 pip37 none
python python37 python27 python27-apple python37 none
python2 python27 python27 python27-apple none
python3 python37 python37 none
> python -V
Python 3.7.6
> python3 -V
Python 3.7.6
> python2 -V
Python 2.7.17
次に仮想環境を構築するためにvirtualenvというパッケージをインストールします。 virtualenvは開発するディレクトリ以下に必要な virtualenvのウェブサイトはこちらです。
> sudo pip install virtualenv
virtualenvをインストールしたら、インストールされたパッケージを確認します。
> pip list
Package Version
---------- -------
pip 19.3.1
setuptools 43.0.0
virtualenv 16.7.9
wheel 0.33.6
これで開発環境を構築する準備ができました。 それでは、実際にtensorflowをインストールして、機械学習のチュートリアルを動かしてみましょう。 以下の例では、現在のディレクトリ内にtensorflowというサブディレクトリを作成して、その中にpython3の実行環境を構築します。 環境構築については、こちらにまとめられているので、ご覧ください。
> virtualenv --system-site-packages -p python3 tensorflow
Running virtualenv with interpreter /opt/local/bin/python3
Already using interpreter /opt/local/bin/python3
Using base prefix '/opt/local/Library/Frameworks/Python.framework/Versions/3.7'
New python executable in /Users/kondonator/Development/python/tensorflow/bin/python3
Also creating executable in /Users/kondonator/Development/python/tensorflow/bin/python
Installing setuptools, pip, wheel...
done.
virtualenvによって、python3と関連するパッケージが導入されました。 tensorflow以下に何が導入されたのかを確認します。
> ls tensorflow/*
tensorflow/bin:
activate easy_install* markdown_py* pyrsa-priv2pub* saved_model_cli*
activate.csh easy_install-3.7* pip* pyrsa-sign* tensorboard*
activate.fish estimator_ckpt_converter* pip3* pyrsa-verify* tf_upgrade_v2*
activate.ps1 f2py* pip3.7* python@ tflite_convert*
activate.xsh f2py3* pyrsa-decrypt* python-config* toco*
activate_this.py f2py3.7* pyrsa-encrypt* python3* toco_from_protos*
chardetect* google-oauthlib-tool* pyrsa-keygen* python3.7@ wheel*
tensorflow/include:
python3.7m@
tensorflow/lib:
python3.7/
activateコマンドを実行して、仮想環境を有効にします。 プロンプトが変わり、仮想環境で作業をしていることを示します。
> source tensorflow/bin/activate
(tensorflow) > ls
tensorflow/
仮想環境を有効にしたら、仮想環境でpipを用いて、tensorflowをインストールします。 仮想環境外でpipを使ってインストールを行うと、仮想環境でなく、OSの管理領域にパッケージをインストールしてしまうので、注意が必要です。
(tensorflow) > pip install --upgrade tensorflow
Collecting tensorflow
Using cached tensorflow-2.1.0-cp37-cp37m-macosx_10_11_x86_64.whl (120.8 MB)
Collecting keras-applications>=1.0.8
Using cached Keras_Applications-1.0.8-py3-none-any.whl (50 kB)
Collecting tensorboard<2.2.0,>=2.1.0
Using cached tensorboard-2.1.0-py3-none-any.whl (3.8 MB)
Collecting six>=1.12.0
Using cached six-1.14.0-py2.py3-none-any.whl (10 kB)
Collecting tensorflow-estimator<2.2.0,>=2.1.0rc0
Using cached tensorflow_estimator-2.1.0-py2.py3-none-any.whl (448 kB)
Processing /Users/kondonator/Library/Caches/pip/wheels/7c/06/54/bc84598ba1daf8f970247f550b175aaaee85f68b4b0c5ab2c6/termcolor-1.1.0-cp37-none-any.whl
Requirement already satisfied, skipping upgrade: wheel>=0.26; python_version >= "3" in ./tensorflow/lib/python3.7/site-packages (from tensorflow) (0.33.6)
Processing /Users/kondonator/Library/Caches/pip/wheels/d7/de/2e/efa132238792efb6459a96e85916ef8597fcb3d2ae51590dfd/wrapt-1.11.2-cp37-cp37m-macosx_10_14_x86_64.whl
Processing /Users/kondonator/Library/Caches/pip/wheels/8e/28/49/fad4e7f0b9a1227708cbbee4487ac8558a7334849cb81c813d/absl_py-0.9.0-cp37-none-any.whl
Processing /Users/kondonator/Library/Caches/pip/wheels/5c/2e/7e/a1d4d4fcebe6c381f378ce7743a3ced3699feb89bcfbdadadd/gast-0.2.2-cp37-none-any.whl
Collecting protobuf>=3.8.0
Using cached protobuf-3.11.2-cp37-cp37m-macosx_10_9_x86_64.whl (1.3 MB)
Collecting scipy==1.4.1; python_version >= "3"
Using cached scipy-1.4.1-cp37-cp37m-macosx_10_6_intel.whl (28.4 MB)
Processing /Users/kondonator/Library/Caches/pip/wheels/2c/b1/94/43d03e130b929aae7ba3f8d15cbd7bc0d1cb5bb38a5c721833/opt_einsum-3.1.0-cp37-none-any.whl
Collecting numpy<2.0,>=1.16.0
Using cached numpy-1.18.1-cp37-cp37m-macosx_10_9_x86_64.whl (15.1 MB)
Collecting keras-preprocessing>=1.1.0
Using cached Keras_Preprocessing-1.1.0-py2.py3-none-any.whl (41 kB)
Collecting astor>=0.6.0
Using cached astor-0.8.1-py2.py3-none-any.whl (27 kB)
Collecting grpcio>=1.8.6
Using cached grpcio-1.26.0-cp37-cp37m-macosx_10_9_x86_64.whl (2.3 MB)
Collecting google-pasta>=0.1.6
Using cached google_pasta-0.1.8-py3-none-any.whl (57 kB)
Collecting h5py
Using cached h5py-2.10.0-cp37-cp37m-macosx_10_6_intel.whl (3.0 MB)
Requirement already satisfied, skipping upgrade: setuptools>=41.0.0 in ./tensorflow/lib/python3.7/site-packages (from tensorboard<2.2.0,>=2.1.0->tensorflow) (45.1.0)
Collecting google-auth<2,>=1.6.3
Using cached google_auth-1.11.0-py2.py3-none-any.whl (76 kB)
Collecting markdown>=2.6.8
Using cached Markdown-3.1.1-py2.py3-none-any.whl (87 kB)
Collecting requests<3,>=2.21.0
Using cached requests-2.22.0-py2.py3-none-any.whl (57 kB)
Collecting werkzeug>=0.11.15
Using cached Werkzeug-0.16.0-py2.py3-none-any.whl (327 kB)
Collecting google-auth-oauthlib<0.5,>=0.4.1
Using cached google_auth_oauthlib-0.4.1-py2.py3-none-any.whl (18 kB)
Collecting pyasn1-modules>=0.2.1
Using cached pyasn1_modules-0.2.8-py2.py3-none-any.whl (155 kB)
Collecting rsa<4.1,>=3.1.4
Using cached rsa-4.0-py2.py3-none-any.whl (38 kB)
Collecting cachetools<5.0,>=2.0.0
Using cached cachetools-4.0.0-py3-none-any.whl (10 kB)
Collecting chardet<3.1.0,>=3.0.2
Using cached chardet-3.0.4-py2.py3-none-any.whl (133 kB)
Collecting idna<2.9,>=2.5
Using cached idna-2.8-py2.py3-none-any.whl (58 kB)
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1
Using cached urllib3-1.25.8-py2.py3-none-any.whl (125 kB)
Collecting certifi>=2017.4.17
Using cached certifi-2019.11.28-py2.py3-none-any.whl (156 kB)
Collecting requests-oauthlib>=0.7.0
Using cached requests_oauthlib-1.3.0-py2.py3-none-any.whl (23 kB)
Collecting pyasn1<0.5.0,>=0.4.6
Using cached pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)
Collecting oauthlib>=3.0.0
Using cached oauthlib-3.1.0-py2.py3-none-any.whl (147 kB)
Installing collected packages: numpy, six, h5py, keras-applications, grpcio, absl-py, protobuf, pyasn1, pyasn1-modules, rsa, cachetools, google-auth, markdown, chardet, idna, urllib3, certifi, requests, werkzeug, oauthlib, requests-oauthlib, google-auth-oauthlib, tensorboard, tensorflow-estimator, termcolor, wrapt, gast, scipy, opt-einsum, keras-preprocessing, astor, google-pasta, tensorflow
Successfully installed absl-py-0.9.0 astor-0.8.1 cachetools-4.0.0 certifi-2019.11.28 chardet-3.0.4 gast-0.2.2 google-auth-1.11.0 google-auth-oauthlib-0.4.1 google-pasta-0.1.8 grpcio-1.26.0 h5py-2.10.0 idna-2.8 keras-applications-1.0.8 keras-preprocessing-1.1.0 markdown-3.1.1 numpy-1.18.1 oauthlib-3.1.0 opt-einsum-3.1.0 protobuf-3.11.2 pyasn1-0.4.8 pyasn1-modules-0.2.8 requests-2.22.0 requests-oauthlib-1.3.0 rsa-4.0 scipy-1.4.1 six-1.14.0 tensorboard-2.1.0 tensorflow-2.1.0 tensorflow-estimator-2.1.0 termcolor-1.1.0 urllib3-1.25.8 werkzeug-0.16.0 wrapt-1.11.2
tensorflowと実行に必要なパッケージが./tensorflow/lib/python3.7/site-packages以下にインストールされました。 どんなパッケージがインストールされたのかを確認しましょう。
(tensorflow) > ls tensorflow/lib/python3.7/site-packages/
Keras_Applications-1.0.8.dist-info/ h5py/ requests_oauthlib-1.3.0.dist-info/
Keras_Preprocessing-1.1.0.dist-info/ h5py-2.10.0.dist-info/ rsa/
Markdown-3.1.1.dist-info/ idna/ rsa-4.0.dist-info/
Werkzeug-0.16.0.dist-info/ idna-2.8.dist-info/ scipy/
__pycache__/ keras_applications/ scipy-1.4.1.dist-info/
absl/ keras_preprocessing/ setuptools/
absl_py-0.9.0.dist-info/ markdown/ setuptools-45.1.0.dist-info/
astor/ numpy/ six-1.14.0.dist-info/
astor-0.8.1.dist-info/ numpy-1.18.1.dist-info/ six.py
cachetools/ oauthlib/ tensorboard/
cachetools-4.0.0.dist-info/ oauthlib-3.1.0.dist-info/ tensorboard-2.1.0.dist-info/
certifi/ opt_einsum/ tensorflow/
certifi-2019.11.28.dist-info/ opt_einsum-3.1.0.dist-info/ tensorflow-2.1.0.dist-info/
chardet/ pasta/ tensorflow_core/
chardet-3.0.4.dist-info/ pip/ tensorflow_estimator/
easy_install.py pip-20.0.2.dist-info/ tensorflow_estimator-2.1.0.dist-info/
gast/ pkg_resources/ termcolor-1.1.0.dist-info/
gast-0.2.2.dist-info/ protobuf-3.11.2-py3.7-nspkg.pth termcolor.py
google/ protobuf-3.11.2.dist-info/ urllib3/
google_auth-1.11.0-py3.8-nspkg.pth pyasn1/ urllib3-1.25.8.dist-info/
google_auth-1.11.0.dist-info/ pyasn1-0.4.8.dist-info/ werkzeug/
google_auth_oauthlib/ pyasn1_modules/ wheel/
google_auth_oauthlib-0.4.1.dist-info/ pyasn1_modules-0.2.8.dist-info/ wheel-0.33.6.dist-info/
google_pasta-0.1.8.dist-info/ requests/ wrapt/
grpc/ requests-2.22.0.dist-info/ wrapt-1.11.2.dist-info/
grpcio-1.26.0.dist-info/ requests_oauthlib/
それでは、tensorflowを実行してみましょう。
(tensorflow) > python -c "import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
2020-01-26 15:46:58.754784: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-01-26 15:46:58.816952: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7fb603cc1fc0 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2020-01-26 15:46:58.816983: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version
tf.Tensor(-895.4408, shape=(), dtype=float32)
結果が表示されたので、動作したようです。 そこで、もうひとつチュートリアルを実行してみましょう。 ここに【For beginners】というコードのサンプルがあるので、実行してみます。 以下のソースコードをapp.pyとして保存しましょう。
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)
保存したら、実行してみます。
(tensorflow) > python app.py
python app.py
2020-01-26 16:16:05.646391: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-01-26 16:16:05.928127: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7ff5e4907aa0 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2020-01-26 16:16:05.928196: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version
Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 5s 88us/sample - loss: 0.2914 - accuracy: 0.9155
Epoch 2/5
60000/60000 [==============================] - 3s 52us/sample - loss: 0.1427 - accuracy: 0.9581
Epoch 3/5
60000/60000 [==============================] - 3s 49us/sample - loss: 0.1075 - accuracy: 0.9683
Epoch 4/5
60000/60000 [==============================] - 3s 43us/sample - loss: 0.0882 - accuracy: 0.9733
Epoch 5/5
60000/60000 [==============================] - 3s 43us/sample - loss: 0.0740 - accuracy: 0.9772
10000/10000 [==============================] - 0s 36us/sample - loss: 0.0726 - accuracy: 0.9784
なにやらメッセージが表示されていますが、実行できたようです。 仮想環境を終了するには、以下のコマンドを実行します。
(tensorflow) > deactivate
>
以下のことを実行・確認しました。
- OSの管理領域に、MacPortsを使ってpython3とpipをインストール
- OSの管理領域に、pipを使ってvirtualenvをインストール
- 仮想環境に、virtualenvを使ってtensorflowをインストールして、実行できることを確認