機械学習(1)TensorFlowをMacにインストールする

TensorFlowは、Googleが開発し公開している機械学習ライブラリ。

インストール方法

Pythonパッケージ管理ツール「easy_install」を使うとよいとのことなので、以下のコマンドを実行。このとき、XCodeのコマンドラインツールのインストールも求められる。

sudo easy_install pip
sudo easy_install --upgrade six
sudo pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.8.0-py3-none-any.whl

tensorflow-0.8.0-py3-none-any.whl is not a supported wheel on this platform.

TensorFlowを入れるためにはpip3(python3)が必要とのこと。
brewからpython3のインストールを行う。

このときpythonのバージョン管理を行うことのできるpyenvを入れておくと、Python2.7とPython3を切り替えることができるので便利。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install pyenv

現在のPythonバージョンを確認することができる。

pyenv versions
* system (set by /Users/***/.pyenv/version)

まだ何も入れていないので、systemのみ。

ここで、~/.profileファイル(ログイン時に読み込むbash設定)に以下を追加。
設定を読み込ませるためにOS再起動。

vi ~/.profile

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"

インストール可能なバージョンを確認して、Python3(今回は3.5.1)をインストール。

pyenv install --list
pyenv install 3.5.1

使用するPythonのバージョンを3.5.1に変更。

pyenv global 3.5.1
pyenv versions
  system
* 3.5.1 (set by /Users/eiji/.pyenv/version)

このときにもし以下のようなエラーが発生する場合は…

Downloading Python-3.5.1.tgz...
-> https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
Installing Python-3.5.1...

BUILD FAILED (OS X 10.11.4 using python-build 20160130)

Inspect or clean up the working tree at /var/folders/my/txp4p33n1lzf2hbzp0vmqbc40000gn/T/python-build.20160515224141.3027
Results logged to /var/folders/my/txp4p33n1lzf2hbzp0vmqbc40000gn/T/python-build.20160515224141.3027.log

Last 10 log lines:
  File "/private/var/folders/my/txp4p33n1lzf2hbzp0vmqbc40000gn/T/python-build.20160515224141.3027/Python-3.5.1/Lib/ensurepip/__main__.py", line 4, in <module>
    ensurepip._main()
  File "/private/var/folders/my/txp4p33n1lzf2hbzp0vmqbc40000gn/T/python-build.20160515224141.3027/Python-3.5.1/Lib/ensurepip/__init__.py", line 209, in _main
    default_pip=args.default_pip,
  File "/private/var/folders/my/txp4p33n1lzf2hbzp0vmqbc40000gn/T/python-build.20160515224141.3027/Python-3.5.1/Lib/ensurepip/__init__.py", line 116, in bootstrap
    _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
  File "/private/var/folders/my/txp4p33n1lzf2hbzp0vmqbc40000gn/T/python-build.20160515224141.3027/Python-3.5.1/Lib/ensurepip/__init__.py", line 40, in _run_pip
    import pip
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1

XCodeのコマンドラインツールもインストールする。

xcode-select --install

最後に、TensorFlowをインストール。

sudo pip3 install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.8.0-py3-none-any.whl

インストールされたかどうかの確認は、以下のコマンドを打ってエラーが発生しないことを確認する。

python

Python 3.5.1 (default, May 15 2016, 09:29:31) 
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

import tensorflow as tf 

AWS S3(1)MacのデータをGlacierにバックアップする

iMacに保存されているデータをAmazon Glacierに定期バックアップする。

Amazon Glacierは、長期バックアップに最適なストレージで、非常に低コストであることが特徴である。費用はリージョンごとに異なり、バージニアリージョンであれば0.007USD/GB、東京リージョンであれば0.0114USD/GB、1TBのデータを保存しても月額800円程度と安価である。Glacierは、データをアーカイブとして保存するため、アップロード後にデータを改変することができない。S3ではデータの保存先にGlacierを指定することが可能で、ライフサイクル設定によりデータを定期的にGlacierにアーカイブ可能となっている。

AWS CLI のインストール

MacからAWSにアクセスするためには、コマンドラインツールであるAWS CLIの利用が便利である。AWS CLIは、pip(Pythonパッケージ管理システム)からインストールが可能である。

$ sudo pip install awscli
  Downloading six-1.10.0-py2.py3-none-any.whl
Installing collected packages: pyasn1, rsa, futures, jmespath, six, python-dateutil, docutils, botocore, s3transfer, colorama, awscli
  Found existing installation: six 1.4.1
    DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling six-1.4.1:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip/basecommand.py", line 209, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip/commands/install.py", line 317, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip/req/req_set.py", line 726, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip/req/req_install.py", line 746, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip/req/req_uninstall.py", line 115, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip/utils/__init__.py", line 267, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 302, in move
    copy2(src, real_dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 131, in copy2
    copystat(src, dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 103, in copystat
    os.chflags(dst, st.st_flags)
OSError: [Errno 1] Operation not permitted: '/tmp/pip-oO8sKD-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'

上記のようにsixが既にインストールされているという警告が出てインストールできない場合は、以下のコマンドでインストールを行う。

$ sudo pip install awscli --upgrade --ignore-installed six

インストール完了後は、認証情報の設定を行う。AWS Access Key IDAWS Secret Access Keyなどの認証情報は、AWSマネージメントコンソールのAWS Identity and Access Managementから設定が可能である。

$ aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json

S3初期設定

S3の設定を行い、データを格納するバケットの生成および、Glacierへバックアップを行うライフサイクル設定をする。安価にデータをバックアップするという目的でGlacierを使用することから、今回は単価が最も安いバージニアリージョンをする。

バケットの生成

バケットを生成する。
このときAWS CLIに設定したユーザにS3へのアクセス権限がないとエラーが発生する。

$ aws s3 mb s3://backup-hoge --region us-east-1
make_bucket failed: s3://backup-hoge/ A client error (AccessDenied) occurred when calling the CreateBucket operation: Access Denied

そこで、AWSマネージメントコンソールのAWS Identity and Access Managementで、該当ユーザにAmazon S3 Full Access権限を付与する。

ポリシーのアタッチ

また、S3のバケット名はユニークである必要があるので、既に同一名称のバケットが存在する場合は、下記のようなエラーが発生するので注意が必要である。

$ aws s3 mb s3://backup-hoge  --region us-east-1
make_bucket failed: s3://backup-hoge/ A client error (BucketAlreadyExists) occurred when calling the CreateBucket operation: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.

ライフサイクル設定

次にライフサイクル設定で、どの程度の頻度でGlacierへアーカイブするかを設定する。
今回は、以下の設定としている。

設定内容 JSON
即日アーカイブする “Days”: 0″
特定のディレクトリに限定することなくバケット全体をアーカイブする “Prefix”: “”
Glacierへアーカイブする “StorageClass”: “GLACIER”

このとき、「”Prefix”: null」とすると、フォーマットエラーとなる。

vi /tmp/lifecycle.json

{
    "Rules": [
        {
            "Status": "Enabled", 
            "Prefix": "", 
            "Transition": {
                "Days": 0, 
                "StorageClass": "GLACIER"
            }, 
            "ID": "backup for xxx"
        }
    ]
}

JSONが作成できたら、ライフサイクル設定の反映を行う。

aws s3api put-bucket-lifecycle --bucket backup-hoge --lifecycle file://lifecycle.json

同期処理

同期処理は以下のコマンドにより実行できる。deleteオプションによりファイル削除も同期される。また、excludeオプションによって同期対象外のファイルやフォルダを指定できるので、.DS_Storeファイルなどを指定しておくと良い。excludeオプションは、条件の数だけいくつでも追記できる。

aws s3 sync /Volumes/hoge/ s3://backup-hoge --delete --exclude '*.DS_Store'