From abcf702eb0c489a7d6054452913f4ea6e9dce2a7 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 12:16:03 +0100 Subject: [PATCH 01/43] FIX conda install --- .github/workflows/deepinv_run_hf.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 680d36c..b46205d 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -71,7 +71,7 @@ jobs: key: ${{ runner.os }}-${{matrix.benchmark_dir}}-${{ steps.get-date.outputs.date }} - name: Clean up any existing miniconda installation - run: rm -rf /home/jtachell/miniconda3 + run: rm -rf /home/jtachell/miniconda3/_conda - name: Setup Conda uses: conda-incubator/setup-miniconda@v3 From 69005230a5048877a24c01bc4b9e7eed69bb534b Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 12:18:35 +0100 Subject: [PATCH 02/43] FIX avoid using CONDA_ENV name --- .github/workflows/deepinv_run_hf.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index b46205d..4f848a4 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -44,7 +44,7 @@ jobs: # don't run on the template benchmark, which is not meant to be run - benchmark_dir: "deepinv_bench/benchmarks/benchmark_template" env: - CONDA_ENV: 'run_env' + BENCHOPT_CONDA_ENV: 'run_env' BENCHOPT_CONDA_CMD: 'mamba' defaults: run: @@ -82,14 +82,14 @@ jobs: use-mamba: true channels: conda-forge python-version: 3.12 - activate-environment: ${{ env.CONDA_ENV }} + activate-environment: ${{ env.BENCHOPT_CONDA_ENV }} use-only-tar-bz2: true # Needed for package caching - name: Install benchopt and its dependencies run: | mamba install -yq pip pip install -U git+https://github.com/benchopt/benchopt huggingface_hub - benchopt install ${{ matrix.benchmark_dir }} --env-name ${{ env.CONDA_ENV }} + benchopt install ${{ matrix.benchmark_dir }} --env-name ${{ env.BENCHOPT_CONDA_ENV }} - name: Run benchmarks run: | From f0e9aae91a41161166c4c749cff5c034d45ac41e Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 12:20:13 +0100 Subject: [PATCH 03/43] FIX avoid border effect in clean up --- .github/workflows/deepinv_run_hf.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 4f848a4..b4eb303 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -72,6 +72,7 @@ jobs: - name: Clean up any existing miniconda installation run: rm -rf /home/jtachell/miniconda3/_conda + shell: bash - name: Setup Conda uses: conda-incubator/setup-miniconda@v3 From a4f50ff01cee950aa9ffc2009709aa448a1a64ba Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 13:51:51 +0100 Subject: [PATCH 04/43] FIX simplify|separate conda env management --- .github/workflows/deepinv_run_hf.yml | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index b4eb303..969046a 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -44,13 +44,12 @@ jobs: # don't run on the template benchmark, which is not meant to be run - benchmark_dir: "deepinv_bench/benchmarks/benchmark_template" env: - BENCHOPT_CONDA_ENV: 'run_env' BENCHOPT_CONDA_CMD: 'mamba' defaults: run: # Need to use this shell to get conda working properly. # See https://github.com/marketplace/actions/setup-miniconda#important - shell: bash -l {0} + shell: bash -el {0} steps: - uses: actions/checkout@v6 @@ -70,31 +69,25 @@ jobs: # invalidate it every month to avoid stale caches. key: ${{ runner.os }}-${{matrix.benchmark_dir}}-${{ steps.get-date.outputs.date }} - - name: Clean up any existing miniconda installation - run: rm -rf /home/jtachell/miniconda3/_conda - shell: bash - - name: Setup Conda uses: conda-incubator/setup-miniconda@v3 with: auto-update-conda: true miniforge-version: latest - mamba-version: "*" - use-mamba: true channels: conda-forge python-version: 3.12 - activate-environment: ${{ env.BENCHOPT_CONDA_ENV }} + installation-dir: ~/deepinv_bench_conda use-only-tar-bz2: true # Needed for package caching - name: Install benchopt and its dependencies run: | mamba install -yq pip pip install -U git+https://github.com/benchopt/benchopt huggingface_hub - benchopt install ${{ matrix.benchmark_dir }} --env-name ${{ env.BENCHOPT_CONDA_ENV }} + benchopt install ${{ matrix.benchmark_dir }} - name: Run benchmarks run: | - benchopt run ${{ matrix.benchmark_dir }} --env-name ${{ env.CONDA_ENV }} --output results_ci_run.csv --no-plot + benchopt run ${{ matrix.benchmark_dir }} --output results_ci_run.csv --no-plot - name: Upload results run: | From c678063ef4552e4c2ef4b68d9fbd230bff42d574 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 14:30:03 +0100 Subject: [PATCH 05/43] DBG add logs --- .github/workflows/deepinv_run_hf.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 969046a..a1a4ef9 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -69,6 +69,12 @@ jobs: # invalidate it every month to avoid stale caches. key: ${{ runner.os }}-${{matrix.benchmark_dir}}-${{ steps.get-date.outputs.date }} + - name: Get info about runner + shell: bash + run: | + cat ~/.bashrc + conda info + - name: Setup Conda uses: conda-incubator/setup-miniconda@v3 with: @@ -79,6 +85,12 @@ jobs: installation-dir: ~/deepinv_bench_conda use-only-tar-bz2: true # Needed for package caching + - name: Get info about runner + shell: bash + run: | + cat ~/.bashrc + conda info + - name: Install benchopt and its dependencies run: | mamba install -yq pip From 8ebe4d42f64b569f62c1f7efcfbd9bea2b777e65 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 14:33:21 +0100 Subject: [PATCH 06/43] DBG more debug logs --- .github/workflows/deepinv_run_hf.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index a1a4ef9..cbca2fc 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -72,8 +72,14 @@ jobs: - name: Get info about runner shell: bash run: | - cat ~/.bashrc conda info + cat ~/.bashrc | echo "does not exist" + + - name: Get info about runner 2 + shell: bash -el {0} + run: | + conda info + cat ~/.bashrc | echo "does not exist" - name: Setup Conda uses: conda-incubator/setup-miniconda@v3 @@ -85,11 +91,11 @@ jobs: installation-dir: ~/deepinv_bench_conda use-only-tar-bz2: true # Needed for package caching - - name: Get info about runner + - name: Get info about runner 3 shell: bash run: | - cat ~/.bashrc conda info + cat ~/.bashrc | echo "does not exist" - name: Install benchopt and its dependencies run: | From 7c60ce94d6b1709480b426326503033fa26507ca Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 14:35:32 +0100 Subject: [PATCH 07/43] DBG working logs --- .github/workflows/deepinv_run_hf.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index cbca2fc..4507098 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -70,13 +70,6 @@ jobs: key: ${{ runner.os }}-${{matrix.benchmark_dir}}-${{ steps.get-date.outputs.date }} - name: Get info about runner - shell: bash - run: | - conda info - cat ~/.bashrc | echo "does not exist" - - - name: Get info about runner 2 - shell: bash -el {0} run: | conda info cat ~/.bashrc | echo "does not exist" @@ -92,7 +85,6 @@ jobs: use-only-tar-bz2: true # Needed for package caching - name: Get info about runner 3 - shell: bash run: | conda info cat ~/.bashrc | echo "does not exist" From 9fed8faefee6a4cf177a760875d6a71cba3e85ff Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 15:06:46 +0100 Subject: [PATCH 08/43] DBG more debug logs --- .github/workflows/deepinv_run_hf.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 4507098..ac21108 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -71,8 +71,8 @@ jobs: - name: Get info about runner run: | - conda info - cat ~/.bashrc | echo "does not exist" + cat ~/.profile | echo ".profile does not exist" + cat ~/.bashrc | echo ".bashrc does not exist" - name: Setup Conda uses: conda-incubator/setup-miniconda@v3 @@ -86,8 +86,9 @@ jobs: - name: Get info about runner 3 run: | + cat ~/.profile | echo ".profile does not exist" + cat ~/.bashrc | echo ".bashrc does not exist" conda info - cat ~/.bashrc | echo "does not exist" - name: Install benchopt and its dependencies run: | From d6d1178330b1fb2c184134154e344f7cdfdb96ef Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 15:08:38 +0100 Subject: [PATCH 09/43] DBG more debug logs --- .github/workflows/deepinv_run_hf.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index ac21108..8c2befc 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -85,6 +85,7 @@ jobs: use-only-tar-bz2: true # Needed for package caching - name: Get info about runner 3 + shell: bash run: | cat ~/.profile | echo ".profile does not exist" cat ~/.bashrc | echo ".bashrc does not exist" From 86b59b91b17efd3bf08375ad76a69cd764701a32 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 15:10:03 +0100 Subject: [PATCH 10/43] DBG more debug logs --- .github/workflows/deepinv_run_hf.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 8c2befc..3a4afa0 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -70,6 +70,7 @@ jobs: key: ${{ runner.os }}-${{matrix.benchmark_dir}}-${{ steps.get-date.outputs.date }} - name: Get info about runner + shell: bash run: | cat ~/.profile | echo ".profile does not exist" cat ~/.bashrc | echo ".bashrc does not exist" From 15f18d0d1c3a1e9aca1e607e26536a5bc8afab41 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 15:11:38 +0100 Subject: [PATCH 11/43] DBG more debug logs --- .github/workflows/deepinv_run_hf.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 3a4afa0..45c176c 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -72,8 +72,8 @@ jobs: - name: Get info about runner shell: bash run: | - cat ~/.profile | echo ".profile does not exist" - cat ~/.bashrc | echo ".bashrc does not exist" + cat ~/.profile || echo ".profile does not exist" + cat ~/.bashrc || echo ".bashrc does not exist" - name: Setup Conda uses: conda-incubator/setup-miniconda@v3 @@ -88,8 +88,8 @@ jobs: - name: Get info about runner 3 shell: bash run: | - cat ~/.profile | echo ".profile does not exist" - cat ~/.bashrc | echo ".bashrc does not exist" + cat ~/.profile || echo ".profile does not exist" + cat ~/.bashrc || echo ".bashrc does not exist" conda info - name: Install benchopt and its dependencies From 2df910c1e16e5ff8041646f8bcda31d727c13067 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 15:16:06 +0100 Subject: [PATCH 12/43] DBG more debug logs --- .github/workflows/deepinv_run_hf.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 45c176c..fa2659a 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -72,8 +72,12 @@ jobs: - name: Get info about runner shell: bash run: | - cat ~/.profile || echo ".profile does not exist" - cat ~/.bashrc || echo ".bashrc does not exist" + cat $HOME/.profile || echo ".profile does not exist" + cat $HOME/.bashrc || echo ".bashrc does not exist" + echo "~" + ls -la ~ + echo "home" + ls -la $HOME - name: Setup Conda uses: conda-incubator/setup-miniconda@v3 @@ -88,8 +92,9 @@ jobs: - name: Get info about runner 3 shell: bash run: | - cat ~/.profile || echo ".profile does not exist" - cat ~/.bashrc || echo ".bashrc does not exist" + cat $HOME/.profile || echo ".profile does not exist" + cat $HOME/.bashrc || echo ".bashrc does not exist" + ls -la ~ conda info - name: Install benchopt and its dependencies From 3fb292a6a23b7026dc4f56e9d7b15b3f2d28e95b Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 15:20:33 +0100 Subject: [PATCH 13/43] DBG more debug logs --- .github/workflows/deepinv_run_hf.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index fa2659a..71513c3 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -72,6 +72,7 @@ jobs: - name: Get info about runner shell: bash run: | + rm -rf $HOME/.profile cat $HOME/.profile || echo ".profile does not exist" cat $HOME/.bashrc || echo ".bashrc does not exist" echo "~" @@ -86,7 +87,7 @@ jobs: miniforge-version: latest channels: conda-forge python-version: 3.12 - installation-dir: ~/deepinv_bench_conda + installation-dir: deepinv_bench_conda use-only-tar-bz2: true # Needed for package caching - name: Get info about runner 3 From 91d94a9aa23ccee8451c3fb43ec0add7c1c1b28b Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 15:28:12 +0100 Subject: [PATCH 14/43] DBG reactivate mamba --- .github/workflows/deepinv_run_hf.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 71513c3..104ea9f 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -72,19 +72,15 @@ jobs: - name: Get info about runner shell: bash run: | - rm -rf $HOME/.profile - cat $HOME/.profile || echo ".profile does not exist" - cat $HOME/.bashrc || echo ".bashrc does not exist" - echo "~" + rm -rf $HOME/.profile || echo ".profile does not exist" ls -la ~ - echo "home" - ls -la $HOME - name: Setup Conda uses: conda-incubator/setup-miniconda@v3 with: auto-update-conda: true miniforge-version: latest + use-mamba: true channels: conda-forge python-version: 3.12 installation-dir: deepinv_bench_conda @@ -94,7 +90,6 @@ jobs: shell: bash run: | cat $HOME/.profile || echo ".profile does not exist" - cat $HOME/.bashrc || echo ".bashrc does not exist" ls -la ~ conda info From d5fe3936cbbd4eda4bcb27e5c77d944207bb99a4 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 15:34:00 +0100 Subject: [PATCH 15/43] DBG move to conda --- .github/workflows/deepinv_run_hf.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 104ea9f..e5e8aac 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -43,8 +43,6 @@ jobs: exclude: # don't run on the template benchmark, which is not meant to be run - benchmark_dir: "deepinv_bench/benchmarks/benchmark_template" - env: - BENCHOPT_CONDA_CMD: 'mamba' defaults: run: # Need to use this shell to get conda working properly. @@ -80,7 +78,6 @@ jobs: with: auto-update-conda: true miniforge-version: latest - use-mamba: true channels: conda-forge python-version: 3.12 installation-dir: deepinv_bench_conda @@ -95,7 +92,7 @@ jobs: - name: Install benchopt and its dependencies run: | - mamba install -yq pip + conda install -yq pip pip install -U git+https://github.com/benchopt/benchopt huggingface_hub benchopt install ${{ matrix.benchmark_dir }} From cd9da8dbb5daa53339bcce2c23d2358b334fbcd5 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 15:37:23 +0100 Subject: [PATCH 16/43] DBG fix install command --- .github/workflows/deepinv_run_hf.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index e5e8aac..02dd53e 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -94,7 +94,7 @@ jobs: run: | conda install -yq pip pip install -U git+https://github.com/benchopt/benchopt huggingface_hub - benchopt install ${{ matrix.benchmark_dir }} + benchopt install -y ${{ matrix.benchmark_dir }} - name: Run benchmarks run: | From 3746dba6c8d5576c78be7f6f6f5288ca963f7d18 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 17:08:39 +0100 Subject: [PATCH 17/43] FIX try to use separate HOME dirs --- .github/workflows/deepinv_run_hf.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 02dd53e..dfb2b7e 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -43,6 +43,9 @@ jobs: exclude: # don't run on the template benchmark, which is not meant to be run - benchmark_dir: "deepinv_bench/benchmarks/benchmark_template" + env: + HOME: '/local/jtachell/runner-${{ matrix.benchmark-dirs }}' + TEST_CONDA_ENV: 'deepinv_bench' defaults: run: # Need to use this shell to get conda working properly. @@ -67,11 +70,9 @@ jobs: # invalidate it every month to avoid stale caches. key: ${{ runner.os }}-${{matrix.benchmark_dir}}-${{ steps.get-date.outputs.date }} - - name: Get info about runner + - name: Create job-specific HOME shell: bash - run: | - rm -rf $HOME/.profile || echo ".profile does not exist" - ls -la ~ + run: mkdir -p $HOME - name: Setup Conda uses: conda-incubator/setup-miniconda@v3 @@ -80,8 +81,8 @@ jobs: miniforge-version: latest channels: conda-forge python-version: 3.12 - installation-dir: deepinv_bench_conda use-only-tar-bz2: true # Needed for package caching + activate-environment: ${{ env.TEST_CONDA_ENV }} - name: Get info about runner 3 shell: bash From 68334e5fd0b299c6f26925d92d99962788db68d9 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 17:11:11 +0100 Subject: [PATCH 18/43] FIX try to use separate HOME dirs --- .github/workflows/deepinv_run_hf.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index dfb2b7e..104ed8b 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -44,7 +44,7 @@ jobs: # don't run on the template benchmark, which is not meant to be run - benchmark_dir: "deepinv_bench/benchmarks/benchmark_template" env: - HOME: '/local/jtachell/runner-${{ matrix.benchmark-dirs }}' + HOME: /local/jtachell/runner-${{ matrix.benchmark_dir }} TEST_CONDA_ENV: 'deepinv_bench' defaults: run: From d7c80d3f8ea2f516dcc9e4896eb5452f4d275c20 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 17:33:37 +0100 Subject: [PATCH 19/43] FIX tentative to install benchmark --- .github/workflows/deepinv_run_hf.yml | 22 +++++++++---------- .github/workflows/test_run_benchmak.yml | 2 +- .../cbsd500_gaussian_denoising/objective.py | 2 +- .../div2k_gaussian_deblurring/objective.py | 2 +- 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 104ed8b..55171bd 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -46,6 +46,8 @@ jobs: env: HOME: /local/jtachell/runner-${{ matrix.benchmark_dir }} TEST_CONDA_ENV: 'deepinv_bench' + BENCHOPT_CONDA_CMD: 'mamba' + BENCHOPT_DEBUG: 1 defaults: run: # Need to use this shell to get conda working properly. @@ -64,7 +66,7 @@ jobs: uses: actions/cache@v5 with: path: | - ~/conda_pkgs_dir + ${{ env.HOME }}/conda_pkgs_dir ${{ matrix.benchmark_dir }}/__cache__ # The cache is unique for each benchmark directory, OS and we # invalidate it every month to avoid stale caches. @@ -79,22 +81,17 @@ jobs: with: auto-update-conda: true miniforge-version: latest + mamba-version: "*" + use-mamba: true channels: conda-forge - python-version: 3.12 - use-only-tar-bz2: true # Needed for package caching + python-version: '3.11' activate-environment: ${{ env.TEST_CONDA_ENV }} - - - name: Get info about runner 3 - shell: bash - run: | - cat $HOME/.profile || echo ".profile does not exist" - ls -la ~ - conda info + use-only-tar-bz2: true # Needed for package caching - name: Install benchopt and its dependencies run: | - conda install -yq pip - pip install -U git+https://github.com/benchopt/benchopt huggingface_hub + mamba install -yq pip + pip install -U git+https://github.com/benchopt/benchopt benchopt install -y ${{ matrix.benchmark_dir }} - name: Run benchmarks @@ -103,6 +100,7 @@ jobs: - name: Upload results run: | + pip install huggingface_hub benchopt publish ${{ matrix.benchmark_dir }} --hub huggingface \ --filename ${{ matrix.benchmark_dir }}/outputs/results_ci_run.csv \ --repo deepinv/benchmarks --keep last \ diff --git a/.github/workflows/test_run_benchmak.yml b/.github/workflows/test_run_benchmak.yml index fdd115e..a980685 100644 --- a/.github/workflows/test_run_benchmak.yml +++ b/.github/workflows/test_run_benchmak.yml @@ -46,7 +46,7 @@ jobs: mamba-version: "*" use-mamba: true channels: conda-forge - python-version: 3.12 + python-version: '3.12' activate-environment: ${{ env.CONDA_ENV }} use-only-tar-bz2: true # Needed for package caching diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/objective.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/objective.py index 7ecbc7f..2ef1d36 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/objective.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/objective.py @@ -13,7 +13,7 @@ class Objective(BaseObjective): "cbsd500_gaussian_denoising" ) - requirements = ["deepinv", "datasets", "pip:pyiqa"] + requirements = ["deepinv", "datasets", "pip::pyiqa"] # Minimal version of benchopt required to run this benchmark. # Bump it up if the benchmark depends on a new feature of benchopt. diff --git a/deepinv_bench/benchmarks/div2k_gaussian_deblurring/objective.py b/deepinv_bench/benchmarks/div2k_gaussian_deblurring/objective.py index 6c139df..0bcd1f8 100644 --- a/deepinv_bench/benchmarks/div2k_gaussian_deblurring/objective.py +++ b/deepinv_bench/benchmarks/div2k_gaussian_deblurring/objective.py @@ -13,7 +13,7 @@ class Objective(BaseObjective): "div2k_gaussian_deblurring" ) - requirements = ["deepinv", "datasets", "pip:pyiqa"] + requirements = ["deepinv", "datasets", "pip::pyiqa"] # Minimal version of benchopt required to run this benchmark. # Bump it up if the benchmark depends on a new feature of benchopt. From f14388cf0afa0138b9815985d9215c8b5643f72d Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 17:37:18 +0100 Subject: [PATCH 20/43] FIX runner isolation --- .github/workflows/deepinv_run_hf.yml | 6 ++++-- deepinv_bench/benchmarks/benchmark_template/objective.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 55171bd..c6ad18b 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -72,9 +72,11 @@ jobs: # invalidate it every month to avoid stale caches. key: ${{ runner.os }}-${{matrix.benchmark_dir}}-${{ steps.get-date.outputs.date }} - - name: Create job-specific HOME + - name: Setup runner isolation shell: bash - run: mkdir -p $HOME + run: | + mkdir -p $HOME + rm $HOME/miniconda/_conda || echo "symlink doesn't exist" - name: Setup Conda uses: conda-incubator/setup-miniconda@v3 diff --git a/deepinv_bench/benchmarks/benchmark_template/objective.py b/deepinv_bench/benchmarks/benchmark_template/objective.py index 8e64740..0d956a5 100644 --- a/deepinv_bench/benchmarks/benchmark_template/objective.py +++ b/deepinv_bench/benchmarks/benchmark_template/objective.py @@ -13,7 +13,7 @@ class Objective(BaseObjective): "benchmark_template" ) - requirements = ["deepinv", "datasets", "pip:pyiqa"] + requirements = ["deepinv", "datasets", "pip::pyiqa"] # Minimal version of benchopt required to run this benchmark. # Bump it up if the benchmark depends on a new feature of benchopt. From 84898a3d8b74d7a96fd4758c391c3a97bdb4fe1b Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 17:47:26 +0100 Subject: [PATCH 21/43] DBG more logs --- .github/workflows/deepinv_run_hf.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index c6ad18b..5eaa3eb 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -94,6 +94,12 @@ jobs: run: | mamba install -yq pip pip install -U git+https://github.com/benchopt/benchopt + conda env list + conda list + + - name: Install benchmark dependencies + run: | + conda env list benchopt install -y ${{ matrix.benchmark_dir }} - name: Run benchmarks From 262e7d4f9d69d11f209ff4dd2d4780800a868416 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 17:48:54 +0100 Subject: [PATCH 22/43] FIX runner isolation --- .github/workflows/deepinv_run_hf.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 5eaa3eb..74ad5e5 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -76,7 +76,7 @@ jobs: shell: bash run: | mkdir -p $HOME - rm $HOME/miniconda/_conda || echo "symlink doesn't exist" + rm $HOME/miniconda3/_conda || echo "symlink doesn't exist" - name: Setup Conda uses: conda-incubator/setup-miniconda@v3 From 9fb14db64f9fce6ec33de70ddafb220a3de165d6 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 17:56:08 +0100 Subject: [PATCH 23/43] FIX runner isolation --- .github/workflows/deepinv_run_hf.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 74ad5e5..6de6afb 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -48,6 +48,7 @@ jobs: TEST_CONDA_ENV: 'deepinv_bench' BENCHOPT_CONDA_CMD: 'mamba' BENCHOPT_DEBUG: 1 + RUNNER_TEMP: /local/jtachell/runner-${{ matrix.benchmark_dir }}/temp defaults: run: # Need to use this shell to get conda working properly. From 59cb8d01032355c635d96da5a827ae1f2cddcb7b Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 22:28:23 +0100 Subject: [PATCH 24/43] FIX use clear isolation --- .github/workflows/deepinv_run_hf.yml | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 6de6afb..0a6516a 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -45,10 +45,11 @@ jobs: - benchmark_dir: "deepinv_bench/benchmarks/benchmark_template" env: HOME: /local/jtachell/runner-${{ matrix.benchmark_dir }} + RUNNER_TEMP: /local/jtachell/runner-${{ matrix.benchmark_dir }}/temp + # Setup conda and benchopt TEST_CONDA_ENV: 'deepinv_bench' BENCHOPT_CONDA_CMD: 'mamba' BENCHOPT_DEBUG: 1 - RUNNER_TEMP: /local/jtachell/runner-${{ matrix.benchmark_dir }}/temp defaults: run: # Need to use this shell to get conda working properly. @@ -57,6 +58,12 @@ jobs: steps: - uses: actions/checkout@v6 + + - name: Setup runner isolation + shell: bash + run: | + rm $HOME || echo "HOME "$HOME" doesn't exist" + mkdir -p $HOME - name: Get Date id: get-date run: | @@ -73,12 +80,6 @@ jobs: # invalidate it every month to avoid stale caches. key: ${{ runner.os }}-${{matrix.benchmark_dir}}-${{ steps.get-date.outputs.date }} - - name: Setup runner isolation - shell: bash - run: | - mkdir -p $HOME - rm $HOME/miniconda3/_conda || echo "symlink doesn't exist" - - name: Setup Conda uses: conda-incubator/setup-miniconda@v3 with: @@ -101,11 +102,13 @@ jobs: - name: Install benchmark dependencies run: | conda env list - benchopt install -y ${{ matrix.benchmark_dir }} + benchopt install -y ${{ matrix.benchmark_dir }} \ + --env-name ${{ env.TEST_CONDA_ENV }} - name: Run benchmarks run: | - benchopt run ${{ matrix.benchmark_dir }} --output results_ci_run.csv --no-plot + benchopt run ${{ matrix.benchmark_dir }} --output results_ci_run.csv \ + --no-plot --env-name ${{ env.TEST_CONDA_ENV }} - name: Upload results run: | From 911bd20d0661faf10648285ab70e9ba18e0553b0 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 22:29:22 +0100 Subject: [PATCH 25/43] FIX use clear isolation --- .github/workflows/deepinv_run_hf.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 0a6516a..771bc4f 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -62,7 +62,7 @@ jobs: - name: Setup runner isolation shell: bash run: | - rm $HOME || echo "HOME "$HOME" doesn't exist" + rm -rf $HOME || echo "HOME "$HOME" doesn't exist" mkdir -p $HOME - name: Get Date id: get-date From 436577464a869b155d5b79ff6328a9f1ea4441d4 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 22:38:43 +0100 Subject: [PATCH 26/43] DBG restrict to only one run for now --- .github/scripts/find_benchmarks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/find_benchmarks.py b/.github/scripts/find_benchmarks.py index 8a1430a..02bb406 100644 --- a/.github/scripts/find_benchmarks.py +++ b/.github/scripts/find_benchmarks.py @@ -106,7 +106,7 @@ def main() -> None: filtered_dirs = filter_changed_dirs(all_dirs, changed_files) else: # No ref_range (e.g., schedule/tag/create): include all benchmarks - filtered_dirs = all_dirs + filtered_dirs = all_dirs[0] # Output as JSON result = json.dumps(filtered_dirs) From cc2274b4d82e63853b3faa38060f9496342f91cc Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 22:39:58 +0100 Subject: [PATCH 27/43] DBG restrict to only one run for now --- .github/scripts/find_benchmarks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/find_benchmarks.py b/.github/scripts/find_benchmarks.py index 02bb406..98e592b 100644 --- a/.github/scripts/find_benchmarks.py +++ b/.github/scripts/find_benchmarks.py @@ -106,7 +106,7 @@ def main() -> None: filtered_dirs = filter_changed_dirs(all_dirs, changed_files) else: # No ref_range (e.g., schedule/tag/create): include all benchmarks - filtered_dirs = all_dirs[0] + filtered_dirs = all_dirs[:2] # Output as JSON result = json.dumps(filtered_dirs) From c86dd1dbc03b35ce9fa5880e8caab58530e3eb1c Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 22:56:46 +0100 Subject: [PATCH 28/43] FIX .profile sourcing in remote HOME --- .github/workflows/deepinv_run_hf.yml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 771bc4f..d075c2a 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -46,15 +46,17 @@ jobs: env: HOME: /local/jtachell/runner-${{ matrix.benchmark_dir }} RUNNER_TEMP: /local/jtachell/runner-${{ matrix.benchmark_dir }}/temp + # BASH_ENV is sourced by non-login bash shells - $HOME expanded by bash + BASH_ENV: $HOME/.profile # Setup conda and benchopt TEST_CONDA_ENV: 'deepinv_bench' BENCHOPT_CONDA_CMD: 'mamba' BENCHOPT_DEBUG: 1 defaults: run: - # Need to use this shell to get conda working properly. - # See https://github.com/marketplace/actions/setup-miniconda#important - shell: bash -el {0} + # Use non-login shell with BASH_ENV instead of -l to ensure + # $HOME/.profile is sourced + shell: bash -eo pipefail {0} steps: - uses: actions/checkout@v6 @@ -95,13 +97,10 @@ jobs: - name: Install benchopt and its dependencies run: | mamba install -yq pip - pip install -U git+https://github.com/benchopt/benchopt - conda env list - conda list + pip install -U git+https://github.com/benchopt/benchopt huggingface_hub - name: Install benchmark dependencies run: | - conda env list benchopt install -y ${{ matrix.benchmark_dir }} \ --env-name ${{ env.TEST_CONDA_ENV }} @@ -112,7 +111,6 @@ jobs: - name: Upload results run: | - pip install huggingface_hub benchopt publish ${{ matrix.benchmark_dir }} --hub huggingface \ --filename ${{ matrix.benchmark_dir }}/outputs/results_ci_run.csv \ --repo deepinv/benchmarks --keep last \ From 77d126bcde821c20b3529e58f4d03a2f17f5860b Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 23:07:39 +0100 Subject: [PATCH 29/43] FIX running on GPU --- .github/scripts/find_benchmarks.py | 2 +- .github/workflows/deepinv_run_hf.yml | 6 ++---- .../cbsd500_gaussian_denoising/solvers/drunet.py | 9 ++++++++- .../cbsd500_gaussian_denoising/solvers/restformer.py | 9 ++++++++- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/.github/scripts/find_benchmarks.py b/.github/scripts/find_benchmarks.py index 98e592b..8a1430a 100644 --- a/.github/scripts/find_benchmarks.py +++ b/.github/scripts/find_benchmarks.py @@ -106,7 +106,7 @@ def main() -> None: filtered_dirs = filter_changed_dirs(all_dirs, changed_files) else: # No ref_range (e.g., schedule/tag/create): include all benchmarks - filtered_dirs = all_dirs[:2] + filtered_dirs = all_dirs # Output as JSON result = json.dumps(filtered_dirs) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index d075c2a..917ffe1 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -100,14 +100,12 @@ jobs: pip install -U git+https://github.com/benchopt/benchopt huggingface_hub - name: Install benchmark dependencies - run: | - benchopt install -y ${{ matrix.benchmark_dir }} \ - --env-name ${{ env.TEST_CONDA_ENV }} + run: benchopt install -y ${{ matrix.benchmark_dir }} - name: Run benchmarks run: | benchopt run ${{ matrix.benchmark_dir }} --output results_ci_run.csv \ - --no-plot --env-name ${{ env.TEST_CONDA_ENV }} + --no-plot - name: Upload results run: | diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py index 727cb8e..b5c8738 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py @@ -1,5 +1,6 @@ from benchopt import BaseSolver +import torch import deepinv as dinv @@ -9,7 +10,13 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - self.model = dinv.models.ArtifactRemoval(dinv.models.DRUNet()) + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + self.model = dinv.models.ArtifactRemoval( + dinv.models.DRUNet(), device=device + ) + self.model.device = device def run(self, _): pass diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restformer.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restformer.py index c35bc86..f3e3fce 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restformer.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restformer.py @@ -1,5 +1,6 @@ from benchopt import BaseSolver +import torch import deepinv as dinv @@ -9,7 +10,13 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - self.model = dinv.models.ArtifactRemoval(dinv.models.Restormer()) + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + self.model = dinv.models.ArtifactRemoval( + dinv.models.Restormer(), device=device + ) + self.model.device = device def run(self, _): pass From 3340c0c83decd31485ba35bdf6f240c061719a8c Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 23:19:18 +0100 Subject: [PATCH 30/43] DBG understand iqia failure --- .github/workflows/deepinv_run_hf.yml | 6 +++--- .../benchmarks/cbsd500_gaussian_denoising/objective.py | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index 917ffe1..cde5a8e 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -7,7 +7,6 @@ on: create: tags: - '**' - pull_request: workflow_dispatch: jobs: @@ -51,6 +50,7 @@ jobs: # Setup conda and benchopt TEST_CONDA_ENV: 'deepinv_bench' BENCHOPT_CONDA_CMD: 'mamba' + BENCHOPT_RAISE_INSTALL_ERROR: true BENCHOPT_DEBUG: 1 defaults: run: @@ -76,7 +76,6 @@ jobs: uses: actions/cache@v5 with: path: | - ${{ env.HOME }}/conda_pkgs_dir ${{ matrix.benchmark_dir }}/__cache__ # The cache is unique for each benchmark directory, OS and we # invalidate it every month to avoid stale caches. @@ -100,7 +99,8 @@ jobs: pip install -U git+https://github.com/benchopt/benchopt huggingface_hub - name: Install benchmark dependencies - run: benchopt install -y ${{ matrix.benchmark_dir }} + run: | + benchopt install -y ${{ matrix.benchmark_dir }} - name: Run benchmarks run: | diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/objective.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/objective.py index 2ef1d36..191945b 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/objective.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/objective.py @@ -5,7 +5,6 @@ class Objective(BaseObjective): - # Name to select the objective in the CLI and to display the results. name = "CBSD68 denoising" url = ( From 0a10946e63bd28c4e804d8bac4556d5c0f2d9c78 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 23:27:12 +0100 Subject: [PATCH 31/43] ENH ensure install in proper env --- .github/workflows/deepinv_run_hf.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index cde5a8e..d6d056a 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -48,7 +48,7 @@ jobs: # BASH_ENV is sourced by non-login bash shells - $HOME expanded by bash BASH_ENV: $HOME/.profile # Setup conda and benchopt - TEST_CONDA_ENV: 'deepinv_bench' + RUN_CONDA_ENV: 'deepinv_bench' BENCHOPT_CONDA_CMD: 'mamba' BENCHOPT_RAISE_INSTALL_ERROR: true BENCHOPT_DEBUG: 1 @@ -89,8 +89,9 @@ jobs: mamba-version: "*" use-mamba: true channels: conda-forge + conda-remove-defaults: true python-version: '3.11' - activate-environment: ${{ env.TEST_CONDA_ENV }} + activate-environment: ${{ env.RUN_CONDA_ENV }} use-only-tar-bz2: true # Needed for package caching - name: Install benchopt and its dependencies @@ -100,12 +101,13 @@ jobs: - name: Install benchmark dependencies run: | - benchopt install -y ${{ matrix.benchmark_dir }} + benchopt install -y ${{ matrix.benchmark_dir }} \ + --env-name ${{ env.RUN_CONDA_ENV }} - name: Run benchmarks run: | benchopt run ${{ matrix.benchmark_dir }} --output results_ci_run.csv \ - --no-plot + --no-plot --env-name ${{ env.RUN_CONDA_ENV }} - name: Upload results run: | From 9eeec5e6ff6295dd86e90b45f92f5cfce7a9a446 Mon Sep 17 00:00:00 2001 From: tommoral Date: Fri, 6 Mar 2026 23:35:57 +0100 Subject: [PATCH 32/43] TST caching mechanism --- .github/workflows/deepinv_run_hf.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/deepinv_run_hf.yml b/.github/workflows/deepinv_run_hf.yml index d6d056a..0e4bb55 100644 --- a/.github/workflows/deepinv_run_hf.yml +++ b/.github/workflows/deepinv_run_hf.yml @@ -92,7 +92,6 @@ jobs: conda-remove-defaults: true python-version: '3.11' activate-environment: ${{ env.RUN_CONDA_ENV }} - use-only-tar-bz2: true # Needed for package caching - name: Install benchopt and its dependencies run: | From b5d013b0cf60b53ba62c2957440891e6b5bb704c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Tachella?= Date: Mon, 6 Apr 2026 17:31:39 +0200 Subject: [PATCH 33/43] add more denoisers --- .../solvers/admunet.py | 26 +++++++++++++ .../solvers/bilateral_filter.py | 26 +++++++++++++ .../solvers/bm3d.py | 38 ++++++++++++++++++ .../solvers/diffunet.py | 26 +++++++++++++ .../solvers/dncnn.py | 26 +++++++++++++ .../solvers/dsccp.py | 26 +++++++++++++ .../solvers/epll_denoiser.py | 38 ++++++++++++++++++ .../solvers/gsdrunet.py | 0 .../solvers/ncsnpp.py | 26 +++++++++++++ .../cbsd500_gaussian_denoising/solvers/ram.py | 26 +++++++++++++ .../solvers/{restformer.py => restormer.py} | 0 .../solvers/scunet.py | 26 +++++++++++++ .../solvers/swinir.py | 26 +++++++++++++ .../solvers/tgv_denoiser.py | 39 +++++++++++++++++++ .../solvers/tv_denoiser.py | 39 +++++++++++++++++++ .../solvers/wavelet_denoiser.py | 39 +++++++++++++++++++ 16 files changed, 427 insertions(+) create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/gsdrunet.py create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py rename deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/{restformer.py => restormer.py} (100%) create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py create mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py new file mode 100644 index 0000000..ccd0968 --- /dev/null +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py @@ -0,0 +1,26 @@ +from benchopt import BaseSolver + +import torch +import deepinv as dinv + + +class Solver(BaseSolver): + name = "ADMUNet" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + self.model = dinv.models.ArtifactRemoval( + dinv.models.ADMUNet(), device=device + ) + self.model.device = device + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) + diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py new file mode 100644 index 0000000..4fb60b0 --- /dev/null +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py @@ -0,0 +1,26 @@ +from benchopt import BaseSolver + +import torch +import deepinv as dinv + + +class Solver(BaseSolver): + name = "BilateralFilter" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + self.model = dinv.models.ArtifactRemoval( + dinv.models.BilateralFilter(), device=device + ) + self.model.device = device + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) + diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py new file mode 100644 index 0000000..8e02ea1 --- /dev/null +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py @@ -0,0 +1,38 @@ +from benchopt import BaseSolver + +import torch +import torch.nn as nn +import deepinv as dinv + + +class Solver(BaseSolver): + name = "BM3D" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + + _bm3d = dinv.models.BM3D() + _device = device + + class _Wrapper(nn.Module): + def __init__(self): + super().__init__() + self.bm3d = _bm3d + self.device = _device + + def forward(self, y, physics, **kwargs): + sigma = physics.noise_model.sigma + return self.bm3d(y.to(self.device), sigma) + + self.model = _Wrapper() + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) + diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py new file mode 100644 index 0000000..8cee9a1 --- /dev/null +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py @@ -0,0 +1,26 @@ +from benchopt import BaseSolver + +import torch +import deepinv as dinv + + +class Solver(BaseSolver): + name = "DiffUNet" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + self.model = dinv.models.ArtifactRemoval( + dinv.models.DiffUNet(), device=device + ) + self.model.device = device + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) + diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py new file mode 100644 index 0000000..3d712d8 --- /dev/null +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py @@ -0,0 +1,26 @@ +from benchopt import BaseSolver + +import torch +import deepinv as dinv + + +class Solver(BaseSolver): + name = "DnCNN" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + self.model = dinv.models.ArtifactRemoval( + dinv.models.DnCNN(), device=device + ) + self.model.device = device + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) + diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py new file mode 100644 index 0000000..c820613 --- /dev/null +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py @@ -0,0 +1,26 @@ +from benchopt import BaseSolver + +import torch +import deepinv as dinv + + +class Solver(BaseSolver): + name = "DScCP" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + self.model = dinv.models.ArtifactRemoval( + dinv.models.DScCP(), device=device + ) + self.model.device = device + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) + diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py new file mode 100644 index 0000000..bc8d9a1 --- /dev/null +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py @@ -0,0 +1,38 @@ +from benchopt import BaseSolver + +import torch +import torch.nn as nn +import deepinv as dinv + + +class Solver(BaseSolver): + name = "EPLLDenoiser" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + + _epll = dinv.models.EPLLDenoiser(device=device) + _device = device + + class _Wrapper(nn.Module): + def __init__(self): + super().__init__() + self.epll = _epll + self.device = _device + + def forward(self, y, physics, **kwargs): + sigma = physics.noise_model.sigma + return self.epll(y.to(self.device), sigma) + + self.model = _Wrapper() + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) + diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/gsdrunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/gsdrunet.py new file mode 100644 index 0000000..e69de29 diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py new file mode 100644 index 0000000..4582e97 --- /dev/null +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py @@ -0,0 +1,26 @@ +from benchopt import BaseSolver + +import torch +import deepinv as dinv + + +class Solver(BaseSolver): + name = "NCSNpp" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + self.model = dinv.models.ArtifactRemoval( + dinv.models.NCSNpp(), device=device + ) + self.model.device = device + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) + diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py new file mode 100644 index 0000000..9c1a429 --- /dev/null +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py @@ -0,0 +1,26 @@ +from benchopt import BaseSolver + +import torch +import deepinv as dinv + + +class Solver(BaseSolver): + name = "RAM" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + self.model = dinv.models.ArtifactRemoval( + dinv.models.RAM(), device=device + ) + self.model.device = device + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) + diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restformer.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restormer.py similarity index 100% rename from deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restformer.py rename to deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restormer.py diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py new file mode 100644 index 0000000..d75cbfa --- /dev/null +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py @@ -0,0 +1,26 @@ +from benchopt import BaseSolver + +import torch +import deepinv as dinv + + +class Solver(BaseSolver): + name = "SCUNet" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + self.model = dinv.models.ArtifactRemoval( + dinv.models.SCUNet(), device=device + ) + self.model.device = device + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) + diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py new file mode 100644 index 0000000..d9f2b2e --- /dev/null +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py @@ -0,0 +1,26 @@ +from benchopt import BaseSolver + +import torch +import deepinv as dinv + + +class Solver(BaseSolver): + name = "SwinIR" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + self.model = dinv.models.ArtifactRemoval( + dinv.models.SwinIR(), device=device + ) + self.model.device = device + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) + diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py new file mode 100644 index 0000000..17e2a2d --- /dev/null +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py @@ -0,0 +1,39 @@ +from benchopt import BaseSolver + +import torch +import torch.nn as nn +import deepinv as dinv + + +class Solver(BaseSolver): + name = "TGVDenoiser" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + + _tgv = dinv.models.TGVDenoiser() + _device = device + + class _Wrapper(nn.Module): + def __init__(self): + super().__init__() + self.tgv = _tgv + self.device = _device + + def forward(self, y, physics, **kwargs): + # Use the noise sigma as the TGV regularization weight + gamma = physics.noise_model.sigma + return self.tgv(y.to(self.device), gamma) + + self.model = _Wrapper() + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) + diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py new file mode 100644 index 0000000..2f22436 --- /dev/null +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py @@ -0,0 +1,39 @@ +from benchopt import BaseSolver + +import torch +import torch.nn as nn +import deepinv as dinv + + +class Solver(BaseSolver): + name = "TVDenoiser" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + + _tv = dinv.models.TVDenoiser() + _device = device + + class _Wrapper(nn.Module): + def __init__(self): + super().__init__() + self.tv = _tv + self.device = _device + + def forward(self, y, physics, **kwargs): + # Use the noise sigma as the TV regularization weight + gamma = physics.noise_model.sigma + return self.tv(y.to(self.device), gamma) + + self.model = _Wrapper() + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) + diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py new file mode 100644 index 0000000..1ede5af --- /dev/null +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py @@ -0,0 +1,39 @@ +from benchopt import BaseSolver + +import torch +import torch.nn as nn +import deepinv as dinv + + +class Solver(BaseSolver): + name = "WaveletDenoiser" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = ( + dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + ) + + _wavelet = dinv.models.WaveletDenoiser(device=device) + _device = device + + class _Wrapper(nn.Module): + def __init__(self): + super().__init__() + self.wavelet = _wavelet + self.device = _device + + def forward(self, y, physics, **kwargs): + # Use the noise sigma as the wavelet threshold + sigma = physics.noise_model.sigma + return self.wavelet(y.to(self.device), ths=sigma) + + self.model = _Wrapper() + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) + From ebf5921ce12f1592c0098e860e26e77d5935f8e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Tachella?= Date: Mon, 6 Apr 2026 17:36:01 +0200 Subject: [PATCH 34/43] RAM doesn't need an artifact removal --- .../benchmarks/cbsd500_gaussian_denoising/solvers/ram.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py index 9c1a429..5e24328 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py @@ -13,9 +13,7 @@ def set_objective(self, train_dataset=None, physics=None): device = ( dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" ) - self.model = dinv.models.ArtifactRemoval( - dinv.models.RAM(), device=device - ) + self.model = dinv.models.RAM() self.model.device = device def run(self, _): From 367f983fc3bd2b85068ce50c92069b672be3e45e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Tachella?= Date: Mon, 6 Apr 2026 17:44:01 +0200 Subject: [PATCH 35/43] black --- .../benchmark_template/datasets/dataset.py | 8 ++----- .../benchmark_template/solvers/solver1.py | 4 +--- .../solvers/admunet.py | 9 ++----- .../solvers/bilateral_filter.py | 5 +--- .../solvers/bm3d.py | 23 +++--------------- .../solvers/diffunet.py | 9 ++----- .../solvers/dncnn.py | 9 ++----- .../solvers/drunet.py | 8 ++----- .../solvers/dsccp.py | 9 ++----- .../solvers/epll_denoiser.py | 23 ++++-------------- .../solvers/ncsnpp.py | 9 ++----- .../cbsd500_gaussian_denoising/solvers/ram.py | 5 +--- .../solvers/restormer.py | 8 ++----- .../solvers/scunet.py | 9 ++----- .../solvers/swinir.py | 9 ++----- .../solvers/tgv_denoiser.py | 24 ++++--------------- .../solvers/tv_denoiser.py | 24 ++++--------------- .../solvers/wavelet_denoiser.py | 24 ++++--------------- 18 files changed, 42 insertions(+), 177 deletions(-) diff --git a/deepinv_bench/benchmarks/benchmark_template/datasets/dataset.py b/deepinv_bench/benchmarks/benchmark_template/datasets/dataset.py index f61661f..c7aa454 100644 --- a/deepinv_bench/benchmarks/benchmark_template/datasets/dataset.py +++ b/deepinv_bench/benchmarks/benchmark_template/datasets/dataset.py @@ -30,14 +30,10 @@ def get_data(self): ) # load the dataset - dataset = dinv.datasets.Set14HR( - root, download=True, transform=transform - ) + dataset = dinv.datasets.Set14HR(root, download=True, transform=transform) # define the physics according to the parameters - physics = dinv.physics.Denoising( - noise_model=dinv.physics.GaussianNoise() - ) + physics = dinv.physics.Denoising(noise_model=dinv.physics.GaussianNoise()) return dict( dataset=dataset, diff --git a/deepinv_bench/benchmarks/benchmark_template/solvers/solver1.py b/deepinv_bench/benchmarks/benchmark_template/solvers/solver1.py index e253b5c..9a8351c 100644 --- a/deepinv_bench/benchmarks/benchmark_template/solvers/solver1.py +++ b/deepinv_bench/benchmarks/benchmark_template/solvers/solver1.py @@ -11,9 +11,7 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" # replace by your model, should take (y, physics) as input self.model = dinv.models.DnCNN(device=device) diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py index ccd0968..f5ec088 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py @@ -10,12 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) - self.model = dinv.models.ArtifactRemoval( - dinv.models.ADMUNet(), device=device - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.ADMUNet(), device=device) self.model.device = device def run(self, _): @@ -23,4 +19,3 @@ def run(self, _): def get_result(self): return dict(model=self.model) - diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py index 4fb60b0..5e533e7 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py @@ -10,9 +10,7 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" self.model = dinv.models.ArtifactRemoval( dinv.models.BilateralFilter(), device=device ) @@ -23,4 +21,3 @@ def run(self, _): def get_result(self): return dict(model=self.model) - diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py index 8e02ea1..73b07e8 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py @@ -1,7 +1,6 @@ from benchopt import BaseSolver import torch -import torch.nn as nn import deepinv as dinv @@ -11,28 +10,12 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) - - _bm3d = dinv.models.BM3D() - _device = device - - class _Wrapper(nn.Module): - def __init__(self): - super().__init__() - self.bm3d = _bm3d - self.device = _device - - def forward(self, y, physics, **kwargs): - sigma = physics.noise_model.sigma - return self.bm3d(y.to(self.device), sigma) - - self.model = _Wrapper() + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.BM3D(), device=device) + self.model.device = device def run(self, _): pass def get_result(self): return dict(model=self.model) - diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py index 8cee9a1..118144f 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py @@ -10,12 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) - self.model = dinv.models.ArtifactRemoval( - dinv.models.DiffUNet(), device=device - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.DiffUNet(), device=device) self.model.device = device def run(self, _): @@ -23,4 +19,3 @@ def run(self, _): def get_result(self): return dict(model=self.model) - diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py index 3d712d8..2b081e4 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py @@ -10,12 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) - self.model = dinv.models.ArtifactRemoval( - dinv.models.DnCNN(), device=device - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.DnCNN(), device=device) self.model.device = device def run(self, _): @@ -23,4 +19,3 @@ def run(self, _): def get_result(self): return dict(model=self.model) - diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py index b5c8738..d419388 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py @@ -10,12 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) - self.model = dinv.models.ArtifactRemoval( - dinv.models.DRUNet(), device=device - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.DRUNet(), device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py index c820613..e12a8d6 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py @@ -10,12 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) - self.model = dinv.models.ArtifactRemoval( - dinv.models.DScCP(), device=device - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.DScCP(), device=device) self.model.device = device def run(self, _): @@ -23,4 +19,3 @@ def run(self, _): def get_result(self): return dict(model=self.model) - diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py index bc8d9a1..6c2f6fe 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py @@ -1,7 +1,6 @@ from benchopt import BaseSolver import torch -import torch.nn as nn import deepinv as dinv @@ -11,28 +10,14 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval( + dinv.models.EPLLDenoiser(), device=device ) - - _epll = dinv.models.EPLLDenoiser(device=device) - _device = device - - class _Wrapper(nn.Module): - def __init__(self): - super().__init__() - self.epll = _epll - self.device = _device - - def forward(self, y, physics, **kwargs): - sigma = physics.noise_model.sigma - return self.epll(y.to(self.device), sigma) - - self.model = _Wrapper() + self.model.device = device def run(self, _): pass def get_result(self): return dict(model=self.model) - diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py index 4582e97..1e134fc 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py @@ -10,12 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) - self.model = dinv.models.ArtifactRemoval( - dinv.models.NCSNpp(), device=device - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.NCSNpp(), device=device) self.model.device = device def run(self, _): @@ -23,4 +19,3 @@ def run(self, _): def get_result(self): return dict(model=self.model) - diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py index 5e24328..edbd39d 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py @@ -10,9 +10,7 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" self.model = dinv.models.RAM() self.model.device = device @@ -21,4 +19,3 @@ def run(self, _): def get_result(self): return dict(model=self.model) - diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restormer.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restormer.py index f3e3fce..0305a56 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restormer.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restormer.py @@ -10,12 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) - self.model = dinv.models.ArtifactRemoval( - dinv.models.Restormer(), device=device - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.Restormer(), device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py index d75cbfa..1ba3852 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py @@ -10,12 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) - self.model = dinv.models.ArtifactRemoval( - dinv.models.SCUNet(), device=device - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.SCUNet(), device=device) self.model.device = device def run(self, _): @@ -23,4 +19,3 @@ def run(self, _): def get_result(self): return dict(model=self.model) - diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py index d9f2b2e..17e3871 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py @@ -10,12 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) - self.model = dinv.models.ArtifactRemoval( - dinv.models.SwinIR(), device=device - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.SwinIR(), device=device) self.model.device = device def run(self, _): @@ -23,4 +19,3 @@ def run(self, _): def get_result(self): return dict(model=self.model) - diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py index 17e2a2d..4e7f84b 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py @@ -1,7 +1,6 @@ from benchopt import BaseSolver import torch -import torch.nn as nn import deepinv as dinv @@ -11,29 +10,14 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval( + dinv.models.TGVDenoiser(), device=device ) - - _tgv = dinv.models.TGVDenoiser() - _device = device - - class _Wrapper(nn.Module): - def __init__(self): - super().__init__() - self.tgv = _tgv - self.device = _device - - def forward(self, y, physics, **kwargs): - # Use the noise sigma as the TGV regularization weight - gamma = physics.noise_model.sigma - return self.tgv(y.to(self.device), gamma) - - self.model = _Wrapper() + self.model.device = device def run(self, _): pass def get_result(self): return dict(model=self.model) - diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py index 2f22436..4dbea2d 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py @@ -1,7 +1,6 @@ from benchopt import BaseSolver import torch -import torch.nn as nn import deepinv as dinv @@ -11,29 +10,14 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval( + dinv.models.TVDenoiser(), device=device ) - - _tv = dinv.models.TVDenoiser() - _device = device - - class _Wrapper(nn.Module): - def __init__(self): - super().__init__() - self.tv = _tv - self.device = _device - - def forward(self, y, physics, **kwargs): - # Use the noise sigma as the TV regularization weight - gamma = physics.noise_model.sigma - return self.tv(y.to(self.device), gamma) - - self.model = _Wrapper() + self.model.device = device def run(self, _): pass def get_result(self): return dict(model=self.model) - diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py index 1ede5af..a391a69 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py @@ -1,7 +1,6 @@ from benchopt import BaseSolver import torch -import torch.nn as nn import deepinv as dinv @@ -11,29 +10,14 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval( + dinv.models.WaveletDenoiser(), device=device ) - - _wavelet = dinv.models.WaveletDenoiser(device=device) - _device = device - - class _Wrapper(nn.Module): - def __init__(self): - super().__init__() - self.wavelet = _wavelet - self.device = _device - - def forward(self, y, physics, **kwargs): - # Use the noise sigma as the wavelet threshold - sigma = physics.noise_model.sigma - return self.wavelet(y.to(self.device), ths=sigma) - - self.model = _Wrapper() + self.model.device = device def run(self, _): pass def get_result(self): return dict(model=self.model) - From 13fe686309ad6781236b9cf7075c27b4e4ad8d72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Tachella?= Date: Mon, 6 Apr 2026 19:57:08 +0200 Subject: [PATCH 36/43] flake8 --- .../benchmark_template/datasets/dataset.py | 6 +++-- .../benchmark_template/solvers/solver1.py | 3 ++- .../solvers/admunet.py | 6 +++-- .../solvers/bilateral_filter.py | 3 ++- .../solvers/bm3d.py | 6 +++-- .../solvers/diffunet.py | 6 +++-- .../solvers/dncnn.py | 6 +++-- .../solvers/drunet.py | 6 +++-- .../solvers/dsccp.py | 6 +++-- .../solvers/epll_denoiser.py | 3 ++- .../solvers/gsdrunet.py | 23 +++++++++++++++++++ .../solvers/ncsnpp.py | 6 +++-- .../cbsd500_gaussian_denoising/solvers/ram.py | 3 ++- .../solvers/restormer.py | 6 +++-- .../solvers/scunet.py | 6 +++-- .../solvers/swinir.py | 6 +++-- .../solvers/tgv_denoiser.py | 3 ++- .../solvers/tv_denoiser.py | 3 ++- .../solvers/wavelet_denoiser.py | 3 ++- pyproject.toml | 2 +- 20 files changed, 82 insertions(+), 30 deletions(-) diff --git a/deepinv_bench/benchmarks/benchmark_template/datasets/dataset.py b/deepinv_bench/benchmarks/benchmark_template/datasets/dataset.py index c7aa454..2b4affa 100644 --- a/deepinv_bench/benchmarks/benchmark_template/datasets/dataset.py +++ b/deepinv_bench/benchmarks/benchmark_template/datasets/dataset.py @@ -30,10 +30,12 @@ def get_data(self): ) # load the dataset - dataset = dinv.datasets.Set14HR(root, download=True, transform=transform) + dataset = dinv.datasets.Set14HR(root, download=True, + transform=transform) # define the physics according to the parameters - physics = dinv.physics.Denoising(noise_model=dinv.physics.GaussianNoise()) + physics = dinv.physics.Denoising( + noise_model=dinv.physics.GaussianNoise()) return dict( dataset=dataset, diff --git a/deepinv_bench/benchmarks/benchmark_template/solvers/solver1.py b/deepinv_bench/benchmarks/benchmark_template/solvers/solver1.py index 9a8351c..ab52652 100644 --- a/deepinv_bench/benchmarks/benchmark_template/solvers/solver1.py +++ b/deepinv_bench/benchmarks/benchmark_template/solvers/solver1.py @@ -11,7 +11,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" # replace by your model, should take (y, physics) as input self.model = dinv.models.DnCNN(device=device) diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py index f5ec088..0dde8e2 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py @@ -10,8 +10,10 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.ADMUNet(), device=device) + device = dinv.utils.get_freer_gpu() \ + if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.ADMUNet(), + device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py index 5e533e7..f115572 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py @@ -10,7 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu() \ + if torch.cuda.is_available() else "cpu" self.model = dinv.models.ArtifactRemoval( dinv.models.BilateralFilter(), device=device ) diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py index 73b07e8..68bc0c1 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py @@ -10,8 +10,10 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.BM3D(), device=device) + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.BM3D(), + device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py index 118144f..a7fabbc 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py @@ -10,8 +10,10 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.DiffUNet(), device=device) + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.DiffUNet(), + device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py index 2b081e4..6fcc83a 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py @@ -10,8 +10,10 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.DnCNN(), device=device) + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.DnCNN(), + device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py index d419388..ae9b90e 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py @@ -10,8 +10,10 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.DRUNet(), device=device) + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.DRUNet(), + device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py index e12a8d6..8c37a97 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py @@ -10,8 +10,10 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.DScCP(), device=device) + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.DScCP(), + device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py index 6c2f6fe..d6e19d8 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py @@ -10,7 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" self.model = dinv.models.ArtifactRemoval( dinv.models.EPLLDenoiser(), device=device ) diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/gsdrunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/gsdrunet.py index e69de29..9218a4f 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/gsdrunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/gsdrunet.py @@ -0,0 +1,23 @@ +from benchopt import BaseSolver + +import torch +import deepinv as dinv + + +class Solver(BaseSolver): + name = "GSDRUNet" + + parameters = {} + + def set_objective(self, train_dataset=None, physics=None): + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval( + dinv.models.GSDRUNet(), device=device) + self.model.device = device + + def run(self, _): + pass + + def get_result(self): + return dict(model=self.model) diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py index 1e134fc..63fede4 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py @@ -10,8 +10,10 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.NCSNpp(), device=device) + device = dinv.utils.get_freer_gpu() \ + if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.NCSNpp(), + device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py index edbd39d..fdba5b3 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py @@ -10,7 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" self.model = dinv.models.RAM() self.model.device = device diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restormer.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restormer.py index 0305a56..1e984c6 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restormer.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restormer.py @@ -10,8 +10,10 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.Restormer(), device=device) + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.Restormer(), + device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py index 1ba3852..784eed3 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py @@ -10,8 +10,10 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.SCUNet(), device=device) + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.SCUNet(), + device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py index 17e3871..1637690 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py @@ -10,8 +10,10 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.SwinIR(), device=device) + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.SwinIR(), + device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py index 4e7f84b..3c71229 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py @@ -10,7 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" self.model = dinv.models.ArtifactRemoval( dinv.models.TGVDenoiser(), device=device ) diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py index 4dbea2d..dd88f66 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py @@ -10,7 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" self.model = dinv.models.ArtifactRemoval( dinv.models.TVDenoiser(), device=device ) diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py index a391a69..cc218d4 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py @@ -10,7 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu()\ + if torch.cuda.is_available() else "cpu" self.model = dinv.models.ArtifactRemoval( dinv.models.WaveletDenoiser(), device=device ) diff --git a/pyproject.toml b/pyproject.toml index 1d5e313..955533a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ name = "deepinv_bench" version = "0.0.1" dependencies = [ "torch", - "deepinv", + "deepinv[dataset,denoisers,physics]", "benchopt>=1.8.0", ] From 1b342c2b0d3757efcaa58d62e6c009bbdb87fbce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Tachella?= Date: Mon, 6 Apr 2026 20:16:29 +0200 Subject: [PATCH 37/43] rename job + remove epll --- .github/workflows/benchopt_test.yml | 2 +- .../solvers/epll_denoiser.py | 24 ------------------- 2 files changed, 1 insertion(+), 25 deletions(-) delete mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py diff --git a/.github/workflows/benchopt_test.yml b/.github/workflows/benchopt_test.yml index 6df114f..9eae940 100644 --- a/.github/workflows/benchopt_test.yml +++ b/.github/workflows/benchopt_test.yml @@ -36,7 +36,7 @@ jobs: GITHUB_EVENT_BEFORE: ${{ github.event.before }} GITHUB_BASE_REF: ${{ github.event.pull_request.base.ref }} - benchopt_dev: + dry-run-benchmarks: needs: find-benchmarks strategy: matrix: diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py deleted file mode 100644 index d6e19d8..0000000 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/epll_denoiser.py +++ /dev/null @@ -1,24 +0,0 @@ -from benchopt import BaseSolver - -import torch -import deepinv as dinv - - -class Solver(BaseSolver): - name = "EPLLDenoiser" - - parameters = {} - - def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval( - dinv.models.EPLLDenoiser(), device=device - ) - self.model.device = device - - def run(self, _): - pass - - def get_result(self): - return dict(model=self.model) From 8a6c217a6f74583e9efdbd38fc9b49c5d7bea252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Tachella?= Date: Tue, 7 Apr 2026 11:07:17 +0200 Subject: [PATCH 38/43] try with all dependencies via pip --- .../benchmarks/cbsd500_gaussian_denoising/objective.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/objective.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/objective.py index 191945b..727e99b 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/objective.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/objective.py @@ -12,7 +12,7 @@ class Objective(BaseObjective): "cbsd500_gaussian_denoising" ) - requirements = ["deepinv", "datasets", "pip::pyiqa"] + requirements = ["pip::deepinv[dataset,denoisers,physics]", "datasets", "pip::pyiqa"] # Minimal version of benchopt required to run this benchmark. # Bump it up if the benchmark depends on a new feature of benchopt. From 5083c386f1848f46241f0d4ca64235d834c8e740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Tachella?= Date: Tue, 7 Apr 2026 11:12:02 +0200 Subject: [PATCH 39/43] lint with black --- .github/workflows/benchopt_test.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/benchopt_test.yml b/.github/workflows/benchopt_test.yml index 9eae940..98c2434 100644 --- a/.github/workflows/benchopt_test.yml +++ b/.github/workflows/benchopt_test.yml @@ -47,4 +47,14 @@ jobs: benchmark_dir: ${{ matrix.benchmark_dir }} lint: - uses: benchopt/template_benchmark/.github/workflows/lint_benchmarks.yml@main + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + - name: Install Black + run: pip install black + - name: Run Black check + run: black --check . From 0660242adad59be936f4f2dbcd04495bb0837e5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Tachella?= Date: Tue, 7 Apr 2026 11:12:41 +0200 Subject: [PATCH 40/43] black --- .github/scripts/find_benchmarks.py | 18 +++++++++--------- deepinv_bench/base/runner_solver.py | 4 +--- .../benchmark_template/datasets/dataset.py | 6 ++---- .../benchmark_template/solvers/solver1.py | 3 +-- .../solvers/admunet.py | 6 ++---- .../solvers/bilateral_filter.py | 3 +-- .../cbsd500_gaussian_denoising/solvers/bm3d.py | 6 ++---- .../solvers/diffunet.py | 6 ++---- .../solvers/dncnn.py | 6 ++---- .../solvers/drunet.py | 6 ++---- .../solvers/dsccp.py | 6 ++---- .../solvers/gsdrunet.py | 6 ++---- .../solvers/ncsnpp.py | 6 ++---- .../cbsd500_gaussian_denoising/solvers/ram.py | 3 +-- .../solvers/restormer.py | 6 ++---- .../solvers/scunet.py | 6 ++---- .../solvers/swinir.py | 6 ++---- .../solvers/tgv_denoiser.py | 3 +-- .../solvers/tv_denoiser.py | 3 +-- .../solvers/wavelet_denoiser.py | 3 +-- .../div2k_gaussian_deblurring/solvers/dpir.py | 4 +--- .../div2k_gaussian_deblurring/solvers/ram.py | 4 +--- deepinv_bench/run.py | 18 ++++++++++-------- 23 files changed, 52 insertions(+), 86 deletions(-) diff --git a/.github/scripts/find_benchmarks.py b/.github/scripts/find_benchmarks.py index 8a1430a..3ec7f95 100644 --- a/.github/scripts/find_benchmarks.py +++ b/.github/scripts/find_benchmarks.py @@ -34,7 +34,7 @@ def get_ref_range(repo: Repo) -> tuple[str, str] | None: try: repo.remotes.origin.fetch( refspec=f"+refs/heads/{base_ref}:" - f"refs/remotes/origin/{base_ref}", + f"refs/remotes/origin/{base_ref}", depth=1, no_tags=True, prune=True, @@ -75,20 +75,20 @@ def get_changed_files(repo: Repo, base: str, head: str) -> set[str]: def filter_changed_dirs(dirs: list[str], changed_files: set[str]) -> list[str]: """Filter directories to only include those with changes.""" return [ - d for d in dirs - if any( - f.startswith(d + "/") or f.startswith(d + os.sep) - for f in changed_files - ) + d + for d in dirs + if any(f.startswith(d + "/") or f.startswith(d + os.sep) for f in changed_files) ] def main() -> None: import argparse - parser = argparse.ArgumentParser(description='Find benchmarks in sub-repo') - parser.add_argument('--all', action="store_true", - help='Force to run all benchmarks') + + parser = argparse.ArgumentParser(description="Find benchmarks in sub-repo") + parser.add_argument( + "--all", action="store_true", help="Force to run all benchmarks" + ) args = parser.parse_args() root = Path.cwd() diff --git a/deepinv_bench/base/runner_solver.py b/deepinv_bench/base/runner_solver.py index bc4d82b..a1aabcd 100644 --- a/deepinv_bench/base/runner_solver.py +++ b/deepinv_bench/base/runner_solver.py @@ -19,9 +19,7 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" # Make sure the model is on the correct device and has a device # attribute to we can properly move the test data later. self.model.to(device) diff --git a/deepinv_bench/benchmarks/benchmark_template/datasets/dataset.py b/deepinv_bench/benchmarks/benchmark_template/datasets/dataset.py index 2b4affa..c7aa454 100644 --- a/deepinv_bench/benchmarks/benchmark_template/datasets/dataset.py +++ b/deepinv_bench/benchmarks/benchmark_template/datasets/dataset.py @@ -30,12 +30,10 @@ def get_data(self): ) # load the dataset - dataset = dinv.datasets.Set14HR(root, download=True, - transform=transform) + dataset = dinv.datasets.Set14HR(root, download=True, transform=transform) # define the physics according to the parameters - physics = dinv.physics.Denoising( - noise_model=dinv.physics.GaussianNoise()) + physics = dinv.physics.Denoising(noise_model=dinv.physics.GaussianNoise()) return dict( dataset=dataset, diff --git a/deepinv_bench/benchmarks/benchmark_template/solvers/solver1.py b/deepinv_bench/benchmarks/benchmark_template/solvers/solver1.py index ab52652..9a8351c 100644 --- a/deepinv_bench/benchmarks/benchmark_template/solvers/solver1.py +++ b/deepinv_bench/benchmarks/benchmark_template/solvers/solver1.py @@ -11,8 +11,7 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" # replace by your model, should take (y, physics) as input self.model = dinv.models.DnCNN(device=device) diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py index 0dde8e2..f5ec088 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py @@ -10,10 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() \ - if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.ADMUNet(), - device=device) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.ADMUNet(), device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py index f115572..5e533e7 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bilateral_filter.py @@ -10,8 +10,7 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() \ - if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" self.model = dinv.models.ArtifactRemoval( dinv.models.BilateralFilter(), device=device ) diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py index 68bc0c1..73b07e8 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py @@ -10,10 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.BM3D(), - device=device) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.BM3D(), device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py index a7fabbc..118144f 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/diffunet.py @@ -10,10 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.DiffUNet(), - device=device) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.DiffUNet(), device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py index 6fcc83a..2b081e4 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py @@ -10,10 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.DnCNN(), - device=device) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.DnCNN(), device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py index ae9b90e..d419388 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/drunet.py @@ -10,10 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.DRUNet(), - device=device) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.DRUNet(), device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py index 8c37a97..e12a8d6 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dsccp.py @@ -10,10 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.DScCP(), - device=device) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.DScCP(), device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/gsdrunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/gsdrunet.py index 9218a4f..da6081b 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/gsdrunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/gsdrunet.py @@ -10,10 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval( - dinv.models.GSDRUNet(), device=device) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.GSDRUNet(), device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py index 63fede4..1e134fc 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ncsnpp.py @@ -10,10 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() \ - if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.NCSNpp(), - device=device) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.NCSNpp(), device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py index fdba5b3..edbd39d 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/ram.py @@ -10,8 +10,7 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" self.model = dinv.models.RAM() self.model.device = device diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restormer.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restormer.py index 1e984c6..0305a56 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restormer.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/restormer.py @@ -10,10 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.Restormer(), - device=device) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.Restormer(), device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py index 784eed3..1ba3852 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/scunet.py @@ -10,10 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.SCUNet(), - device=device) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.SCUNet(), device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py index 1637690..17e3871 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/swinir.py @@ -10,10 +10,8 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.SwinIR(), - device=device) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" + self.model = dinv.models.ArtifactRemoval(dinv.models.SwinIR(), device=device) self.model.device = device def run(self, _): diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py index 3c71229..4e7f84b 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tgv_denoiser.py @@ -10,8 +10,7 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" self.model = dinv.models.ArtifactRemoval( dinv.models.TGVDenoiser(), device=device ) diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py index dd88f66..4dbea2d 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/tv_denoiser.py @@ -10,8 +10,7 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" self.model = dinv.models.ArtifactRemoval( dinv.models.TVDenoiser(), device=device ) diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py index cc218d4..a391a69 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/wavelet_denoiser.py @@ -10,8 +10,7 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu()\ - if torch.cuda.is_available() else "cpu" + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" self.model = dinv.models.ArtifactRemoval( dinv.models.WaveletDenoiser(), device=device ) diff --git a/deepinv_bench/benchmarks/div2k_gaussian_deblurring/solvers/dpir.py b/deepinv_bench/benchmarks/div2k_gaussian_deblurring/solvers/dpir.py index 8ba5d95..5309179 100644 --- a/deepinv_bench/benchmarks/div2k_gaussian_deblurring/solvers/dpir.py +++ b/deepinv_bench/benchmarks/div2k_gaussian_deblurring/solvers/dpir.py @@ -12,9 +12,7 @@ class Solver(BaseSolver): } def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" self.model = dinv.optim.DPIR(sigma=self.sigma, device=device) self.model.device = device diff --git a/deepinv_bench/benchmarks/div2k_gaussian_deblurring/solvers/ram.py b/deepinv_bench/benchmarks/div2k_gaussian_deblurring/solvers/ram.py index ce13b62..c5327b7 100644 --- a/deepinv_bench/benchmarks/div2k_gaussian_deblurring/solvers/ram.py +++ b/deepinv_bench/benchmarks/div2k_gaussian_deblurring/solvers/ram.py @@ -10,9 +10,7 @@ class Solver(BaseSolver): parameters = {} def set_objective(self, train_dataset=None, physics=None): - device = ( - dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - ) + device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" self.model = dinv.models.RAM(device=device) self.model.device = device diff --git a/deepinv_bench/run.py b/deepinv_bench/run.py index 1c85de8..1717572 100644 --- a/deepinv_bench/run.py +++ b/deepinv_bench/run.py @@ -29,15 +29,17 @@ def run_benchmark( model_name = model_name or str(model.__class__.__name__) try: - benchmark = benchopt.benchmark.Benchmark( - BENCHMARK_ROOT / benchmark_name - ) + benchmark = benchopt.benchmark.Benchmark(BENCHMARK_ROOT / benchmark_name) except Exception: - all_benchmarks = "\n-".join([ - p.name for p in BENCHMARK_ROOT.iterdir() - if p.is_dir() and not p.name.startswith(".") - and "template" not in p.name - ]) + all_benchmarks = "\n-".join( + [ + p.name + for p in BENCHMARK_ROOT.iterdir() + if p.is_dir() + and not p.name.startswith(".") + and "template" not in p.name + ] + ) raise ValueError( f"Could not find benchmark: {benchmark_name}.\n" f"Available benchmarks are:\n-{all_benchmarks}\n\n" From 0cd24d994d8199baacf224d7de76638ede70f871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Tachella?= Date: Tue, 7 Apr 2026 13:04:59 +0200 Subject: [PATCH 41/43] remove admunet for the moment --- .../solvers/admunet.py | 21 ------------------- 1 file changed, 21 deletions(-) delete mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py deleted file mode 100644 index f5ec088..0000000 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/admunet.py +++ /dev/null @@ -1,21 +0,0 @@ -from benchopt import BaseSolver - -import torch -import deepinv as dinv - - -class Solver(BaseSolver): - name = "ADMUNet" - - parameters = {} - - def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.ADMUNet(), device=device) - self.model.device = device - - def run(self, _): - pass - - def get_result(self): - return dict(model=self.model) From 68475357f0f3e8dbfa4deeb27e6cc9222effee76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Tachella?= Date: Tue, 7 Apr 2026 13:22:31 +0200 Subject: [PATCH 42/43] remove bm3d for the moment --- .../solvers/bm3d.py | 21 ------------------- 1 file changed, 21 deletions(-) delete mode 100644 deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py deleted file mode 100644 index 73b07e8..0000000 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/bm3d.py +++ /dev/null @@ -1,21 +0,0 @@ -from benchopt import BaseSolver - -import torch -import deepinv as dinv - - -class Solver(BaseSolver): - name = "BM3D" - - parameters = {} - - def set_objective(self, train_dataset=None, physics=None): - device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.BM3D(), device=device) - self.model.device = device - - def run(self, _): - pass - - def get_result(self): - return dict(model=self.model) From 3177f4e1c74a41181ccc3ca9853b41414f7fd041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20Tachella?= Date: Tue, 7 Apr 2026 13:52:32 +0200 Subject: [PATCH 43/43] improve dncnn --- .../cbsd500_gaussian_denoising/solvers/dncnn.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py index 2b081e4..a3c61ee 100644 --- a/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py +++ b/deepinv_bench/benchmarks/cbsd500_gaussian_denoising/solvers/dncnn.py @@ -11,7 +11,20 @@ class Solver(BaseSolver): def set_objective(self, train_dataset=None, physics=None): device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu" - self.model = dinv.models.ArtifactRemoval(dinv.models.DnCNN(), device=device) + + class RescaledDenoiser(dinv.models.Denoiser): + def __init__(self, model, *args, **kwargs): + super().__init__(*args, **kwargs) + self.base_model = model + + def forward(self, x, sigma): + # DnCNN is trained for sigma=2.0/255, so we rescale the input and output + sigma_ref = 2.0 / 255 + factor = sigma_ref / sigma + return self.base_model(x * factor) / factor + + rescaled_denoiser = RescaledDenoiser(dinv.models.DnCNN()) + self.model = dinv.models.ArtifactRemoval(rescaled_denoiser, device=device) self.model.device = device def run(self, _):