のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Anacondaを使ったPythonの環境構築

皆さんこんにちは
お元気ですか。私は暇です(だと信じています)。
最近ブログタイトルと本人の忙しさが一致していないと言われるので
とりあえず暇ですといってみます。

本日は、Anacondaについて書きます。

Anacondaについて

Anacondaとは

AnacondaはPythonのデータサイエンスプラットフォームで
100以上のライブラリを簡単に導入できます。

Pythonのバージョンを仮想環境を使って切り替えることや
科学技術演算ライブラリ(numpyなど)のインストールを行うことを簡単にできます。
Windowsを全く利用していなかった頃は気にしていなかったのですが、
numpyやscipyを簡単に使えます。(pipで入れるとC環境の関係でハマったことがあります。)

インストール方法

まずは、インストールです。インストール用パッケージは
Anacondaの公式サイトで公開されています。
インストール先のOSによって媒体が異なるので、適切な媒体を選択しましょう。

Download Anaconda Now! | Continuum

GUIだとクリックするとインストールがはじまりますのでその手順に従いましょう。
また、CUIの場合は、公式にも掲載されている以下のコマンドを
利用すればインストールできます。
後半のshのファイルパスはインストール環境に併せて変更してください。

$ bash Anaconda3-4.2.0-Linux-x86_64.sh

但し、このコマンドは対話的に設定を行うので、Dockerfileのコマンドなど
対話的で行えない環境の場合は追加でオプションが必要です。
その場合は次のコマンドを利用しましょう。

$ bash Anaconda3-4.2.0-Linux-x86_64.sh -b -p /root/anaconda3

オプションですが、-bはバッチモードです。
例えば、Dockerfileに書く時のように対話的に実行できない場合に利用します。

  • pはAnacondaのインストール先のパスを設定します。

最後に環境変数を設定します。Anaconda環境を標準の初期設定にしたい場合は、
.bashrcに予めexport文を書いておきましょう。

$ export PATH=/root/anaconda3/bin:$PATH

そして、「python」とコマンドを叩き、以下のようになると成功です。
特に確認する必要がある項目はAnaconda 4.2.0が表示されていることです。

$ python
Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  2 2016, 17:53:06)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

condaを使って環境を構築・確認する

Anacondaは付属のcondaでPythonの環境を作ったり、
新しいライブラリをインストールできます。
実際に構築してみましょう。

ライブラリのインストール

Anacondaにライブラリをインストールする時は、condaコマンドを使います。
まずは、conda searchを使い、インストールライブラリを確認します。
例えば、tensorflowをインストールする場合、次のようなコマンドを実行します。

$ conda search tensorflow
Fetching package metadata .......
tensorflow                   0.10.0rc0           np111py27_0  defaults
                             0.10.0rc0           np111py34_0  defaults
                             0.10.0rc0           np111py35_0  defaults

これらのパッケージをインストールするには、installコマンドを使います。

$ conda install tensorflow

但し、conda searchで見つからない見つからないライブラリはpipでインストールしましょう。

condaで入れたライブラリの一覧

conda listを入力するとライブラリの一覧を確認できます。

$ conda list
# packages in environment at /root/anaconda3:
#
_license                  1.1                      py35_1
_nb_ext_conf              0.3.0                    py35_0
alabaster                 0.7.9                    py35_0

仮想環境の構築と削除

仮想環境を構築します。今回は試しにPython3.6の仮想環境を構築します。

$ conda create -n py36 python=3.6 anaconda

構築した環境の確認は以下のようにできます。

$ conda info -e
# conda environments:
#
py36                  *  /root/anaconda3/envs/py36
root                     /root/anaconda3

また、構築した仮想環境ですが、removeコマンドで削除できます。

$ conda remove -n py36 --all
$ conda info -e
# conda environments:
#
root                  *  /root/anaconda3

仮想環境にライブラリをインストールする

インストールした環境にライブラリがない場合があります。
その場合、インストール方法は2つあります。

  1. conda searchを使い、検索し、インストールをする。
  2. pipを使ってインストールをする。

基本的には、conda searchしても見つからない場合はpipを使ってインストールします。

仮想環境の切り替え

この環境をactivateするには、sourceでこのコマンドを動かします。

$ source activate py36

逆に環境を無効化したい場合はdeactivateを使います。

$ source deactivate

condaのupdate

conda自身を更新することができます。
まずは、versionを確認しましょう。

$ conda --version
conda 4.2.9

次にversionを更新します。非常に簡単で、conda updateを使います。

$ conda update --prefix /root/anaconda3 anaconda

conda自身の情報

conda自身がどのような状態かは、conda infoを使えば確認できます。

$ conda info
Current conda install:

               platform : linux-64
          conda version : 4.3.13
       conda is private : False
      conda-env version : 4.3.13
    conda-build version : 2.0.2
         python version : 3.5.2.final.0
       requests version : 2.12.4
       root environment : /root/anaconda3  (writable)
    default environment : /root/anaconda3
       envs directories : /root/anaconda3/envs
                          /root/.conda/envs
          package cache : /root/anaconda3/pkgs
                          /root/.conda/pkgs
           channel URLs : https://repo.continuum.io/pkgs/free/linux-64
                          https://repo.continuum.io/pkgs/free/noarch
                          https://repo.continuum.io/pkgs/r/linux-64
                          https://repo.continuum.io/pkgs/r/noarch
                          https://repo.continuum.io/pkgs/pro/linux-64
                          https://repo.continuum.io/pkgs/pro/noarch
            config file : None
           offline mode : False
             user-agent : conda/4.3.13 requests/2.12.4 CPython/3.5.2 Linux/4.9.4-moby debian/jessie/sid glibc/2.19
                UID:GID : 0:0

最後に

一通りAnacondaを使った環境構築をやってみました!
・・・大変だった。。

Cookiecutterを使ってテンプレートからプロジェクトを作成する

皆さんこんにちは
お元気ですか。ユニクロの極暖Tシャツ着ているとかなり暑い。。。冬なのに

今日は、Cookiecutterを使ったテンプレートからの複製生成を試みます。
テンプレートからちょっと変えたい部分を用意することで、簡単に
似たプロジェクトを作成できます。

Cookiecutterについて

Cookiecutterは雛形となるテンプレートプロジェクトから
プロジェクトを生成するツールです。
雛形となるプロジェクトを作ってしまえば、少し変更したい箇所を指定して
新しいプロジェクトを作ります。

github.com

インストール

cookiecutterをpypiから取得できます。

sudo pip install cookiecutter

Cookiecutterを使った複製をやってみる。

頻繁に利用がありそうなテンプレートの雛形は既に用意されています。
とりあえず、何も考えずに作ってみましょう。

GitHub - ionelmc/cookiecutter-pylibrary: Enhanced cookiecutter template for Python libraries.の雛形を使用する場合は
次のように実行します。

cookiecutter gh:ionelmc/cookiecutter-pylibrary

途中で色々と聞かれるので必要のある箇所は入力します。

full_name [Ionel Cristian Maries]: tereka
email [contact@ionelmc.ro]:
website [https://blog.ionelmc.ro]:
github_username [ionelmc]:
project_name [Nameless]:
repo_name [python-nameless]:
package_name [nameless]:
distribution_name [nameless]:
project_short_description [An example package. Generated with cookiecutter-pylibrary.]:
release_date [today]:
Select year:
(略)

他にもflaskやdjango、restのプロジェクトがあります。
これで、確認すると変数となっていた箇所が指定した名前に
置き換わっていることを確認できます。
次はテンプレートを構築してみます。

テンプレートを作成に挑戦してみる。

準備されているテンプレートでは不足することもあるでしょう。
そんなときのために、自分で1からテンプレートを作ってみます。

ディレクトリの雛形は以下の通りです。

ディレクトリ構成

treeコマンドを使ってcookiecutterの雛形の構成を表示します。

.
└── TestProject
    ├── cookiecutter.json
    └── {{cookiecutter.project_name_lower}}
        └── README.md
cookiecutter.json

cookiecutter.jsonにcookiecutterの雛形で使う変数を定義します。

{
  "project_name" : "test-project",
  "create_document": "y",
  "license": ["MIT", "BSD-3", "GNU GPL v3.0", "Apache Software License 2.0"],
  "project_name_rower" : "{{ cookiecutter.project_name|replace('-', '_') }}"
}

{{ cookiecutter.<変数名> }}とすることで、その変数を埋め込めます。
また、埋め込んだ変数の文字を"-"→"_"に置換しています。
licenseの箇所はリストにしています。リストをjsonで入力した場合、
対話的に実行する時に候補を表示します。

README.md

プロジェクト内にあるREADME.mdにcookiecutterで
定義した変数を埋め込むテストをします。
今回、テストとして用意した文書は以下の通りです。

{{ cookiecutter.project_name}} document.

{% if cookiecutter.create_document == 'n' -%}
   No Document
{%- endif %}

{% if cookiecutter.create_document == 'y' -%}
{{cookiecutter.license}}

This is an apple.
{%- endif %}

このREADME内で、cookiecutterの変数を使えることは同じです。
追加で、if文を使った条件式を構築できます。上記の場合、
{% if cookiecutter.create_document == 'n' -%}はcreate_document変数がnの場合に動作し、
{% if cookiecutter.create_document == 'y' -%}はcreate_document変数がyの場合に動作します。

実行

コマンドラインからcookiecutter <ディレクトリ>で実行できます。
但し、ディレクトリ内にcookiecutter.jsonがないと実行できません。

$ cookiecutter TestProject/
project_name [test-project]: test-project
create_document [y]: y
Select license:
1 - MIT
2 - BSD-3
3 - GNU GPL v3.0
4 - Apache Software License 2.0
Choose from 1, 2, 3, 4 [1]: 2
project_name_lower [test_project]:

cookiecutter.jsonにリストで定義した設定は番号で選択できるようになっています。

作られたプロジェクトを確認する

最後に作ったプロジェクトを確認します。
まず、cookiecutterの変数になっていたディレクトリが
「test_project」の名前になりました。

.
└── test_project
    └── README.md
README.md
test-project document.



BSD-3

This is an apple.

README.mdを見ると、変数名が埋め込まれています。(test-project)
また、create_documentの条件が"n"となっている箇所が表示されていないことを確認できます。
更に、条件式が"y"の時に表示される文章を確認できました。

最後に

cookiecutterを使うと、基本となる雛形から
オリジナルのプロジェクトを簡単に作成できます。

ちょっとだけ変えたプロジェクトを作成したいことは結構あります。
意外に応用できそうなので、もっと使ってみたいと感じています。

Visual Studio CodeでC++の環境構築をやってみる

皆さんこんにちは
お元気ですか。私は元気です。

VIsual Studio CodeでC++の環境を構築します。
C++のコードを書く時に案外いいエディタがなくて結構困ります。
今まではsublime text+ pluginを使っていましたが、デバッガ厳しい、
補完難しいなど色々困っていました。

そこで、試しにVisual Studio CodeでC++の環境を作ってみました。

Visual Studio Code

Microsoftが作っているWindows, MacOS, Linuxで動作する
軽量高速な高機能エディタです。
Visual Studio Code - Visual Studioより)

ダウンロードは次のサイトを参考にしてください。
code.visualstudio.com

設定方法

まずは、Visual Studio CodeにC++の環境を構築します。
C++の開発機能であるcpptoolsを拡張機能(plugin)からインストールします。
その手順は次の通りです。

  1. Visual Studio Codeを開く
  2. 左から拡張機能を選択する。
  3. cpptoolsを検索する。
  4. インストールする。

f:id:tereka:20170211164158p:plain

Visual Studio Codeと色々な機能

前準備

ソースコードを準備します。他にも設定ファイルなどが必要なものはありますが、
それは適宜、準備していきます。

#include <iostream>
using namespace std;

int main(void){
    int a = 10;
    int b = 20;
    int c = a + b;

    cout << c << endl;
    return 0;
}

コンパイルをする

コンパイルのショートカットキーは「cmd + shift + b」を使うと可能です。
ただ、タスクランナーがないと出るので、「tasks.json」を作るように言われます。
そのため、tasks.jsonを設定します。tasks.jsonにはg++のコマンドを設定します。

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "0.1.0",
    "command": "g++",
    "isShellCommand": true,
    "args": ["-O2", "-g", "test.cpp"],
    "showOutput": "always"
}

デバッグ

Debugタブから起動すると、「launch.json」が作られます。
起動するためには、launch.jsonの修正が必要です。

"program"の値を以下に変更が必要です。この"program"は
実行ファイルのパスを記述します。

            "program": "${workspaceRoot}/a.out",

デバッグは以下のような画面で、gdbが使われます。
予め、break pointを仕掛けるとその箇所で止まります。
実際にデバッグすると次のような画面になります。

f:id:tereka:20170211164547p:plain

ヘッダーの設定

コマンドで、「C/Cpp: Edit Configurations」を選択すると
C++の設定ファイル「「c_cpp_properties.json」が作られます。
そのの内部にヘッダーを設定する箇所があるので、その箇所にヘッダーのパスを
設定をすると読み込みすることができます。

このファイルはOS別に設定ができるため、該当するOSの"includePath"を変更します。

            "includePath": [
                "/usr/include",
                "/usr/local/include"
            ],

関数検索

関数検索は「cmd + shift + O」を使えばできます。
後はその欄で該当するファイルを探しましょう。

f:id:tereka:20170211162214p:plain

最後に

C++のエディタで良いものがなかったので、これはいい感じだと思っています。

Dockerを使ってGPUも使える分析環境を構築してみた

皆さんこんにちは
お元気ですか。Kaggle Meetup面白かったです!またあいましょう。

今日はDockerを使った分析環境構築の話をしようと思います。
Dockerを使って何を作ろうかと思ったら、分析環境さっさと作りたい・・・
cudnn等の更新が面倒であることが思い浮かびました。

なんとなく、Dockerを使えば解消できるのではないかといったことを思いつき遊んでみました。

Dockerとは

Dockerはコードやシステムライブラリ、システムで利用するのを実行するために
必要な全てが含まれているものをラップするソフトウェアらしい。
OS上で仮想環境を立ち上げ、ソフトウェアなどの実行ができます。

www.docker.com

Dockerのメリット

公式サイトによれば、次のとおりです。

  1. 階層化されたファイルシステムから構築されるので、ディスクやイメージが効率的
  2. DockerコンテナはLinuxMacOS, Windowsで動かせる
  3. 安全らしい

何が嬉しいの?

一言で言うと環境の管理です。

Dockerを使うと定義したコマンドを変更するのみで
ソフトウェアの更新が簡単になります。
また、同じファイルを利用している限り、同じ環境が構築されるので
マシンによってversionなどの差分が生まれることもなくなります。

私個人として大きいのは環境の再現だと思っています。
誰もがDockerを使うと同じバージョン、同じ環境を手間なく使えます。
更新手順と同じにしておけば、複数人で開発しても環境が同じ等、メリットがあります。

インストール

MacOS

これを試すためにだけ、Sierraにアップグレードしました。
Docker for macをダウンロードし、インストールすれば、準備完了です。
docs.docker.com

Ubuntu

MacOSと違って手順が少々必要です。(公式より)

sudo apt-get install apt-transport-https \
                       ca-certificates
curl -fsSL https://yum.dockerproject.org/gpg | sudo apt-key add -

sudo apt-get install software-properties-common
sudo add-apt-repository \
       "deb https://apt.dockerproject.org/repo/ \
       ubuntu-$(lsb_release -cs) \
       main"
sudo apt-get update
sudo apt-get -y install docker-engine

dockerを試してみる。

まずは、dockerのイメージを取得します。
pullコマンドはイメージをダウンロードするコマンドです。

docker pull ubuntu:16.04

次にDockerを実行します。実行コマンドはrunを使えばできます。

docker run -it ubuntu:16.04
root@fe9c5c38a45a:/#

そして、共有フォルダです。
ホストとコンテナのディレクトリを共有できます。
これは、-vを利用するとマウントが可能です。<ホスト側のパス>:<コンテナ側のパス>を記述して起動することで実現できます。

docker run -v /Users/Tereka/Desktop/Mount:/tmp/ -it ubuntu:16.04

また、Imageの一覧を確認するには、次のコマンドを使うと良いです。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               104bec311bcd        2 weeks ago         129 MB
hello-world         latest              c54a2cc56cbb        6 months ago

dockerのコンテナ状態は次のコマンドで見れます。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e09f51e1b51c        ubuntu:16.04        "/bin/bash"         3 hours ago         Up 7 minutes

最後にコンテナの削除です。rmiコマンドを使うと可能です。

docker rmi <contener>:<tag>

どのようなimageがあるのかを検索したい時は、docker search
これを使うとpullで取得できるコンテナを探せます。

$ docker search centos
NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                                 The official build of CentOS.                   2963      [OK]
jdeathe/centos-ssh                     CentOS-6 6.8 x86_64 / CentOS-7 7.3.1611 x8...   54                   [OK]
nimmis/java-centos                     This is docker images of CentOS 7 with dif...   20                   [OK]
million12/centos-supervisor            Base CentOS-7 with supervisord launcher, h...   12                   [OK]
torusware/speedus-centos               Always updated official CentOS docker imag...   8                    [OK]

Dockerfileを書く

Dockerfileを書くことで、独自のイメージを作れます。

FROMを利用すると、他のイメージをベースにDockerイメージをベースに構築できます。
RUNを利用することで、実際にコマンドの実行ができます。

説明するよりも見る方が早いかと。

試しにChainerを実行するDockerfileを作りました。
日本語入力にも対応しているコンテナです。

FROM nvidia/cuda:7.5-cudnn5-devel

RUN apt-get update
RUN apt-get install -y wget
RUN apt-get -y install language-pack-ja-base language-pack-ja ibus-mozc

RUN update-locale LANG=ja_JP.UTF-8 LANGUAGE=ja_JP:ja
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
ENV LC_CTYPE ja_JP.UTF-8

RUN wget https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86_64.sh
RUN bash Anaconda3-4.2.0-Linux-x86_64.sh -b
ENV PATH /root/anaconda3/bin:$PATH
RUN echo $PATH

RUN pip install chainer

以下のコマンドはDockerfileをビルドし、cudnn_dockerの名前で新しいイメージを構築しています。

docker build -t cudnn_chainer .

途中で失敗すると既に実行された結果のキャッシュを使います。
そのため、修正して再トライするのは非常に早いです。

ただし、それまでの結果を更新したい(gitのリポジトリの最新を使いたい等)
結果のキャッシュを使いたくない場合は、キャッシュを無効にしなければなりません。

その場合は、以下のコマンドを使うとDockerfileに書いてある
全てのコマンドを対象にbuildを行います。

docker build -t --no-cache=true cudnn_chainer .

後はrunを使えば実行できます。

docker run -it cudnn_chainer

DockerでGPUを使う方法

しかし、これではGPUを使うとエラーが出ます。
GPUをDockerコンテナ上で動かす為にはGPUの色々な設定をする必要があるようです。

chainerの公式githubを確認すると、nvidia-dockerと呼ばれるコマンドがあるので
それを使うと解消できました。因みにnvidia-dockerリポジトリは以下にあります。

github.com

まずは、インストールですが、以下のとおりです。

wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0/nvidia-docker_1.0.0-1_amd64.deb
sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb

# 起動確認
nvidia-docker run --rm nvidia/cuda nvidia-smi

後は起動するだけです。起動はdockerの代わりにnvidia-dockerを使います。
試しに遊んでみたら高速だった。僕のcudnnが古すぎた。。

nvidia-docker run -it cudnn_chainer

最後

これで一通りDockerを扱える気がします。
気が向いたらもう応用できそうな記事を書きます。

2017年の挨拶とやりたいこと

あけましておめでとうございます。
今年もよろしくお願いします。

ふりかえりはしませんが、昨年はエキサイティングな1年間で色々なことに
挑戦していった年でした。
色々と課題も見えてきましたが・・・

今年はKaggleもしかりお仕事もしかり色々やっていったかなと思います。
結局、Kaggle Masterになれず、Competitions Expertにいます。
今年こそはなりたいなぁ

やりたいこと

今年度もやりたいことは沢山あります。

  1. 強化学習の勉強
  2. 数学の勉強
  3. Docker等の環境構築周りの勉強
  4. PyConJPへの登壇挑戦

色々な分野に強化学習を+αとする研究や論文が増えていると感じています。
本を読んで、勉強を進めたいと思います。
せめて、基本的なところがわかるようになりたい。

これからの強化学習

これからの強化学習

  • 作者: 牧野貴樹,澁谷長史,白川真一,浅田稔,麻生英樹,荒井幸代,飯間等,伊藤真,大倉和博,黒江康明,杉本徳和,坪井祐太,銅谷賢治,前田新一,松井藤五郎,南泰浩,宮崎和光,目黒豊美,森村哲郎,森本淳,保田俊行,吉本潤一郎
  • 出版社/メーカー: 森北出版
  • 発売日: 2016/10/27
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (2件) を見る

数学についても今年は行列演算を復習したり、ベースとなる知識を増やしたりしたいと思います。
加えて機械学習プロフェッショナルシリーズも読みたい。

行列プログラマー ―Pythonプログラムで学ぶ線形代数

行列プログラマー ―Pythonプログラムで学ぶ線形代数

カーネル多変量解析―非線形データ解析の新しい展開 (シリーズ確率と情報の科学)

カーネル多変量解析―非線形データ解析の新しい展開 (シリーズ確率と情報の科学)

更に、最近ではDockerなどによる分析基盤構築話を
時折Qiitaで見ます。そこで、少なくともDocker等を自分で
触れるようにしたいなぁなんて考えています。

最後に、PyConJPの登壇も目指したいなぁと思っています。
去年は聴衆として参加しましたが、せっかくだから話すネタを作って挑戦したいです。

(マーフィーなんて忘れた)

今年の記事

今年は何をメインに書こうかなぁと実家で考えていましたが、
去年と同じく、やったことを書いていくような感じになるでしょう。

去年は分野が結構偏っていたなぁと自分自身でも思っています。
機械学習・データ分析のみならず、色々と自由に書いていきたいと思います。
その結果、分野が偏ってしまった場合はご愛嬌ということで・・・

最後に

改めまして、皆様、今年もよろしくお願いします。