diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..ec6ef81 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,8 @@ +## Description + +Place a description of your PR here + +## Checklist +- [ ] If creating a new version of the tutorial, create a new directory at the root of the repository with the relevant name +- [ ] Ensure all Docker-related material except for tutorial contents goes in a `docker` subdirectory +- [ ] Update `github_ci_matrix.json` with (1) the tag you will eventually use for the tutorial Docker images (place in the `"tag"` field) and (2) the name of the directory for your version of the tutorial (place in the `"tutorial_dir"` field) \ No newline at end of file diff --git a/.github/workflows/push_images.yml b/.github/workflows/push_images.yml new file mode 100644 index 0000000..5b65af6 --- /dev/null +++ b/.github/workflows/push_images.yml @@ -0,0 +1,362 @@ +name: Build containers and push to GHCR + +on: + workflow_dispatch: + inputs: + tag: + type: string + description: Tag to use for the uploaded containers + required: true + tutorial_dir: + type: string + description: The directory (relative to repo root) for the tutorial you want to build + required: true + +jobs: + setup_shared_matrix: + runs-on: ubuntu-latest + outputs: + matrix_data: ${{ steps.set-matrix.outputs.matrix_data }} + + steps: + - id: set-matrix + run: | + matrix_data='{"docker_os": ["linux"], "docker_arch": ["amd64"]}' + echo "matrix_data=$matrix_data" >> "$GITHUB_OUTPUT" + + build_caliper_container: + needs: setup_shared_matrix + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + tag: + - ${{ github.event.inputs.tag }} + tutorial_dir: + - ${{ github.event.inputs.tutorial_dir }} + docker_os: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_os }} + docker_arch: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_arch }} + containers_to_build: + - ["docker/Dockerfile.caliper", "ghcr.io/llnl/caliper"] + + steps: + - uses: actions/checkout@v4 + + - name: Remove unneeded stuff to make space for container + uses: jlumbroso/free-disk-space@v1.3.1 + with: + tool-cache: true + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: false + swap-storage: true + + - name: Set up Docker + uses: docker/setup-docker-action@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GHCR + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Pull layers if they exist + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker pull ${container} || echo "${container} has not yet been pushed" + + - name: Build container + env: + context: ${{ matrix.tutorial_dir }} + dockerfile: ${{ matrix.containers_to_build[0] }} + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + platform: "${{ matrix.docker_os }}/${{ matrix.docker_arch }}" + run: | + cd ${context} + docker build --progress=plain --platform ${platform} -f ${dockerfile} -t ${container} . + + - name: Deploy container + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker push ${container} + + build_thicket_container: + needs: + - setup_shared_matrix + - build_caliper_container + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + tag: + - ${{ github.event.inputs.tag }} + tutorial_dir: + - ${{ github.event.inputs.tutorial_dir }} + docker_os: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_os }} + docker_arch: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_arch }} + containers_to_build: + - ["docker/Dockerfile.thicket", "ghcr.io/llnl/thicket"] + + steps: + - uses: actions/checkout@v4 + + - name: Remove unneeded stuff to make space for container + uses: jlumbroso/free-disk-space@v1.3.1 + with: + tool-cache: true + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: false + swap-storage: true + + - name: Set up Docker + uses: docker/setup-docker-action@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GHCR + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Pull layers if they exist + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker pull ${container} || echo "${container} has not yet been pushed" + + - name: Build container + env: + context: ${{ matrix.tutorial_dir }} + dockerfile: ${{ matrix.containers_to_build[0] }} + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + platform: "${{ matrix.docker_os }}/${{ matrix.docker_arch }}" + run: | + cd ${context} + docker build --progress=plain --platform ${platform} -f ${dockerfile} -t ${container} . + + - name: Deploy container + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker push ${container} + + build_benchpark_container: + needs: + - setup_shared_matrix + - build_thicket_container + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + tag: + - ${{ github.event.inputs.tag }} + tutorial_dir: + - ${{ github.event.inputs.tutorial_dir }} + docker_os: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_os }} + docker_arch: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_arch }} + containers_to_build: + - ["docker/Dockerfile.benchpark", "ghcr.io/llnl/benchpark"] + + steps: + - uses: actions/checkout@v4 + + - name: Remove unneeded stuff to make space for container + uses: jlumbroso/free-disk-space@v1.3.1 + with: + tool-cache: true + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: false + swap-storage: true + + - name: Set up Docker + uses: docker/setup-docker-action@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GHCR + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Pull layers if they exist + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker pull ${container} || echo "${container} has not yet been pushed" + + - name: Build container + env: + context: ${{ matrix.tutorial_dir }} + dockerfile: ${{ matrix.containers_to_build[0] }} + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + platform: "${{ matrix.docker_os }}/${{ matrix.docker_arch }}" + run: | + cd ${context} + docker build --progress=plain --platform ${platform} -f ${dockerfile} -t ${container} . + + - name: Deploy container + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker push ${container} + + build_spawn_container: + needs: + - setup_shared_matrix + - build_benchpark_container + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + tag: + - ${{ github.event.inputs.tag }} + tutorial_dir: + - ${{ github.event.inputs.tutorial_dir }} + docker_os: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_os }} + docker_arch: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_arch }} + containers_to_build: + - ["docker/Dockerfile.spawn", "ghcr.io/llnl/reproducible-benchmarking-spawn"] + + steps: + - uses: actions/checkout@v4 + + - name: Remove unneeded stuff to make space for container + uses: jlumbroso/free-disk-space@v1.3.1 + with: + tool-cache: true + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: false + swap-storage: true + + - name: Set up Docker + uses: docker/setup-docker-action@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GHCR + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Pull layers if they exist + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker pull ${container} || echo "${container} has not yet been pushed" + + - name: Build container + env: + context: ${{ matrix.tutorial_dir }} + dockerfile: ${{ matrix.containers_to_build[0] }} + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + platform: "${{ matrix.docker_os }}/${{ matrix.docker_arch }}" + run: | + cd ${context} + docker build --progress=plain --platform ${platform} -f ${dockerfile} -t ${container} . + + - name: Deploy container + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker push ${container} + + build_init_container: + needs: + - setup_shared_matrix + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + tag: + - ${{ github.event.inputs.tag }} + tutorial_dir: + - ${{ github.event.inputs.tutorial_dir }} + docker_os: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_os }} + docker_arch: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_arch }} + containers_to_build: + - ["docker/Dockerfile.init", "ghcr.io/llnl/reproducible-benchmarking-init"] + + steps: + - uses: actions/checkout@v4 + + - name: Remove unneeded stuff to make space for container + uses: jlumbroso/free-disk-space@v1.3.1 + with: + tool-cache: true + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: false + swap-storage: true + + - name: Set up Docker + uses: docker/setup-docker-action@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GHCR + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Pull layers if they exist + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker pull ${container} || echo "${container} has not yet been pushed" + + - name: Build container + env: + context: ${{ matrix.tutorial_dir }} + dockerfile: ${{ matrix.containers_to_build[0] }} + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + platform: "${{ matrix.docker_os }}/${{ matrix.docker_arch }}" + run: | + cd ${context} + docker build --progress=plain --platform ${platform} -f ${dockerfile} -t ${container} . + + - name: Deploy container + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker push ${container} \ No newline at end of file diff --git a/.github/workflows/test_build_images.yml b/.github/workflows/test_build_images.yml new file mode 100644 index 0000000..e21d3de --- /dev/null +++ b/.github/workflows/test_build_images.yml @@ -0,0 +1,359 @@ +name: Build containers for testing PRs + +on: + pull_request: [] + +jobs: + setup_shared_matrix: + runs-on: ubuntu-latest + outputs: + matrix_data: ${{ steps.set-matrix.outputs.matrix_data }} + + steps: + - uses: actions/checkout@v4 + + - id: set-matrix + run: | + echo "$(pwd)" + ls -lah + matrix_data="$(cat github_ci_matrix.json | jq -c)" + echo "matrix_data=$matrix_data" >> "$GITHUB_OUTPUT" + + build_caliper_container: + needs: setup_shared_matrix + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + tag: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).tag }} + tutorial_dir: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).tutorial_dir }} + docker_os: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_os }} + docker_arch: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_arch }} + containers_to_build: + - ["docker/Dockerfile.caliper", "ghcr.io/llnl/caliper"] + + steps: + - uses: actions/checkout@v4 + + - name: Remove unneeded stuff to make space for container + uses: jlumbroso/free-disk-space@v1.3.1 + with: + tool-cache: true + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: false + swap-storage: true + + - name: Set up Docker + uses: docker/setup-docker-action@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Pull layers if they exist + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker pull ${container} || echo "${container} has not yet been pushed" + + - name: Build container + env: + context: ${{ matrix.tutorial_dir }} + dockerfile: ${{ matrix.containers_to_build[0] }} + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + platform: "${{ matrix.docker_os }}/${{ matrix.docker_arch }}" + run: | + cd ${context} + docker build --progress=plain --platform ${platform} -f ${dockerfile} -t ${container} . + + - name: Save container to tarball + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + tar_dest: "${{ runner.temp }}/caliper_${{ matrix.docker_arch }}.tar" + run: docker save -o ${tar_dest} ${container} + + - name: Upload tarball as artifact to be used in downstream jobs + uses: actions/upload-artifact@v4 + with: + name: caliper_image_${{ matrix.docker_arch }} + path: ${{ runner.temp }}/caliper_${{ matrix.docker_arch }}.tar + + build_thicket_container: + needs: + - setup_shared_matrix + - build_caliper_container + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + tag: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).tag }} + tutorial_dir: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).tutorial_dir }} + docker_os: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_os }} + docker_arch: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_arch }} + containers_to_build: + - ["docker/Dockerfile.thicket", "ghcr.io/llnl/thicket"] + + steps: + - uses: actions/checkout@v4 + + - name: Remove unneeded stuff to make space for container + uses: jlumbroso/free-disk-space@v1.3.1 + with: + tool-cache: true + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: false + swap-storage: true + + - name: Set up Docker + uses: docker/setup-docker-action@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Download Caliper image + uses: actions/download-artifact@v4 + with: + name: caliper_image_${{ matrix.docker_arch }} + path: ${{ runner.temp }} + + - name: Load Caliper image + env: + DEPENDENCY_IMAGE_TAR: ${{ runner.temp }}/caliper_${{ matrix.docker_arch }}.tar + run: | + docker load --input ${DEPENDENCY_IMAGE_TAR} + docker image ls -a + - name: Pull layers if they exist + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker pull ${container} || echo "${container} has not yet been pushed" + + - name: Build container + env: + context: ${{ matrix.tutorial_dir }} + dockerfile: ${{ matrix.containers_to_build[0] }} + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + platform: "${{ matrix.docker_os }}/${{ matrix.docker_arch }}" + run: | + cd ${context} + docker build --progress=plain --platform ${platform} -f ${dockerfile} -t ${container} . + + - name: Save container to tarball + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + tar_dest: "${{ runner.temp }}/thicket_${{ matrix.docker_arch }}.tar" + run: docker save -o ${tar_dest} ${container} + + - name: Upload tarball as artifact to be used in downstream jobs + uses: actions/upload-artifact@v4 + with: + name: thicket_image_${{ matrix.docker_arch }} + path: ${{ runner.temp }}/thicket_${{ matrix.docker_arch }}.tar + + build_benchpark_container: + needs: + - setup_shared_matrix + - build_thicket_container + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + tag: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).tag }} + tutorial_dir: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).tutorial_dir }} + docker_os: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_os }} + docker_arch: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_arch }} + containers_to_build: + - ["docker/Dockerfile.benchpark", "ghcr.io/llnl/benchpark"] + + steps: + - uses: actions/checkout@v4 + + - name: Remove unneeded stuff to make space for container + uses: jlumbroso/free-disk-space@v1.3.1 + with: + tool-cache: true + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: false + swap-storage: true + + - name: Set up Docker + uses: docker/setup-docker-action@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Download Thicket image + uses: actions/download-artifact@v4 + with: + name: thicket_image_${{ matrix.docker_arch }} + path: ${{ runner.temp }} + + - name: Load Thicket image + env: + DEPENDENCY_IMAGE_TAR: ${{ runner.temp }}/thicket_${{ matrix.docker_arch }}.tar + run: | + docker load --input ${DEPENDENCY_IMAGE_TAR} + docker image ls -a + - name: Pull layers if they exist + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker pull ${container} || echo "${container} has not yet been pushed" + + - name: Build container + env: + context: ${{ matrix.tutorial_dir }} + dockerfile: ${{ matrix.containers_to_build[0] }} + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + platform: "${{ matrix.docker_os }}/${{ matrix.docker_arch }}" + run: | + cd ${context} + docker build --progress=plain --platform ${platform} -f ${dockerfile} -t ${container} . + + - name: Save container to tarball + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + tar_dest: "${{ runner.temp }}/benchpark_${{ matrix.docker_arch }}.tar" + run: docker save -o ${tar_dest} ${container} + + - name: Upload tarball as artifact to be used in downstream jobs + uses: actions/upload-artifact@v4 + with: + name: benchpark_image_${{ matrix.docker_arch }} + path: ${{ runner.temp }}/benchpark_${{ matrix.docker_arch }}.tar + + build_spawn_container: + needs: + - setup_shared_matrix + - build_benchpark_container + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + tag: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).tag }} + tutorial_dir: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).tutorial_dir }} + docker_os: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_os }} + docker_arch: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_arch }} + containers_to_build: + - ["docker/Dockerfile.spawn", "ghcr.io/llnl/reproducible-benchmarking-spawn"] + + steps: + - uses: actions/checkout@v4 + + - name: Remove unneeded stuff to make space for container + uses: jlumbroso/free-disk-space@v1.3.1 + with: + tool-cache: true + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: false + swap-storage: true + + - name: Set up Docker + uses: docker/setup-docker-action@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Download Benchpark image + uses: actions/download-artifact@v4 + with: + name: benchpark_image_${{ matrix.docker_arch }} + path: ${{ runner.temp }} + + - name: Load Benchpark image + env: + DEPENDENCY_IMAGE_TAR: ${{ runner.temp }}/benchpark_${{ matrix.docker_arch }}.tar + run: | + docker load --input ${DEPENDENCY_IMAGE_TAR} + docker image ls -a + - name: Pull layers if they exist + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker pull ${container} || echo "${container} has not yet been pushed" + + - name: Build container + env: + context: ${{ matrix.tutorial_dir }} + dockerfile: ${{ matrix.containers_to_build[0] }} + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + platform: "${{ matrix.docker_os }}/${{ matrix.docker_arch }}" + run: | + cd ${context} + docker build --progress=plain --platform ${platform} -f ${dockerfile} -t ${container} . + + build_init_container: + needs: + - setup_shared_matrix + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + tag: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).tag }} + tutorial_dir: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).tutorial_dir }} + docker_os: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_os }} + docker_arch: ${{ fromJson(needs.setup_shared_matrix.outputs.matrix_data).docker_arch }} + containers_to_build: + - ["docker/Dockerfile.init", "ghcr.io/llnl/reproducible-benchmarking-init"] + + steps: + - uses: actions/checkout@v4 + + - name: Remove unneeded stuff to make space for container + uses: jlumbroso/free-disk-space@v1.3.1 + with: + tool-cache: true + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: false + swap-storage: true + + - name: Set up Docker + uses: docker/setup-docker-action@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Pull layers if they exist + env: + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + run: docker pull ${container} || echo "${container} has not yet been pushed" + + - name: Build container + env: + context: ${{ matrix.tutorial_dir }} + dockerfile: ${{ matrix.containers_to_build[0] }} + container: "${{ matrix.containers_to_build[1] }}:${{ matrix.tag }}" + platform: "${{ matrix.docker_os }}/${{ matrix.docker_arch }}" + run: | + cd ${context} + docker build --progress=plain --platform ${platform} -f ${dockerfile} -t ${container} . \ No newline at end of file diff --git a/2025-HPDC/README.rst b/2025-HPDC/README.rst new file mode 100644 index 0000000..f09145b --- /dev/null +++ b/2025-HPDC/README.rst @@ -0,0 +1,75 @@ +================== +HPDC 2025 Tutorial +================== + +This directory contains the materials for the HPDC 2025 tutorial. The following subsections go over the contains of the material. + +------------- +Tutorial Code +------------- + +The code elements of this tutorial (e.g., Jupyter notebooks, command-line scripts, Markdown/RST instruction files) can all be found in the :code:`tutorial-code` subdirectory. If materials are actually stored in other git repositories, they can be accessed from this subdirectory +via a git submodule. + +------ +Slides +------ + +The slides used in presenting this tutorial can be found in the :code:`slides` subdirectory. + +------ +Docker +------ + +The Docker definition files (i.e., Dockerfiles) for all the necessary containers can be found in the :code:`docker` subdirectory. There are currently 5 definition files: + +1. :code:`Dockerfile.caliper`: builds Caliper and Adiak on top of the :code:`ubuntu/noble` image from DockerHub +2. :code:`Dockerfile.thicket`: build Thicket on top of the image produced by :code:`Dockerfile.caliper` +3. :code:`Dockerfile.benchpark`: download and bootstrap Benchpark on top of the image produced by :code:`Dockerfile.benchpark` +4. :code:`Dockerfile.spawn`: download tutorial materials, download any remaining necessary packages, and do other setup work on top of the image produced by :code:`Dockerfile.benchpark` +5. :code:`Dockerfile.init`: ensure user permissions are correct using the super-minimal :code:`alpine/git` image from DockerHub + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Testing the Builds of the Docker Images +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To enable automated testing of the Docker images, all edits to the Dockerfiles above should be done in a branch with an open PR. When a PR is open, a GitHub Actions CI will +run and ensure that the images can be built. To properly configure the CI, edit the :code:`github_ci_matrix.json` file in the root of this repository as follows: + +1. Edit the "tag" field to be the tag (i.e., version) of the Docker images you will be generating +2. Edit the "tutorial_dir" field to the name of this directory + +The CI reads :code:`github_ci_matrix.json` to get values shared by the matrices of all GitHub Actions jobs. + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Pushing the Docker Images to GitHub Container Registry (GHCR) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Before trying to push to GHCR, someone with the necessary permissions should make sure this repo can push to these images in GHCR (**change names when we decide on appropriate ones**): + +* ghcr.io/LLNL/caliper +* ghcr.io/LLNL/thicket +* ghcr.io/LLNL/benchpark +* ghcr.io/LLNL/reproducible-benchmarking-spawn +* ghcr.io/LLNL/reproducible-benchmarking-init + +If these images do not yet exist, your first push will properly set the permissions. If these images do exist, follow the instructions +`here `_ +to add this repository to each package. Make sure to grant "Write" permissions to the repository while doing this. + +After ensuring this repository has the necessary permissions, to push the Docker images to GHCR, follow these steps: + +1. Make sure all changes to the Dockerfiles have been merged into the :code:`main` branch +2. From the GitHub webpage, navigate to the "Actions" tab +3. On the left of the resulting page, click on "Build containers and push to GHCR" +4. Click on the "Run workflow" button to the right of the page +5. In the popup menu that appears, select the "main" branch and fill out the requested information +6. Click the green "Run workflow" button to start the process and building and pushing images + +-------------- +Infrastructure +-------------- + +All the infrastructure needed to deploy the tutorial to a Kubernetes cluster with JupyterHub is contained in the :code:`infrastructure` subdirectory. +This infrastructure is generated by the tool `here `_. +The infrastructure can be regenerated as-is using :code:`infrastructure/config.toml`. diff --git a/2025-HPDC/docker/Dockerfile.benchpark b/2025-HPDC/docker/Dockerfile.benchpark new file mode 100644 index 0000000..ee246fc --- /dev/null +++ b/2025-HPDC/docker/Dockerfile.benchpark @@ -0,0 +1,62 @@ +# Copyright 2025 Lawrence Livermore National Security, LLC and other +# Benchpark developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: Apache-2.0 + +# For testing +# FROM test-thicket + +FROM ghcr.io/llnl/thicket:hpdc-2025 + +USER root + +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + wget \ + gzip \ + lsb-release \ + patch \ + tar \ + unzip \ + xz-utils \ + zstd \ + bzip2 \ + && rm -rf /var/lib/apt/lists/* + +SHELL [ "/bin/bash", "-c" ] + +USER ${NB_USER} + +RUN git clone https://github.com/LLNL/benchpark.git ${HOME}/benchpark && \ + cd ${HOME}/benchpark && \ + git submodule update --init --recursive + +USER root + +RUN . /opt/global_py_venv/bin/activate && \ + python3 -m pip install -r ${HOME}/benchpark/requirements.txt + +RUN echo 'export PATH=/usr/bin:$PATH' >> ${HOME}/.bashrc && \ + echo '. /opt/global_py_venv/bin/activate' >> ${HOME}/.bashrc && \ + echo 'export LD_LIBRARY_PATH=/usr/lib:/usr/lib64:$LD_LIBRARY_PATH' >> ${HOME}/.bashrc && \ + echo 'export PATH=${HOME}/benchpark/bin:$PATH' >> ${HOME}/.bashrc + +RUN echo 'export PATH=/usr/bin:$PATH' >> ${HOME}/.bash_profile && \ + echo '. /opt/global_py_venv/bin/activate' >> ${HOME}/.bash_profile && \ + echo 'export LD_LIBRARY_PATH=/usr/lib:/usr/lib64:$LD_LIBRARY_PATH' >> ${HOME}/.bash_profile && \ + echo 'export PATH=${HOME}/benchpark/bin:$PATH' >> ${HOME}/.bash_profile + +RUN chmod -R 777 ~/ ${HOME} + +WORKDIR ${HOME} + +RUN mkdir -p ${HOME}/.local/share && \ + chmod 777 ${HOME}/.local/share + +USER ${NB_USER} + +# Run this to trigger bootstrap +# TODO change to new benchpark bootstrap command +RUN . /opt/global_py_venv/bin/activate && \ + ${HOME}/benchpark/bin/benchpark audit -h diff --git a/2025-HPDC/docker/Dockerfile.caliper b/2025-HPDC/docker/Dockerfile.caliper new file mode 100644 index 0000000..bbad96f --- /dev/null +++ b/2025-HPDC/docker/Dockerfile.caliper @@ -0,0 +1,108 @@ +# Copyright 2025 Lawrence Livermore National Security, LLC and other +# Benchpark developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: Apache-2.0 + +FROM ubuntu:noble + +# ubuntu:noble added a new 'ubuntu' user in the container. +# Get rid of it! +RUN userdel -r ubuntu + +USER root + +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + adduser \ + vim \ + nano \ + emacs \ + build-essential \ + cmake \ + python3 \ + python3-dev \ + python3-pip \ + python3-venv \ + openmpi-bin \ + openmpi-common \ + libopenmpi-dev \ + git \ + && rm -rf /var/lib/apt/lists/* + +SHELL [ "/bin/bash", "-c" ] + +RUN python3 -m venv /opt/global_py_venv + +RUN . /opt/global_py_venv/bin/activate && \ + python3 -m pip install pybind11 + +ENV CALI_INSTALL_PREFIX=/usr \ + GIT_CLONE_STAGING_DIR=/tmp + +RUN git clone https://github.com/LLNL/Caliper.git ${GIT_CLONE_STAGING_DIR}/Caliper && \ + cd ${GIT_CLONE_STAGING_DIR}/Caliper && \ + git fetch origin && \ + git checkout v2.12.1 && \ + git submodule update --init --recursive && \ + git clone https://github.com/LLNL/Adiak.git ${GIT_CLONE_STAGING_DIR}/Adiak && \ + cd ${GIT_CLONE_STAGING_DIR}/Adiak && \ + git fetch origin && \ + git checkout v0.4.1 && \ + git submodule update --init --recursive + +RUN cd ${GIT_CLONE_STAGING_DIR}/Adiak && \ + mkdir build && \ + cd build && \ + cmake \ + -DENABLE_MPI=ON \ + -DCMAKE_C_COMPILER=$(which gcc) \ + -DCMAKE_CXX_COMPILER=$(which g++) \ + -DBUILD_SHARED_LIBS=ON \ + -DCMAKE_INSTALL_PREFIX=${CALI_INSTALL_PREFIX} \ + .. && \ + make -j 4 && \ + make install + +RUN . /opt/global_py_venv/bin/activate && \ + cd ${GIT_CLONE_STAGING_DIR}/Caliper && \ + mkdir build && \ + cd build && \ + cmake \ + -DWITH_TOOLS=ON \ + -DWITH_MPI=ON \ + -DWITH_ADIAK=ON \ + -DWITH_PYTHON_BINDINGS=ON \ + -Dpybind11_DIR=$(pybind11-config --cmakedir) \ + -DCMAKE_PREFIX_PATH=${CALI_INSTALL_PREFIX} \ + -DCMAKE_C_COMPILER=$(which gcc) \ + -DCMAKE_CXX_COMPILER=$(which g++) \ + -DBUILD_SHARED_LIBS=ON \ + -DCMAKE_INSTALL_PREFIX=${CALI_INSTALL_PREFIX} \ + .. && \ + make -j 4 && \ + make install + +RUN rm -rf ${GIT_CLONE_STAGING_DIR}/Caliper && rm -rf ${GIT_CLONE_STAGING_DIR}/Adiak + +ENV NB_USER=jovyan \ + NB_UID=1000 \ + HOME=/home/jovyan + +RUN adduser \ + --disabled-password \ + --gecos "Default user" \ + --uid ${NB_UID} \ + --home ${HOME} \ + --force-badname \ + ${NB_USER} + +RUN chmod -R 777 ~/ ${HOME} + +ENV SHELL=/usr/bin/bash + +RUN mkdir -p ${HOME}/.local/share && \ + chmod 777 ${HOME}/.local/share + +USER ${NB_USER} +WORKDIR ${HOME} \ No newline at end of file diff --git a/2025-HPDC/docker/Dockerfile.init b/2025-HPDC/docker/Dockerfile.init new file mode 100644 index 0000000..269a316 --- /dev/null +++ b/2025-HPDC/docker/Dockerfile.init @@ -0,0 +1,22 @@ +# Copyright 2025 Lawrence Livermore National Security, LLC and other +# Benchpark developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: Apache-2.0 + +FROM alpine/git + +USER root + +ENV NB_USER=jovyan \ + NB_UID=1000 \ + HOME=/home/jovyan + +RUN adduser \ + -D \ + -g "Default user" \ + -u ${NB_UID} \ + -h ${HOME} \ + ${NB_USER} + +COPY ./docker/init-entrypoint.sh /entrypoint.sh +RUN chmod 777 /entrypoint.sh diff --git a/2025-HPDC/docker/Dockerfile.spawn b/2025-HPDC/docker/Dockerfile.spawn new file mode 100644 index 0000000..816b460 --- /dev/null +++ b/2025-HPDC/docker/Dockerfile.spawn @@ -0,0 +1,52 @@ +# Copyright 2025 Lawrence Livermore National Security, LLC and other +# Benchpark developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: Apache-2.0 + +# For testing +# FROM test-benchpark + +FROM ghcr.io/llnl/benchpark:hpdc-2025 + +USER root + +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + ca-certificates \ + dnsutils \ + iputils-ping \ + tini \ + && rm -rf /var/lib/apt/lists/* + +SHELL [ "/bin/bash", "-c" ] + +COPY ./docker/requirements.txt /requirements.txt + +RUN . /opt/global_py_venv/bin/activate && \ + # Needed for some viz in thicket-tutorial + python3 -m pip install plotly[express] && \ + python3 -m pip install -r /requirements.txt && \ + python3 -m pip install ipython==7.34.0 ipykernel==6.25.1 && \ + python3 -m IPython kernel install + +RUN chmod -R 777 ~/ ${HOME} + +WORKDIR ${HOME} + +COPY ./docker/spawn-entrypoint.sh /entrypoint.sh +RUN chmod 777 /entrypoint.sh + +USER ${NB_USER} + +RUN git clone https://github.com/LLNL/thicket-tutorial.git ${HOME}/thicket-tutorial && \ + cd ${HOME}/thicket-tutorial && \ + git submodule update --init --recursive && \ + git clone https://github.com/daboehme/caliper-tutorial.git ${HOME}/caliper-tutorial && \ + cd ${HOME}/caliper-tutorial && \ + git submodule update --init --recursive + +EXPOSE 8888 +ENTRYPOINT [ "tini", "--" ] + +CMD ["jupyter", "lab"] diff --git a/2025-HPDC/docker/Dockerfile.thicket b/2025-HPDC/docker/Dockerfile.thicket new file mode 100644 index 0000000..127ad0d --- /dev/null +++ b/2025-HPDC/docker/Dockerfile.thicket @@ -0,0 +1,17 @@ +# Copyright 2025 Lawrence Livermore National Security, LLC and other +# Benchpark developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: Apache-2.0 + +# For testing +# FROM test-caliper + +FROM ghcr.io/llnl/caliper:hpdc-2025 + +USER root + +RUN . /opt/global_py_venv/bin/activate && \ + python3 -m pip install git+https://github.com/LLNL/thicket.git@develop +# python3 -m pip install llnl-thicket[extrap,plotting]==2024.2.1 + +USER ${NB_USER} diff --git a/2025-HPDC/docker/build_and_upload_images.sh b/2025-HPDC/docker/build_and_upload_images.sh new file mode 100755 index 0000000..a982b39 --- /dev/null +++ b/2025-HPDC/docker/build_and_upload_images.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash + +set -e + +function usage { + echo "Usage: ./build_and_upload_images.sh [image_to_build]" +} + +if [ $# -lt 1 ]; then + usage + exit 1 +fi + +if [ $1 == "-h" ] || [ $1 == "--help" ]; then + usage + exit 0 +fi + +TAG="$1" + +DOCKER_PLATFORMS="linux/amd64,linux/arm64" + +TO_BUILD_IDS=( "caliper" "thicket" "benchpark" "init" "spawn" ) + +if [ $# -ge 2 ]; then + TO_BUILD_IDS=( "$2" ) +fi + +caliper_IMAGE="ghcr.io/ilumsden/hpdc-caliper" +thicket_IMAGE="ghcr.io/ilumsden/hpdc-thicket" +benchpark_IMAGE="ghcr.io/ilumsden/hpdc-benchpark" +init_IMAGE="ghcr.io/ilumsden/hpdc-test-init" +spawn_IMAGE="ghcr.io/ilumsden/hpdc-test-spawn" + +if ! command -v gh >/dev/null 2>&1; then + echo "This script requires the GitHub CLI (i.e., the gh command)." + echo "Install the CLI and rerun this script." + exit 1 +fi + +if ! command -v docker >/dev/null 2>&1; then + echo "This script requires Docker." + echo "Install Docker and rerun this script." + exit 1 +fi + +echo $(gh auth token) | docker login ghcr.io -u $(gh api user --jq .login) --password-stdin + +for bid in ${TO_BUILD_IDS[@]}; do + CURR_IMAGE_NAME="${bid}_IMAGE" + docker build --platform $DOCKER_PLATFORMS -f Dockerfile.$bid -t ${!CURR_IMAGE_NAME}:$TAG . + docker push ${!CURR_IMAGE_NAME}:$TAG +done + +# docker build --platform $DOCKER_PLATFORMS -f Dockerfile.benchpark -t hpdc-benchpark:latest . +# docker tag hpdc-benchpark:latest $BENCHPARK_IMAGE:$TAG +# docker push $BENCHPARK_IMAGE:$TAG +# +# docker build --platform $DOCKER_PLATFORMS -f Dockerfile.init -t hpdc-init:latest . +# docker tag hpdc-init:latest $INIT_IMAGE:$TAG +# docker push $INIT_IMAGE:$TAG +# +# docker build --platform $DOCKER_PLATFORMS -f Dockerfile.spawn -t hpdc-spawn:latest . +# docker tag hpdc-spawn:latest $SPAWN_IMAGE:$TAG +# docker push $SPAWN_IMAGE:$TAG diff --git a/2025-HPDC/docker/init-entrypoint.sh b/2025-HPDC/docker/init-entrypoint.sh new file mode 100755 index 0000000..3f37e5f --- /dev/null +++ b/2025-HPDC/docker/init-entrypoint.sh @@ -0,0 +1,10 @@ +# Copyright 2025 Lawrence Livermore National Security, LLC and other +# Benchpark developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: Apache-2.0 + +#!/usr/bin/env sh + +# NOTE: this script runs as root + +chown -R 1000 /home/jovyan diff --git a/2025-HPDC/docker/requirements.txt b/2025-HPDC/docker/requirements.txt new file mode 100644 index 0000000..dd55186 --- /dev/null +++ b/2025-HPDC/docker/requirements.txt @@ -0,0 +1,342 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# Use the "Run workflow" button at https://github.com/jupyterhub/zero-to-jupyterhub-k8s/actions/workflows/watch-dependencies.yaml +# +alembic==1.16.1 + # via jupyterhub +annotated-types==0.7.0 + # via pydantic +anyio==4.9.0 + # via + # httpx + # jupyter-server +argon2-cffi==23.1.0 + # via jupyter-server +argon2-cffi-bindings==21.2.0 + # via argon2-cffi +arrow==1.3.0 + # via isoduration +asttokens==3.0.0 + # via stack-data +async-lru==2.0.5 + # via jupyterlab +attrs==25.3.0 + # via + # jsonschema + # referencing +babel==2.17.0 + # via jupyterlab-server +beautifulsoup4==4.13.4 + # via nbconvert +bleach==6.2.0 + # via nbconvert +certifi==2025.4.26 + # via + # httpcore + # httpx + # requests +certipy==0.2.2 + # via jupyterhub +cffi==1.17.1 + # via + # argon2-cffi-bindings + # cryptography +charset-normalizer==3.4.2 + # via requests +comm==0.2.2 + # via ipykernel +cryptography==45.0.3 + # via certipy +debugpy==1.8.14 + # via ipykernel +decorator==5.2.1 + # via ipython +defusedxml==0.7.1 + # via nbconvert +executing==2.2.0 + # via stack-data +fastjsonschema==2.21.1 + # via nbformat +fqdn==1.5.1 + # via jsonschema +greenlet==3.2.2 + # via sqlalchemy +h11==0.16.0 + # via httpcore +httpcore==1.0.9 + # via httpx +httpx==0.28.1 + # via jupyterlab +idna==3.10 + # via + # anyio + # httpx + # jsonschema + # jupyterhub + # requests +ipykernel==6.29.5 + # via + # jupyterlab + # nbclassic +ipython==9.2.0 + # via ipykernel +ipython-genutils==0.2.0 + # via nbclassic +ipython-pygments-lexers==1.1.1 + # via ipython +isoduration==20.11.0 + # via jsonschema +jedi==0.19.2 + # via ipython +jinja2==3.1.6 + # via + # jupyter-server + # jupyterhub + # jupyterlab + # jupyterlab-server + # nbconvert +json5==0.12.0 + # via jupyterlab-server +jsonpointer==3.0.0 + # via jsonschema +jsonschema==4.24.0 + # via + # jupyter-events + # jupyterlab-server + # nbformat +jsonschema-specifications==2025.4.1 + # via jsonschema +jupyter-client==8.6.3 + # via + # ipykernel + # jupyter-server + # nbclient +jupyter-core==5.8.0 + # via + # ipykernel + # jupyter-client + # jupyter-server + # jupyterlab + # nbclient + # nbconvert + # nbformat +jupyter-events==0.12.0 + # via + # jupyter-server + # jupyterhub +jupyter-lsp==2.2.5 + # via jupyterlab +jupyter-server==2.16.0 + # via + # jupyter-lsp + # jupyterlab + # jupyterlab-server + # nbgitpuller + # notebook-shim +jupyter-server-terminals==0.5.3 + # via jupyter-server +jupyterhub==5.3.0 + # via -r unfrozen/requirements.txt +jupyterlab==4.4.3 + # via -r unfrozen/requirements.txt +jupyterlab-pygments==0.3.0 + # via nbconvert +jupyterlab-server==2.27.3 + # via jupyterlab +mako==1.3.10 + # via alembic +markupsafe==3.0.2 + # via + # jinja2 + # mako + # nbconvert +matplotlib-inline==0.1.7 + # via + # ipykernel + # ipython +mistune==3.1.3 + # via nbconvert +nbclassic==1.3.1 + # via -r unfrozen/requirements.txt +nbclient==0.10.2 + # via nbconvert +nbconvert==7.16.6 + # via jupyter-server +nbformat==5.10.4 + # via + # jupyter-server + # nbclient + # nbconvert +nbgitpuller==1.2.2 + # via -r unfrozen/requirements.txt +nest-asyncio==1.6.0 + # via + # ipykernel + # nbclassic +notebook-shim==0.2.4 + # via + # jupyterlab + # nbclassic +oauthlib==3.2.2 + # via jupyterhub +overrides==7.7.0 + # via jupyter-server +packaging==25.0 + # via + # ipykernel + # jupyter-events + # jupyter-server + # jupyterhub + # jupyterlab + # jupyterlab-server + # nbconvert +pamela==1.2.0 + # via jupyterhub +pandocfilters==1.5.1 + # via nbconvert +parso==0.8.4 + # via jedi +pexpect==4.9.0 + # via ipython +platformdirs==4.3.8 + # via jupyter-core +prometheus-client==0.22.0 + # via + # jupyter-server + # jupyterhub +prompt-toolkit==3.0.51 + # via ipython +psutil==7.0.0 + # via ipykernel +ptyprocess==0.7.0 + # via + # pexpect + # terminado +pure-eval==0.2.3 + # via stack-data +pycparser==2.22 + # via cffi +pydantic==2.11.5 + # via jupyterhub +pydantic-core==2.33.2 + # via pydantic +pygments==2.19.1 + # via + # ipython + # ipython-pygments-lexers + # nbconvert +python-dateutil==2.9.0.post0 + # via + # arrow + # jupyter-client + # jupyterhub +python-json-logger==3.3.0 + # via jupyter-events +pyyaml==6.0.2 + # via jupyter-events +pyzmq==26.4.0 + # via + # ipykernel + # jupyter-client + # jupyter-server +referencing==0.36.2 + # via + # jsonschema + # jsonschema-specifications + # jupyter-events +requests==2.32.3 + # via + # jupyterhub + # jupyterlab-server +rfc3339-validator==0.1.4 + # via + # jsonschema + # jupyter-events +rfc3986-validator==0.1.1 + # via + # jsonschema + # jupyter-events +rpds-py==0.25.1 + # via + # jsonschema + # referencing +send2trash==1.8.3 + # via jupyter-server +six==1.17.0 + # via + # python-dateutil + # rfc3339-validator +sniffio==1.3.1 + # via anyio +soupsieve==2.7 + # via beautifulsoup4 +sqlalchemy==2.0.41 + # via + # alembic + # jupyterhub +stack-data==0.6.3 + # via ipython +terminado==0.18.1 + # via + # jupyter-server + # jupyter-server-terminals +tinycss2==1.4.0 + # via bleach +tornado==6.5.1 + # via + # ipykernel + # jupyter-client + # jupyter-server + # jupyterhub + # jupyterlab + # nbgitpuller + # terminado +traitlets==5.14.3 + # via + # comm + # ipykernel + # ipython + # jupyter-client + # jupyter-core + # jupyter-events + # jupyter-server + # jupyterhub + # jupyterlab + # matplotlib-inline + # nbclient + # nbconvert + # nbformat +types-python-dateutil==2.9.0.20250516 + # via arrow +typing-extensions==4.13.2 + # via + # alembic + # anyio + # beautifulsoup4 + # pydantic + # pydantic-core + # referencing + # sqlalchemy + # typing-inspection +typing-inspection==0.4.1 + # via pydantic +uri-template==1.3.0 + # via jsonschema +urllib3==2.4.0 + # via requests +wcwidth==0.2.13 + # via prompt-toolkit +webcolors==24.11.1 + # via jsonschema +webencodings==0.5.1 + # via + # bleach + # tinycss2 +websocket-client==1.8.0 + # via jupyter-server + +# The following packages are considered to be unsafe in a requirements file: +setuptools==80.8.0 + # via jupyterlab \ No newline at end of file diff --git a/2025-HPDC/docker/spawn-entrypoint.sh b/2025-HPDC/docker/spawn-entrypoint.sh new file mode 100755 index 0000000..c64607f --- /dev/null +++ b/2025-HPDC/docker/spawn-entrypoint.sh @@ -0,0 +1,8 @@ +# Copyright 2025 Lawrence Livermore National Security, LLC and other +# Benchpark developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: Apache-2.0 + +#!/usr/bin/env bash + +/opt/global_py_venv/bin/jupyterhub-singleuser diff --git a/2025-HPDC/infrastructure/stub.txt b/2025-HPDC/infrastructure/stub.txt new file mode 100644 index 0000000..1d3fcd6 --- /dev/null +++ b/2025-HPDC/infrastructure/stub.txt @@ -0,0 +1 @@ +This is a stub file to make sure the directory appears in GitHub. \ No newline at end of file diff --git a/2025-HPDC/slides/stub.txt b/2025-HPDC/slides/stub.txt new file mode 100644 index 0000000..1d3fcd6 --- /dev/null +++ b/2025-HPDC/slides/stub.txt @@ -0,0 +1 @@ +This is a stub file to make sure the directory appears in GitHub. \ No newline at end of file diff --git a/2025-HPDC/tutorial-code/stub.txt b/2025-HPDC/tutorial-code/stub.txt new file mode 100644 index 0000000..1d3fcd6 --- /dev/null +++ b/2025-HPDC/tutorial-code/stub.txt @@ -0,0 +1 @@ +This is a stub file to make sure the directory appears in GitHub. \ No newline at end of file diff --git a/COPYRIGHT b/COPYRIGHT new file mode 100644 index 0000000..231bbbf --- /dev/null +++ b/COPYRIGHT @@ -0,0 +1,19 @@ +Intellectual Property Notice +------------------------------ + +Benchpark is licensed under the Apache License, Version 2.0 (LICENSE +or http://www.apache.org/licenses/LICENSE-2.0). + +Copyrights and patents in the Benchpark project are retained by contributors. +No copyright assignment is required to contribute to Benchpark. + +Benchpark is derived from Ramble and Spack. +Ramble: https://github.com/GoogleCloudPlatform/ramble +Spack: https://github.com/spack/spack + +SPDX usage +------------ + +Individual files contain SPDX tags instead of the full license text. +This enables machine processing of license information based on the SPDX +License Identifiers that are available here: https://spdx.org/licenses/ \ No newline at end of file diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..329b142 --- /dev/null +++ b/NOTICE @@ -0,0 +1,21 @@ +This work was produced under the auspices of the U.S. Department of +Energy by Lawrence Livermore National Laboratory under Contract +DE-AC52-07NA27344. + +This work was prepared as an account of work sponsored by an agency of +the United States Government. Neither the United States Government nor +Lawrence Livermore National Security, LLC, nor any of their employees +makes any warranty, expressed or implied, or assumes any legal liability +or responsibility for the accuracy, completeness, or usefulness of any +information, apparatus, product, or process disclosed, or represents that +its use would not infringe privately owned rights. + +Reference herein to any specific commercial product, process, or service +by trade name, trademark, manufacturer, or otherwise does not necessarily +constitute or imply its endorsement, recommendation, or favoring by the +United States Government or Lawrence Livermore National Security, LLC. + +The views and opinions of authors expressed herein do not necessarily +state or reflect those of the United States Government or Lawrence +Livermore National Security, LLC, and shall not be used for advertising +or product endorsement purposes. \ No newline at end of file diff --git a/README.md b/README.md index cd34c42..658c71b 100644 --- a/README.md +++ b/README.md @@ -1 +1,11 @@ -# benchpark-tutorial \ No newline at end of file +# Reproducible Benchmarking Tutorial + +This repo contains the material for tutorials on LLNL's reproducible benchmarking efforts associated with +tools like Caliper, Thicket, and Benchpark. To see the materials for a given tutorial, +navigate to the appropriate folder. + +## License + +These benchmarking tutorials are released under the Apache 2.0 w/ LLVM Exception license. For more details see the LICENSE file. + +LLNL-CODE-850629 diff --git a/github_ci_matrix.json b/github_ci_matrix.json new file mode 100644 index 0000000..9febf32 --- /dev/null +++ b/github_ci_matrix.json @@ -0,0 +1,14 @@ +{ + "tag": [ + "hpdc-2025" + ], + "tutorial_dir": [ + "2025-HPDC" + ], + "docker_os": [ + "linux" + ], + "docker_arch": [ + "amd64" + ] +} \ No newline at end of file