macOSにPython環境を構築する(pyenv+Anaconda)
macOSにPythonの開発環境を構築しました。データ分析と機械学習に興味があるためです。以下に、環境構築手順をまとめます。なお、構築した環境の維持、削除については、こちらにまとめました。
ちなみに、別構成(Python+pipenv)での構築手順は、こちらです。私自身は、2018/08/16現在、「Python+pipenv」で構築した環境を利用しています。
要件
- 開発用のPythonは、システムにプリインストールされているPythonと分けてインストールすること
- サンドボックス化された、複数の環境を持てるようにすること
構成
- macOS High Sierra
- Homebrew
- pyenv
- Anaconda(3系)
- TensorFlow / Keras
変更履歴
-
2018/07/26
- 初版作成
-
2018/07/28
- タイトルに構成を明記
- PDFの図表表示位置を明示的に指定する手順を追加(手順8)
- 設定ファイルへの追記内容に、コメントを追加(手順8、9)
- フォントについての説明を追加(手順9の補足)
- 動作確認用Kerasスクリプトを一部修正(手順11)
-
2018/08/04
- 手順8の修正対象ファイルを、
ipython_config.py
からipython_kernel_config.py
に訂正
- 手順8の修正対象ファイルを、
-
2018/08/04
- 段落のインデントを行う設定手順を追加(手順9)
-
2018/08/05
- 変更履歴の追加
- 注意事項に、
-bash: hoge: command not found
発生時の対応手順を追加 - 最新版のAnacondaをインストールするように明記(手順5)
- コマンド
conda
を機能拡張するための、~/.bashrc
への設定手順を追加(手順5) - 仮想環境作成時、ベース環境をクローンして作成する手順に変更(手順7)
- 仮想環境作成後、
conda update --all
する手順を追加(手順7) - TensorFlow、Kerasを、
pip
でなくconda
でインストールする手順に変更(手順7) - コマンド
source activate
をconda activate
に変更(手順7、8) - 全般に、見出しのレベルを変更
-
2018/08/05
- 冒頭に維持管理手順へのリンクを追加
- 補足追記(手順7)
-
2018/08/13
- 補足、参考サイト追記(手順6)
-
2018/08/16
- 冒頭に別構成での環境構築手順へのリンクを追加
概要
以下手順で環境構築します。
- Bash設定ファイルの整備
- Xcode、Command Line Toolsのインストール
- Homebrewのインストール
- pyenvのインストール
- Anacondaのインストール
- ワークスペースの作成
- 仮想環境の作成
- Jupyter Notebookの設定
- 日本語まわりの設定
- GNU Core Utilitiesのインストール
- 動作確認
注意事項
注意事項
- コマンド内に
<作成したワークスペース>
等の記載がある場合、各自の環境に合わせて読み替えて実行してください。冗長となるので、特に見落としそうな箇所を除けば、但し書きを書いていません。
pyenv versions
python -V
cd <作成したワークスペース>
pyenv versions
python -V
pyenv local anaconda<バージョン>
pyenv versions
python -V
- コマンドは、一行ずつ実行してください。
- 何かをインストール、設定したはずなのに、
-bash: hoge: command not found
と言って怒られるときは、コマンドexec $SHELL -l
で、シェルを再起動させると大体うまくいきます。
参考サイト
謝辞
環境構築、および、本稿の作成にあたっては、参考サイトに記載のサイトのほかにも、多くのサイトを参考にさせて頂きました。心より御礼申し上げます。
手順1. Bash設定ファイルの整備
目的
- Bash設定ファイルを作成し、メンテナンスしやすい状態にする
やること
- Bash設定ファイルの作成
- Bash設定ファイルの編集
手順
- ターミナルを起動し、以下コマンドを実行する。
touch ~/.bash_profile
touch ~/.bashrc
- Finderでホームに移動し、
[command] + [shift] + [.]
で、隠しファイルを表示する。 -
.bash_profile
をエディタ(テキストエディット等)で開き、.bashrc
を呼び出すよう冒頭に記載する。
test -r ~/.bashrc && . ~/.bashrc
補足
-
少し単純化して補足説明します。macOSでは、ターミナル起動時にログインシェルが実行され、ホームディレクトリ内の
.bash_profile
が読み込まれます。ターミナル上でコマンドbash
を実行すると、非ログインシェルが実行され、ホームディレクトリ内の.bashrc
が読み込まれます。このとき、環境変数は実行元から実行先へと引き継がれます。エイリアス等は引き継がれません。 -
以上をふまえると、以下とするのがスマートだと考えられます。
- 環境変数は、
.bash_profile
のみに記載する - エイリアスの定義、シェル関数の定義、コマンドライン補完の設定は、
.bashrc
のみに記載する -
.bash_profile
から.bashrc
を読み込むように記載する
- 環境変数は、
参考サイト
手順2. Xcode、Command Line Toolsのインストール
目的
- macOS上でビルドできるようにする
やること
- Xcodeのインストール
- Command Line Toolsのインストール
手順
- App StoreからXcodeをインストールする。
- ターミナルを起動し、コマンド
sudo xcodebuild -license
を実行する。 - コマンド
xcode-select --install
を実行すると、ダイアログが出るので、インストールを選択する。
手順3. Homebrewのインストール
目的
- macOSにソフトウェアを簡単にインストールできるようにする
やること
- Homebrewのインストール
手順
- ターミナルを起動し、Homebrewの公式サイトに記載のコマンド(スクリプト)を実行する。
手順4. pyenvのインストール
目的
- システムにプリインストールされているPythonとは別に、開発用のPythonをインストールできるようにする
やること
- pyenvのインストール
- Homebrewの、pyenvに対する警告に対処
手順
- ターミナルを起動し、以下コマンドを実行する。
brew install pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc
source ~/.bash_profile
source ~/.bashrc
- 以下コマンドを実行する。ただし、
<ユーザ名>
は、コマンドwhoami
の結果で置き換える。
whoami
brew doctor
echo 'alias brew="env PATH=${PATH/\/Users\/<ユーザ名>\/\.pyenv\/shims:/} brew"' >> ~/.bashrc
source ~/.bashrc
brew doctor
参考サイト
- GitHub - pyenv-pyenv- Simple Python version management
- phpenv入れてる時brew doctorしたら出るWarning消した
- 【Homebrew】brew doctorのWarning対処方法 (その3) + envコマンドについて
手順5. Anacondaのインストール
目的
- サンドボックス化された、複数の環境を持てるようにする
- 科学技術計算などを中心とした数多くのモジュールやツールをインストールする
やること
- インストール可能なAnacondaのバージョンの確認
- 最新版のAnacondaのインストール
- コマンド
conda
の機能拡張
手順
- ターミナルを起動し、以下コマンドを実行する。
pyenv versions
pyenv install -l | grep anaconda
pyenv install anaconda<バージョン>
pyenv versions
echo '. ~/.pyenv/versions/anaconda<バージョン>/etc/profile.d/conda.sh' >> ~/.bashrc
参考サイト
手順6. ワークスペースの作成
目的
- 開発物を体系的に管理できるようにする
- カレントディレクトリがワークスペースのとき、開発用のPythonが有効になるようにする
やること
- ワークスペース用のディレクトリの作成
- ワークスペースにてpyenvのコマンドを実行
手順
- ワークスペース用のディレクトリ(例:
~/private/python/workspace
)を作成する。 - ターミナルを起動し、以下コマンドを実行する。
pyenv versions
python -V
cd <作成したワークスペース>
pyenv versions
python -V
pyenv local anaconda<バージョン>
pyenv versions
python -V
補足
-
python -V
と入力する際、間違えて小文字でpython -v
と打つと、突如大量の文字列がターミナル上に表示され、戸惑うかもしれません。これは、結論的に言うと、何も問題ありません。単にpythonを対話モードで、かつverbose(冗長)オプション付きで起動したために起きる現象です。あせらず、quit()
と入力し、対話モードを抜けてください。抜ける際にも、clear
だのdestroy
だのと言ってビビらせてくれますが、単に環境を閉じているだけなので、安心してください。
参考サイト
手順7. 仮想環境の作成
目的
- ベースとなる環境とは別に、開発や実験用に、特定のパッケージをインストールした仮想環境を作成する
やること
- 仮想環境の作成
- TensorFlow、Kerasのインストール
手順
- ターミナルを起動し、以下コマンドを実行する。
cd <ワークスペース>
pyenv versions
conda info -e
conda create -n <仮想環境名> --clone base
pyenv versions
conda info -e
conda activate <仮想環境名>
pyenv versions
conda info -e
conda update --all
conda install -c conda-forge tensorflow
conda install keras
conda deactivate
補足
-
TensorFlowやKerasの公式サイトには、
pip
を用いてインストールするように指示がありますが、バージョン管理の一貫性の観点から、conda
を用いてインストールする手順としました。
手順8. Jupyter Notebookの設定
目的
- Jupyter Notebookから、仮想環境を選択できるようにする
- グラフをインライン表示できるようにする
- 作成したノートブックをLateX経由でPDFダウンロードできるようにする
- プログラミングやマークダウンを快適に行えるようにする
やること
- 仮想環境をJupyter Notebookのカーネルとして追加
- iPythonのプロファイルを作成し、グラフインライン表示されるように設定
- MacTexのインストール
- PDFの図表表示位置を明示的に指定
- 日本語等幅フォント(日本語と英語の幅が2:1のもの)のインストール
- 背景色が黒基調となるようなスタイルシートのダウンロード、編集
手順
- ターミナルを起動し、以下コマンドを実行する。
cd <ワークスペース>
jupyter kernelspec list
conda activate <仮想環境名>
ipython kernel install --user --name=<仮想環境名> --display-name=<Jupyter Notebook上での表示名>
jupyter kernelspec list
conda deactivate
- ワークスペース内で、コマンド
ipython profile create
を実行する。作成されたプロファイル(~/.ipython/profile_default/ipython_kernel_config.py
)の最下行に以下を追加する。
## Setting to display graph inline
c.InteractiveShellApp.exec_lines = ['%matplotlib inline']
- コマンド
brew cask install mactex
を実行する。 -
~/.pyenv/versions/anaconda<バージョン>/lib/python3.6/site-packages/nbconvert/templates/latex
直下のbase.tplx
を一箇所編集する。- PDFの図表が、次ページでなく、なるべくその場所に表示されるように指定(22行目と23行目の間、
\usepackage{graphicx}
の直下に、% set default figure placement to htbp
以下の4行を追加)
- PDFの図表が、次ページでなく、なるべくその場所に表示されるように指定(22行目と23行目の間、
〜中略〜
%===============================================================================
% Abstract overrides
%===============================================================================
((* block header *))
((* block docclass *))((* endblock docclass *))
((* block packages *))
\usepackage[T1]{fontenc}
% Nicer default font (+ math font) than Computer Modern for most use cases
\usepackage{mathpazo}
% Basic figure setup, for now with no caption control since it's done
% automatically by Pandoc (which extracts ![](path) syntax from Markdown).
\usepackage{graphicx}
% set default figure placement to htbp
\makeatletter
\def\fps@figure{htbp}
\makeatother
% We will generate all images so they have a width \maxwidth. This means
% that they will get their normal width if they fit onto the page, but
% are scaled down if they would overflow the margins.
〜中略〜
- Ricty Diminishedの公式サイトから、フォントファイル一式をダウンロードする。Font Bookを起動し、ダウンロードしたフォントファイルを追加する。
-
Oleg Levitsky氏のGitHub Gistより
custom.css
をダウンロードし、~/.jupyter/custom/
直下に保存する。保存したcssを三箇所編集する。- プログラミング用フォントの
font-family
に"Ricty Diminished"
を追加(49行目) - プログラミング用フォントの
font-size
を10pt
に変更(58行目) - ツールバーの非表示設定をコメントアウト(231行目)
- プログラミング用フォントの
〜(中略)〜
/*
SET THE CODE/MONOSPACE FONT
I prefer Bitsream Vera Sans Mono, which is freely downloadable here:
http://www.dafont.com/bitstream-vera-mono.font
However, there are plenty of alternatives at http://programmingfonts.org/
in which case, add your preferred font to the stack below.
*/
〜(中略)〜
div.output pre,
div.output code,
.rendered_html pre,
.rendered_html code,
div.completions select,
div.container pre {
font-family: "Ricty Diminished", "Bitstream Vera Sans Mono", Monaco, monospace;
}
div.output pre,
div.output code,
.rendered_html pre,
.rendered_html p code,
div.completions select,
div.container pre {
font-size: 10pt;
}
〜(中略)〜
/* NOTEBOOK AND EDITOR INTERFACE */
/* comment out the following line to unhide the toolbar */
div#maintoolbar {
/* display: none !important; */
}
〜(中略)〜
補足
- 当初、jupyterthemesの利用も検討しました。コマンドでテーマを切り替えられる素晴らしいツールですが、プログラミングやマークダウン時に日本語等幅フォント(日本語と英語の幅が2:1のもの)を使えるようにすることがどうしてもできなかったので、別の手段をとることにしました。マークダウン時、日本語を含む表を作成する際に、罫線が揃うようにしたかったためです。スタイルシートの作者であるOleg Levitsky氏、および、その先人達に感謝します。
- お気に入りの日本語等幅フォント(日本語と英語の幅が2:1のもの)があれば、そちらを利用しても構いません。フォントのファミリー名は、Font Bookで確認することができます。
- PDFダウンロード時、図表が次ページに送られる現象を当初どうしても解決できませんでした。突破口となったのは、参考サイトの四つ目、@cawpea氏の投稿でした。氏の投稿を参考に、PandocのLaTeX用テンプレートを生成。Jupyter NotebookのMarkdownをコマンド
pandoc
でテンプレートを用いてLaTeXに変換。通常版とDIFFをとることにより、ようやく必要な設定が見えてきた次第です。深く感謝します。
参考サイト
- Jupyterで複数カーネルを簡単に選択するための設定
- %matplotlib inlineを毎回書かなくて済む方法
- Installation — nbconvert 5.3.2.dev0 #installing-tex
- Pandocを使ってMarkdownを整形されたHTMLに変換する
手順9. 日本語まわりの設定
目的
- 作成したノートブックをLateX経由でPDFダウンロードする際、日本語が出力されるようにする
- グラフのタイトルやラベルに、日本語が表示されるようにする
やること
- LaTeX関連ファイルの作成、編集
- iPythonのプロファイルの編集、キャッシュのクリア
手順
- ターミナルを起動し、以下コマンドを実行する。
mkdir -p ~/texmf/tex/latex/local
touch ~/texmf/tex/latex/local/jalinebreak.sty
- 作成された設定ファイル(
jalinebreak.sty
)に以下(日本語の段落を右端で折り返す設定)を記載する。
\XeTeXlinebreaklocale "ja"
\XeTeXlinebreakskip=0pt plus 1pt
\XeTeXlinebreakpenalty=0
\def\<{\@ifstar{\zx@hwback\nobreak}{\zx@hwback\relax}}
\def\zx@hwback#1{\leavevmode#1\hskip-.5em\relax}
-
~/.pyenv/versions/anaconda<バージョン>/lib/python3.6/site-packages/nbconvert/templates/latex
直下のbase.tplx
を二箇所編集する。- フォントを指定する設定、段落のインデントを行う設定、
jalinebreak.sty
を読み込む設定を追加(16行目と17行目の間、\usepackage[T1]{fontenc}
の直下に、% Settings for displaying Japanese
以下の5行を追加) - 日本語フォントの指定を追加(175行目と177行目の間、
\begin{document}
の下に、% Settings for displaying Japanese
以下の4行を追加)
- フォントを指定する設定、段落のインデントを行う設定、
〜中略〜
%===============================================================================
% Abstract overrides
%===============================================================================
((* block header *))
((* block docclass *))((* endblock docclass *))
((* block packages *))
\usepackage[T1]{fontenc}
% Settings for displaying Japanese
\usepackage{fontspec}
\setlength{\parindent}{11pt}
\usepackage{indentfirst}
\usepackage{jalinebreak}
% Nicer default font (+ math font) than Computer Modern for most use cases
〜中略〜
((* block body *))
\begin{document}
% Settings for displaying Japanese
\setmainfont[BoldFont=HiraginoSans-W5]{HiraMinProN-W3}
\setsansfont{HiraginoSans-W5}
\setmonofont{RictyDiminished-Regular}
((* block predoc *))
〜中略〜
- iPythonのプロファイル(
~/.ipython/profile_default/ipython_kernel_config.py
)の最下行に以下を追加する。
## Settings for displaying Japanese
c.InlineBackend.rc = {
'font.size': 11,
'font.family': 'Osaka',
'figure.figsize': (6.0, 4.0),
'savefig.dpi': 80,
'axes.titlesize': 12
}
c.InlineBackend.figure_formats = set(['png', 'retina'])
- キャッシュ(
~/.matplotlib/fontList.json
)があれば、削除する。
補足
-
base.tplx
の設定では、mainfontに明朝体、BoldFontにその太字、sansfontにゴシック体、monofontに等幅フォントを指定すると、市販の多くの書籍のような書体になります。お気に入りのフォントがあれば、そちらを利用しても構いません。フォントのPostScript名やファミリー名は、Font Bookで確認することができます。 - 私にとってTeXまわりは未知の領域ですので、参考サイトの一つ目、@masa-ita氏の投稿に出会わなければ、ドツボにハマるところだったでしょう。御礼申し上げます。
参考サイト
手順10. GNU Core Utilitiesのインストール
目的
- macOSにプリインストールされているBSD系コマンドを、よりメジャーなGNU/Linux系コマンドに置き換える
やること
- GNU Core Utilitiesのインストール
手順
- ターミナルを起動し、以下コマンドを実行する。
brew install coreutils
echo 'export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"' >> ~/.bash_profile
echo 'export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"' >> ~/.bash_profile
echo "alias ls='ls --color=auto'" >> ~/.bashrc
source ~/.bash_profile
source ~/.bashrc
- 同様に、diffutils、colordiff、findutils、grepあたりをインストールしておく。コマンド
brew install <パッケージ名>
でよい。追加すべきPATH
があれば、インストール後に注意事項(Caveats
)として表示される。
参考サイト
手順11. 動作確認
目的
- 正しく環境構築できていることを確認する
やること
- Jupyter Notebookの背景色が白でなく黒基調であることの確認
- Jupyter Notebookから仮想環境を選択できることの確認
- Kerasが実行できることの確認
- グラフがインライン表示され、ラベルに日本語が表示されていることの確認
- マークダウンが日本語等幅フォントで行えることの確認
- ノートブックをPDF形式でダウンロードでき、日本語が出力されていることの確認
- GNU Core Utilitiesがインストールできていることの確認
手順
- 以下コマンドで、Jupyter Notebookを起動し、背景色が白でなく黒基調であることを確認する。
cd <ワークスペース>
jupyter notebook
-
新規ノートブックを作成し、このとき、作成した仮想環境を選択する。(選択できることを確認する。)
-
セルに以下のKerasコードを貼り付け、
[shift] + [return]
で実行する。実行できること、グラフが表示されること、および、グラフのラベルに日本語が表示されていることを確認する。
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
from keras.layers import Dense
from keras.models import Model
import matplotlib.pyplot as plt
# 学習データを生成する関数
def binary_encode(i, num_digits):
return np.array([i >> d & 1 for d in range(num_digits)])
# 正解ラベルを生成する関数
def fizz_buzz_encode(i):
if i % 15 == 0: return np.array([0, 0, 0, 1])
elif i % 5 == 0: return np.array([0, 0, 1, 0])
elif i % 3 == 0: return np.array([0, 1, 0, 0])
else: return np.array([1, 0, 0, 0])
# 訓練データ
NUM_DIGITS = 10
trX = np.array([binary_encode(i, NUM_DIGITS) for i in range(101, 2 ** NUM_DIGITS)])
trY = np.array([fizz_buzz_encode(i) for i in range(101, 2 ** NUM_DIGITS)])
# 検証データ
valX = np.array([binary_encode(i, NUM_DIGITS) for i in
range(2 ** NUM_DIGITS, 2 ** NUM_DIGITS + 100)])
valY = np.array([fizz_buzz_encode(i) for i in range(1, 101)])
# モデル
model = Sequential()
model.add(Dense(1000, input_dim=10, activation="relu"))
model.add(Dense(1000, activation="relu"))
model.add(Dense(4, activation="softmax"))
model.compile(loss='categorical_crossentropy', optimizer='adagrad', metrics=["accuracy"])
hist = model.fit(trX, trY, epochs=100, batch_size=128, validation_data=(valX, valY))
# 学習状況の可視化
acc = hist.history['acc']
val_acc = hist.history['val_acc']
plt.plot(range(100), acc, marker='.', label='訓練データ')
plt.plot(range(100), val_acc, marker='.', label='検証データ')
plt.legend(loc='best', fontsize=10)
plt.grid()
plt.xlabel('エポック')
plt.ylabel('正解率')
plt.show()
# バイナリのfizzbuzz変換
def fizz_buzz(i, prediction):
return [str(i), "fizz", "buzz", "fizzbuzz"][prediction]
# モデルを1から100の整数に適用してみる
numbers = np.arange(1, 101)
teX = np.transpose(binary_encode(numbers, NUM_DIGITS))
teY = model.predict_classes(teX)
output = np.vectorize(fizz_buzz)(numbers, teY)
print (output)
# 正解
answer = np.array([])
for i in numbers:
if i % 15 == 0: answer = np.append(answer, "fizzbuzz")
elif i % 5 == 0: answer = np.append(answer, "buzz")
elif i % 3 == 0: answer = np.append(answer, "fizz")
else: answer = np.append(answer, str(i))
# print (answer)
# 正解率
evaluate = np.array(answer == output)
print ("正解率:" + str(np.count_nonzero(evaluate == True) / 100))
- 新規にセルを追加し、タイプを
Markdown
に切り替える。以下文字列を貼り付け、罫線が揃っていることを確認する。[shift] + [return]
で表を描画する。
| 日本語と | 英語が混じっても | 罫線が | ずれない |
|:-----------------|-----------------:|:--------------:|:---------------:|
| Even if Japanese | and English mix, | the ruled line | does not shift. |
| 日本語と | 英語が混じっても | 罫線が | ずれない |
| Even if Japanese | and English mix, | the ruled line | does not shift. |
| 日本語と | 英語が混じっても | 罫線が | ずれない |
-
File
から、LaTex経由のPDF形式でダウンロードし、ダウンロードできること、日本語が出力されていることを確認する。 -
Notebookを保存し、閉じる。ブラウザを閉じる。ターミナルを
[control] + [C]
で停止する。 -
新規にターミナルを起動し、コマンド
ls
を実行する。ホームディレクトリ内のディレクトリが紫色で表示されていることを確認する。コマンドbash
を実行し、コマンドls
を実行する。ホームディレクトリ内のディレクトリが紫色で表示されていることを確認する。コマンドexit
を二回実行し、ターミナルを閉じる。
補足
Kerasのコードは、参考サイトの一つ目で@cvusk氏の書かれたコードに、学習時の検証データによる検証を追加したものです。学習状況を可視化する部分は、参考サイトの二つ目を参考にさせて頂きました。それぞれ御礼申し上げます。
参考サイト