KZKY memo

自分用メモ.

Comparison between Multiprocessing and Multithreading in Python

Comparison between Multiprocessing and Multithreading in Python

See
github.com

GAN: Generative Adversarial Network

前からやってたかったのでGANをやってみた.

GAN

GANの学習は非常難しいのが率直な感想.生成画像がかなりブラー.

Python Shared Memory

データリードがボトルネックになる時があるので,IPC経由でデータを渡す場合とSharedMemory経由でデータを渡す場合で比較してみた.

Shared Memory for Data Storage

SSL Ladder Network

Semi-Supervised LearningにおけるLadder Networkを実装した.Permuration-Invariant MNISTで,100ラベルで98%の正答率が出たので,大体再現出来たと言える.

SSL Ladder Network

References

  • Rasmus, A., Valpola, H., Honkala, M., Berglund, M., & Raiko, T. (2015). Semi-Supervised Learning with Ladder Networks. Neural and Evolutionary Computing; Learning; Machine Learning.
  • Pezeshki, M., Fan, L., Brakel, P., Courville, A., & Bengio, Y. (2016). Deconstructing the Ladder Network Architecture (icml). Icml, 48, 1–15.

Cython with nogil

Cythonでgilを外せるので外したときにどれくらい高速化されるのかを見てみた.

Cython with nogil

Thread + Cython (nogil)が一番良いと思う.

Cython基本

Cythonでできるのこと

  • .pyxをcコードにする
  • Cythonの変数にcの型をもたせられる
  • C/C++ APIの利用

要するに,pythonぽく書けるので生産性が高くて,高速化も可能.

Installation

pip install cython

Hello World

ここここに書いてみた.

コンパイル方法

2通りある.

  • pyximport: 外部Cライブラリや特殊なビルド設定が必要ない場合.
  • setup.py: 上記以外の場合.自作のCライブラリに依存している等.Makefileと思っておけばいい.

pyximport

import pyximport; pyximport.install(pyimport = True)
import (basename ${filename.pyx} .pyx)

な感じで使う.

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [Extension("helloworld", ["helloworld.pyx"])]
)

な感じのコードを書く.

build_extはbuildコマンドで,Extensionは,この名前の.soができる.

使い方は,

python setup.py build_ext [--inplace]

静的片付け

def cdef type func(type param)  # 関数引数の場合

cdef type param0, param1, ...  # 変数の場合

とかく.

サンプルを書いた

結果
kzk@localhost:~/languages/cython/speedup_exmaple
$ python main.py
666666.686668
Python: 0.354106903076 [s]
666666.686668
Cython: 0.196939945221 [s]
666666.686668
cdef Cython: 0.0480411052704 [s]
666666.686668
cdef v2 Cython: 0.00502610206604 [s]

### Ratio Comparison### 
Python: 1.0
Cython: 1.79804509785
cdef Cython: 7.37091499213
cdef v2 Cython: 70.4535837958

すげーはやい.

C/C++ APIの複雑なラップ等は,チュートリアル,ユーザガイド,リファレンスを見ながらやればいい.

現状Cythonを使うというユースケースで思いつくのは,

Chainer (1.12.0)をさわってみた

わけあって,Chainerを触らなくてはならなくなった,再び触ってみた.

Installation

環境
  • Chainer: 1.12
  • OS: Ubuntu15.04
  • CUDA: 7.5
  • Compiler: cpp-4.9, g++-4.9, gcc-4.9, cc-4.9
  • cudnn: v5

CUDA7.5の場合,gcc4.9を使わないとならないようなので注意.

まとめ

所感

Link, Chainが増えたと聞いていたが,他にデータ関連のIterator, モデル最適化ループ用のUpdater,その他もろもろの便利APIが入っていた.新しい便利APIの方は,今のところわかりづらい.位機能が入っていた.新しい便利APIの方は,今のところわかりづらい.

まともにChainerを触った(大部分は写経した)のは初めてだが,結構使いやすいと思った.