日々の足跡、試行版

アクセスカウンタ

zoom RSS ニューラルシミュレータNEST

<<   作成日時 : 2010/11/23 22:33   >>

ブログ気持玉 0 / トラックバック 1 / コメント 0

数週間まえまで、ニューラルシミュレータNEST (Neural Simulation Technology) というソフトウェアを仕事で利用していた。以下、NESTについて調べて分ったことのまとめです。

 NESTとは、積分発火ニューロンなどの比較的単純なモデルニューロンをノードとし、複雑な結合パターンを持ったニューロンネットワークの振るまいをシミュレーションすることを目的にしてして作られたソフトウェアである。UNIX (Linux) やMac (OS X) に対応する。SLIという独自のフロントエンド&インタプリンタをもち、インタプリンタを介してニューロンやシナプスに対応するノード(オブジェクト)を作成&結合してニューロンネットワークを作成し、シミュレーションを行う。GUIは持たない。ただし、最近はPythonのモジュールとしても提供されるようになり(PyNEST)、PyNEST中でLAPACKのフロントエンドモジュールNumpy, Scipyおよびグラフ表示モジュールMatplotlibと連携させる事ができる。したがって、NESTは複雑な行列計算やグラフ表示などの機能と組み合わせて使うことができる。用途によるものの、多くの場合はPyNESTを使うことになる。

 例えば、下のようなPythonスクリプトを書くと、積分発火ニューロン "n" を作成して時刻 50, 56, ..., 150 ms にシナプス入力 "s" を行うシミュレーションを 200 ms おこない、膜ニューロン膜電位 "m" が上昇してスパイクが発生する様 "e" をグラフ表示することができる。

#!/usr/bin/env python

runtime = 200
import nest
import numpy as np
import pylab as pl

nest.ResetKernel()

# Create a neuron object
n = nest.Create('iaf_cond_alpha', params = {'V_reset': -70.0})

# Create a synaptic input object
s = nest.Create('spike_generator')
nest.SetStatus(s, {"spike_times": np.arange(50.0, 150.0, 6.0)})


# Create recording devices
m = nest.Create('multimeter', params = {'withtime': True,
        'interval': 0.1,
        'record_from': ['V_m']})
e = nest.Create('spike_detector');

# Make connections between objects
nest.Connect(s, n, syn_spec={'weight': 50.0})
nest.Connect(m, n)
nest.Connect(n, e)

# Simulation
nest.Simulate(runtime)

# Graph
pot = nest.GetStatus(m)[0]['events']
pl.figure()
pl.plot(pot['times'], pot['V_m'], linewidth=2)
pl.axis([0, runtime, -75, -13])
pl.xlabel('Time [ms]')
pl.ylabel('Membrane pot [mV]')
for k in nest.GetStatus(e,"events")[0]['times']:
        pl.plot([k, k], [-75, -13], color='r', linewidth=2)
pl.show()

画像


(Slightly modified on 2015/07/01)

 NESTは、既にあるニューラルシミュレータNEURONやGENSISと外見的には大きく違わない。しかし、内部的な構造はずいぶん異なる。NEURONやGENESISは、基本的に時間についてのODE(PDE?)を数値的に解く「ODEソルバ」であるのに対し、NESTはとにかく「特定時刻に生じるイベントをオブジェクト間で受け渡す」ことを基本的な機能としている。もちろん、NESTも「イベント発生を検知するため」に一定間隔の時間ステップを単位に情報を処理する。例えば、ニューロンオブジェクトは各時間ステップで(複数の)入力イベントを処理しつつ内部状態の遷移を計算して内部状態を更新し、(発火)条件を満たせば出力イベントを送信する。ただし、この時間ステップはODEソルバの時間ステップではない。NESTにおいてODEを数値的に解く必要がある場合は、個々のオブジェクトが独自にGnu scientific library (GSL)中のODEソルバを呼び出す仕様になっており、シミュレータ本体でODEを解くことはない。なぜ、このような仕様になっているのか?実は、多くの単純なニューロンモデルは単に時間に関する指数関数減衰のダイナミクスしか持たない場合が多く、そもそもODEソルバを使用する必要がない。ODEソルバを使わなくて良いなら使わない方が計算が速いので、強制的にODEソルバを使わなくても良いようになっている。さらに、入力イベントと出力イベントが一対一に対応するシナプスオブジェクトに至っては、単位時間ステップ毎にオブジェクトが呼び出されることさえない。オブジェクトは、入力イベントがあったときのみ呼び出されて必要な計算を行い、内部状態を更新して出力イベント(遅延や強度)を送信する。

 このようにシミュレータ本体がイベント時刻の通信処理のみに特化することでよい点は、計算スピードが速くなること、各々のオブジェクトの独立性が高いのでプログラムが並列化しやすくなることである。おそらく大規模なニューラルネットワークをスーパーコンピュータ上でもっとも効率的にシミュレートすることができるであろう。一方、欠点は連続時間情報のオブジェクト間通信がとても難しいこと。例えば、NESTでマルチコンパートメントニューロンモデルを作ることは簡単ではなく、おそらく自作のC++のコードを埋め込んでしまう以外に方法がない。それでも、面倒な時間についてのイベント処理をシステム側にお願いしたかったり、スーパーコンピュータを用いたときにスレッドやMPIの処理をお願いしたい場合などを考えると、NESTを使う理由が生まれてくる。

 で、このNESTは、実際のところ計算論的神経科学(Computational neuroscince)の研究ツールとして使えるのか?という問いには、利用者自身がC++に詳しく、かつニューラルネットワークの大規模シミュレーションを目的にするのでなければ、もう少しこなれるのを待った方が良いかな?という印象。シミュレータのプログラム自体(C++)は、(少なくとも以前使用したGENESIS/kkitに比べて)大規模ソフトウェアを開発するときの作法に則ってとてもエレガントに書かれている。ただ、NESTがどのようなシミュレーションに利用されるか?という利用者の観点からは改善の余地は多い(と思っている)。仕様にゆとりがなく、融通が利きにくい感あり。例えば、シナプス可塑性をシミュレーションしたとき、シナプス強度の時間変化を記録する術がない。もちろん、自分で記録用に新たなオブジェクトを作ればよいのだが、それはすなわち自分でC++ を用いてメモリ(バッファ)を管理するプログラムを書くことである。素人用や教育用と考えるとちょっと難しい。プロ向けである。

NESTのインストール方法

NESTを使うにあたって、インストールに手こずったので簡単なまとめ。いや、正確にはNESTのみのインストールはとても簡単であった。研究室のPCクラスタ(Redhat ES4)内でごく普通にコンパイル&インストールでき、SLIが立ち上がってデモプログラムが動いた。予めGSLを (rpmファイルで) インストールしておく必要があることに注意するくらい。問題はPyNESTのインストールである。PyNESTをインストールするためには、予めPython, numpy, scipy, matplotlib, ipythonがインストールされている必要がある(Software:Installation の Dependencies 参照)。さらに、numpy, scipyには数値計算ライブラリlapack, blasを必要とするし、 matplotlibは X 出力のためのバックエンドを必要とする。

 研究室のPCクラスタ (Redhat ES4) において、up2date によりダウンロード&インストールできる Python は Ver2.3.4 まで。ダウンロードした Numpy-1.5.0/Matplotlib? を動かすには古かった。そこで、Python 最新バージョン (Ver3.0) のソースをダウンロードしてコンパイル&インストールするが、今度は Python3 系列は新しすぎるため (Experimental packageのため) matplotlib が対応していないことを知りげんなりする。また、デフォルトで起動する /usr/sbin/Python を Python2.X から 3.X にシンボリックリンクで入れ替えると、up2date が起動しなくなった。この時点で PyNEST をPCクラスタへインストールすることはあきらめる。

 翌日、検討ののち手持ちのデスクトップパソコンに CentOS 5 (Redhat linux ES5に対応) をインストールして、NEST専用機(?)にしてしまうことに決定。最大の理由は、David Cournapeau さんと言う方が Fedora Core 8, openSUSE 10.2, RHEL/CentOS 5のためにlapack3-3.0, numpy-1.2.0, scipy-0.6.0, refblas3-3.0 のコンパイル後RPMファイルを作成&公開してくれていることを確認したため。 NESTのメールリストでは、Ubuntu linux の最新バージョンを使うことが勧められている。私は Redhat 系列以外の Distribution 固有の特徴を勉強する暇も、RHEL 5 のためにお金を払うこともできなかったので CentOS 5 にした。

 CentOS 5 において、通常の yum でダウンロードできる Python の最新版 2.4.3 をインストール。さらに上記 lapack, refblas, numpy, scipy の rpm ファイルをインストール。さらに、Matplotlib をインストール。最新の Matplotlib-1.0.0 だと Python 2.5 または 2.6 が必要なようなので(?)、ちょっと古めの Matplotlib-0.98.5.3 をダウンロード&インストールした。

 ただし、上記構成ではNEST拡張モジュール開発のために勧められている GNU autotools のバージョン (m4-1.4.11, libtool-2.2.6, autoconf-2.62, automake-1.11) を満たさない (Writing an Extension Module の Compilation and Installation 参照) 。CentOS 5 の yum で手に入る最新のバージョンは m4-1.4.5, libtool-1.5.22, autoconf-2.59, automake-1.9.6。現在のところ、一応問題なく動作しているが、拡張モジュールをコンパイルした後、自動でリンクしてくれる機能が動いていない様子なのでマニュアルでリンクしている (Writing an Extension Module の Using MyModule および Linking MyModule into NESTの項参照)。

月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(1件)

タイトル (本文) ブログ名/日時
プラダ アウトレット
ニューラルシミュレータNEST 日々の足跡、試行版/ウェブリブログ ...続きを見る
プラダ アウトレット
2013/07/07 01:01

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
ニューラルシミュレータNEST 日々の足跡、試行版/BIGLOBEウェブリブログ
文字サイズ:       閉じる