Compare commits

...

4 Commits

Author SHA1 Message Date
075d11b948 Add GPU strong scaling measurement files 2024-03-09 18:49:03 +01:00
1696d72a6f Add pgf generation scripts 2024-03-09 17:47:50 +01:00
6de64dd5d0 Add stuff for eval 2024-03-08 21:42:24 +01:00
b36d8a748d Check in stuff 2024-03-08 17:04:58 +01:00
26 changed files with 31385 additions and 0 deletions

View File

@ -7,3 +7,4 @@ batch/measurements/strong/*
configs/measurements/strong/* configs/measurements/strong/*
*.dat *.dat
*.db *.db
eval/generated/*

View 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}"

View File

View 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
View 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

File diff suppressed because it is too large Load Diff

View 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
1 label nodes mean_time std_time speedup speedup_std
2 1 1 1132.1093720291667 18.428644622186628 1.0 0.016278148629010596
3 2 2 619.9614289104168 7.890810670766857 1.8260964621925766 0.029725469622481192
4 4 4 348.657283046875 3.3739994706945122 3.247054993762918 0.052856043795043856
5 8 8 200.79244575312498 1.259910347938215 5.63820699420684 0.09177957145282603
6 16 16 111.37033198671875 0.3943541234366863 10.16526889911915 0.16547175799372044
7 32 32 65.69918741145833 0.43464214827532205 17.231710415823503 0.28050034328084494
8 64 64 38.56257490957031 0.12227397957602136 29.35772247273364 0.4778893698204027
9 128 128 21.433497051595047 0.14016683538819355 52.81962944749218 0.8598057786755426
10 256 256 13.247708324598525 0.030540850807946187 85.45699711149668 1.3910817003698723

File diff suppressed because it is too large Load Diff

View 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
1 label nodes tasks mean_time std_time speedup speedup_std
2 1 1 1 157.5217688 0.5311809049610176 1.0 0.003372111099358209
3 1 1 2 120.15237200000001 0.299200156243067 1.3110167213344732 0.004420894037456185
4 1 1 4 75.69762635 0.5769735213369493 2.0809340582447473 0.007017140834839633
5 2 2 8 52.110670325 0.940887445857671 3.022831366735062 0.010193323203255446
6 4 4 16 28.215493675000005 0.5598524922936691 5.582811012077745 0.018825858979446598
7 8 8 32 12.422501156249998 0.31940690526235005 12.680358554102268 0.04275957782413007
8 16 16 64 7.70770194375 0.04068644910316383 20.43693048194875 0.06891560011499148

View File

@ -0,0 +1 @@
module load SciPy-Stack

View File

View 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)

View 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)

View 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)

View 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))

View 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))

View 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"
}
]
}

View 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"
}
]
}

View 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}"

View 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
}
}

View 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]
}
}
}
}

View 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)

View File

@ -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()

View 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
}
}