Skip to content

Commit

Permalink
Upgrade from ISMRMRD to MRDv2
Browse files Browse the repository at this point in the history
Establish Pingvin streaming image reconstruction framework.

* Upgrade all tested Gadgets/Toolboxes to use MRDv2 instead of ISMRMRD
* Remove all socket networking code, including `gadgetron_ismrmrd_client`
* Remove all Readers and Writers
* Refactor end-to-end tests to use PyTest, removing Siemens dat conversion
* Remove everything Windows-related
* Port the CI pipeline to GitHub Actions
* Rename from Gadgetron to Pingvin
  • Loading branch information
naegelejd authored Dec 14, 2024
1 parent 38f01b3 commit 936fded
Show file tree
Hide file tree
Showing 1,201 changed files with 19,257 additions and 68,138 deletions.
2 changes: 1 addition & 1 deletion .devcontainer/.vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "/opt/conda/envs/gadgetron/bin/gadgetron",
"program": "/opt/conda/envs/pingvin/bin/pingvin",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
Expand Down
4 changes: 2 additions & 2 deletions .devcontainer/.vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,10 @@
},
"cmake.configureOnOpen": true,
"cmake.preferredGenerators": ["Ninja", "Unix Makefiles"],
"cmake.cmakePath": "/opt/conda/envs/gadgetron/bin/cmake",
"cmake.cmakePath": "/opt/conda/envs/pingvin/bin/cmake",
"cmake.configureSettings": {
"USE_CUDA": "ON",
"USE_MKL": "ON",
"CMAKE_INSTALL_PREFIX": "/opt/conda/envs/gadgetron"
"CMAKE_INSTALL_PREFIX": "/opt/conda/envs/pingvin"
}
}
2 changes: 1 addition & 1 deletion .devcontainer/bootstrap-vscode.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ else
fi

mkdir -p /home/vscode/.local/share/CMakeTools && \
echo '[{"name":"GCC-CONDA","compilers":{"C":"/opt/conda/envs/gadgetron/bin/x86_64-conda_cos6-linux-gnu-gcc","CXX":"/opt/conda/envs/gadgetron/bin/x86_64-conda_cos6-linux-gnu-g++"}}]' > /home/vscode/.local/share/CMakeTools/cmake-tools-kits.json && \
echo '[{"name":"GCC-CONDA","compilers":{"C":"/opt/conda/envs/pingvin/bin/x86_64-conda_cos6-linux-gnu-gcc","CXX":"/opt/conda/envs/pingvin/bin/x86_64-conda_cos6-linux-gnu-g++"}}]' > /home/vscode/.local/share/CMakeTools/cmake-tools-kits.json && \
chown vscode:conda /home/vscode/.local/share/CMakeTools/cmake-tools-kits.json
14 changes: 14 additions & 0 deletions .devcontainer/devcontainer.bashrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#! /bin/bash
# shellcheck source=/dev/null

source /opt/conda/etc/profile.d/conda.sh
conda activate pingvin

if command -v just >/dev/null ; then
source <(just --completions bash)
fi

if [[ "${BASH_ENV:-}" == "$(readlink -f "${BASH_SOURCE[0]:-}")" ]]; then
# We don't want subshells to unnecessarily source this again.
unset BASH_ENV
fi
15 changes: 7 additions & 8 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"name": "Gadgetron",
"name": "Pingvin",
"build": {
"dockerfile": "../Dockerfile",
"target": "gadgetron_dev_cuda",
"target": "pingvin_dev_cuda",
"context": "../",
"cacheFrom": "ghcr.io/gadgetron/gadgetron/gadgetron_ubuntu_dev_cuda:latest",
"cacheFrom": "ghcr.io/gadgetron/pingvin/ubuntu22.04_dev_cuda:latest",
},
"containerEnv": {
"DOCKER_BUILDKIT": "1",
Expand All @@ -21,11 +21,11 @@
"Ninja",
"Unix Makefiles"
],
"cmake.cmakePath": "/opt/conda/envs/gadgetron/bin/cmake",
"cmake.cmakePath": "/opt/conda/envs/pingvin/bin/cmake",
"cmake.configureSettings": {
"USE_CUDA": "ON",
"USE_MKL": "ON",
"CMAKE_INSTALL_PREFIX": "/opt/conda/envs/gadgetron",
"CMAKE_INSTALL_PREFIX": "/opt/conda/envs/pingvin",
"BUILD_DOCUMENTATION": "OFF"
},
"indentRainbow.includedLanguages": [ "yaml", "python" ]
Expand All @@ -34,6 +34,7 @@
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"ms-vscode.cpptools",
"ms-vscode.cpptools-extension-pack",
"ms-vscode.cmake-tools",
"ms-vscode.live-server",
"eamodio.gitlens",
Expand All @@ -48,10 +49,8 @@
}
},

"runArgs": ["--init", "--network=host"],

// To enable your local GPUs in container if they are on enabled by default devcontainer will fail to start on hosts without GPU
// "runArgs": ["--init", "--network=host", "--gpus=all"],
"runArgs": ["--init", "--network=host", "--gpus=all"],

"mounts": [
],
Expand Down
7 changes: 5 additions & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,18 @@
!apps/
!cmake/
!core/
!doc/
!docker/
!gadgets/
!justfile
!libmrd/
!test/
!toolboxes/
!environment.yml
!chroot/
!doc/
!.devcontainer/devcontainer.bashrc

# but also ignore:
test/integration/data/
test/e2e/data/
*.Dockerfile
docker/integration-test-image.sh
149 changes: 149 additions & 0 deletions .github/workflows/pingvin-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
name: Pingvin CI

on:
push:
branches: [main]
tags: ["v*.*.*"]
pull_request:
branches: [main]
workflow_dispatch:

permissions:
id-token: write
contents: read

env:
imageBaseName: ghcr.io/gadgetron/pingvin/ubuntu22.04

defaults:
run:
# See https://github.com/marketplace/actions/setup-miniconda#important
shell: bash -el {0}

jobs:
build-and-test:
runs-on: ["self-hosted", "1ES.Pool=biomedsigproc-pingvin-NC6s_v3"]
strategy:
matrix:
flavor: [cuda, nocuda]
steps:
- name: checkout
uses: actions/[email protected]

- name: Check GPU availability
run: docker run --rm --gpus=all ghcr.io/gadgetron/gadgetron/cuda:12.3.0-base-ubuntu22.04 nvidia-smi

- name: Build Docker images
run: ./docker/build-images.sh --type dev --type build --type rt --flavor ${{matrix.flavor}} --base-name "${{env.imageBaseName}}"

- name: Unit Test
run: |-
image_name="${{env.imageBaseName}}_build_${{matrix.flavor}}"
test_command=". /opt/conda/etc/profile.d/conda.sh \
&& conda activate pingvin \
&& /opt/code/pingvin/build/test/test_all"
docker run --rm --gpus=all "${image_name}" /bin/bash -c "$test_command"
- name: End-to-End Test
run: |-
image_name="${{env.imageBaseName}}_rt_${{matrix.flavor}}"
# Check Pingvin entrypoint
docker run --rm -i --gpus=all "${image_name}" --info
# Test Pingvin end-to-end
test_command=". /opt/conda/etc/profile.d/conda.sh \
&& conda activate pingvin \
&& cd /opt/e2e-test/ \
&& pytest --echo-log-on-failure"
docker run --rm --gpus=all --entrypoint /bin/bash "${image_name}" -c "$test_command"
publish-docker-images:
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
needs: [build-and-test]
runs-on: ["self-hosted", "1ES.Pool=biomedsigproc-pingvin-NC6s_v3"]
strategy:
matrix:
flavor: [cuda, nocuda]
permissions:
packages: write
steps:
- name: checkout
uses: actions/[email protected]

- name: Log into ghcr.io
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Publish Docker images
run: |-
PINGVIN_VERSION_MAJOR=$(grep -Po '(?<=set\(PINGVIN_VERSION_MAJOR )([^\)]+)' CMakeLists.txt)
PINGVIN_VERSION_MINOR=$(grep -Po '(?<=set\(PINGVIN_VERSION_MINOR )([^\)]+)' CMakeLists.txt)
PINGVIN_VERSION_PATCH=$(grep -Po '(?<=set\(PINGVIN_VERSION_PATCH )([^\)]+)' CMakeLists.txt)
PINGVIN_VERSION="${PINGVIN_VERSION_MAJOR}.${PINGVIN_VERSION_MINOR}.${PINGVIN_VERSION_PATCH}"
./docker/build-images.sh --type dev --type rt --flavor ${{matrix.flavor}} --base-name "${{env.imageBaseName}}" --tag "${PINGVIN_VERSION}" --push
./docker/build-images.sh --type dev --type rt --flavor ${{matrix.flavor}} --base-name "${{env.imageBaseName}}" --tag latest --push
build-conda-package:
runs-on: ["self-hosted", "1ES.Pool=biomedsigproc-pingvin-NC6s_v3"]
steps:
- name: checkout
uses: actions/[email protected]

- name: Install Yardl
run: |-
YARDL_VERSION=$(grep -Po '(?<=YARDL_VERSION=)(.+)' Dockerfile)
mkdir -p "/tmp/yardl_${YARDL_VERSION}_linux_x86_64"
cd "/tmp/yardl_${YARDL_VERSION}_linux_x86_64"
wget --quiet "https://github.com/microsoft/yardl/releases/download/v${YARDL_VERSION}/yardl_${YARDL_VERSION}_linux_x86_64.tar.gz"
tar -xzf "yardl_${YARDL_VERSION}_linux_x86_64.tar.gz"
pwd >> $GITHUB_PATH
- name: Setup Miniforge
uses: conda-incubator/setup-miniconda@v3
with:
miniforge-version: latest
environment-file: conda/environment.yml
activate-environment: pingvin-build

- name: Build conda package
run: ./conda/package.sh

- name: Upload Conda package
uses: actions/upload-artifact@v4
with:
name: conda-packages
path: conda/build_pkg/**/pingvin*.tar.bz2

publish-conda-package:
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
needs: [build-conda-package]
runs-on: ["self-hosted", "1ES.Pool=biomedsigproc-pingvin-NC6s_v3"]
steps:
- name: checkout
uses: actions/[email protected]

- name: Setup Miniforge
uses: conda-incubator/setup-miniconda@v3
with:
miniforge-version: latest
environment-file: conda/environment.yml
activate-environment: pingvin-build

- name: Download Conda package
uses: actions/download-artifact@v4
with:
name: conda-packages
path: conda/build_pkg/

- name: Publish conda package
env:
ANACONDA_TOKEN: ${{ secrets.ANACONDA_TOKEN }}
run: |
for p in $(find conda/build_pkg -name pingvin*.tar.bz2)
do
./conda/publish_package.sh -u gadgetron -t "$ANACONDA_TOKEN" -p "$p"
done
Loading

0 comments on commit 936fded

Please sign in to comment.