From cbe09087b9d1faf778a163a0a9df10fc8acb8575 Mon Sep 17 00:00:00 2001 From: cerlane <> Date: Thu, 21 Aug 2025 15:46:24 +0200 Subject: [PATCH 01/10] added gssr documentation --- docs/images/gssr/heatmap_eg.png | Bin 0 -> 70937 bytes docs/images/gssr/timeseries_eg.png | Bin 0 -> 29784 bytes docs/software/gssr/containers.md | 120 +++++++++++++++++++++++++++++ docs/software/gssr/index.md | 14 ++++ docs/software/gssr/quickstart.md | 55 +++++++++++++ mkdocs.yml | 4 + 6 files changed, 193 insertions(+) create mode 100644 docs/images/gssr/heatmap_eg.png create mode 100644 docs/images/gssr/timeseries_eg.png create mode 100644 docs/software/gssr/containers.md create mode 100644 docs/software/gssr/index.md create mode 100644 docs/software/gssr/quickstart.md diff --git a/docs/images/gssr/heatmap_eg.png b/docs/images/gssr/heatmap_eg.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd674ead1b8832573b1e4bb8d5fdc4d821981d5 GIT binary patch literal 70937 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 literal 0 HcmV?d00001 diff --git a/docs/images/gssr/timeseries_eg.png b/docs/images/gssr/timeseries_eg.png new file mode 100644 index 0000000000000000000000000000000000000000..37346f1937005d80df42f13bd6307b332e5d3a37 GIT binary patch literal 29784 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 literal 0 HcmV?d00001 diff --git a/docs/software/gssr/containers.md b/docs/software/gssr/containers.md new file mode 100644 index 00000000..266dba4f --- /dev/null +++ b/docs/software/gssr/containers.md @@ -0,0 +1,120 @@ +[](){#ref-gssr-containers} +# gssr - Containers Guide + +CSCS highly recommends that all users leverage on container solutions on our Alps platforms so as to flexibly configure any required user environments of their choice within the containers. Users thus have maximum flexibility as they are not tied to any specific operating systems and/or software stacks. + +The following guide will explain how to install and use `gssr` within a container. + +Most CSCS users leverage on the base containers with pre-installed CUDA from Nvidia. As such, in the following documentation, we will use a PyTorch base container as an example. + +## Preparing a container with `gssr` + +### Base Container from Nvidia + +The most commonly used Nvidia container used on Alps is the [Nvidia's PyTorch container](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch). Typically the latest version is preferred for the most up-to-date functionalities of PyTorch. + +#### Example: Preparing a Nvidia PyTorch ContainerFile +``` +FROM --platform=linux/arm64 nvcr.io/nvidia/pytorch:25.08-py3 + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update \ + && apt-get install -y wget rsync rclone vim git htop nvtop nano \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Installing gssr +RUN pip install gssr + +# Install your application and dependencies as required +... +``` +As you can see from the above example, gssr can easily be installed with a `RUN pip install gssr` command. Your application and dependencies should be written where the `...` is. + +Once your `ContainerFile` is ready, you can build it on any Alps platform with the following commands to create a container with label `mycontainer`. + +```bash +srun -A {groupID} --pty bash +# Once you have an interactive session, use podman command to build your container +# -v is to mount the fast storage on Alps into the container. +podman build -v $SCRATCH:$SCRATCH -t mycontainer:0.1 . +# Export the container from the podman's cache to a local sqshfs file with enroot +enroot import -x mount -o mycontainer.sqsh podman://local:mycontainer:0.1 +``` + +Now you should have a sqsh file of your container. Please note that you should replace `mycontainer` label to any other label of your choice. The version `0.1` can also be omitted or replaced with another version as required. + +## Create CSCS configuration for Container + +Now you only need to tell CSCS container engine solution where your container is and how you would like to run it. To do so, you will have to create a`{label}.toml` file in your `$HOME/.edf` directory. + +### Example of a `mycontainer.toml` file +``` +image = "/capstor/scratch/cscs/username/directoryWhereYourContainerIs/mycontainer.sqsh" +mounts = ["/capstor/scratch/cscs/username:/capstor/scratch/cscs/username"] +workdir = "/capstor/scratch/cscs/username" +writable = true + +[annotations] +com.hooks.dcgm.enabled = "true" +``` + +Please note that the `mounts` line is important if you want $SCRATCH to be available in your container. You can also mount a specific directory or file in $HOME and/or $SCRATCH as required. You should modify the username and the image directory as per your setup. + +To use `gssr` in a container, you will need the `dcgm` hook that is configured in the `[annotations]` section to enable DCGM libraries to be available within the container. + +### Run the application and container with gssr + +To invoke `gssr`, you can do the following in your sbatch file. + +#### Example of a mycontainer.sbatch file +``` +#!/bin/bash +#SBATCH -N4 +#SBATCH -A groupname +#SBATCH -J mycontainer +#SBATCH -t 1:00:00 +#SBATCH ... + +srun --environment=mycontainer bash -c 'gssr --wrap="python mycode.py"' + +``` + +Please replace the text `...` for any other SBATCH configuration that your job requires. +The `--environment` flag tells Slurm which container (name of the toml file) you would like to run. +The `bash -c` requirement is to initialise the bash environment within your container. + +If no `gssr` is used, the `srun` command in your container should like that.: + +``` +srun --environment=mycontainer bash -c 'python mycode.py'. +``` + +Now you are ready to submit your sbatch file to slurm with `sbatch` command. + +## Analyze the output + +Once your job successfully concluded. You should find a folder named `profile_out_{slurm_jobid}` where `gssr` json output is in. To generate output for analysis. + +To do so, you can do so interactively within your container where `gssr` is installed. + +To get an interactive session of our container + +``` +srun -A groupname --environment=mycontainer --pty bash +cd {directory where the gssr output data is generated} +``` +Alternatively, you can install `gssr` locally and copy the `profile_out_{slurm_jobid}` to your computer and visualise it locally. + +#### Metric Output +The profiled output can be analysed as follows.: + + gssr analyze -i ./profile_out + +#### PDF File Output with Plots + + gssr analyze -i ./profile_out --report + +A/Multiple PDF report(s) will be generated. + diff --git a/docs/software/gssr/index.md b/docs/software/gssr/index.md new file mode 100644 index 00000000..68aabfa4 --- /dev/null +++ b/docs/software/gssr/index.md @@ -0,0 +1,14 @@ +[](){#ref-gssr-overview} +# gssr + +GPU Saturation Scorer (gssr) provides a simple way to profile your code and get the results in both tables and plots for easy visualisation. gssr works on top of [NVIDIA Data Center GPU Manager (DCGM)](https://developer.nvidia.com/dcgm) and thus only NVIDIA GPUs are currently supported. + +The following documentations will be available.: + +* [Quickstart Guide][ref-gssr-quickstart] +* [Container Guide][ref-gssr-containers] + +This tool will produce time-series and heatmaps of the profiled metric values. Here is an example of one set of plots generated by the tool from the application Megatron-LLM from EPFL. + +![gssr timeseries](../../images/gssr/timeseries_eg.png) +![gssr heatmap](../../images/gssr/heatmap_eg.png) diff --git a/docs/software/gssr/quickstart.md b/docs/software/gssr/quickstart.md new file mode 100644 index 00000000..ca8ca585 --- /dev/null +++ b/docs/software/gssr/quickstart.md @@ -0,0 +1,55 @@ +[](){#ref-gssr-quickstart} +# gssr - Quickstart Guide + +## Installation + +### From Pypi + +`gssr` can be easily installed as follows.: + + pip install gssr + +### From GitHub Source + +To install directly from the source: + + pip install git+https://github.com/eth-cscs/GPU-saturation-scorer.git + +To install from a specific branch, e.g. the development branch, from the source: + + pip install git+https://github.com/eth-cscs/GPU-saturation-scorer.git@dev + +To install a specific release tag, e.g. gssr-v0.3, from the source: + + pip install git+https://github.com/eth-cscs/GPU-saturation-scorer.git@gssr-v0.3 + +## Profile + +### Example + +If you are submitting a batch job and the command you are executing is: + + srun python test.py + +The corresponding srun command should be modified as follows.: + + srun gssr profile -wrap="python abc.py" + +* The `gssr` option to run is `profile` +* The `"--wrap"` flag will wrap the command that you would like to run +* The default output directory is `profile_out_{slurm_job_id}` +* A label to the output data can be set with the `-l` flag + +## Analyze + +### Metric Output +The profiled output can be analysed as follows.: + + gssr analyze -i ./profile_out + +### PDF File Output with Plots + + gssr analyze -i ./profile_out --report + +A/Multiple PDF report(s) will be generated. + diff --git a/mkdocs.yml b/mkdocs.yml index c1167de4..0633d2d0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -82,6 +82,10 @@ nav: - 'Building uenv': software/uenv/build.md - 'Deploying uenv': software/uenv/deploy.md - 'Release notes': software/uenv/release-notes.md + - 'gssr': + - software/gssr/index.md + - 'Quickstart Guide': software/gssr/quickstart.md + - 'Container Guide': software/gssr/containers.md - 'Debugging and Performance Analysis': - software/devtools/index.md - 'Using NVIDIA Nsight': software/devtools/nvidia-nsight.md From c7d7d54ff695c0bdd6b7f209e688f42086b8d778 Mon Sep 17 00:00:00 2001 From: cerlane <> Date: Fri, 22 Aug 2025 08:54:22 +0200 Subject: [PATCH 02/10] to adhere to the American spell check and whitelist tool related words --- .github/actions/spelling/allow.txt | 6 ++++++ docs/software/gssr/containers.md | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt index e96d734a..460f278b 100644 --- a/.github/actions/spelling/allow.txt +++ b/.github/actions/spelling/allow.txt @@ -16,6 +16,7 @@ CWP CXI Ceph Containerfile +DCGM DNS Dockerfiles Dufourspitze @@ -92,6 +93,7 @@ Piz Plesset Podladchikov Pulay +Pypi RCCL RDMA ROCm @@ -166,7 +168,9 @@ gpu gromos groundstate gsl +gssr hdf +heatmaps hotmail huggingface hwloc @@ -203,6 +207,7 @@ mkl mpi mps multitenancy +mycontainer nanoscale nanotron nccl @@ -241,6 +246,7 @@ kubeconfig ceph rwx rwo +sqsh subdomain tls kured diff --git a/docs/software/gssr/containers.md b/docs/software/gssr/containers.md index 266dba4f..1ca174c8 100644 --- a/docs/software/gssr/containers.md +++ b/docs/software/gssr/containers.md @@ -105,7 +105,7 @@ To get an interactive session of our container srun -A groupname --environment=mycontainer --pty bash cd {directory where the gssr output data is generated} ``` -Alternatively, you can install `gssr` locally and copy the `profile_out_{slurm_jobid}` to your computer and visualise it locally. +Alternatively, you can install `gssr` locally and copy the `profile_out_{slurm_jobid}` to your computer and visualize it locally. #### Metric Output The profiled output can be analysed as follows.: From aeb82dce601e2341e8d6a494b54aa4731b40101b Mon Sep 17 00:00:00 2001 From: cerlane <> Date: Fri, 22 Aug 2025 09:57:50 +0200 Subject: [PATCH 03/10] improve readability and grammer of some sentences --- .github/actions/spelling/allow.txt | 2 +- docs/software/gssr/containers.md | 12 +++---- docs/software/gssr/quickstart.md | 56 +----------------------------- 3 files changed, 8 insertions(+), 62 deletions(-) diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt index 460f278b..7094be37 100644 --- a/.github/actions/spelling/allow.txt +++ b/.github/actions/spelling/allow.txt @@ -93,7 +93,7 @@ Piz Plesset Podladchikov Pulay -Pypi +PyPi RCCL RDMA ROCm diff --git a/docs/software/gssr/containers.md b/docs/software/gssr/containers.md index 1ca174c8..b8f525dc 100644 --- a/docs/software/gssr/containers.md +++ b/docs/software/gssr/containers.md @@ -30,9 +30,9 @@ RUN pip install gssr # Install your application and dependencies as required ... ``` -As you can see from the above example, gssr can easily be installed with a `RUN pip install gssr` command. Your application and dependencies should be written where the `...` is. +As you can see from the above example, gssr can easily be installed with a `RUN pip install gssr` command. -Once your `ContainerFile` is ready, you can build it on any Alps platform with the following commands to create a container with label `mycontainer`. +Once your `ContainerFile` is ready, you can build it on any Alps platforms with the following commands to create a container with label `mycontainer`. ```bash srun -A {groupID} --pty bash @@ -47,7 +47,7 @@ Now you should have a sqsh file of your container. Please note that you should r ## Create CSCS configuration for Container -Now you only need to tell CSCS container engine solution where your container is and how you would like to run it. To do so, you will have to create a`{label}.toml` file in your `$HOME/.edf` directory. +The next step is to tell CSCS container engine solution where your container is and how you would like to run it. To do so, you will have to create a`{label}.toml` file in your `$HOME/.edf` directory. ### Example of a `mycontainer.toml` file ``` @@ -95,11 +95,11 @@ Now you are ready to submit your sbatch file to slurm with `sbatch` command. ## Analyze the output -Once your job successfully concluded. You should find a folder named `profile_out_{slurm_jobid}` where `gssr` json output is in. To generate output for analysis. +Once your job successfully concluded, you should find a folder named `profile_out_{slurm_jobid}` where `gssr` json outputs are in. -To do so, you can do so interactively within your container where `gssr` is installed. +To analyze the outputs, you can do so interactively within any containers where `gssr` is installed, e.g., `mycontainer` we have in this guide. -To get an interactive session of our container +To get an interactive session of this container: ``` srun -A groupname --environment=mycontainer --pty bash diff --git a/docs/software/gssr/quickstart.md b/docs/software/gssr/quickstart.md index ca8ca585..1172d9a2 100644 --- a/docs/software/gssr/quickstart.md +++ b/docs/software/gssr/quickstart.md @@ -1,55 +1 @@ -[](){#ref-gssr-quickstart} -# gssr - Quickstart Guide - -## Installation - -### From Pypi - -`gssr` can be easily installed as follows.: - - pip install gssr - -### From GitHub Source - -To install directly from the source: - - pip install git+https://github.com/eth-cscs/GPU-saturation-scorer.git - -To install from a specific branch, e.g. the development branch, from the source: - - pip install git+https://github.com/eth-cscs/GPU-saturation-scorer.git@dev - -To install a specific release tag, e.g. gssr-v0.3, from the source: - - pip install git+https://github.com/eth-cscs/GPU-saturation-scorer.git@gssr-v0.3 - -## Profile - -### Example - -If you are submitting a batch job and the command you are executing is: - - srun python test.py - -The corresponding srun command should be modified as follows.: - - srun gssr profile -wrap="python abc.py" - -* The `gssr` option to run is `profile` -* The `"--wrap"` flag will wrap the command that you would like to run -* The default output directory is `profile_out_{slurm_job_id}` -* A label to the output data can be set with the `-l` flag - -## Analyze - -### Metric Output -The profiled output can be analysed as follows.: - - gssr analyze -i ./profile_out - -### PDF File Output with Plots - - gssr analyze -i ./profile_out --report - -A/Multiple PDF report(s) will be generated. - +### From PyPi From 7d4fabf37566e4d4bbefba2dc9f90f60ccab3c82 Mon Sep 17 00:00:00 2001 From: cerlane <> Date: Fri, 22 Aug 2025 10:20:54 +0200 Subject: [PATCH 04/10] feedback from Andreas and some minor sentencing updatess --- docs/software/gssr/containers.md | 4 +-- docs/software/gssr/quickstart.md | 55 +++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/docs/software/gssr/containers.md b/docs/software/gssr/containers.md index b8f525dc..b841c58b 100644 --- a/docs/software/gssr/containers.md +++ b/docs/software/gssr/containers.md @@ -77,7 +77,7 @@ To invoke `gssr`, you can do the following in your sbatch file. #SBATCH -t 1:00:00 #SBATCH ... -srun --environment=mycontainer bash -c 'gssr --wrap="python mycode.py"' +srun --environment=mycontainer bash -c 'gssr --wrap="python abc.py"' ``` @@ -88,7 +88,7 @@ The `bash -c` requirement is to initialise the bash environment within your cont If no `gssr` is used, the `srun` command in your container should like that.: ``` -srun --environment=mycontainer bash -c 'python mycode.py'. +srun --environment=mycontainer bash -c 'python abc.py'. ``` Now you are ready to submit your sbatch file to slurm with `sbatch` command. diff --git a/docs/software/gssr/quickstart.md b/docs/software/gssr/quickstart.md index 1172d9a2..e54d1ebd 100644 --- a/docs/software/gssr/quickstart.md +++ b/docs/software/gssr/quickstart.md @@ -1 +1,54 @@ -### From PyPi +[](){#ref-gssr-quickstart} +# gssr - Quickstart Guide + +## Installation + +### From Pypi + +`gssr` can be easily installed as follows.: + + pip install gssr + +### From GitHub Source + +To install directly from the source: + + pip install git+https://github.com/eth-cscs/GPU-saturation-scorer.git + +To install from a specific branch, e.g. the development branch, from the source: + + pip install git+https://github.com/eth-cscs/GPU-saturation-scorer.git@dev + +To install a specific release tag, e.g. gssr-v0.3, from the source: + + pip install git+https://github.com/eth-cscs/GPU-saturation-scorer.git@gssr-v0.3 + +## Profile + +### Example + +If you are submitting a batch job and the command you are executing is: + + srun python abc.py + +The corresponding srun command should be modified as follows.: + + srun gssr profile -wrap="python abc.py" + +* The `gssr` option to run is `profile` +* The `"--wrap"` flag will wrap the command that you would like to run +* The default output directory is `profile_out_{slurm_job_id}` +* A label to the output data can be set with the `-l` flag + +## Analyze + +### Metric Output +The profiled output can be analysed as follows.: + + gssr analyze -i ./profile_out + +### PDF File Output with Plots + + gssr analyze -i ./profile_out --report + +A/Multiple PDF report(s) will be generated. From d2b6d75735a0fa94e47794091af94948274ee31c Mon Sep 17 00:00:00 2001 From: cerlane <> Date: Fri, 22 Aug 2025 10:25:54 +0200 Subject: [PATCH 05/10] Pypi to PyPi --- docs/software/gssr/quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/software/gssr/quickstart.md b/docs/software/gssr/quickstart.md index e54d1ebd..41479123 100644 --- a/docs/software/gssr/quickstart.md +++ b/docs/software/gssr/quickstart.md @@ -3,7 +3,7 @@ ## Installation -### From Pypi +### From PyPi `gssr` can be easily installed as follows.: From d5897710cef56d52ed2dba1b7897c457f8a73fb0 Mon Sep 17 00:00:00 2001 From: cerlane <> Date: Fri, 22 Aug 2025 10:27:39 +0200 Subject: [PATCH 06/10] capitalise saturation scorer --- docs/software/gssr/quickstart.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/software/gssr/quickstart.md b/docs/software/gssr/quickstart.md index 41479123..655eff93 100644 --- a/docs/software/gssr/quickstart.md +++ b/docs/software/gssr/quickstart.md @@ -13,15 +13,15 @@ To install directly from the source: - pip install git+https://github.com/eth-cscs/GPU-saturation-scorer.git + pip install git+https://github.com/eth-cscs/GPU-Saturation-Scorer.git To install from a specific branch, e.g. the development branch, from the source: - pip install git+https://github.com/eth-cscs/GPU-saturation-scorer.git@dev + pip install git+https://github.com/eth-cscs/GPU-Saturation-Scorer.git@dev To install a specific release tag, e.g. gssr-v0.3, from the source: - pip install git+https://github.com/eth-cscs/GPU-saturation-scorer.git@gssr-v0.3 + pip install git+https://github.com/eth-cscs/GPU-Saturation-Scorer.git@gssr-v0.3 ## Profile From e37e59e2e57baa6a2a15371d1b8bb014d08e6aa7 Mon Sep 17 00:00:00 2001 From: cerlane <> Date: Mon, 25 Aug 2025 10:58:23 +0200 Subject: [PATCH 07/10] update to resolve comments from Andreas and Ben --- .github/actions/spelling/allow.txt | 1 - docs/software/{ => devtools}/gssr/containers.md | 12 ++++++------ docs/software/{ => devtools}/gssr/index.md | 4 ++-- docs/software/{ => devtools}/gssr/quickstart.md | 0 docs/software/devtools/index.md | 1 + mkdocs.yml | 8 ++++---- 6 files changed, 13 insertions(+), 13 deletions(-) rename docs/software/{ => devtools}/gssr/containers.md (85%) rename docs/software/{ => devtools}/gssr/index.md (85%) rename docs/software/{ => devtools}/gssr/quickstart.md (100%) diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt index 7094be37..c8c062d9 100644 --- a/.github/actions/spelling/allow.txt +++ b/.github/actions/spelling/allow.txt @@ -246,7 +246,6 @@ kubeconfig ceph rwx rwo -sqsh subdomain tls kured diff --git a/docs/software/gssr/containers.md b/docs/software/devtools/gssr/containers.md similarity index 85% rename from docs/software/gssr/containers.md rename to docs/software/devtools/gssr/containers.md index b841c58b..e6869a50 100644 --- a/docs/software/gssr/containers.md +++ b/docs/software/devtools/gssr/containers.md @@ -1,8 +1,6 @@ [](){#ref-gssr-containers} # gssr - Containers Guide -CSCS highly recommends that all users leverage on container solutions on our Alps platforms so as to flexibly configure any required user environments of their choice within the containers. Users thus have maximum flexibility as they are not tied to any specific operating systems and/or software stacks. - The following guide will explain how to install and use `gssr` within a container. Most CSCS users leverage on the base containers with pre-installed CUDA from Nvidia. As such, in the following documentation, we will use a PyTorch base container as an example. @@ -36,14 +34,16 @@ Once your `ContainerFile` is ready, you can build it on any Alps platforms with ```bash srun -A {groupID} --pty bash -# Once you have an interactive session, use podman command to build your container +# Once you have an interactive session, use podman command to build the +# container # -v is to mount the fast storage on Alps into the container. podman build -v $SCRATCH:$SCRATCH -t mycontainer:0.1 . -# Export the container from the podman's cache to a local sqshfs file with enroot +# Export the container from the podman's cache to a local squashFS file with +# enroot enroot import -x mount -o mycontainer.sqsh podman://local:mycontainer:0.1 ``` -Now you should have a sqsh file of your container. Please note that you should replace `mycontainer` label to any other label of your choice. The version `0.1` can also be omitted or replaced with another version as required. +Now you should have a squashFS file of your container. Please note that you should replace `mycontainer` label to any other label of your choice. The version `0.1` can also be omitted or replaced with another version as required. ## Create CSCS configuration for Container @@ -51,7 +51,7 @@ The next step is to tell CSCS container engine solution where your container is ### Example of a `mycontainer.toml` file ``` -image = "/capstor/scratch/cscs/username/directoryWhereYourContainerIs/mycontainer.sqsh" +image = "/capstor/scratch/cscs/username/{yourDir}/mycontainer.sqsh" mounts = ["/capstor/scratch/cscs/username:/capstor/scratch/cscs/username"] workdir = "/capstor/scratch/cscs/username" writable = true diff --git a/docs/software/gssr/index.md b/docs/software/devtools/gssr/index.md similarity index 85% rename from docs/software/gssr/index.md rename to docs/software/devtools/gssr/index.md index 68aabfa4..f7f86846 100644 --- a/docs/software/gssr/index.md +++ b/docs/software/devtools/gssr/index.md @@ -10,5 +10,5 @@ The following documentations will be available.: This tool will produce time-series and heatmaps of the profiled metric values. Here is an example of one set of plots generated by the tool from the application Megatron-LLM from EPFL. -![gssr timeseries](../../images/gssr/timeseries_eg.png) -![gssr heatmap](../../images/gssr/heatmap_eg.png) +![gssr timeseries](../../../images/gssr/timeseries_eg.png) +![gssr heatmap](../../../images/gssr/heatmap_eg.png) diff --git a/docs/software/gssr/quickstart.md b/docs/software/devtools/gssr/quickstart.md similarity index 100% rename from docs/software/gssr/quickstart.md rename to docs/software/devtools/gssr/quickstart.md diff --git a/docs/software/devtools/index.md b/docs/software/devtools/index.md index 7d8f3177..061eacdb 100644 --- a/docs/software/devtools/index.md +++ b/docs/software/devtools/index.md @@ -31,3 +31,4 @@ In this section we introduce the various performance analysis solutions availabl * [NVIDIA Nsight Developer Tools][ref-devtools-nsight] * [Linaro Forge MAP][ref-devtools-map] * [VI-HPS Tools][ref-devtools-vihps] +* [gssr][ref-gssr-overview] diff --git a/mkdocs.yml b/mkdocs.yml index 8a6c90e9..0622c561 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -82,10 +82,6 @@ nav: - 'Building uenv': software/uenv/build.md - 'Deploying uenv': software/uenv/deploy.md - 'Release notes': software/uenv/release-notes.md - - 'gssr': - - software/gssr/index.md - - 'Quickstart Guide': software/gssr/quickstart.md - - 'Container Guide': software/gssr/containers.md - 'Debugging and Performance Analysis': - software/devtools/index.md - 'Using NVIDIA Nsight': software/devtools/nvidia-nsight.md @@ -94,6 +90,10 @@ nav: - 'Linaro performance analysis tool': software/devtools/linaro-map.md - 'Linaro debugger': software/devtools/linaro-ddt.md - 'Using Score-P/Scalasca': software/devtools/vihps.md + - 'GPU Saturation Scorer (gssr)': + - software/devtools/gssr/index.md + - 'Quickstart Guide': software/devtools/gssr/quickstart.md + - 'Container Guide': software/devtools/gssr/containers.md - 'Container Engine': - software/container-engine/index.md - 'Using container engine': software/container-engine/run.md From 5003d185ff3ce8b48730ed29a9e95aef9a2c07f2 Mon Sep 17 00:00:00 2001 From: Cerlane Leong <4125163+cerlane@users.noreply.github.com> Date: Tue, 9 Sep 2025 11:14:32 +0200 Subject: [PATCH 08/10] Update docs/software/devtools/gssr/containers.md Co-authored-by: Ben Cumming --- docs/software/devtools/gssr/containers.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/software/devtools/gssr/containers.md b/docs/software/devtools/gssr/containers.md index e6869a50..0b4fec4a 100644 --- a/docs/software/devtools/gssr/containers.md +++ b/docs/software/devtools/gssr/containers.md @@ -3,7 +3,8 @@ The following guide will explain how to install and use `gssr` within a container. -Most CSCS users leverage on the base containers with pre-installed CUDA from Nvidia. As such, in the following documentation, we will use a PyTorch base container as an example. +Most CSCS users leverage on the base containers with pre-installed CUDA from Nvidia. +As such, in the following documentation, we will use a PyTorch base container as an example. ## Preparing a container with `gssr` From 9bc67d4115757af9ae884bb46eb4469f4c658be2 Mon Sep 17 00:00:00 2001 From: Cerlane Leong <4125163+cerlane@users.noreply.github.com> Date: Tue, 9 Sep 2025 11:15:03 +0200 Subject: [PATCH 09/10] Update docs/software/devtools/gssr/containers.md Co-authored-by: Ben Cumming --- docs/software/devtools/gssr/containers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/software/devtools/gssr/containers.md b/docs/software/devtools/gssr/containers.md index 0b4fec4a..09d8caee 100644 --- a/docs/software/devtools/gssr/containers.md +++ b/docs/software/devtools/gssr/containers.md @@ -13,7 +13,7 @@ As such, in the following documentation, we will use a PyTorch base container as The most commonly used Nvidia container used on Alps is the [Nvidia's PyTorch container](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch). Typically the latest version is preferred for the most up-to-date functionalities of PyTorch. #### Example: Preparing a Nvidia PyTorch ContainerFile -``` +```dockerfile FROM --platform=linux/arm64 nvcr.io/nvidia/pytorch:25.08-py3 ENV DEBIAN_FRONTEND=noninteractive From 05993722bedc74b22b4f9d68d4fcecf75657bc70 Mon Sep 17 00:00:00 2001 From: Cerlane Leong <4125163+cerlane@users.noreply.github.com> Date: Tue, 9 Sep 2025 11:16:08 +0200 Subject: [PATCH 10/10] Update docs/software/devtools/gssr/containers.md Co-authored-by: Ben Cumming --- docs/software/devtools/gssr/containers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/software/devtools/gssr/containers.md b/docs/software/devtools/gssr/containers.md index 09d8caee..993791f6 100644 --- a/docs/software/devtools/gssr/containers.md +++ b/docs/software/devtools/gssr/containers.md @@ -117,5 +117,5 @@ The profiled output can be analysed as follows.: gssr analyze -i ./profile_out --report -A/Multiple PDF report(s) will be generated. +At least one PDF report will be generated.