Ubuntuにpyenv+pyenv-virtualenvを入れるときのメモ

  • pyenv

    • 異なるバージョンのPythonを、ホームディレクトリのレベルで管理するソフト.
  • pyenv-virtualenv

    • パッケージの切り分けを可能にする仮想環境を,pyenvでインストールしたバージョンのPythonを元にして作成するpyenvのプラグイン

まずはpyenvを ~/.pyenv にインストールする.

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

pyenvを利用するには~/.bashrc等に以下の設定を追加する.

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

続いてpyenv-virtualenvを ~/.pyenv/plugins/pyenv-virtualenv にインストールする.

$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

同じく,~/.bashrc等に

eval "$(pyenv virtualenv-init -)"

を追加する.


インストールできたか確認.

$ which pyenv
/home/buko106/.pyenv/bin/pyenv

などと表示されればOK.


お好みのバージョンのPythonをインストールする.

$ pyenv install 3.6.2
Downloading Python-3.6.2.tar.xz...
-> https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz
Installing Python-3.6.2...
Installed Python-3.6.2 to /home/buko106/.pyenv/versions/3.6.2

ビルドが走るので少し待つ.なにも表示されなければOK.

ファイル群は全て,~/.pyenv/versions/3.6.2/ にインストールされる.


続いて仮想環境を作成する.今回は流行りのtensorflowのための仮想環境を作ってみる.

仮想環境を作成するコマンドはpyenv virtualenv (元にするPythonのバージョン) (仮想環境につける名前)となる.

$ pyenv virtualenv 3.6.2 tensorflow
$ pyenv activate tensorflow
(tensorflow) $

上記のようにプロンプトに仮想環境名が表示されれば,その環境が有効になっている.

(tensorflow) $ pip install --upgrade tensorflow
(tensorflow) $ python
>>> import tensorflow as tf
>>> tf.__path__
['/home/buko106/.pyenv/versions/tensorflow/lib/python3.6/site-packages/tensorflow']

しっかりと仮想環境下にあるパッケージが読み込まれている.

仮想環境から出るには

(tensorflow) $ pyenv deactivate 
$ 

ライブラリの依存関係でハマった時に使うコマンド

ldd

elf binaryやshared objectに対して使える.

使用例

~$ ldd /usr/bin/apt
    linux-vdso.so.1 =>  (0x00007fff362ab000)
    libapt-pkg.so.5.0 => /usr/lib/x86_64-linux-gnu/libapt-pkg.so.5.0 (0x00007f504c29d000)
    libapt-private.so.0.0 => /usr/lib/x86_64-linux-gnu/libapt-private.so.0.0 (0x00007f504c04a000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f504bcbf000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f504baa8000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f504b6de000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f504b4d9000)
    libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f504b2be000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f504b0a4000)
    libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f504ae93000)
    liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f504ac71000)
    liblz4.so.1 => /usr/lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f504aa59000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f504a74f000)
    /lib64/ld-linux-x86-64.so.2 (0x0000556e99f8c000)

ld

使用例 ※カレントディレクトリにa.outが生成される可能性あり.

~$ ld --verbose -Y $LD_LIBRARY_PATH -lbz2
(中略)
attempt to open //usr/local/lib/x86_64-linux-gnu/libbz2.so failed
attempt to open //usr/local/lib/x86_64-linux-gnu/libbz2.a failed
attempt to open //lib/x86_64-linux-gnu/libbz2.so failed
attempt to open //lib/x86_64-linux-gnu/libbz2.a failed
attempt to open //usr/lib/x86_64-linux-gnu/libbz2.so succeeded
-lbz2 (//usr/lib/x86_64-linux-gnu/libbz2.so)
libc.so.6 needed by //usr/lib/x86_64-linux-gnu/libbz2.so
found libc.so.6 at //lib/x86_64-linux-gnu/libc.so.6
ld-linux-x86-64.so.2 needed by //lib/x86_64-linux-gnu/libc.so.6
found ld-linux-x86-64.so.2 at //lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
ld: warning: cannot find entry symbol _start; not setting start address

2017/08/13 更新

$LD_LIBRARY_PATHが正しく処理されないので,上記だとだめ.

g++ main.cpp -o main -Wl,--verbose -lbz2

とすれば,$LD_LIBRARY_PATHを含むパス探索が見られる.

gcc>=5.4.0をLinuxでビルドする方法

Installing GCC - GNU Project - Free Software Foundation (FSF)に書いてある依存ライブラリ,GMP,MPFR,MPCをインストールする.

パッケージマネージャでシステムにインストールできれば良いですが,無理な場合はGMP,MPFR,MPCの順にソースからビルドする.

configureを動かす際に –with-gmp/mpfr/mpc などのオプションが必要になるだろう.

インストールしたGMP,MPFR,MPCにはLD_LIBRARY_PATHを通しておく.


gccのtar ballをGCC mirror sites - GNU Project - Free Software Foundation (FSF)らへんからダウンロードする.

configureを動かす際に –with-gmp/mpfr/mpc などのオプションが必要になるだろう.


ビルド中にシステムのインクルードファイルと変数/関数定義が衝突するので,

c++ - g++ 4.7.1 compilation error : conflicting types for ‘strsignal’ - Stack Overflow

を参考にして

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE

を叩いてからmakeする.

その際,コア数に合わせてジョブ数を-j4などと指定する.

Ubuntu+pyenv-virtualenv下のpython3にOpenCVの最新版をインストールした話

今回は

pyenv virtualenv 3.5.3 opencv

で作成した仮想環境にインストールする.

仮想環境にnumpyをインストール

pyenv activate opencv
pip install numpy

Releases - OpenCV library あたりからソースをダウンロード.

依存ライブラリは Documentation -> Introduction to OpenCV -> Installation in Linux に書いてある.


適当にビルドディレクトリを作成

cd /path/to/opencv-source
mkdir build
cd build

以下のスクリプトでcmakeを実行する.

ROOT=~/.pyenv/versions/3.5.3
VENV_ROOT=$ROOT/envs/opencv

cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=$VENV_ROOT \
-D INSTALL_C_EXAMPLES=OFF \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_legacy=OFF \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=ON \
-D PYTHON3_EXECUTABLE=$ROOT/bin/python \
-D PYTHON_LIBRARY=$ROOT/lib/libpython3.5m.a \
-D PYTHON_INCLUDE_DIR=$ROOT/include/python3.5m \
-D PYTHON_INCLUDE_DIRS=$ROOT/include/python3.5m \
-D PYTHON_INCLUDE_DIRS2=$ROOT/include/python3.5m \
-D INCLUDE_DIRS=$ROOT/include/python3.5m \
-D INCLUDE_DIRS2=$ROOT/include/python3.5m \
-D PYTHON3_PACKAGES_PATH=$VENV_ROOT/lib/python3.5/site-packages \
-D PYTHON3_NUMPY_INCLUDE_DIRS=$VENV_ROOT/lib/python3.5/site-packages/numpy/core/include \
..

参考

Install opencv3 for python 3.5.0 with pyenv on ubuntu 14.04 · GitHub

Ubuntu16.04をLet's Note(CF-MX3)にデュアルブートでインストールした話

Windows8に搭載されている「ディスクの管理」からCドライブ(SSD)のパーティションを縮小しようとしましたが、大きく縮小しようとするとうまく行きませんでした。

Windows7の標準機能「ボリュームの縮小」でパーティション容量が縮小できない問題について: Fat as a pig(ごんぶと)

最終的には下のページで勧められているフリーソフトを使いました。

www.disk-partition.com


  • Ubuntu16.04をインストールした話

日本語に対応させるなら下のページから手に入る日本語Remixを使ってインストールすると楽です。

Ubuntuの入手 | Ubuntu Japanese Team

変換メソッドはmozcが好きです。

qiita.com


  • 種々の問題の解決方法

WindowsUbuntuを切り替えて起動するたびに時間が9時間進んだり戻ったりします。 次のサイトで解決しました。

PCのハードウェアクロックをUbuntuUTC協定世界時)で扱っているのに対して、 Windows(日本語版)ではlocaltime(日本標準時)で扱っているためです。

zorinos.seesaa.net

バックライトの輝度が変更できない(Ubuntu上では数値が変わるが、実際は変化しない)問題がありました。

/usr/share/X11/xorg.conf.d/20-intel.conf を次のページに従い追加したら変化するようになりました。 ※未解決問題:電源を繋いだ瞬間に輝度が勝手に低下する(手動で戻すしかない)

askubuntu.com

内蔵スピーカーから音が出ない(イヤホンからは出る) 原因:スピーカーなのにHeadphoneとして認識されている。そしてHeadphoneの音量がミキサーのレベルで0になっている。 ひとまずの対応が以下

ターミナルからalsamixerを起動。

1枚目のサウンドカードを選択、2枚目はイヤホンを繋いだ状態、3枚目はイヤホンを抜いた状態。 f:id:buko1062000:20170707112429p:plain f:id:buko1062000:20170707112441p:plain f:id:buko1062000:20170707112446p:plain 内蔵スピーカーから音を出したいときは3枚目の状態から2枚目の状態に手動で戻す。

勝手に変わらないように設定する方法を教えてください。


  • その他

masahito.hatenablog.com

※日本国内で市販DVDのCSSをクラックして複製することは、著作権法第30条第1項第2号により私的使用にならないことが規定されています。再生するだけにしておきましょう。 kledgeb.blogspot.jp

2017/07/22 追加

do-you-linux.com

A Deep Learning Framework: Caffe リンク集

Caffeは昨今流行りのディープラーニングフレームワークの1つです。

Caffe | Deep Learning Framework

 

 

有名な他のフレームワークとして、ChainerやTensorflowというものがあります。

Caffeの特徴は学習済みのモデルが多数配布されていること、教師データのデータベースの作成がとても簡単(例えば画像データ群と、画像へのパスとカテゴリの列挙されたテキストデータがあればOK)であるということです。

Caffeで始めるディープラーニング

 

 

管理者権限の無いリモートのCentOS6マシンでビルドおよびPython Bindingを利用するに当たって、かなり手こずりました。以下の記事を参考にしました。

ディープラーニングライブラリBVLC/Caffeを管理者権限rootなしでインストールした時のメモ集 - Qiita

 

 

僕の場合は、すでに管理者権限でインストールされたものが多く

 

・Anacondaのインストール+要求モジュールをpipで導入

・Anacondaのpythonの実行バイナリを指定してBoostライブラリをビルド

Makefile.configを書く(CMakeは使わない)

 

の、だいたい3ステップでできました。

 

 

PythonはAnacondaを用いました。僕は自力で頑張りましたが、OSのPythonやライブラリ群とコンフリクトしないようにconda+pyenvを使うのが良いらしいです。

データサイエンティストを目指す人のpython環境構築 2016 - Qiita

 

 

3D-FCNを用いた論文手法をCaffeで実装するというタスクに取り組んでいます。Caffeは割と画像処理に特化しているので高次元のCNNについては情報が少ないです。またバージョンによって仕様が変わることも多いでしょう。

 

 

参照しているページを列挙します。

 

 

N次元の畳み込みは実装されているようです。

ND convolution with im2col by jeffdonahue · Pull Request #2049 · BVLC/caffe · GitHub

任意次元の教師データにはHDF5形式を用いる必要がある(?)ようです。

Caffeの3D-CNNを使ったダミーデータの学習 - Qiita

 

 

損失関数の形が特殊なので自作のPython Layerを書いています。

caffe/pyloss.py at master · BVLC/caffe · GitHub

Python implementation of softmax loss layer · Issue #4023 · BVLC/caffe · GitHub

 

 

既存のレイヤーの組み合わせで書けるかもしれないので要調査。

Caffe | Layer Catalogue

 

 

ルンゲ=クッタ法の気持ちを理解したい(1)

ルンゲ=クッタ法 - Wikipedia に関する課題が出たが、授業をロクに聞いていなかったため式だけを眺めていても気持ちが全く分からずに苦心した。そこでブログの投稿の練習も兼ねて記事にしてみる。

ルンゲ=クッタ法とは

Wikipediaによると

ルンゲ=クッタ法(英: Runge–Kutta method)とは、数値解析において微分方程式の初期値問題に対して近似解を与える一連の方法である。

上のページと同じく、{ \frac{\mathrm{d}y}{\mathrm{d}t} = f(t,y),\hspace{4mm} y(t_0)=y_0 } という初期値問題が与えられていると以下では考えることにする。

現実的な時間で十分な近似精度を得やすいので、数値解析の分野では重宝されるようだ。

オイラー

ルンゲ=クッタ法の一番簡単なケースとして、(前進)オイラー法がある。

以降に出てくる近似解を求めるアルゴリズムは、十分小さな刻み幅{ h }を設定し、時刻 { t_i = t_0 + i \cdot h } における { y(t_i) = y(t_0 + ih) } の近似値 { y_i } を順番に求めていくという部分は同じであるので覚えておいてほしい。

オイラー法は以下のような単純なアルゴリズムである。

{ y_{i+1} = y_i + h \cdot f(t_i,y_i) }

 { \frac{\mathrm{d}y}{\mathrm{d}t} = f(t,y) } であることを思い出せば、テイラー展開の1次までの項 { y(t_{i+1}) = y(t_i+h)=y(t_i) +   h \frac{\mathrm{d}y} {\mathrm{d}t}(t_i)  } を元にした近似式であることが分かる。

実はこの計算では十分な精度が得られない。

直観的には、直線近似をしているので { y_i }{ y(t_i) } の誤差がそのまま累積されていくことから、刻み幅として直線とみなせる十分に狭い区間をとる必要があると理解できる。

正確に言うと各ステップでの誤差が { {\rm O}(h^2) } であり、時刻{ t }までのステップ数は{ \frac{t}{h} } であるので、(時刻を固定したとき)誤差は { {\rm O}(h) } となる。

これは1桁精度をよくするために10倍の計算が必要になるということである。余りにも過大であるのが分かるだろう。

オイラー法のサンプルプログラム

次の初期値問題をオイラー法を用いて解いて、解析解と比較してみる。

{ \frac{\mathrm{d}y}{\mathrm{d}t} = f(t,y) = 2ty }

 {  y(0)=1}

解析的に解を求めると { y(t) = e^{t^2} } となる。 { y(1) = e }オイラー法で近似的に求めた値の誤差を両対数でプロットしてみる。

Pythonという言語が流行っているらしいのでPythonを使って書いたが、Pythonらしくない書き方をしていたらコメントで教えてほしい。

import numpy as np
import matplotlib.pyplot as plt

def f(t,y):
    return 2.0 * t * y

def ans(t):
    return np.exp(t**2.0)

m = 2
M = 7
N = np.logspace(m,M,M-m+1,10,dtype=int) # 10^m ... 10^M
Y = np.zeros(M-m+1)
for n in N:
    h = 1.0 / float(n) # h = 1 / n
    y = 1.0
    for i in range(0,n):
        t = float(i)/float(n)
        y = y + h * f(t,y)
    Y[np.where(N==n)] = y

plt.xscale("log")
plt.yscale("log")
plt.title("Euler method")
plt.xlabel("step width")
plt.ylabel("error")
plt.grid(which="both")
plt.plot(1.0/N,abs(Y-ans(1.0)),"o-",markersize=13) # ( h , |y - e| )
plt.show()

f:id:buko1062000:20161225233604p:plain

まさかオイラー法だけで(1)が終わってしまうとは思わなかった。 (2)へ (そのうち)