公開日: 2020-01-26
更新日: 2020-05-27

macOSにPythonをインストールして機械学習の環境を構築する

macOSにPythonをインストールして機械学習の環境を構築する

macOSにpythonをインストールして機械学習を構築します。 Pythonをインストールには、以下の方法があります。

  1. Pythonの公式配布サイトからインストーラをダウンロードしてインストールする。
  2. MacPortsを使ってインストールする。
  3. Homebrewを使ってインストールする。
  4. DockerでPythonのコンテナを用意する。
私はMacPorts派なので、MacPortsでのインストール方法を説明します。 本記事の対象は以下の方々となります。
  • パッケージ管理は安全・安心の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
>

            

以下のことを実行・確認しました。

  1. OSの管理領域に、MacPortsを使ってpython3とpipをインストール
  2. OSの管理領域に、pipを使ってvirtualenvをインストール
  3. 仮想環境に、virtualenvを使ってtensorflowをインストールして、実行できることを確認
OSの管理領域への変更を最小限で済ませつつ、必要なパッケージをインストールして実行することができるようになりました。 次回以降、機械学習やディープラーニングの技術を扱っていきたいと思います。