跳转到主要内容

NEURON建模语言源到源编译器框架

项目描述

github workflow Build Status codecov CII Best Practices

NMODL框架是NEURON建模语言(NMODL)的代码生成引擎。它使用现代编译器和代码生成技术设计,以

  • 提供用于解析、分析和转换NMODL的模块化工具

  • 提供易于使用的高级Python API

  • 为包括CPU、GPU在内的现代计算架构生成优化代码

  • 具有实现新模拟后端的灵活性

  • 支持完整的NMODL规范

关于NMODL

像NEURON(https://www.neuron.yale.edu/neuron/)这样的模拟器使用NMODL作为领域特定语言(DSL)来描述广泛的膜和细胞内子模型。以下是一个在NMODL中指定的指数突触的示例

NEURON {
    POINT_PROCESS ExpSyn
    RANGE tau, e, i
    NONSPECIFIC_CURRENT i
}
UNITS {
    (nA) = (nanoamp)
    (mV) = (millivolt)
    (uS) = (microsiemens)
}
PARAMETER {
    tau = 0.1 (ms) <1e-9,1e9>
    e = 0 (mV)
}
ASSIGNED {
    v (mV)
    i (nA)
}
STATE {
    g (uS)
}
INITIAL {
    g = 0
}
BREAKPOINT {
    SOLVE state METHOD cnexp
    i = g*(v - e)
}
DERIVATIVE state {
    g' = -g/tau
}
NET_RECEIVE(weight (uS)) {
    g = g + weight
}

安装

有关从源构建NMODL的详细说明,请参阅INSTALL.rst

尝试使用Docker使用NMODL

为了快速测试NMODL框架的分析功能,我们提供了一个docker镜像,其中包含NMODL框架Python库和功能齐全的Jupyter笔记本环境。安装dockerdocker-compose后,您可以从终端拉取并运行NMODL镜像。

要直接从CLI尝试Python接口,您可以将docker镜像作为运行

docker run -it --entrypoint=/bin/sh bluebrain/nmodl

并尝试在本README后面讨论的NMODL Python API

$ python3
Python 3.6.8 (default, Apr  8 2019, 18:17:52)
>>> from nmodl import dsl
>>> import os
>>> examples = dsl.list_examples()
>>> nmodl_string = dsl.load_example(examples[-1])
...

要尝试Jupyter笔记本,您可以下载docker compose文件并作为运行

wget "https://raw.githubusercontent.com/BlueBrain/nmodl/master/docker/docker-compose.yml"
DUID=$(id -u) DGID=$(id -g) HOSTNAME=$(hostname) docker-compose up

如果一切顺利,您应该在最后看到类似以下的状态消息

[I 09:49:53.923 NotebookApp] The Jupyter Notebook is running at:
[I 09:49:53.923 NotebookApp] http://(4c8edabe52e1 or 127.0.0.1):8888/?token=a7902983bad430a11935
[I 09:49:53.923 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
    To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-1-open.html
    Or copy and paste one of these URLs:
        http://(4c8edabe52e1 or 127.0.0.1):8888/?token=a7902983bad430a11935

基于上面的示例,您应该打开浏览器并导航到以下URL http://127.0.0.1:8888/?token=a7902983bad430a11935

您可以在“examples”文件夹中打开和运行提供的所有示例笔记本。您也可以在“my_notebooks”中创建新的笔记本,这些笔记本将存储在当前工作目录的“notebooks”子文件夹中。

使用Python API

NMODL框架安装完毕后,您可以使用Python解析API加载NMOD文件

from nmodl import dsl

examples = dsl.list_examples()
nmodl_string = dsl.load_example(examples[-1])
driver = dsl.NmodlDriver()
modast = driver.parse_string(nmodl_string)

parse_file API返回输入NMOD文件的抽象语法树(AST)表示形式。可以通过将其转换为JSON形式来查看AST

>>> print (dsl.to_json(modast))
{
  "Program": [
    {
      "NeuronBlock": [
        {
          "StatementBlock": [
            {
              "Suffix": [
                {
                  "Name": [
                    {
                      "String": [
                        {
                          "name": "POINT_PROCESS"
                        }
                    ...

JSON形式中的每个键都代表AST中的一个节点。您还可以使用可视化API查看AST的详细信息

from nmodl import ast
ast.view(modast)

这将打开网页浏览器中的AST视图

ast_viz

NMODL框架中的AST可视化

中心节点Program代表整个MOD文件,其每个子节点代表输入NMODL文件中的块。请注意,如果您正在使用Docker镜像,这需要X转发。

一旦创建AST,就可以使用现有的访问者进行各种分析/优化。也可以轻松使用Python访问者API编写自己的自定义访问者。有关详细信息,请参阅Python API教程

NMODL框架还允许我们将AST表示形式转换回NMODL形式

>>> print (dsl.to_nmodl(modast))
NEURON {
    POINT_PROCESS ExpSyn
    RANGE tau, e, i
    NONSPECIFIC_CURRENT i
}

UNITS {
    (nA) = (nanoamp)
    (mV) = (millivolt)
    (uS) = (microsiemens)
}

PARAMETER {
    tau = 0.1 (ms) <1e-09,1000000000>
    e = 0 (mV)
}
...

高级分析和代码生成

NMODL框架提供了丰富的模型内省和分析功能,使用各种访问者。以下是一个关于2015年发表在《Cell》上的大鼠新皮层柱微电路通道和突触的理论性能特性的例子(见此处)

nmodl-perf-stats

NMODL框架的性能结果

要了解如何编写自己的内省和分析工具,请参阅本教程

一旦执行分析和优化步骤,NMODL框架就可以为现代计算架构生成优化代码,包括CPU(Intel、AMD、ARM)和GPU(NVIDIA、AMD)平台。例如,实现了C++、OpenACC和OpenMP后端,可以在命令行中选择这些后端

$ nmodl expsyn.mod sympy --analytic

要了解更多有关代码生成后端的信息,请见此处。NMODL框架提供了许多选项(用于代码生成、优化步骤和ODE求解器),可以列出如下

$ nmodl -H
NMODL : Source-to-Source Code Generation Framework [version]
Usage: /path/<>/nmodl [OPTIONS] file... [SUBCOMMAND]

Positionals:
  file TEXT:FILE ... REQUIRED           One or more MOD files to process

Options:
  -h,--help                             Print this help message and exit
  -H,--help-all                         Print this help message including all sub-commands
  --verbose=info                        Verbose logger output (trace, debug, info, warning, error, critical, off)
  -o,--output TEXT=.                    Directory for backend code output
  --scratch TEXT=tmp                    Directory for intermediate code output
  --units TEXT=/path/<>/nrnunits.lib
                                        Directory of units lib file

Subcommands:
host
  HOST/CPU code backends
  Options:
    --c                                   C/C++ backend (true)

acc
  Accelerator code backends
  Options:
    --oacc                                C/C++ backend with OpenACC (false)

sympy
  SymPy based analysis and optimizations
  Options:
    --analytic                            Solve ODEs using SymPy analytic integration (false)
    --pade                                Pade approximation in SymPy analytic integration (false)
    --cse                                 CSE (Common Subexpression Elimination) in SymPy analytic integration (false)
    --conductance                         Add CONDUCTANCE keyword in BREAKPOINT (false)

passes
  Analyse/Optimization passes
  Options:
    --inline                              Perform inlining at NMODL level (false)
    --unroll                              Perform loop unroll at NMODL level (false)
    --const-folding                       Perform constant folding at NMODL level (false)
    --localize                            Convert RANGE variables to LOCAL (false)
    --global-to-range                     Convert GLOBAL variables to RANGE (false)
    --localize-verbatim                   Convert RANGE variables to LOCAL even if verbatim block exist (false)
    --local-rename                        Rename LOCAL variable if variable of same name exist in global scope (false)
    --verbatim-inline                     Inline even if verbatim block exist (false)
    --verbatim-rename                     Rename variables in verbatim block (true)
    --json-ast                            Write AST to JSON file (false)
    --nmodl-ast                           Write AST to NMODL file (false)
    --json-perf                           Write performance statistics to JSON file (false)
    --show-symtab                         Write symbol table to stdout (false)

codegen
  Code generation options
  Options:
    --layout TEXT:{aos,soa}=soa           Memory layout for code generation
    --datatype TEXT:{float,double}=soa    Data type for floating point variables
    --force                               Force code generation even if there is any incompatibility
    --only-check-compatibility            Check compatibility and return without generating code
    --opt-ionvar-copy                     Optimize copies of ion variables (false)

文档

我们正在编写用户文档,您可以找到当前草稿

引用

如果您想了解更多关于NMODL框架的信息,请参阅以下论文

  • Pramod Kumbhar,Omar Awile,Liam Keegan,Jorge Alonso,James King,Michael Hines和Felix Schürmann。2019年。用于NEURON建模语言的优化多平台源到源编译框架。在Eprint:arXiv:1905.02241

支持/贡献

如果您发现任何问题,请提交工单。如果您想改进此框架,请参阅开放问题贡献指南

示例/基准

用于测试NMODL框架性能和解析能力的基准目前正在迁移到GitHub。这些基准将很快在以下存储库中发布

资助与致谢

本软件的开发得到了瑞士联邦理工学院(École polytechnique fédérale de Lausanne,简称EPFL)下属的蓝色大脑项目(Blue Brain Project)的资金支持,该项目由瑞士政府科技学院理事会提供。此外,开发还得到了美国国立卫生研究院(NIH)的资助,项目编号R01NS11613(耶鲁大学),以及欧盟“地平线2020”研究与创新框架计划的具体协议号785907(人脑项目SGA2)。

版权所有 © 2017-2023 蓝色大脑项目,EPFL

项目详情


发布历史 发布通知 | RSS 源

下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

此版本没有提供源代码分发文件。请参阅有关生成分发存档的教程。

构建分发

nmodl_nightly-0.6.330-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.9 MB 查看哈希值)

上传时间: CPython 3.12 manylinux: glibc 2.17+ x86-64

nmodl_nightly-0.6.330-cp312-cp312-macosx_10_15_x86_64.whl (2.9 MB 查看哈希值)

上传时间: CPython 3.12 macOS 10.15+ x86-64

nmodl_nightly-0.6.330-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.9 MB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ x86-64

nmodl_nightly-0.6.330-cp311-cp311-macosx_10_15_x86_64.whl (2.9 MB 查看哈希值)

上传于 CPython 3.11 macOS 10.15+ x86-64

nmodl_nightly-0.6.330-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.9 MB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.17+ x86-64

nmodl_nightly-0.6.330-cp310-cp310-macosx_10_15_x86_64.whl (2.9 MB 查看哈希值)

上传于 CPython 3.10 macOS 10.15+ x86-64

nmodl_nightly-0.6.330-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.9 MB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ x86-64

nmodl_nightly-0.6.330-cp39-cp39-macosx_10_15_x86_64.whl (2.9 MB 查看哈希值)

上传于 CPython 3.9 macOS 10.15+ x86-64

nmodl_nightly-0.6.330-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.9 MB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.17+ x86-64

nmodl_nightly-0.6.330-cp38-cp38-macosx_10_15_x86_64.whl (2.9 MB 查看哈希值)

上传于 CPython 3.8 macOS 10.15+ x86-64

支持