Compare commits
4 Commits
4661646b4f
...
075d11b948
Author | SHA1 | Date | |
---|---|---|---|
075d11b948 | |||
1696d72a6f | |||
6de64dd5d0 | |||
b36d8a748d |
1
experiments/.gitignore
vendored
1
experiments/.gitignore
vendored
@ -7,3 +7,4 @@ batch/measurements/strong/*
|
|||||||
configs/measurements/strong/*
|
configs/measurements/strong/*
|
||||||
*.dat
|
*.dat
|
||||||
*.db
|
*.db
|
||||||
|
eval/generated/*
|
||||||
|
24
experiments/batch/julian-animation
Normal file
24
experiments/batch/julian-animation
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
#SBATCH --job-name=julian-animation
|
||||||
|
#SBATCH --account=hkf6
|
||||||
|
#SBATCH --partition=booster
|
||||||
|
#SBATCH --nodes=8
|
||||||
|
#SBATCH --ntasks=32
|
||||||
|
# Counted per node
|
||||||
|
#SBATCH --gres=gpu:4
|
||||||
|
#SBATCH --time=03:30:00
|
||||||
|
#SBATCH --output=logs/%x-%A_%a.log
|
||||||
|
#SBATCH --error=logs/%x-%A_%a.log
|
||||||
|
|
||||||
|
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
|
||||||
|
OUTPUT_DIR="/p/scratch/cellsinsilico/paul/nastja-out/${SLURM_JOB_NAME}"
|
||||||
|
|
||||||
|
echo "outdir is ${OUTPUT_DIR}"
|
||||||
|
|
||||||
|
mkdir -p "${OUTPUT_DIR}"
|
||||||
|
source "${SOURCE_DIR}/activate-nastja-modules"
|
||||||
|
|
||||||
|
srun --unbuffered "${SOURCE_DIR}/nastja/build-cuda/nastja" \
|
||||||
|
-c "${SOURCE_DIR}/ma/experiments/configs/${SLURM_JOB_NAME}.json" \
|
||||||
|
-o "${OUTPUT_DIR}"
|
0
experiments/batch/measurements/.gitkeep
Normal file
0
experiments/batch/measurements/.gitkeep
Normal file
330
experiments/configs/julian-animation.json
Normal file
330
experiments/configs/julian-animation.json
Normal file
@ -0,0 +1,330 @@
|
|||||||
|
{
|
||||||
|
"Comments": [
|
||||||
|
"Celltype Usage",
|
||||||
|
"0 Dynamic ECM",
|
||||||
|
"1-5 Not Used",
|
||||||
|
"6 Liquid ",
|
||||||
|
"7 Apoptotic cell Type ",
|
||||||
|
"8 Basic Non Dividing Cell type (surrounding)",
|
||||||
|
"9 Cancer"
|
||||||
|
],
|
||||||
|
"Application": "Cells",
|
||||||
|
"CellsInSilico": {
|
||||||
|
"ecmdegradation": {
|
||||||
|
"enabled": "false",
|
||||||
|
"steps": 99999,
|
||||||
|
"stochastic": "true",
|
||||||
|
"probability": 0.5
|
||||||
|
},
|
||||||
|
"energyfunctions": [
|
||||||
|
"Volume00",
|
||||||
|
"Surface01",
|
||||||
|
"Motility00",
|
||||||
|
"Adhesion01",
|
||||||
|
"DynamicECM00"
|
||||||
|
],
|
||||||
|
"liquid": 6,
|
||||||
|
"volume": {
|
||||||
|
"default": {
|
||||||
|
"storage": "const",
|
||||||
|
"value": 500
|
||||||
|
},
|
||||||
|
"lambda": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
7.5,
|
||||||
|
7.5,
|
||||||
|
7.5
|
||||||
|
],
|
||||||
|
"sizechange": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
-0.05,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"surface": {
|
||||||
|
"default": {
|
||||||
|
"storage": "const",
|
||||||
|
"value": 400
|
||||||
|
},
|
||||||
|
"lambda": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
5.625,
|
||||||
|
5.625,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"sizechange": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
-0.05,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"adhesion": {
|
||||||
|
"matrix": [
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
450
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
450,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
50
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"temperature": 50,
|
||||||
|
"division": {
|
||||||
|
"enabled": "true",
|
||||||
|
"condition": [
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"( volume >= 0.9 * volume0 ) & ( rnd() <= 0.00001 ) & generation < 1"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"centerofmass": {
|
||||||
|
"steps": 1
|
||||||
|
},
|
||||||
|
"signaling": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"orientation": {
|
||||||
|
"enabled": true,
|
||||||
|
"motility": "persistentRandomWalk",
|
||||||
|
"persistenceMagnitude": 0.0,
|
||||||
|
"recalculationtime": 200,
|
||||||
|
"motilityamount": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"visitor": {
|
||||||
|
"stepwidth": 10,
|
||||||
|
"checkerboard": "01"
|
||||||
|
},
|
||||||
|
"cleaner": {
|
||||||
|
"killDistance": 20
|
||||||
|
},
|
||||||
|
"dynamicecm": {
|
||||||
|
"enabled": true,
|
||||||
|
"stepsPerMcs": 100,
|
||||||
|
"pushSteps": 10,
|
||||||
|
"pushWeight": 2,
|
||||||
|
"ecmCellID": 0,
|
||||||
|
"deltat": 0.1,
|
||||||
|
"eta": 0.25,
|
||||||
|
"k0": 0.1,
|
||||||
|
"k1": 0.1,
|
||||||
|
"c": 4,
|
||||||
|
"alpha": 2,
|
||||||
|
"d": 0.3,
|
||||||
|
"phi": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Geometry": {
|
||||||
|
"blockcount": [
|
||||||
|
2,
|
||||||
|
4,
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"blocksize": [
|
||||||
|
200,
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Settings": {
|
||||||
|
"randomseed": 0,
|
||||||
|
"timesteps": 5000,
|
||||||
|
"statusoutput": 1
|
||||||
|
},
|
||||||
|
"WriteActions": ["ParallelVTK_Cells", "ParallelVTK_Displacement"],
|
||||||
|
"Writers": {
|
||||||
|
"CellInfo": {
|
||||||
|
"field": "",
|
||||||
|
"groupsize": 0,
|
||||||
|
"steps": 1,
|
||||||
|
"writer": "CellInfo"
|
||||||
|
},
|
||||||
|
"ParallelVTK_Cells": {
|
||||||
|
"field": "cells",
|
||||||
|
"outputtype": "UInt32",
|
||||||
|
"printhints": false,
|
||||||
|
"steps": 100,
|
||||||
|
"writer": "ParallelVtkImage"
|
||||||
|
},
|
||||||
|
"ParallelVTK_Displacement": {
|
||||||
|
"writer": "ParallelVtkImage",
|
||||||
|
"outputtype": "Float32",
|
||||||
|
"field": "dynamicecm",
|
||||||
|
"components": [
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"steps": 100
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Include": "measurements/strong/config_filling_1.json"
|
||||||
|
}
|
10
experiments/eval/Makefile
Normal file
10
experiments/eval/Makefile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
generate-batch-strong-cpu:
|
||||||
|
python scripts/substitute.py strong-batch.j2 < strong-cpu.json
|
||||||
|
|
||||||
|
generate-batch-strong-gpu:
|
||||||
|
python scripts/substitute.py strong-batch.j2 < strong-gpu.json
|
||||||
|
|
||||||
|
clean-logs:
|
||||||
|
rm logs/*
|
||||||
|
|
||||||
|
.PHONY: generate-batch-strong-cpu clean-logs
|
17568
experiments/eval/data/strong-cpu-timings.json
Normal file
17568
experiments/eval/data/strong-cpu-timings.json
Normal file
File diff suppressed because it is too large
Load Diff
10
experiments/eval/data/strong-cpu.tsv
Normal file
10
experiments/eval/data/strong-cpu.tsv
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
label nodes mean_time std_time speedup speedup_std
|
||||||
|
1 1 1132.1093720291667 18.428644622186628 1.0 0.016278148629010596
|
||||||
|
2 2 619.9614289104168 7.890810670766857 1.8260964621925766 0.029725469622481192
|
||||||
|
4 4 348.657283046875 3.3739994706945122 3.247054993762918 0.052856043795043856
|
||||||
|
8 8 200.79244575312498 1.259910347938215 5.63820699420684 0.09177957145282603
|
||||||
|
16 16 111.37033198671875 0.3943541234366863 10.16526889911915 0.16547175799372044
|
||||||
|
32 32 65.69918741145833 0.43464214827532205 17.231710415823503 0.28050034328084494
|
||||||
|
64 64 38.56257490957031 0.12227397957602136 29.35772247273364 0.4778893698204027
|
||||||
|
128 128 21.433497051595047 0.14016683538819355 52.81962944749218 0.8598057786755426
|
||||||
|
256 256 13.247708324598525 0.030540850807946187 85.45699711149668 1.3910817003698723
|
|
12312
experiments/eval/data/strong-gpu-timings.json
Normal file
12312
experiments/eval/data/strong-gpu-timings.json
Normal file
File diff suppressed because it is too large
Load Diff
8
experiments/eval/data/strong-gpu.tsv
Normal file
8
experiments/eval/data/strong-gpu.tsv
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
label nodes tasks mean_time std_time speedup speedup_std
|
||||||
|
1 1 1 157.5217688 0.5311809049610176 1.0 0.003372111099358209
|
||||||
|
1 1 2 120.15237200000001 0.299200156243067 1.3110167213344732 0.004420894037456185
|
||||||
|
1 1 4 75.69762635 0.5769735213369493 2.0809340582447473 0.007017140834839633
|
||||||
|
2 2 8 52.110670325 0.940887445857671 3.022831366735062 0.010193323203255446
|
||||||
|
4 4 16 28.215493675000005 0.5598524922936691 5.582811012077745 0.018825858979446598
|
||||||
|
8 8 32 12.422501156249998 0.31940690526235005 12.680358554102268 0.04275957782413007
|
||||||
|
16 16 64 7.70770194375 0.04068644910316383 20.43693048194875 0.06891560011499148
|
|
0
experiments/eval/generated/batch/.gitkeep
Normal file
0
experiments/eval/generated/batch/.gitkeep
Normal file
0
experiments/eval/generated/config/.gitkeep
Normal file
0
experiments/eval/generated/config/.gitkeep
Normal file
1
experiments/eval/load-modules
Normal file
1
experiments/eval/load-modules
Normal file
@ -0,0 +1 @@
|
|||||||
|
module load SciPy-Stack
|
0
experiments/eval/logs/.gitkeep
Normal file
0
experiments/eval/logs/.gitkeep
Normal file
36
experiments/eval/scripts/build-pgf-datafiles.py
Executable file
36
experiments/eval/scripts/build-pgf-datafiles.py
Executable file
@ -0,0 +1,36 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
|
def print_table(data, spec):
|
||||||
|
print("\t".join(column for column in spec.keys()))
|
||||||
|
|
||||||
|
for data_item in data:
|
||||||
|
values = []
|
||||||
|
for retrieve in spec.values():
|
||||||
|
raw_value = retrieve(data_item)
|
||||||
|
values.append(raw_value if isinstance(raw_value, str) else str(raw_value))
|
||||||
|
print("\t".join(values))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
p = argparse.ArgumentParser(description="Turn files generated by timing.py into pgf datafiles")
|
||||||
|
p.add_argument("timing_file")
|
||||||
|
args = p.parse_args()
|
||||||
|
|
||||||
|
with open(args.timing_file, "r", encoding="utf8") as f:
|
||||||
|
jobs = json.load(f)
|
||||||
|
|
||||||
|
scaling_spec = {
|
||||||
|
"label": lambda job: job["accounting"][0]["nodes"]["count"],
|
||||||
|
"nodes": lambda job: job["accounting"][0]["nodes"]["count"],
|
||||||
|
"tasks": lambda job: job["accounting"][0]["tasks"]["count"],
|
||||||
|
"mean_time": lambda job: job["means"]["TimeStep"],
|
||||||
|
"std_time": lambda job: job["stds"]["TimeStep"],
|
||||||
|
"speedup": lambda job: jobs[0]["means"]["TimeStep"] / job["means"]["TimeStep"],
|
||||||
|
"speedup_std": lambda job: jobs[0]["stds"]["TimeStep"] / job["means"]["TimeStep"],
|
||||||
|
}
|
||||||
|
print_table(jobs, scaling_spec)
|
35
experiments/eval/scripts/generate-strong-cpu-configs.py
Executable file
35
experiments/eval/scripts/generate-strong-cpu-configs.py
Executable file
@ -0,0 +1,35 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import copy
|
||||||
|
import json
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
SIZE = [384, 384, 384]
|
||||||
|
|
||||||
|
with (Path(__file__).parent.parent / "templates" / "strong-cpu.json").open(encoding="utf8") as f:
|
||||||
|
template = json.load(f)
|
||||||
|
|
||||||
|
configs = [
|
||||||
|
[ 4, 4, 3],
|
||||||
|
[ 4, 4, 6],
|
||||||
|
[ 4, 4, 12],
|
||||||
|
[ 4, 8, 12],
|
||||||
|
[ 8, 8, 12],
|
||||||
|
[ 8, 8, 24],
|
||||||
|
[ 8, 16, 24],
|
||||||
|
[ 16, 16, 24],
|
||||||
|
[ 16, 16, 48]
|
||||||
|
]
|
||||||
|
|
||||||
|
out_path = Path(__file__).parent.parent / "generated" / "config"
|
||||||
|
|
||||||
|
for c in configs:
|
||||||
|
nc = copy.deepcopy(template)
|
||||||
|
nc["Geometry"]["blockcount"] = c
|
||||||
|
nc["Geometry"]["blocksize"] = [bs // bc for bc, bs in zip(c, SIZE)]
|
||||||
|
|
||||||
|
nc_out_path = out_path / f"strong-cpu-{c[0]:02}-{c[1]:02}-{c[2]:02}.json"
|
||||||
|
print(f"Dumping {(c[0] * c[1] * c[2]) // 48} to {nc_out_path}")
|
||||||
|
with nc_out_path.open("w", encoding="utf8") as f:
|
||||||
|
json.dump(nc, f)
|
34
experiments/eval/scripts/generate-strong-gpu-configs.py
Executable file
34
experiments/eval/scripts/generate-strong-gpu-configs.py
Executable file
@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import copy
|
||||||
|
import json
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
SIZE = [384, 384, 384]
|
||||||
|
|
||||||
|
with (Path(__file__).parent.parent / "templates" / "strong-gpu.json").open(encoding="utf8") as f:
|
||||||
|
template = json.load(f)
|
||||||
|
|
||||||
|
configs = [
|
||||||
|
[ 1, 1, 1],
|
||||||
|
[ 1, 1, 2],
|
||||||
|
[ 1, 2, 2],
|
||||||
|
[ 2, 2, 2],
|
||||||
|
[ 2, 2, 4],
|
||||||
|
[ 2, 4, 4],
|
||||||
|
[ 4, 4, 4],
|
||||||
|
[ 4, 4, 8],
|
||||||
|
]
|
||||||
|
|
||||||
|
out_path = Path(__file__).parent.parent / "generated" / "config"
|
||||||
|
|
||||||
|
for c in configs:
|
||||||
|
nc = copy.deepcopy(template)
|
||||||
|
nc["Geometry"]["blockcount"] = c
|
||||||
|
nc["Geometry"]["blocksize"] = [bs // bc for bc, bs in zip(c, SIZE)]
|
||||||
|
|
||||||
|
nc_out_path = out_path / f"strong-gpu-{c[0]:02}-{c[1]:02}-{c[2]:02}.json"
|
||||||
|
print(f"Dumping {(c[0] * c[1] * c[2])} to {nc_out_path}")
|
||||||
|
with nc_out_path.open("w", encoding="utf8") as f:
|
||||||
|
json.dump(nc, f)
|
21
experiments/eval/scripts/substitute.py
Executable file
21
experiments/eval/scripts/substitute.py
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import jinja2
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
data = json.load(sys.stdin)
|
||||||
|
|
||||||
|
templates_env = jinja2.Environment(
|
||||||
|
loader=jinja2.FileSystemLoader(Path(__file__).parent.parent / "templates"),
|
||||||
|
autoescape=jinja2.select_autoescape()
|
||||||
|
)
|
||||||
|
|
||||||
|
for possibly_incomplete_batch in data["batches"]:
|
||||||
|
batch = dict(list(data["common"].items()) + list(possibly_incomplete_batch.items()))
|
||||||
|
out_path = Path(__file__).parent.parent / "generated" / "batch" / batch["name"]
|
||||||
|
t = templates_env.get_template(sys.argv[1])
|
||||||
|
print(f"Dumping to {out_path}")
|
||||||
|
t.stream(**batch).dump(str(out_path))
|
92
experiments/eval/scripts/timing.py
Executable file
92
experiments/eval/scripts/timing.py
Executable file
@ -0,0 +1,92 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
import pandas
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def load_timing_file(timing_path: Path):
|
||||||
|
df = pandas.read_csv(timing_path, delim_whitespace=True)
|
||||||
|
headers = list(df["#Name"][1:])
|
||||||
|
times = list(df["TotalTime"][1:])
|
||||||
|
return pandas.DataFrame([times], columns=headers)
|
||||||
|
|
||||||
|
|
||||||
|
def load_all_timings(outdir_path: Path):
|
||||||
|
timingdir_path = outdir_path / "timing"
|
||||||
|
timing_paths = sorted(timingdir_path.iterdir())
|
||||||
|
|
||||||
|
print(f"Loading {len(timing_paths)} timing files from {timingdir_path}...", file=sys.stderr)
|
||||||
|
dfs = []
|
||||||
|
for i, timing_path in enumerate(timing_paths, 1):
|
||||||
|
dfs.append(load_timing_file(timing_path))
|
||||||
|
sys.stderr.write("\x1b[1K\r")
|
||||||
|
sys.stderr.flush()
|
||||||
|
print(f"[{i:8}/{len(timing_paths):8}] {i/len(timing_paths)*100:6.2f}%", file=sys.stderr, end="", flush=True)
|
||||||
|
print(file=sys.stderr, flush=True)
|
||||||
|
|
||||||
|
return pandas.concat(dfs)
|
||||||
|
|
||||||
|
|
||||||
|
def load_mean_timings(outdir_path: Path):
|
||||||
|
df = load_all_timings(outdir_path)
|
||||||
|
return df.mean() / 1000000
|
||||||
|
|
||||||
|
|
||||||
|
def get_outdirs(jobid: str):
|
||||||
|
print(f"Globbing for {jobid}...", file=sys.stderr)
|
||||||
|
return sorted(Path("/p/scratch/cellsinsilico/paul/nastja-out").glob(f"*{jobid}*"))
|
||||||
|
|
||||||
|
|
||||||
|
def load_array_mean_timings(jobid: str):
|
||||||
|
mts = [
|
||||||
|
load_mean_timings(outdir_path)
|
||||||
|
for outdir_path
|
||||||
|
in get_outdirs(jobid)
|
||||||
|
]
|
||||||
|
|
||||||
|
return pandas.DataFrame(list(mts), columns=mts[0].index)
|
||||||
|
|
||||||
|
|
||||||
|
def get_mean_mean_totaltimes(jobid: str):
|
||||||
|
return load_array_mean_timings(jobid).mean()
|
||||||
|
|
||||||
|
|
||||||
|
def get_std_mean_totaltimes(jobid: str):
|
||||||
|
return load_array_mean_timings(jobid).std()
|
||||||
|
|
||||||
|
|
||||||
|
def get_accounting_data(jobid: str):
|
||||||
|
sacct_results = subprocess.run(
|
||||||
|
["sacct", "--json", "--jobs", jobid],
|
||||||
|
check=True, # Throw on non-zero exit code,
|
||||||
|
capture_output=True
|
||||||
|
)
|
||||||
|
return json.loads(sacct_results.stdout.decode("utf8"))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
p = argparse.ArgumentParser(description="Load and analzye data from nastja timing files")
|
||||||
|
p.add_argument("jobid", nargs="+")
|
||||||
|
p.add_argument("--prettify", action="store_true")
|
||||||
|
args = p.parse_args()
|
||||||
|
|
||||||
|
results = []
|
||||||
|
for i, jobid in enumerate(args.jobid, 1):
|
||||||
|
print(f"({i:2}/{len(args.jobid):2}) Loading accounting data for {jobid}", file=sys.stderr)
|
||||||
|
accounting_data = get_accounting_data(jobid)
|
||||||
|
array_mean_timings = load_array_mean_timings(jobid)
|
||||||
|
|
||||||
|
results.append({
|
||||||
|
"jobid": jobid,
|
||||||
|
"means": array_mean_timings.mean().to_dict(),
|
||||||
|
"stds": array_mean_timings.std().to_dict(),
|
||||||
|
"accounting": [array_job["steps"][-1] for array_job in accounting_data["jobs"]]
|
||||||
|
})
|
||||||
|
print(json.dumps(results, indent=2 if args.prettify else None))
|
67
experiments/eval/strong-cpu.json
Normal file
67
experiments/eval/strong-cpu.json
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
{
|
||||||
|
"common": {
|
||||||
|
"account": "cellsinsilico",
|
||||||
|
"partition": "batch",
|
||||||
|
"extra_sbatch_line": "",
|
||||||
|
"logfile_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/logs/%x-%A.%a",
|
||||||
|
"nastja_binary_path": "/p/project/cellsinsilico/paulslustigebude/nastja/build-nocuda/nastja",
|
||||||
|
"config_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/generated/config/${SLURM_JOB_NAME}.json",
|
||||||
|
"output_dir_path": "/p/scratch/cellsinsilico/paul/nastja-out/${SLURM_JOB_NAME}-${SLURM_ARRAY_JOB_ID}.${SLURM_ARRAY_TASK_ID}"
|
||||||
|
},
|
||||||
|
"batches": [
|
||||||
|
{
|
||||||
|
"name": "strong-cpu-04-04-03",
|
||||||
|
"nodes": 1,
|
||||||
|
"tasks": 48,
|
||||||
|
"time": "00:30:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-cpu-04-04-06",
|
||||||
|
"nodes": 2,
|
||||||
|
"tasks": 96,
|
||||||
|
"time": "00:30:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-cpu-04-04-12",
|
||||||
|
"nodes": 4,
|
||||||
|
"tasks": 192,
|
||||||
|
"time": "00:10:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-cpu-04-08-12",
|
||||||
|
"nodes": 8,
|
||||||
|
"tasks": 384,
|
||||||
|
"time": "00:10:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-cpu-08-08-12",
|
||||||
|
"nodes": 16,
|
||||||
|
"tasks": 768,
|
||||||
|
"time": "00:10:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-cpu-08-08-24",
|
||||||
|
"nodes": 32,
|
||||||
|
"tasks": 1536,
|
||||||
|
"time": "00:10:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-cpu-08-16-24",
|
||||||
|
"nodes": 64,
|
||||||
|
"tasks": 3072,
|
||||||
|
"time": "00:10:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-cpu-16-16-24",
|
||||||
|
"nodes": 128,
|
||||||
|
"tasks": 6144,
|
||||||
|
"time": "00:10:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-cpu-16-16-48",
|
||||||
|
"nodes": 256,
|
||||||
|
"tasks": 12288,
|
||||||
|
"time": "00:10:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
63
experiments/eval/strong-gpu.json
Normal file
63
experiments/eval/strong-gpu.json
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
{
|
||||||
|
"common": {
|
||||||
|
"account": "cellsinsilico",
|
||||||
|
"partition": "gpus",
|
||||||
|
"extra_sbatch_line": "#SBATCH --gres=gpu:4",
|
||||||
|
"logfile_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/logs/%x-%A.%a",
|
||||||
|
"nastja_binary_path": "/p/project/cellsinsilico/paulslustigebude/nastja/build-cuda/nastja",
|
||||||
|
"config_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/generated/config/${SLURM_JOB_NAME}.json",
|
||||||
|
"output_dir_path": "/p/scratch/cellsinsilico/paul/nastja-out/${SLURM_JOB_NAME}-${SLURM_ARRAY_JOB_ID}.${SLURM_ARRAY_TASK_ID}"
|
||||||
|
},
|
||||||
|
"batches": [
|
||||||
|
{
|
||||||
|
"name": "strong-gpu-01-01-01",
|
||||||
|
"nodes": 1,
|
||||||
|
"tasks": 1,
|
||||||
|
"time": "00:15:00",
|
||||||
|
"extra_sbatch_line": "#SBATCH --gres=gpu:1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-gpu-01-01-02",
|
||||||
|
"nodes": 1,
|
||||||
|
"tasks": 2,
|
||||||
|
"time": "00:15:00",
|
||||||
|
"extra_sbatch_line": "#SBATCH --gres=gpu:2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-gpu-01-02-02",
|
||||||
|
"nodes": 1,
|
||||||
|
"tasks": 4,
|
||||||
|
"time": "00:15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-gpu-02-02-02",
|
||||||
|
"nodes": 2,
|
||||||
|
"tasks": 8,
|
||||||
|
"time": "00:15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-gpu-02-02-04",
|
||||||
|
"nodes": 4,
|
||||||
|
"tasks": 16,
|
||||||
|
"time": "00:15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-gpu-02-04-04",
|
||||||
|
"nodes": 8,
|
||||||
|
"tasks": 32,
|
||||||
|
"time": "00:15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-gpu-04-04-04",
|
||||||
|
"nodes": 16,
|
||||||
|
"tasks": 64,
|
||||||
|
"time": "00:15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "strong-gpu-04-04-08",
|
||||||
|
"nodes": 32,
|
||||||
|
"tasks": 128,
|
||||||
|
"time": "00:15:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
31
experiments/eval/templates/strong-batch.j2
Normal file
31
experiments/eval/templates/strong-batch.j2
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
#SBATCH --job-name={{ name }}
|
||||||
|
#SBATCH --account={{ account }}
|
||||||
|
#SBATCH --partition={{ partition }}
|
||||||
|
#SBATCH --nodes={{ nodes }}
|
||||||
|
#SBATCH --ntasks={{ tasks }}
|
||||||
|
# Counted per node
|
||||||
|
{{ extra_sbatch_line }}
|
||||||
|
#SBATCH --time={{ time }}
|
||||||
|
#SBATCH --output={{ logfile_path }}
|
||||||
|
#SBATCH --error={{ logfile_path }}
|
||||||
|
#SBATCH --array=1-5
|
||||||
|
|
||||||
|
NASTJA_BINARY="{{ nastja_binary_path }}"
|
||||||
|
CONFIG_FILE="{{ config_path }}"
|
||||||
|
OUTPUT_DIR="{{ output_dir_path }}"
|
||||||
|
module load Stages/2024 GCC/12.3.0 ParaStationMPI/5.9.2-1 CMake/3.26.3 mold/1.11.0 jq/1.6 git Python
|
||||||
|
|
||||||
|
echo "${NASTJA_BINARY_PATH}"
|
||||||
|
echo "${CONFIG_FILE}"
|
||||||
|
echo "${OUTPUT_DIR}"
|
||||||
|
|
||||||
|
cat "${CONFIG_FILE}"
|
||||||
|
|
||||||
|
mkdir -p "${OUTPUT_DIR}"
|
||||||
|
|
||||||
|
srun "${NASTJA_BINARY}" \
|
||||||
|
-c "${CONFIG_FILE}" \
|
||||||
|
-o "${OUTPUT_DIR}"
|
||||||
|
|
258
experiments/eval/templates/strong-cpu.json
Normal file
258
experiments/eval/templates/strong-cpu.json
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
{
|
||||||
|
"Application": "Cells",
|
||||||
|
"CellsInSilico": {
|
||||||
|
"2D": false,
|
||||||
|
"adhesion": {
|
||||||
|
"matrix": [
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 450.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 450.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 50.0]
|
||||||
|
],
|
||||||
|
"polarityenabled": false
|
||||||
|
},
|
||||||
|
"centerofmass": {
|
||||||
|
"steps": 1
|
||||||
|
},
|
||||||
|
"cleaner": {
|
||||||
|
"killdistance": 0,
|
||||||
|
"steps": 100
|
||||||
|
},
|
||||||
|
"contactinhibition": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"division": {
|
||||||
|
"condition": [
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"( volume >= 0.9 * volume0 ) & ( rnd() <= 0.00001 ) & generation < 1"
|
||||||
|
],
|
||||||
|
"enabled": true,
|
||||||
|
"halveSignals": false
|
||||||
|
},
|
||||||
|
"dynamicecm": {
|
||||||
|
"alpha": 2.0,
|
||||||
|
"beta": 0.5,
|
||||||
|
"c": 4.0,
|
||||||
|
"deltat": 0.10000000149011612,
|
||||||
|
"ecmCellID": 0,
|
||||||
|
"enabled": true,
|
||||||
|
"eta": 0.25,
|
||||||
|
"k0": 0.10000000149011612,
|
||||||
|
"k1": 0.10000000149011612,
|
||||||
|
"lambda": 10.0,
|
||||||
|
"phi": 1.0,
|
||||||
|
"pushSteps": 10,
|
||||||
|
"pushWeight": 0.5,
|
||||||
|
"stepsPerMcs": 100
|
||||||
|
},
|
||||||
|
"ecmdegradation": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"energyfunctions": [
|
||||||
|
"Volume00",
|
||||||
|
"Surface01",
|
||||||
|
"Motility00",
|
||||||
|
"Adhesion01",
|
||||||
|
"DynamicECM00"
|
||||||
|
],
|
||||||
|
"liquid": 6,
|
||||||
|
"logcellproperties": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"orientation": {
|
||||||
|
"enabled": true,
|
||||||
|
"motility": "persistentRandomWalk",
|
||||||
|
"motilityamount": [
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0
|
||||||
|
],
|
||||||
|
"numRandomNumbers": 5,
|
||||||
|
"persistenceMagnitude": 0.0,
|
||||||
|
"persistentDecay": 0.8,
|
||||||
|
"recalculationtime": 200
|
||||||
|
},
|
||||||
|
"polarity": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"signaling": {
|
||||||
|
"constant": false,
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"surface": {
|
||||||
|
"default": {
|
||||||
|
"storage": "const",
|
||||||
|
"value": 400.0
|
||||||
|
},
|
||||||
|
"lambda": [
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
5.625,
|
||||||
|
5.625,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
"sizechange": [
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
-0.05,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"temperature": 50.0,
|
||||||
|
"visitor": {
|
||||||
|
"checkerboard": "01",
|
||||||
|
"stepwidth": 10
|
||||||
|
},
|
||||||
|
"volume": {
|
||||||
|
"default": {
|
||||||
|
"storage": "const",
|
||||||
|
"value": 500.0
|
||||||
|
},
|
||||||
|
"lambda": [
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
7.5,
|
||||||
|
7.5,
|
||||||
|
7.5
|
||||||
|
],
|
||||||
|
"sizechange": [
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
-0.05,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DefineFunctions": [
|
||||||
|
"r_angle()=360*rnd()",
|
||||||
|
"r_size()=400*rnd()"
|
||||||
|
],
|
||||||
|
"Filling": {
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"box": [
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
[
|
||||||
|
384,
|
||||||
|
384,
|
||||||
|
384
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"celltype": 0,
|
||||||
|
"component": 0,
|
||||||
|
"pattern": "const",
|
||||||
|
"seed": 0,
|
||||||
|
"shape": "cube",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"box": [
|
||||||
|
[117, 117, 177],
|
||||||
|
[267, 267, 267]
|
||||||
|
],
|
||||||
|
"celltype": 9,
|
||||||
|
"center": [192, 192, 192],
|
||||||
|
"component": 0,
|
||||||
|
"count": 5500,
|
||||||
|
"pattern": "voronoi",
|
||||||
|
"radius": 75,
|
||||||
|
"seed": 758960,
|
||||||
|
"shape": "sphere",
|
||||||
|
"value": 8
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"initialoutput": false,
|
||||||
|
"randomseed": 758959
|
||||||
|
},
|
||||||
|
"Geometry": {
|
||||||
|
"blockcount": [
|
||||||
|
4,
|
||||||
|
4,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"blockdefault": "fill",
|
||||||
|
"blocksize": [
|
||||||
|
96,
|
||||||
|
96,
|
||||||
|
128
|
||||||
|
],
|
||||||
|
"blocktype": [
|
||||||
|
[
|
||||||
|
[
|
||||||
|
1
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Settings": {
|
||||||
|
"deltat": 1.0,
|
||||||
|
"deltax": 1.0,
|
||||||
|
"handleFPE": "signal",
|
||||||
|
"logger": {
|
||||||
|
"group": 0,
|
||||||
|
"steps": 100
|
||||||
|
},
|
||||||
|
"randomseed": 42,
|
||||||
|
"statusoutput": 1,
|
||||||
|
"timestepguard": 1,
|
||||||
|
"timesteps": 5
|
||||||
|
}
|
||||||
|
}
|
263
experiments/eval/templates/strong-gpu.json
Normal file
263
experiments/eval/templates/strong-gpu.json
Normal file
@ -0,0 +1,263 @@
|
|||||||
|
{
|
||||||
|
"Application": "Cells",
|
||||||
|
"CellsInSilico": {
|
||||||
|
"2D": false,
|
||||||
|
"adhesion": {
|
||||||
|
"matrix": [
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 450.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
||||||
|
[0.0, 450.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 50.0]
|
||||||
|
],
|
||||||
|
"polarityenabled": false
|
||||||
|
},
|
||||||
|
"centerofmass": {
|
||||||
|
"steps": 1
|
||||||
|
},
|
||||||
|
"cleaner": {
|
||||||
|
"killdistance": 0,
|
||||||
|
"steps": 100
|
||||||
|
},
|
||||||
|
"contactinhibition": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"division": {
|
||||||
|
"condition": [
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"( volume >= 0.9 * volume0 ) & ( rnd() <= 0.00001 ) & generation < 1"
|
||||||
|
],
|
||||||
|
"enabled": true,
|
||||||
|
"halveSignals": false
|
||||||
|
},
|
||||||
|
"dynamicecm": {
|
||||||
|
"alpha": 2.0,
|
||||||
|
"beta": 0.5,
|
||||||
|
"c": 4.0,
|
||||||
|
"deltat": 0.10000000149011612,
|
||||||
|
"ecmCellID": 0,
|
||||||
|
"enabled": true,
|
||||||
|
"eta": 0.25,
|
||||||
|
"k0": 0.10000000149011612,
|
||||||
|
"k1": 0.10000000149011612,
|
||||||
|
"lambda": 10.0,
|
||||||
|
"phi": 1.0,
|
||||||
|
"pushSteps": 10,
|
||||||
|
"pushWeight": 0.5,
|
||||||
|
"stepsPerMcs": 100
|
||||||
|
},
|
||||||
|
"ecmdegradation": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"energyfunctions": [
|
||||||
|
"Volume00",
|
||||||
|
"Surface01",
|
||||||
|
"Motility00",
|
||||||
|
"Adhesion01",
|
||||||
|
"DynamicECM00"
|
||||||
|
],
|
||||||
|
"liquid": 6,
|
||||||
|
"logcellproperties": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"orientation": {
|
||||||
|
"enabled": true,
|
||||||
|
"motility": "persistentRandomWalk",
|
||||||
|
"motilityamount": [
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0
|
||||||
|
],
|
||||||
|
"numRandomNumbers": 5,
|
||||||
|
"persistenceMagnitude": 0.0,
|
||||||
|
"persistentDecay": 0.8,
|
||||||
|
"recalculationtime": 200
|
||||||
|
},
|
||||||
|
"polarity": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"signaling": {
|
||||||
|
"constant": false,
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"surface": {
|
||||||
|
"default": {
|
||||||
|
"storage": "const",
|
||||||
|
"value": 400.0
|
||||||
|
},
|
||||||
|
"lambda": [
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
5.625,
|
||||||
|
5.625,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
"sizechange": [
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
-0.05,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"temperature": 50.0,
|
||||||
|
"visitor": {
|
||||||
|
"checkerboard": "01",
|
||||||
|
"stepwidth": 10
|
||||||
|
},
|
||||||
|
"volume": {
|
||||||
|
"default": {
|
||||||
|
"storage": "const",
|
||||||
|
"value": 500.0
|
||||||
|
},
|
||||||
|
"lambda": [
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
7.5,
|
||||||
|
7.5,
|
||||||
|
7.5
|
||||||
|
],
|
||||||
|
"sizechange": [
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
-0.05,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DefineFunctions": [
|
||||||
|
"r_angle()=360*rnd()",
|
||||||
|
"r_size()=400*rnd()"
|
||||||
|
],
|
||||||
|
"Filling": {
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"box": [
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
[
|
||||||
|
384,
|
||||||
|
384,
|
||||||
|
384
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"celltype": 0,
|
||||||
|
"component": 0,
|
||||||
|
"pattern": "const",
|
||||||
|
"seed": 0,
|
||||||
|
"shape": "cube",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"box": [
|
||||||
|
[117, 117, 177],
|
||||||
|
[267, 267, 267]
|
||||||
|
],
|
||||||
|
"celltype": 9,
|
||||||
|
"center": [192, 192, 192],
|
||||||
|
"component": 0,
|
||||||
|
"count": 5500,
|
||||||
|
"pattern": "voronoi",
|
||||||
|
"radius": 75,
|
||||||
|
"seed": 758960,
|
||||||
|
"shape": "sphere",
|
||||||
|
"value": 8
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"initialoutput": false,
|
||||||
|
"randomseed": 758959
|
||||||
|
},
|
||||||
|
"Geometry": {
|
||||||
|
"blockcount": [
|
||||||
|
4,
|
||||||
|
4,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"blockdefault": "fill",
|
||||||
|
"blocksize": [
|
||||||
|
96,
|
||||||
|
96,
|
||||||
|
128
|
||||||
|
],
|
||||||
|
"blocktype": [
|
||||||
|
[
|
||||||
|
[
|
||||||
|
1
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Settings": {
|
||||||
|
"deltat": 1.0,
|
||||||
|
"deltax": 1.0,
|
||||||
|
"handleFPE": "signal",
|
||||||
|
"logger": {
|
||||||
|
"group": 0,
|
||||||
|
"steps": 100
|
||||||
|
},
|
||||||
|
"randomseed": 42,
|
||||||
|
"statusoutput": 1,
|
||||||
|
"timestepguard": 1,
|
||||||
|
"timesteps": 5,
|
||||||
|
"cuda": {
|
||||||
|
"subblocks": {
|
||||||
|
"blockDim": [8, 8, 8]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
107
experiments/scripts/gen/weak.py
Normal file
107
experiments/scripts/gen/weak.py
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
import copy
|
||||||
|
import json
|
||||||
|
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
configurations = [
|
||||||
|
(1, 1, 1),
|
||||||
|
(1, 1, 2),
|
||||||
|
(1, 2, 2),
|
||||||
|
(2, 2, 2),
|
||||||
|
(2, 2, 4),
|
||||||
|
(2, 4, 4),
|
||||||
|
(4, 4, 4),
|
||||||
|
(4, 4, 8),
|
||||||
|
(4, 8, 8),
|
||||||
|
(8, 8, 8)
|
||||||
|
]
|
||||||
|
|
||||||
|
with open("templates/spheroid_weak.json") as template_file:
|
||||||
|
template = json.load(template_file)
|
||||||
|
|
||||||
|
SIZE_X = 400
|
||||||
|
SIZE_Y = 400
|
||||||
|
SIZE_Z = 400
|
||||||
|
|
||||||
|
for bx, by, bz in configurations:
|
||||||
|
nastja_config = copy.deepcopy(template)
|
||||||
|
nastja_config["Geometry"]["blockcount"] = [bx, by, bz]
|
||||||
|
nastja_config["Geometry"]["blocksize"] = [SIZE_X, SIZE_Y, SIZE_Z]
|
||||||
|
|
||||||
|
# Fill the whole domain with ECM
|
||||||
|
cells_filling = [
|
||||||
|
{
|
||||||
|
"shape": "cube",
|
||||||
|
"box": [
|
||||||
|
[0, 0, 0],
|
||||||
|
[bx * SIZE_X, by * SIZE_Y, bz * SIZE_Z]
|
||||||
|
],
|
||||||
|
"value": 0,
|
||||||
|
"celltype": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
# Place a bunch of cells in each block to keep each rank busy
|
||||||
|
for z in range(bz):
|
||||||
|
for y in range(by):
|
||||||
|
for x in range(bx):
|
||||||
|
sx = x * SIZE_X
|
||||||
|
sy = y * SIZE_Y
|
||||||
|
sz = z * SIZE_Z
|
||||||
|
cells_filling.append({
|
||||||
|
"shape": "sphere",
|
||||||
|
"pattern": "voronoi",
|
||||||
|
"count": 5500,
|
||||||
|
"radius": 75,
|
||||||
|
"center": [sx + 200, sy + 200, sz + 200],
|
||||||
|
"box": [
|
||||||
|
[sx + 110, sy + 110, sz + 110],
|
||||||
|
[sx + 290, sy + 290, sz + 290]
|
||||||
|
],
|
||||||
|
"celltype": 9
|
||||||
|
})
|
||||||
|
nastja_config["Filling"]["cells"] = cells_filling
|
||||||
|
|
||||||
|
ntasks = bx * by * bz
|
||||||
|
if ntasks < 4:
|
||||||
|
nodes = 1
|
||||||
|
gpus_per_node = ntasks
|
||||||
|
else:
|
||||||
|
assert ntasks % 4 == 0
|
||||||
|
nodes = ntasks // 4
|
||||||
|
gpus_per_node = 4
|
||||||
|
|
||||||
|
label = f"weak400-t{ntasks:04}n{nodes:03}g{gpus_per_node}x{bx}y{by}z{bz}"
|
||||||
|
|
||||||
|
with open(f"configs/measurements/weak/spheroid_{label}.json", "w") as config_file:
|
||||||
|
json.dump(nastja_config, config_file, indent=2)
|
||||||
|
|
||||||
|
batch_config = f"""#!/usr/bin/env bash
|
||||||
|
|
||||||
|
#SBATCH --job-name={label}
|
||||||
|
#SBATCH --account=hkf6
|
||||||
|
#SBATCH --partition=booster
|
||||||
|
#SBATCH --nodes={nodes}
|
||||||
|
#SBATCH --ntasks={ntasks}
|
||||||
|
# Counted per node
|
||||||
|
#SBATCH --gres=gpu:{gpus_per_node}
|
||||||
|
#SBATCH --time=00:15:00
|
||||||
|
#SBATCH --output=logs/{label}-%A_%a.log
|
||||||
|
#SBATCH --error=logs/{label}-%A_%a.log
|
||||||
|
#SBATCH --array=1-5
|
||||||
|
|
||||||
|
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
|
||||||
|
OUTPUT_DIR="/p/scratch/cellsinsilico/paul/nastja-out/{label}-${{SLURM_ARRAY_TASK_ID}}"
|
||||||
|
|
||||||
|
echo "outdir is ${{OUTPUT_DIR}}"
|
||||||
|
|
||||||
|
mkdir -p "${{OUTPUT_DIR}}"
|
||||||
|
source "${{SOURCE_DIR}}/activate-nastja-modules"
|
||||||
|
|
||||||
|
srun --unbuffered "${{SOURCE_DIR}}/nastja/build-cuda/nastja" \\
|
||||||
|
-c "${{SOURCE_DIR}}/ma/experiments/configs/measurements/weak/spheroid_{label}.json" \\
|
||||||
|
-o "${{OUTPUT_DIR}}"
|
||||||
|
"""
|
||||||
|
|
||||||
|
with open(f"batch/measurements/weak/{label}", "w", encoding="utf8") as batch_config_file:
|
||||||
|
batch_config_file.write(batch_config)
|
@ -128,5 +128,19 @@ def strong_dat(db, time):
|
|||||||
for tasks, time in values:
|
for tasks, time in values:
|
||||||
print(f"{tasks}\t{time}")
|
print(f"{tasks}\t{time}")
|
||||||
|
|
||||||
|
@timing.command()
|
||||||
|
@click.option("--db", default="timings.db", help="Path of sqlite database file")
|
||||||
|
def weak_dat(db):
|
||||||
|
db = sqlite3.connect(db)
|
||||||
|
c = db.cursor()
|
||||||
|
res = c.execute("""
|
||||||
|
select tasks, avg(averagetime) as mean from timings group by tasks order by tasks asc
|
||||||
|
""")
|
||||||
|
values = res.fetchall()
|
||||||
|
|
||||||
|
print("gpus\tefficiency")
|
||||||
|
for tasks, mean in values:
|
||||||
|
print(f"{tasks}\t{values[0][1] / mean}")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
timing()
|
timing()
|
||||||
|
100
experiments/templates/spheroid_weak.json
Normal file
100
experiments/templates/spheroid_weak.json
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
{
|
||||||
|
"Comments": ["Celltype Usage", "0 Dynamic ECM", "1-5 Not Used", "6 Liquid ", "7 Apoptotic cell Type ", "8 Basic Non Dividing Cell type (surrounding)", "9 Cancer"],
|
||||||
|
"Application": "Cells",
|
||||||
|
"CellsInSilico": {
|
||||||
|
"ecmdegradation": {
|
||||||
|
"enabled": "false",
|
||||||
|
"steps": 99999,
|
||||||
|
"stochastic": "true",
|
||||||
|
"probability": 0.5
|
||||||
|
},
|
||||||
|
"energyfunctions": ["Volume00", "Surface01", "Motility00", "Adhesion01", "DynamicECM00"],
|
||||||
|
"liquid": 6,
|
||||||
|
"volume": {
|
||||||
|
"default": {
|
||||||
|
"storage": "const",
|
||||||
|
"value": 500
|
||||||
|
},
|
||||||
|
"lambda": [0, 0, 0, 0, 0, 0, 0, 7.5, 7.5, 7.5],
|
||||||
|
"sizechange": [0, 0, 0, 0, 0, 0, 0, -0.05, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
},
|
||||||
|
"surface": {
|
||||||
|
"default": {
|
||||||
|
"storage": "const",
|
||||||
|
"value": 400
|
||||||
|
},
|
||||||
|
"lambda": [0, 0, 0, 0, 0, 0, 0, 5.625, 5.625, 1],
|
||||||
|
"sizechange": [0, 0, 0, 0, 0, 0, 0, -0.05, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
},
|
||||||
|
"adhesion": {
|
||||||
|
"matrix": [
|
||||||
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 450],
|
||||||
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
[0, 450, 0, 0, 0, 0, 0, 0, 0, 50]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"temperature": 50,
|
||||||
|
"division": {
|
||||||
|
"enabled": "true",
|
||||||
|
"condition": ["", "", "", "", "", "", "", "", "", "( volume >= 0.9 * volume0 ) & ( rnd() <= 0.00001 ) & generation < 1"]
|
||||||
|
},
|
||||||
|
"centerofmass": {
|
||||||
|
"steps": 1
|
||||||
|
},
|
||||||
|
"signaling": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"orientation": {
|
||||||
|
"enabled": true,
|
||||||
|
"motility": "persistentRandomWalk",
|
||||||
|
"persistenceMagnitude": 0.0,
|
||||||
|
"recalculationtime": 200,
|
||||||
|
"motilityamount": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
},
|
||||||
|
"visitor": {
|
||||||
|
"stepwidth": 10,
|
||||||
|
"checkerboard": "01"
|
||||||
|
},
|
||||||
|
"cleaner": {
|
||||||
|
"killDistance": 20
|
||||||
|
},
|
||||||
|
"dynamicecm": {
|
||||||
|
"enabled": true,
|
||||||
|
"stepsPerMcs": 100,
|
||||||
|
"pushSteps": 10,
|
||||||
|
"pushWeight": 2,
|
||||||
|
"ecmCellID": 0,
|
||||||
|
"deltat": 0.1,
|
||||||
|
"eta": 0.25,
|
||||||
|
"k0": 0.1,
|
||||||
|
"k1": 0.1,
|
||||||
|
"c": 4,
|
||||||
|
"alpha": 2,
|
||||||
|
"d": 0.3,
|
||||||
|
"phi": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Geometry": {
|
||||||
|
"blockcount": null,
|
||||||
|
"blocksize": null
|
||||||
|
},
|
||||||
|
"Settings": {
|
||||||
|
"randomseed": 0,
|
||||||
|
"timesteps": 20,
|
||||||
|
"statusoutput": 1
|
||||||
|
},
|
||||||
|
"DefineFunctions": [
|
||||||
|
"r_angle()=360*rnd()",
|
||||||
|
"r_size()=400*rnd()"
|
||||||
|
],
|
||||||
|
"Filling": {
|
||||||
|
"cells": null
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user