Neuliteカーネルは実用最小限製品

Neuliteカーネルは実用最小限製品 (Minimum Viable Product, MVP) です。公式のカーネルが提供する機能は、(1) シナプス入力の計算、(2) イオンチャネルの計算、(3) カルシウム濃度の計算、(4) ケーブル(膜電位)の計算、(5) スパイク発射判定、(6) スパイク伝播のみです。NEURONやArborのようなスイスアーミーナイフではありません。そもそもそれら以外の仕事はフロントエンド(BMTKとbionet_lite)の役割だからですが、他にも理由があります。

理由1
私たちは1ミリ秒でも速く計算を終わらせたいです。多くの汎用シミュレーターは高速ですが、最速ではありません。なぜなら計算の速度はシミュレーターだけでなく、モデルの構造や規模とそれを実行する計算機のアーキテクチャに依存するからです。例えばランダムネットワークだったらNEST風のランダムに分割してラウンドロビンで分散させる並列化が速いし、近距離結合が密で遠距離結合が粗な構造を持つネットワークだったらMONET風のタイル分割が速いでしょう。ニューロンの発火率が低ければ動的時間刻みが効くし、Stiffnessが高くなければ陽解法が使えます。GPUの場合は世代によって使える技術が違うし、ネットワークの規模によってパラメータを調整する必要があります(レジスタスピルを避けるため)。「富岳」でもL1, L2キャッシュから溢れないようにループを分割したりキャッシュブロッキングを意識してコードを書くことが必要です。つまり、最速を得るためには専用のコードを書く必要があるのです。それは汎用のシミュレーターではできないし、そもそもそういうコンセプトのシミュレーターは、私の知る限り存在しません。

ですので、必要なのは「そのままでも十分速いけど、最適化を限界まで詰められる」枠組みであり、それは明解なデータ構造を持つ簡潔なCのコードということになります。それがNeuliteカーネルです。

理由2
YAGNI原則です。自分たちが使わない機能を実装する責任は負いたくありません。必要な機能はそれを必要とするよく分かっている人が実装すべきで、そのためにカーネルを極端にシンプルにしています。

現時点で自力では難しそうでも、チュートリアルやワークショップをこれから随時開催しますから、それらに参加してもらって、相談しながら実装していくことが可能です。カーネルのソースコードのライセンスはGPLv2ですので、後に続く人達のために、機能を追加したらコードはGPLv2で共有してください。

理由3
MVPであることを徹底することで、公式のカーネルはわずか2,000行、MPI版でも2,500行程度です。これならLLMにコードを丸ごと渡して修正させることが可能です。例えば独自のイオンチャネルを実装するようなことは、自力でやるまでもなくLLMがやってくれるでしょう。

理由4
単一のシミュレーターで1ニューロンのシミュレーションから全脳規模のシミュレーションまでをスケーラブルにさせることは極めて困難です。モデルの規模が小さく計算ノード数が数百程度であれば、単一の設定ファイルを全ノードで読み込んで実行してもいいですが、例えば「富岳」全系で全皮質モデルを実行する場合は、事前に各ノードが計算するデータだけを抽出した設定ファイルをノード数分用意するようにしないと、ファイルのI/Oが詰まって計算が止まるしそもそもメモリに乗らなくなります。すなわち”one size fits all” (1つのサイズで全部まかなう) 戦略は機能しません。必要なのは”simple things should be simple, complex things should be possible” (簡単なことは簡単に、複雑なことは可能に) 戦略で、そのために公式カーネルはMVPであり続けます。

拡張したカーネルは全て”flavors”という形で、公式 (vanilla) カーネルとは別に提供します。