Skip to content

Hold MLOps artifacts on Unity Catalog volumes through the Files API - #114

Open
Vedaant-J wants to merge 27 commits into
vedaant/mlops-filestore-sinkfrom
vedaant/mlops-dbx-volume
Open

Vedaant-J wants to merge 27 commits into
vedaant/mlops-filestore-sinkfrom
vedaant/mlops-dbx-volume

Conversation

@Vedaant-J

@Vedaant-J Vedaant-J commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Stack: #53 → #112 → #50 → #60 → #64; #114 on #112; #115 on #64. Merge bottom to top.

Summary

A /Volumes/<catalog>/<schema>/<volume>/... path is reachable only through the FUSE mount on Databricks compute, so a training job on a laptop, EC2 box or CI cannot publish a model or export scores to the volume a Databricks job reads. This PR makes such a path a file destination of DatabricksConnector from any machine. The sink implements #112's FileStoreSink and reads and writes the volume through the Databricks Files API with the connector's identity, reusing #112's writers. Files up to 4 GiB are plain objects that Spark reads directly; larger ones are stored as 4 GiB parts (the Files API caps one upload at 5 GiB). No SQL warehouse is used.

Usage

root = "/Volumes/main/kumo/artifacts"
trainer.fit(training_table, snapshot=snapshot, export_config=ModelOutputConfig(
    databricks, path=f"{root}/models/churn"))
trainer = Trainer.load_from_connector(databricks, path=f"{root}/models/churn")
trainer.predict(prediction_table, snapshot=snapshot, output_config=PredictionOutputConfig(
    databricks, output_paths={"predictions": f"{root}/scores/"}))

The identity needs USE CATALOG, USE SCHEMA, READ VOLUME (load) and WRITE VOLUME (export).

Back-compat

Situation Behaviour
Table name on a DatabricksConnector Unchanged: COPY INTO through the staging volume.
Unity Catalog registry publish and fetch (location=) Unchanged.
/Volumes/... path on a DatabricksConnector Was refused; now written through the Files API.
/Volumes/... string root on Databricks compute Unchanged: a FileConnector over FUSE.
Export into a volume directory that already holds files Fails before scoring starts: Output directory '/Volumes/.../scores/' already contains data from another export. Choose an empty destination path.
Upload or download failure FileNotFoundError, PermissionError or OSError with the volume path; no signed URL in the message. A failed write cancels its upload, so nothing is committed.
A file larger than 4 GiB read by Spark A directory of <name>.chunks/<generation>/ parts; only kumo reads it as one file.

Testing

  • kumo-databricks/tests/test_volume.py (10 tests, in-memory Files API in tests/fakes.py): reads across part boundaries; sized writes plain up to a part; failed and refused uploads; a download that ignores Range is refused; directories and missing paths; bundle publish and fetch, Parquet and frame exports through a volume path; an occupied directory refused before scoring.
  • Live with the rest of the series applied, on a test workspace with synthetic data, off-cluster and in a cluster job: 3.0 GiB and 4.29 GiB files round-trip with matching CRCs, a read across the 4 GiB part boundary is exact, and a kumo.mlops fit and predict with the artifact root on a volume writes snapshots, models and predictions there.

Change map: see the kumo-pr-change-map comment.

🤖 Generated with Claude Code

@Vedaant-J Vedaant-J self-assigned this Oct 24, 2026
@copy-pr-bot

copy-pr-bot Bot commented Oct 24, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 24, 2026 19:25 — with GitHub Actions Inactive
@coderabbitai

coderabbitai Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

@Vedaant-J

Vedaant-J commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor Author

Change map

File Function / scope What changed Why
packages/kumo-databricks/src/kumo_databricks/volume.py new: VolumeHandler, volume_filesystem, is_volume_path Chunked filesystem over the Files API; 4 GiB parts, ranged reads Volumes cap one upload at 5 GiB
packages/kumo-databricks/src/kumo_databricks/sink.py _DatabricksTables, DatabricksSinkBackend: holds_files, filesystem Table methods split out; FileStoreRouting sends volume paths through FilesystemSink Exports and bundles on /Volumes/... paths
packages/kumo-databricks/src/kumo_databricks/registry.py _address Error names the volume path form Points users at the supported path
packages/kumo-databricks/README.md "Artifacts on a volume" section Usage, file layout, required grants Setup the code cannot show
packages/kumo-databricks/tests/fakes.py FakeVolume, FakeMetadata, FakeStreamingResponse In-memory volume with ranged downloads Tests run without a workspace
packages/kumo-databricks/tests/test_volume.py new tests Parts, failures, permissions, bundles, exports, occupied directory Covers the volume sink

@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-prediction-tracking branch from 5b51082 to 1d3acd6 Compare October 24, 2026 19:42
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-dbx-volume branch from cab9cb7 to 91d494f Compare October 24, 2026 20:31
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 24, 2026 20:31 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 24, 2026 20:43 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-dbx-volume branch from 044ad8c to b322307 Compare October 26, 2026 18:28
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 26, 2026 18:29 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J changed the base branch from vedaant/mlops-prediction-tracking to vedaant/mlops-filestore-sink October 26, 2026 18:29
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-filestore-sink branch from d2153fe to db52381 Compare October 27, 2026 07:30
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-dbx-volume branch from b322307 to d1d6d05 Compare October 27, 2026 07:30
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 27, 2026 07:30 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-dbx-volume branch from d1d6d05 to 3f3d201 Compare October 27, 2026 09:51
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 27, 2026 09:51 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-filestore-sink branch from db52381 to db74c6c Compare October 27, 2026 18:58
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-dbx-volume branch from 3f3d201 to 98fb53e Compare October 27, 2026 18:58
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 27, 2026 18:59 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-filestore-sink branch from db74c6c to fc4d709 Compare October 28, 2026 16:25
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-dbx-volume branch from 98fb53e to e2d71ad Compare October 28, 2026 16:26
Vedaant-J and others added 2 commits October 31, 2026 00:03
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Vedaant-J
Vedaant-J had a problem deploying to gha-kumo-workflow-tests October 31, 2026 00:03 — with GitHub Actions Error
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 31, 2026 00:04 — with GitHub Actions Inactive
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Vedaant-J
Vedaant-J deployed to gha-kumo-workflow-tests October 31, 2026 01:08 — with GitHub Actions Active
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Vedaant-J
Vedaant-J deployed to gha-kumo-workflow-tests October 31, 2026 03:01 — with GitHub Actions Active
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Vedaant-J
Vedaant-J deployed to gha-kumo-workflow-tests October 31, 2026 03:51 — with GitHub Actions Active
Vedaant-J and others added 5 commits October 31, 2026 21:54
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tream log

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ep only table writes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Vedaant-J
Vedaant-J deployed to gha-kumo-workflow-tests October 31, 2026 22:44 — with GitHub Actions Active
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Vedaant-J
Vedaant-J deployed to gha-kumo-workflow-tests November 1, 2026 00:17 — with GitHub Actions Active
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Vedaant-J
Vedaant-J deployed to gha-kumo-workflow-tests November 1, 2026 01:03 — with GitHub Actions Active
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Vedaant-J
Vedaant-J deployed to gha-kumo-workflow-tests November 1, 2026 01:38 — with GitHub Actions Active
Vedaant-J and others added 5 commits November 1, 2026 01:49
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Vedaant-J
Vedaant-J deployed to gha-kumo-workflow-tests November 1, 2026 01:58 — with GitHub Actions Active
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Vedaant-J
Vedaant-J deployed to gha-kumo-workflow-tests November 1, 2026 02:58 — with GitHub Actions Active

This branch was successfully deployed

1 active deployment
gha-kumo-workflow-tests — 9125de48 Deployed Nov 1, 2026 by Vedaant-J via import #1162
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant