-
Notifications
You must be signed in to change notification settings - Fork 205
Compare Vortex GPU decompression against a cuDF Parquet read #9147
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
joseph-isaacs
merged 26 commits into
develop
from
claude/gpu-decompress-benchmarks-4mmn93
Aug 19, 2026
Merged
Changes from all commits
Commits
Show all changes
26 commits
Select commit
Hold shift + click to select a range
37af5b0
Add a GPU Parquet decompression backend to the compression benchmark
claude 5eb7a6d
Verify GPU Vortex decode against a separate host scan
claude e7a6b41
Isolate the verification scans and report how a GPU decode differs
claude 335d14a
fix(cuda): add the frame of reference to bit-packed patch values
claude 5f297d4
Survey every dataset in a GPU verification pass
claude b0eda65
CI: publish the GPU verification matrix to the PR
claude 66c75a5
CI: install DuckDB for the GPU compression benchmark
claude 64d481c
Time the GPU Parquet number with cuDF instead of nvCOMP
claude c5a74d1
Run the GPU verification reference through a host execution context
claude e34c505
Merge remote-tracking branch 'origin/develop' into claude/gpu-decompr…
claude c3a0ad9
Publish GPU timings even when a dataset fails to decode
claude ca22f18
Document that a partial GPU matrix still publishes its timings
claude 2afc3b7
CI: publish the full error detail from a failed GPU verification
claude 6a0fd9d
Fix three defects the first cuDF comparison run exposed
claude b9fed6a
CI: measure a CPU decompression baseline on the same GPU runner
claude 793f9a0
CI: reduce the GPU workflow change to the two required installs
claude 8e060ca
Give both GPU formats the same physical partition size
claude f4d16bc
Gather the GPU benchmark behind one cuda gate
joseph-isaacs 36ffe4b
Address review feedback on the GPU decompression benchmark
joseph-isaacs 4e379f7
Model the benchmark suite as an enum instead of an optional GPU config
joseph-isaacs bce42c1
List only GPU datasets whose CUDA decode has been verified
joseph-isaacs 29ccc8b
Format the cuDF Parquet read script with ruff
joseph-isaacs 614a6a2
Scope the disallowed_methods waivers to the calls that need them
joseph-isaacs 537e30b
Extract the per-batch GPU verification into its own function
joseph-isaacs 53fda15
Stop the GPU benchmark syncing the Python workspace
joseph-isaacs 76cbd11
Publish the GPU benchmark through the shared comparison renderer
joseph-isaacs File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| name: "Setup DuckDB" | ||
| description: "Download the DuckDB CLI and put it on PATH" | ||
| inputs: | ||
| duckdb_version: | ||
| description: "Version of the DuckDB CLI" | ||
| default: "1.5.5" | ||
| runs: | ||
| using: "composite" | ||
| steps: | ||
| - name: Download DuckDB | ||
| shell: bash | ||
| run: | | ||
| wget -qO- \ | ||
| "https://github.com/duckdb/duckdb/releases/download/v${{ inputs.duckdb_version }}/duckdb_cli-linux-amd64.zip" \ | ||
| | funzip > duckdb | ||
| chmod +x duckdb | ||
| echo "$PWD" >> "$GITHUB_PATH" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,66 @@ | ||
| // SPDX-License-Identifier: Apache-2.0 | ||
| // SPDX-FileCopyrightText: Copyright the Vortex contributors | ||
|
|
||
| //! The GPU decompression mode behind `--gpu-decompress`. | ||
| //! | ||
| //! This module is the only place in the crate that mentions the `cuda` feature. The two device | ||
| //! backends need it, so they are gated here and reached through [`compressor`]; the rest of the | ||
| //! crate calls that one function and stays feature-agnostic. | ||
| //! | ||
| //! [`GpuOptions`] and [`writer`] deliberately sit outside the gate. Neither touches CUDA, and | ||
| //! keeping them unconditional is what lets `main` parse the `--gpu-*` flags — and reject them | ||
| //! with a clear message — in a build without the feature. | ||
|
|
||
| use vortex_bench::Format; | ||
| use vortex_bench::compress::Compressor; | ||
|
|
||
| pub mod writer; | ||
|
|
||
| #[cfg(feature = "cuda")] | ||
| mod parquet; | ||
| #[cfg(feature = "cuda")] | ||
| mod vortex; | ||
|
|
||
| pub use crate::gpu::writer::GpuCodec; | ||
|
|
||
| /// Settings for the GPU decompression mode. | ||
| #[derive(Clone, Copy, Debug)] | ||
| pub struct GpuOptions { | ||
| /// Parquet page codec to write the GPU file with. | ||
| pub codec: GpuCodec, | ||
| /// Cross-check decompressed output against the CPU decoders. | ||
| pub verify: bool, | ||
| /// Read the Vortex file with direct IO instead of through the page cache. | ||
| pub direct_io: bool, | ||
| } | ||
|
|
||
| /// The GPU backend that measures `format`. | ||
| #[cfg(feature = "cuda")] | ||
| pub fn compressor(format: Format, options: GpuOptions) -> Box<dyn Compressor> { | ||
| match format { | ||
| Format::OnDiskVortex => Box::new(vortex::GpuVortexCompressor::new( | ||
| options.verify, | ||
| options.direct_io, | ||
| )) as Box<dyn Compressor>, | ||
| Format::Parquet => Box::new(parquet::GpuParquetCompressor::new( | ||
| options.codec, | ||
| options.verify, | ||
| )), | ||
| _ => unimplemented!("GPU compress bench not implemented for {format}"), | ||
| } | ||
| } | ||
|
|
||
| /// Stands in for [`compressor`] in a build without the `cuda` feature. | ||
| /// | ||
| /// `main` rejects `--gpu-decompress` before any compressor is selected, so reaching this is a | ||
| /// bug. Destructuring the options is what marks their fields as read: they are only otherwise | ||
| /// used by the gated backends, and without this they are dead code in a non-CUDA build. | ||
| #[cfg(not(feature = "cuda"))] | ||
| pub fn compressor(format: Format, options: GpuOptions) -> Box<dyn Compressor> { | ||
| let GpuOptions { | ||
| codec: _, | ||
| verify: _, | ||
| direct_io: _, | ||
| } = options; | ||
| unreachable!("GPU mode requires the cuda feature, checked before selecting a {format} backend") | ||
| } |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should centralize this somewhere. I think we have the CI logic for installing DuckDB duplicated like 5 times.