====== Mozaik ======
> Mozaik is a workflow system for spiking neuronal network simulations written in Python that integrates model, experiment and stimulation specification, simulation execution, data storage, data analysis and visualization into a single automated workflow. This way, Mozaik increases the productivity of running virtual experiments on complex heterogenous spiking neuronal networks.
From https://github.com/CSNG-MFF/mozaik
----
===== Installation =====
The installation of Mozaik requires a large number of dependencies and is __specifically only tested on modern Ubuntu Linux distributions__. As part of its mandatory requirements, it includes:
* More than **27** system packages as essential pre-requisites
* A further **25** //additional// Python modules over and above those modules listed amongst the system packages, above
* //Another// **5** applications or libraries installed //from source// from Github
Outside of a single user environment where that user has complete admin control over the Linux environment it can be difficult to manage these requirements in such a way that it does not impact other users. Therefore, it is suggested that a __container environment__ is used to encapsulate the entire software requirements and allow the application to run on non-Ubuntu platforms - this //includes// **Comet**.
=== Container Definition ===
A pre-written container definition/build file is provided for anyone who wishes to build Mozaik for themselves.
* {{:advanced:software:mozaik.zip|mozaik.zip}} - A zip containing the container definition file, suitable for use with Apptainer or Singularity
=== Building The Container ===
On Comet you will first need to load the Apptainer module, then use the Mozaik definition file to build the container image
* See the Comet [[advanced:apptainer|Apptainer]] help guide
This should be as simple as running:
$ module load apptainer
$ apptainer build mozaik.sif mozaik.def
Note that due to the number of additional libraries and dependencies this can be a reasonably long process. Ultimately when the process is finished you will find a large ''mozaik.sif'' file - this is your container with Ubuntu Linux, all the software dependencies and the Mozaik application. You //do not// need to run the ''apptainer build'' process again, unless you decide to upgrade the version of Mozaik.
----
===== Testing =====
While running the container some of the Nest and Mozaik models want to write to their own install/lib directories - this is unusual, and another reason why Mozaik doesn't appear to work very well outside a single user. However, we can fake this by mounting a temporary filesystem over the top of the container at runtime.
In the test below we:
* Load the apptainer environment module
* Start apptainer
* Tell apptainer to execute a single command inside the container
* Instruct apptainer to add a temporary, writeable overlay (tmpfs) to allow write to the filesystem (which will be thrown away at the end of runtime)
* Mount the local directory ''./input'' within the container as ''/input''
* Run the script ''test.sh'' from our ''./input'' directory as the single command to ''exec''
$ module load apptainer
$ apptainer exec --writable-tmpfs --bind input:/input mozaik.sif /input/test.sh
The contents of the ''test.sh'' file matches the //Running Examples// test given from the [[https://github.com/CSNG-MFF/mozaik|Mozaik Github repository]] - it is intended to demonstrate that the installation is working.
#!/bin/bash
# Extend the system and python search paths
export PATH=$PATH:/opt/nest/bin
export PYTHONPATH=/opt/nest/lib/python3.12/site-packages
cd /opt/mozaik/examples/VogelsAbbott2005
python3 run.py nest 2 param/defaults 'test'
After running the apptainer command you should see output that matches that included below:
(OSS 2410.0) [n1234@cometlogin02(comet)]$ apptainer exec --writable-tmpfs --bind input:/input mozaik.sif /input/test.sh
INFO: gocryptfs not found, will not be able to use gocryptfs
-- N E S T --
Copyright (C) 2004 The NEST Initiative
Version: 3.4
Built: Nov 17 2025 21:30:00
This program is provided AS IS and comes with
NO WARRANTY. See the file LICENSE for details.
Problems or suggestions?
Visit https://www.nest-simulator.org
Type 'nest.help()' to find out more about NEST.
Nov 18 08:45:47 Install [Info]:
loaded module PyNN extensions for NEST
START MPI
Loading parameters
Finished loading parameters
mozaik.sheets.vision.VisualCorticalUniformSheet
0 Loaded component VisualCorticalUniformSheet from module mozaik.sheets.vision
0 Loaded component VisualCorticalUniformSheet from module mozaik.sheets.vision
0 Creating VisualCorticalUniformSheet with 3200 neurons.
0 Creating VisualCorticalUniformSheet with 800 neurons.
0 Creating UniformProbabilisticArborization between VisualCorticalUniformSheet and VisualCorticalUniformSheet
0 Connector UniformProbabilisticArborization took 3s to compute
0 Creating UniformProbabilisticArborization between VisualCorticalUniformSheet and VisualCorticalUniformSheet
0 Connector UniformProbabilisticArborization took 1s to compute
0 Creating UniformProbabilisticArborization between VisualCorticalUniformSheet and VisualCorticalUniformSheet
0 Connector UniformProbabilisticArborization took 2s to compute
0 Creating UniformProbabilisticArborization between VisualCorticalUniformSheet and VisualCorticalUniformSheet
0 Connector UniformProbabilisticArborization took 0s to compute
0 Loaded component RCRandomPercentage from module mozaik.sheets.population_selector
0 Loaded component RCRandomPercentage from module mozaik.sheets.population_selector
0 Starting Experiemnts
0 Starting experiment: PoissonNetworkKick
0 Running model
0 Loaded component RCRandomN from module mozaik.sheets.population_selector
0 Loaded component RCRandomN from module mozaik.sheets.population_selector
0 Loaded component RCRandomN from module mozaik.sheets.population_selector
0 Loaded component RCRandomN from module mozaik.sheets.population_selector
0 Simulating the network for 56 ms
0 Finished simulating the network for 56 ms
0 Sheet Exc_Layer average rate: 20.661157
0 Sheet Inh_Layer average rate: 24.609844
0 Stimulus presentation took 2 s, of which 1 s was simulation time
0 Stimulus 1/1 finished. Memory usage: 475MB
0 Experiment 1/2 finished
0 Starting experiment: NoStimulation
0 Running model
0 Simulating the network for 270.0 ms
0 Finished simulating the network for 270.0 ms
0 Sheet Exc_Layer average rate: 11.906948
0 Sheet Inh_Layer average rate: 13.787737
0 Stimulus presentation took 2 s, of which 2 s was simulation time
0 Stimulus 1/1 finished. Memory usage: 477MB
0 Experiment 2/2 finished
0 Total simulation run time: 5s
0 Simulator run time: 2s (46%)
0 Mozaik run time: 2s (53%)
Final memory usage: 479MB
Starting visualization
0 Starting PSTH analysis
0 PSTH analysis took: 0.00044417381286621094seconds
0 Starting TrialAveragedFiringRate analysis
0 TrialAveragedFiringRate analysis took: 0.00011348724365234375seconds
0 Starting Irregularity analysis
0 Irregularity analysis took: 8.130073547363281e-05seconds
0 Starting NeuronToNeuronAnalogSignalCorrelations analysis
0 NeuronToNeuronAnalogSignalCorrelations analysis took: 8.20159912109375e-05seconds
0 Starting PopulationMeanAndVar analysis
0 PopulationMeanAndVar analysis took: 0.0014793872833251953seconds
0 DSV info:
0 Number of recordings: 4
0 InternalStimulus : 4
0 Number of ADS: 1
0 Connections : 1
0 RECORDING RESULTS
0 {"module_path" :"mozaik.stimuli","direct_stimulation_name":'Kick', "direct_stimulation_parameters":MozaikExtendedParameterSet({'exc_firing_rate': 100.0, 'exc_weight': 0.1, 'drive_period': 56.0, 'population_selector': {'component': 'mozaik.sheets.population_selector.RCRandomPercentage', 'params': {'percentage': 20.0}}}), "duration":56, "frame_duration":56, "name":'InternalStimulus', "trial":0}
0 {"module_path" :"mozaik.stimuli","direct_stimulation_name":'Kick', "direct_stimulation_parameters":MozaikExtendedParameterSet({'exc_firing_rate': 100.0, 'exc_weight': 0.1, 'drive_period': 56.0, 'population_selector': {'component': 'mozaik.sheets.population_selector.RCRandomPercentage', 'params': {'percentage': 20.0}}}), "duration":56, "frame_duration":56, "name":'InternalStimulus', "trial":0}
0 {"module_path" :"mozaik.stimuli","direct_stimulation_name":None, "direct_stimulation_parameters":None, "duration":270.0, "frame_duration":270.0, "name":'InternalStimulus', "trial":0}
0 {"module_path" :"mozaik.stimuli","direct_stimulation_name":None, "direct_stimulation_parameters":None, "duration":270.0, "frame_duration":270.0, "name":'InternalStimulus', "trial":0}
0 ANALYSIS RESULTS
0 {"module_path" :"mozaik.analysis.data_structures","analysis_algorithm":'connection storage', "identifier":'Connections', "name":'Connections', "neuron":None, "proj_name":'ExcExcConnection', "sheet_name":None, "source_name":'Exc_Layer', "stimulus_id":None, "target_name":'Exc_Layer'}
0 OverviewPlot plotting took: 0.2823832035064697seconds
0 OverviewPlot plotting took: 0.20375967025756836seconds
0 OverviewPlot plotting took: 0.29886937141418457seconds
0 RasterPlot plotting took: 0.32535862922668457seconds
0 RasterPlot plotting took: 0.35002732276916504seconds
(OSS 2410.0) [n1234@cometlogin02(comet)]$
----
===== Running Via Slurm =====
Running Mozaik via Slurm on a compute node is quite simple; all you need to do is load the Apptainer module in your sbatch file. In the example below we:
* Run the job on the **default_free** partition
* Use the account code **my_account_code**
* Use up to 8 CPU cores
* Run for up to 30 minutes
#!/bin/bash
#SBATCH --partition=default_free
#SBATCH --account=my_account_code
#SBATCH -c 8
#SBATCH -t 00:30:00
module load apptainer
# This assumes:
# 1. You want to mount $HOME/data as a writeable directory in the container
# 2. Your container image is on the /nobackup filesystem
# 3. The commands you want mozaik to run (including the path to Python and
# your Mozaik model commands) are in the runner.sh script in $HOME/data/runner.sh
apptainer exec --writable-tmpfs --bind $HOME/data:/data /nobackup/proj/my_project/mozaik.sif /data/runner.sh
----
===== Issues =====
As detailed with [[:advanced:apptainer|Apptainer]], [[:advanced:podman|Podman]] and [[:advanced:docker|Docker]] you can __only create new containers on the login nodes__. Do not attempt to create new containers whilst your job is running on a compute node.
Once your container exists you can then run it on __any__ compute node via a Slurm job, or an interactive [[advanced:interactive|Open OnDemand]] desktop session.
----
[[:advanced:software|Back to Advanced software page]]