Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
833 commits
Select commit Hold shift + click to select a range
2a4bf25
List the roles kept out of the artifact paths one per line
Vedaant-J Nov 1, 2026
d5997ca
Name runs the same on every tracker through _run_names
Vedaant-J Nov 1, 2026
1f5bb86
Store the model under the artifact root after the fit, from Trainer.fit
Vedaant-J Nov 1, 2026
b6fe35d
Report MLOps store failures as MLOps.on_error says
Vedaant-J Nov 1, 2026
689435f
Route summaries through _summary_tables instead of TrackingBase dispatch
Vedaant-J Nov 1, 2026
2e664c3
Publish a fitted bundle through a _publish helper
Vedaant-J Nov 1, 2026
c1d7bd0
Split Trainer._fit into warm-start, validation, materialization, trai…
Vedaant-J Nov 1, 2026
4c92ca4
Word the MLOps docstrings as the upper PRs do
Vedaant-J Nov 1, 2026
be6c8f3
Tag only models with their location when naming manifest artifacts
Vedaant-J Nov 1, 2026
10569d5
Name the changed columns in a schema change
Vedaant-J Nov 1, 2026
0180335
Lay out the MLOps doc in the upper PRs' order and words
Vedaant-J Nov 1, 2026
c0d7000
Check the recorded fit mode of each published model
Vedaant-J Nov 1, 2026
25b67dd
Log a fit's holdout as test/<metric> and register those metrics
Vedaant-J Nov 1, 2026
356fecf
Register a fit's logged model, or log one in no run, and name it afte…
Vedaant-J Nov 1, 2026
f76c349
Sample MLflow system metrics every second and log them in batches
Vedaant-J Nov 1, 2026
1ca5395
Hint once per server how to open SageMaker's MLflow UI, naming the run
Vedaant-J Nov 1, 2026
8bce1d4
Track trial runs only for searches, under the fit's snapshot and task…
Vedaant-J Nov 1, 2026
e6df805
Tag every run with the engine version and a fit with its entity
Vedaant-J Nov 1, 2026
5f3d13b
Summarize a fit's data as splits, health and column tables plus probl…
Vedaant-J Nov 1, 2026
fe1d471
Publish through TrainingResult.export in the filesystem-only sink test
Vedaant-J Nov 1, 2026
8c43cd8
Share the serving query and snapshot lookup in integrations/_serving
Vedaant-J Nov 1, 2026
61a68df
Read stored assets and snapshots with the identity the loading call w…
Vedaant-J Nov 1, 2026
88b8850
Build a Snowflake registry version's model arguments in one helper
Vedaant-J Nov 1, 2026
5063ded
Correct the MLOps guide for run names, registration, SageMaker and as…
Vedaant-J Nov 1, 2026
6ffa7ae
Merge #50's churn moves into #60
Vedaant-J Nov 1, 2026
c7e6f90
Merge #60's churn moves into #64
Vedaant-J Nov 1, 2026
4ec1416
Merge #64's churn moves into #115
Vedaant-J Nov 1, 2026
e8f3e7d
Add the Snowflake serving notes as new doc lines instead of rewording…
Vedaant-J Nov 1, 2026
1b2d873
Drop an unneeded mut in the column-stats options test
Vedaant-J Nov 1, 2026
c9f10fc
Merge #64's clippy fix into #115
Vedaant-J Nov 1, 2026
4e0a992
Merge #114 into #50 to make the stack linear
Vedaant-J Nov 2, 2026
2cc6ece
Merge #114 through #50 into #60
Vedaant-J Nov 2, 2026
9d3438d
Merge #114 through #60 into #64
Vedaant-J Nov 2, 2026
e2c420e
Refuse an occupied volume directory under APPEND, since OVERWRITE emp…
Vedaant-J Nov 2, 2026
1626094
Merge #114 through #64 into #115
Vedaant-J Nov 2, 2026
5d03569
Name the per-hundredth score counts pred/score_histogram, per class f…
Vedaant-J Nov 2, 2026
6a7ce47
Write each bar chart summary as an SVG image beside the run's tables,…
Vedaant-J Nov 2, 2026
85dd03a
Chart a prediction run's scores against the holdout's as charts/pred/…
Vedaant-J Nov 2, 2026
da508b5
Shorten the experiment note to its two run filters, with no angle-bra…
Vedaant-J Nov 2, 2026
b65fe1c
Draw one equal-width bar per bin and label the bin edges, so uneven b…
Vedaant-J Nov 2, 2026
f833aa0
Skip summary types a tracker does not know instead of raising
Vedaant-J Nov 2, 2026
0478f5f
Chart a regression run's predicted values against the holdout's as ch…
Vedaant-J Nov 2, 2026
1476ea7
Skip summary types a tracker does not know instead of raising
Vedaant-J Nov 2, 2026
3093a6c
Merge #60's unknown-summary skip into #64
Vedaant-J Nov 2, 2026
ef0b4b1
Merge #64's prediction charts and note into #115
Vedaant-J Nov 2, 2026
6633a4b
Merge main into #112
Vedaant-J Nov 2, 2026
4e22957
Merge main through #112 into #114
Vedaant-J Nov 2, 2026
8951887
Merge main through #114 into #50
Vedaant-J Nov 2, 2026
963a7e5
Merge main through #50 into #60
Vedaant-J Nov 2, 2026
cb0032c
Merge main through #60 into #64
Vedaant-J Nov 2, 2026
e6fc929
Merge main through #64 into #115
Vedaant-J Nov 2, 2026
3d3c9d8
Round-trip an artifact through an ADLS file destination
Vedaant-J Nov 2, 2026
defa7fc
Name the per-rank recommendation counts pred/item_popularity
Vedaant-J Nov 2, 2026
659414e
Shrink a chart title's font when the title is too long to fit
Vedaant-J Nov 2, 2026
63ee39b
Chart a recommendation run's top 100 items as charts/pred/item_popula…
Vedaant-J Nov 2, 2026
3dfba07
Treat a chunked writer as failed until it opens, so a failed open nev…
Vedaant-J Nov 2, 2026
5f75e66
Drop only older committed generations, and read the newest one whose …
Vedaant-J Nov 2, 2026
746cedd
Merge #112's chunked-writer fixes and ADLS test into #114
Vedaant-J Nov 2, 2026
5ab71b1
Merge #112's chunked-writer fixes and ADLS test into #50
Vedaant-J Nov 2, 2026
923000e
Document that MLOps applies per call or block, not per model
Vedaant-J Nov 2, 2026
e6ca6f2
Merge #112's chunked-writer fixes and #50's MLOps scope note into #60
Vedaant-J Nov 2, 2026
6ef7147
Merge #112's chunked-writer fixes and #50's MLOps scope note into #64
Vedaant-J Nov 2, 2026
7b3c997
Merge #112's chunked-writer fixes, #50's MLOps scope note and #64's i…
Vedaant-J Nov 2, 2026
2f73536
Describe the pyfunc as a platform adapter, not a serving or BP replac…
Vedaant-J Nov 2, 2026
6ede208
Separate the durable predict path from the platform DataFrame adapter…
Vedaant-J Nov 2, 2026
2bc03fb
Merge #60's pyfunc adapter wording into #64
Vedaant-J Nov 2, 2026
30bb645
Register a runnable Snowflake version only from a Linux x86_64 host
Vedaant-J Nov 2, 2026
b3d3fa7
Keep explicit anchor timestamps from snapping a split's boundaries
Vedaant-J Nov 2, 2026
e1dd004
Read evaluate labels from every generated row, not only the split stages
Vedaant-J Nov 2, 2026
0738518
Share the holdout's error-by-step table
Vedaant-J Nov 2, 2026
f1c6773
Stamp artifact columns as Arrow constants instead of per-row Python l…
Vedaant-J Nov 2, 2026
8143a79
Document the pyfunc population param and its memory cost
Vedaant-J Nov 2, 2026
a2d8d85
Evaluate forecasts per step, multilabel classes and ranking at the fi…
Vedaant-J Nov 2, 2026
e20d808
Evaluate every task type the trainer fits
Vedaant-J Nov 2, 2026
f51ce77
Document evaluate's metrics for every task type
Vedaant-J Nov 2, 2026
5fb2a8d
Reopen a volume download after a failed read
Vedaant-J Nov 2, 2026
0db3ddd
Reuse only the requested Snowflake version when one is named
Vedaant-J Nov 2, 2026
f11c547
Reuse a Snowflake version only if it serves the same snapshot and target
Vedaant-J Nov 2, 2026
e9f3df9
Lead the run_batch docs with its scores-only lifecycle
Vedaant-J Nov 2, 2026
68fd976
Count holdout scores in bounded chunks, ranking top-k without a full …
Vedaant-J Nov 2, 2026
dc0523b
Count link top scores on one sorted copy
Vedaant-J Nov 2, 2026
a395236
Drop the pyfunc population param; Trainer.predict scores a population
Vedaant-J Nov 2, 2026
de29fc6
Merge #114's volume read retry fix into #50
Vedaant-J Nov 2, 2026
c921891
Merge #114's volume read retry fix into #60
Vedaant-J Nov 2, 2026
8670c98
Merge #64's adapter docs into #115
Vedaant-J Nov 2, 2026
beef553
Remove EvaluationResult.frame; the evaluated rows stay in actuals
Vedaant-J Nov 2, 2026
503f578
Stub the SageMaker experiment lookup with an experiment, so the test …
Vedaant-J Nov 2, 2026
12d1694
Log realized error by step as a tracked table, not an EvaluationResul…
Vedaant-J Nov 2, 2026
b68c404
Test that evaluate's labels are the fit table's rows for every task type
Vedaant-J Nov 2, 2026
9d311cb
Merge evaluate for every task type into #64
Vedaant-J Nov 2, 2026
92d35b2
Merge #60's population removal and test fixes into #64
Vedaant-J Nov 2, 2026
9b5029b
Merge #64's evaluate for every task, bounded holdout counts and #60's…
Vedaant-J Nov 2, 2026
2e70093
Bin a forecasting target in the split stats' histogram
Vedaant-J Nov 2, 2026
35718b0
Take holdout target bins only from the split statistics, noting when …
Vedaant-J Nov 2, 2026
64ea65c
Upload each stored training-table part as it is written
Vedaant-J Nov 2, 2026
ea5d22d
Pass an export's sidecars through a file-store sink's routing
Vedaant-J Nov 2, 2026
f074773
Merge #50's streamed training-table store into #60
Vedaant-J Nov 2, 2026
b74a2d7
Merge #50's streamed training-table store into #64
Vedaant-J Nov 2, 2026
10d1857
Compute exact NumPy quantiles of a column in the parquet col-stats pass
Vedaant-J Nov 2, 2026
fcb3d79
Merge #50's streamed training-table store into #115
Vedaant-J Nov 2, 2026
91b6f69
Spill holdout top scores to Parquet and count them with DiskGraph
Vedaant-J Nov 2, 2026
9b69a83
Remove holdout_evaluation and its holdout baseline rows
Vedaant-J Nov 2, 2026
9c4f71e
Document the warehouse monitors without a holdout baseline
Vedaant-J Nov 2, 2026
d7cd940
Count multilabel and forecasting holdouts in bounded chunks
Vedaant-J Nov 2, 2026
3f887ac
Merge #64's holdout_evaluation removal into #115
Vedaant-J Nov 2, 2026
086c97f
Keep unsized volume exports as plain objects up to a part
Vedaant-J Nov 2, 2026
2bc3351
Document that volume exports need READ VOLUME too
Vedaant-J Nov 2, 2026
caef35f
Merge #114's plain volume exports through 4 GiB into #50
Vedaant-J Nov 2, 2026
6756093
Tally recommended items in place and summarise them in chunks
Vedaant-J Nov 2, 2026
c55e04a
Name a fit's datasets by what they are and label each with its role
Vedaant-J Nov 2, 2026
a175d69
Return an all-skipped prediction source with its row failures
Vedaant-J Nov 2, 2026
a78d8aa
Refuse prediction rows that none can be scored
Vedaant-J Nov 2, 2026
3981526
Say that a predict failing before scoring records no prediction run
Vedaant-J Nov 2, 2026
57ab0c4
Merge #64's head into the holdout and items counting work
Vedaant-J Nov 2, 2026
dd9c34d
Merge #60's dataset roles into #64
Vedaant-J Nov 2, 2026
2a43ba8
Label a prediction's scoring snapshot and its tables by role
Vedaant-J Nov 2, 2026
af7a45e
Name top-score spills by rank and remove them once counted
Vedaant-J Nov 2, 2026
7032567
List every skipped prediction row in skipped/ Parquet parts
Vedaant-J Nov 2, 2026
83d7022
Keep, store and track a prediction run's skipped rows
Vedaant-J Nov 2, 2026
d534dc2
Name skipped ids in the run card and document skipped/
Vedaant-J Nov 2, 2026
929e554
Test that every skipped prediction row is stored and tracked
Vedaant-J Nov 2, 2026
3ebd238
Count a run's skipped rows from the skipped/ part footers
Vedaant-J Nov 2, 2026
046bb27
Say skipped rows were found while building the prediction table
Vedaant-J Nov 2, 2026
7f2eb0f
Find the training table by its new name in the logged-model test
Vedaant-J Nov 2, 2026
3c7f50f
Show how a run's data depend on each other in its card's Lineage block
Vedaant-J Nov 2, 2026
3924443
Merge the bounded holdout and items counting work into #64
Vedaant-J Nov 2, 2026
7830ffd
Merge the all-skipped fix and the full skipped-rows list into #64
Vedaant-J Nov 2, 2026
d9209b9
Say predict raises only when no requested entity can be scored
Vedaant-J Nov 2, 2026
870b54b
Merge #64's lineage, skipped rows and bounded counts into #115
Vedaant-J Nov 2, 2026
e0e8cc1
Match the skipped-entities warning's new wording in the pyfunc test
Vedaant-J Nov 2, 2026
d538953
Merge #64's pyfunc test fix into #115
Vedaant-J Nov 2, 2026
58ead71
Delete trainer.py's second copies of _warm_start_plan, _validate_mode…
Vedaant-J Nov 2, 2026
65223b8
Drop the docstrings of #64's private helpers
Vedaant-J Nov 2, 2026
8f575e1
Name the path-based connectors once, in _manifest
Vedaant-J Nov 2, 2026
167384d
Split snapshot loading into allocate, verify and shared read helpers
Vedaant-J Nov 2, 2026
f785539
Share one untracked-run warning, inline record_failure and read the t…
Vedaant-J Nov 2, 2026
88f3dfb
Build the holdout top-score spill in one Trainer method
Vedaant-J Nov 3, 2026
2de0030
Pass the holdout scoring options to both test calls from one dict
Vedaant-J Nov 3, 2026
4302b68
Compute a score column's mean, min and max in one helper
Vedaant-J Nov 3, 2026
d5e9689
Read the card's tuned metric in one helper
Vedaant-J Nov 3, 2026
f809175
Inline _smoothed into _category_psi
Vedaant-J Nov 3, 2026
2c6a363
Build histogram cumulative shares with accumulate
Vedaant-J Nov 3, 2026
38091c2
Let an unusable MLflow server's own error say why, not blame credentials
Vedaant-J Nov 3, 2026
b7c7d6b
Share MLflow's metric batching between run and system metrics
Vedaant-J Nov 3, 2026
e754d3c
Give Snowflake's carrier-model arguments only the bundle they use
Vedaant-J Nov 3, 2026
dfa3f76
Drop run-name helpers nothing in this change calls
Vedaant-J Nov 3, 2026
4da226d
Say once in mlops.md that the warehouse monitor recipes are untested,…
Vedaant-J Nov 3, 2026
f49809a
Return early from a publish that sets no alias
Vedaant-J Nov 3, 2026
a9557ff
Call the counts dict counts in _labels_mature
Vedaant-J Nov 3, 2026
7946f65
Say once in the docs that a held bundle reuses its registered version
Vedaant-J Nov 3, 2026
cb6efca
Drop or shorten field comments the field names already say
Vedaant-J Nov 3, 2026
0527476
Inline the fit's duration and wrap its registration call
Vedaant-J Nov 3, 2026
2e54fec
Inline asset helpers that have one caller
Vedaant-J Nov 3, 2026
3f86367
Split a source table's change status into its current source and place
Vedaant-J Nov 3, 2026
c1f093e
Drop docstrings that restate private helpers' names
Vedaant-J Nov 3, 2026
b5c706d
Shorten the range-checksum doc comments
Vedaant-J Nov 3, 2026
d2d7e1a
Name the local and remote write checks of an artifact root
Vedaant-J Nov 3, 2026
6bea711
Read a training table export's name once when choosing sidecars
Vedaant-J Nov 3, 2026
24c1431
Share the label query and table generation across training table tests
Vedaant-J Nov 3, 2026
9a9057c
Export snapshots in tests through one helper
Vedaant-J Nov 3, 2026
6eac84e
Default the stub-fit helper's trainer and drop repeated model assertions
Vedaant-J Nov 3, 2026
7fdbf80
Score through one helper in the query-from-snapshot tests
Vedaant-J Nov 3, 2026
b571af1
Warn about an unreadable manifest from one handler
Vedaant-J Nov 3, 2026
8cbfdcb
Inline the fit-mode lookup into the holdout metrics
Vedaant-J Nov 3, 2026
e7067c6
Format Snowflake's schema-check error with full_error
Vedaant-J Nov 3, 2026
adad4f8
Trim volume and sink docstrings and redundant path stripping
Vedaant-J Nov 3, 2026
50ddd18
Tighten volume README and hoist test imports
Vedaant-J Nov 3, 2026
12faf65
Route FileStoreRouting's file paths through one helper
Vedaant-J Nov 3, 2026
bde829b
Raise the occupied-directory error from one place
Vedaant-J Nov 3, 2026
07b2caf
Drop docstrings that restate the file-store names
Vedaant-J Nov 3, 2026
48a8552
Share the streaming store fixture and the one-form check in the chunk…
Vedaant-J Nov 3, 2026
dafc543
Merge the two occupied-directory preflight tests
Vedaant-J Nov 3, 2026
6036fd2
Say in the docs that MLflow's default store is sqlite:///mlflow.db
Vedaant-J Nov 3, 2026
7fe756a
Say plainly when MLflow refuses a local folder store
Vedaant-J Nov 3, 2026
d78d12b
Delete manifest, warning and model helpers nothing in this PR uses
Vedaant-J Nov 3, 2026
15337f4
Parametrize the card heading tests
Vedaant-J Nov 3, 2026
270919d
Merge the one-epoch note tests and drop duplicate imports in the trac…
Vedaant-J Nov 3, 2026
64211f8
Import shared names once in the MLflow tracking tests
Vedaant-J Nov 3, 2026
e7ac208
Share graph building, one evaluation and the tracker failure cases in…
Vedaant-J Nov 3, 2026
a5928d0
Run the prediction manifest tests on the shared fitted model and one …
Vedaant-J Nov 3, 2026
8a8d31d
Share the brute-force histogram and parametrize the at-k cases in the…
Vedaant-J Nov 3, 2026
e74882d
Give the metric-list trainer stub a global rank, as the top-score spi…
Vedaant-J Nov 3, 2026
d094383
Merge #64's test cleanup and CI fix into #115
Vedaant-J Nov 3, 2026
48fe065
Read stage parts through one part class; drop the unused stage root
Vedaant-J Nov 3, 2026
ad8af15
Load the container's predictor directly instead of through a passed l…
Vedaant-J Nov 3, 2026
ebed6b9
Build the Snowflake log_model arguments in one dict; type ENTITY in t…
Vedaant-J Nov 3, 2026
23d18ec
Share the registry test sink, version and connector helpers; parametr…
Vedaant-J Nov 3, 2026
190f99e
Merge the current #115 head into its quality pass
Vedaant-J Nov 3, 2026
4430736
Merge remote-tracking branch 'origin/vedaant/mlops-score-sketch' into…
Vedaant-J Nov 3, 2026
0603c08
Merge #112's quality pass into #114
Vedaant-J Nov 3, 2026
5b91312
Simplify the col-stats options code and share its Arrow helpers
Vedaant-J Nov 3, 2026
eb648fc
Reuse the shared Arrow helpers in evaluation and split out the actual…
Vedaant-J Nov 3, 2026
54fb267
Compact the col-stats options and evaluation tests
Vedaant-J Nov 3, 2026
2772737
Shorten the col-stats options and evaluation docstrings
Vedaant-J Nov 3, 2026
855783b
Trim comments on value bins, skipped rows and forecast histograms
Vedaant-J Nov 3, 2026
2e7ff5e
Simplify the skipped-rows tests
Vedaant-J Nov 3, 2026
4cb1bea
Merge #64 head into the Rust quality pass
Vedaant-J Nov 3, 2026
c78cb30
Remove a stage file whether Snowflake matches REMOVE patterns against…
Vedaant-J Nov 3, 2026
f72ffa9
Merge #112's and #114's quality passes into #50
Vedaant-J Nov 3, 2026
d4b8ec4
Share the tracking URI, fit data and quick plan fixtures across track…
Vedaant-J Nov 3, 2026
4d8795a
Share the bundle and registry stubs in the Snowflake registry tests
Vedaant-J Nov 3, 2026
e19445a
Merge the Snowflake run-name tests and reuse FakeSession for schema c…
Vedaant-J Nov 3, 2026
b05fbbb
Share the vocab asset and volume stubs in the model-agnostic MLOps tests
Vedaant-J Nov 3, 2026
b3a1ddc
Fold the bundle-id pointer test into the publication test and share t…
Vedaant-J Nov 3, 2026
8dddaf9
Share one recording tracker and session start in the model-logging tests
Vedaant-J Nov 3, 2026
fccff2f
Test summary routing beside the summary table tests
Vedaant-J Nov 3, 2026
c4788f9
Merge remote-tracking branch 'origin/vedaant/mlops-score-sketch' into…
Vedaant-J Nov 3, 2026
6f0974f
Record the Snowflake experiment on the fit's tracking ref
Vedaant-J Nov 3, 2026
c1fcd18
Merge #50's quality pass into #60
Vedaant-J Nov 3, 2026
c176507
Name the tracker run in score_drift's and evaluate's tracking refs
Vedaant-J Nov 3, 2026
98ca5e2
Merge #60's quality pass into #64
Vedaant-J Nov 3, 2026
8683c86
Merge #64's quality pass into #115
Vedaant-J Nov 3, 2026
09eef3a
Merge main into mlops-filestore-sink
Vedaant-J Nov 3, 2026
0c7d76c
Merge mlops-filestore-sink into mlops-dbx-volume
Vedaant-J Nov 3, 2026
a87135f
Merge mlops-dbx-volume into mlops-snapshot-manifest
Vedaant-J Nov 3, 2026
eb9d922
Check the trained clock before building the prediction table
Vedaant-J Nov 3, 2026
ccd4c40
Merge mlops-snapshot-manifest into mlops-mlflow-tracking
Vedaant-J Nov 3, 2026
3ada1be
Merge mlops-mlflow-tracking into mlops-score-sketch
Vedaant-J Nov 3, 2026
da7f132
Merge mlops-score-sketch into mlops-sf-stage
Vedaant-J Nov 3, 2026
c96d1e5
Compare timestamp drift across index clocks in seconds
Vedaant-J Nov 3, 2026
836b7cc
Merge mlops-score-sketch into mlops-sf-stage
Vedaant-J Nov 3, 2026
fb03edd
Bound Databricks volume upload buffering
Vedaant-J Nov 3, 2026
2eb87dc
Merge mlops-dbx-volume into mlops-snapshot-manifest
Vedaant-J Nov 3, 2026
945ec4a
Merge mlops-snapshot-manifest into mlops-mlflow-tracking
Vedaant-J Nov 3, 2026
8a31c5e
Merge mlops-mlflow-tracking into mlops-score-sketch
Vedaant-J Nov 3, 2026
01a2b87
Merge mlops-score-sketch into mlops-sf-stage
Vedaant-J Nov 3, 2026
7460f8d
Merge origin/main into vedaant/mlops-snapshot-manifest
Vedaant-J Nov 3, 2026
bc4de08
Merge vedaant/mlops-snapshot-manifest into vedaant/mlops-mlflow-tracking
Vedaant-J Nov 3, 2026
454a0bd
Merge vedaant/mlops-mlflow-tracking into vedaant/mlops-score-sketch
Vedaant-J Nov 3, 2026
f530f67
Merge vedaant/mlops-score-sketch into vedaant/mlops-sf-stage
Vedaant-J Nov 3, 2026
33f8b29
Log chart data as step metrics on MLflow and Snowflake instead of SVG…
Vedaant-J Nov 3, 2026
17cace1
Log Snowflake metrics under the names MLflow uses
Vedaant-J Nov 3, 2026
d175986
Document chart step series and the Snowflake differences
Vedaant-J Nov 3, 2026
470604a
Indent the regression chart note test
Vedaant-J Nov 3, 2026
a8254ff
Merge vedaant/mlops-score-sketch into vedaant/mlops-sf-stage
Vedaant-J Nov 3, 2026
ca72e13
Log a run's inputs in role order and show the snapshot's tables
Vedaant-J Nov 3, 2026
78f0380
Merge vedaant/mlops-mlflow-tracking into vedaant/mlops-score-sketch
Vedaant-J Nov 3, 2026
9e84eda
Say how to overlay a prediction histogram on its holdout's
Vedaant-J Nov 3, 2026
59c3b3f
Expect a prediction's outputs in name order
Vedaant-J Nov 3, 2026
ffe51c0
Merge vedaant/mlops-score-sketch into vedaant/mlops-sf-stage
Vedaant-J Nov 3, 2026
e4d98c0
Profile the snapshot input instead of listing its tables as columns
Vedaant-J Nov 3, 2026
f1c17d8
Merge vedaant/mlops-mlflow-tracking into vedaant/mlops-score-sketch
Vedaant-J Nov 3, 2026
3cad4ca
Merge vedaant/mlops-score-sketch into vedaant/mlops-sf-stage
Vedaant-J Nov 3, 2026
320ffd1
Merge main into vedaant/mlops-mlflow-tracking
Vedaant-J Nov 3, 2026
e783142
Merge vedaant/mlops-mlflow-tracking into vedaant/mlops-score-sketch
Vedaant-J Nov 3, 2026
79b8350
Merge vedaant/mlops-score-sketch into vedaant/mlops-sf-stage
Vedaant-J Nov 3, 2026
8c288ad
Merge main into vedaant/mlops-score-sketch
Vedaant-J Nov 3, 2026
5a51286
Compare calibration rows without nested approx
Vedaant-J Nov 3, 2026
cdff050
Merge vedaant/mlops-score-sketch into vedaant/mlops-sf-stage
Vedaant-J Nov 3, 2026
4183740
Merge main into vedaant/mlops-sf-stage
Vedaant-J Nov 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion examples/mlops/snowflake/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@ generates is undocumented) and has not been run end to end; see
Tracking through the connector's Snowpark session.
- **`KUMO_SCORE`** (`KUMO_SCORE_TASK`, daily 03:00 UTC) runs `score_job.py`,
loading the version `champion` points at and writing
`USERS_CHURN_PREDICTIONS`.
`USERS_CHURN_PREDICTIONS`. It scores with `Trainer.predict`, so each run is
a Kumo prediction run under the artifact root that `evaluate` and
`score_drift` read; a native `run_batch` job on the version writes scores
only.

To review a model before scoring, drop the alias from the registry location
in `jobs.mlops` and move `champion` yourself
Expand Down
131 changes: 131 additions & 0 deletions examples/mlops/snowflake/run_batch_smoke.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES.
# All rights reserved.
# SPDX-License-Identifier: Apache-2.0
"""Live smoke: register a model with a stage snapshot and score it with run_batch.

run_batch writes scores only: no Kumo prediction run for evaluate or
score_drift. See "Batch inference in Snowflake" in
packages/kumo-engine/docs/mlops.md.

python run_batch_smoke.py --connection-name <connections.toml entry> \\
--warehouse WH --database ML --schema MODELS \\
--stage @ML.MODELS.KUMO --compute-pool KUMO_GPU_POOL
"""

import argparse
import tempfile
from pathlib import Path

import numpy as np
import pandas as pd
from kumoapi.graph import Edge
from kumoapi.model_plan import ModelPlan
from kumoapi.typing import Stype

import kumo.engine as kumo


def snapshot_and_query(data: Path) -> tuple:
rng = np.random.default_rng(0)
pd.DataFrame({'ID': np.arange(200)}).to_parquet(data / 'users.parquet')
pd.DataFrame({
'OID': np.arange(5000),
'USER_ID': rng.integers(0, 200, 5000),
'TS': pd.Timestamp('2024-01-01') +
pd.to_timedelta(rng.integers(0, 120, 5000), unit='D'),
}).to_parquet(data / 'orders.parquet')
files = kumo.FileConnector(root_dir=str(data))
graph = kumo.Graph(
tables={
'users':
kumo.Table.from_source_table(files['users.parquet'],
primary_key='ID').infer_metadata(),
'orders':
kumo.Table.from_source_table(
files['orders.parquet'], primary_key='OID',
time_column='TS').infer_metadata().with_column(
'USER_ID', stype=Stype.ID),
}, edges=[Edge(src_table='orders', fkey='USER_ID', dst_table='users')])
snapshot = graph.snapshot()
query = kumo.PredictiveQuery(
graph=graph, query='PREDICT COUNT(orders.*, 0, 7, days) > 0 '
'FOR EACH users.ID')
return snapshot, query


def main() -> None:
parser = argparse.ArgumentParser(description=__doc__.split('\n\n')[0])
parser.add_argument('--connection-name', required=True)
parser.add_argument('--warehouse', required=True)
parser.add_argument('--database', required=True)
parser.add_argument('--schema', required=True)
parser.add_argument('--stage', required=True,
help='named internal stage, @DB.SCHEMA.STAGE')
parser.add_argument('--compute-pool', required=True)
parser.add_argument('--model-name', default='KUMO_RUN_BATCH_SMOKE')
parser.add_argument('--pip-repository', default=None)
args = parser.parse_args()

from snowflake.ml.model.batch_inference import (
InferenceSpec,
InputSpec,
OutputSpec,
ResourcesSpec,
SaveMode,
)
from snowflake.ml.registry import Registry

sf = kumo.SnowflakeConnector.from_connection_toml(
connection_name=args.connection_name, warehouse=args.warehouse,
database=args.database, schema_name=args.schema)
stage = args.stage.rstrip('/')
with tempfile.TemporaryDirectory() as tmp:
snapshot, query = snapshot_and_query(Path(tmp))
exported = snapshot.export(
kumo.SnapshotOutputConfig(sf, f'{stage}/smoke/snapshots'))
trainer = kumo.Trainer(model_plan=ModelPlan())
result = trainer.fit(
query.generate_training_table(snapshot), snapshot=snapshot,
export_config=kumo.ModelOutputConfig(
sf, location=kumo.ModelRegistryLocation(args.model_name),
serving_snapshot=exported,
serving_options={'pip_repository': args.pip_repository}
if args.pip_repository else None))
published = result.published_model
print(f'registered {published.name} version {published.version}')

table = query.generate_prediction_table(snapshot)
time = pd.Timestamp(table.timestamps[0])
expected = trainer.predict(table, snapshot=snapshot,
binary_classification_threshold=0.5).frame

session = sf.session()
version = Registry(session, database_name=args.database,
schema_name=args.schema).get_model(
published.name).version(published.version)
rows = session.create_dataframe(
pd.DataFrame({'ENTITY': expected['ENTITY'].astype(str)}))
output = f'{stage}/smoke/scores/'
job = version.run_batch(
rows, compute_pool=args.compute_pool,
output_spec=OutputSpec(stage_location=output, mode=SaveMode.OVERWRITE),
input_spec=InputSpec(params={
'prediction_time': str(time),
'binary_classification_threshold': 0.5,
}), resources_spec=ResourcesSpec(gpu_requests='1'),
inference_spec=InferenceSpec(num_workers=1))
job.wait()
job_name = job.id.split('.')[-1].strip('"')
scored = session.read.parquet(f'{output}{job_name}/').to_pandas()
scored.columns = [column.strip('"') for column in scored.columns]

local = expected.assign(ENTITY=expected['ENTITY'].astype(str)).sort_values(
'ENTITY').reset_index(drop=True)
remote = scored[list(local.columns)].sort_values('ENTITY').reset_index(
drop=True)
pd.testing.assert_frame_equal(local, remote, check_dtype=False, atol=1e-5)
print(f'PASS: {len(remote)} rows match local scores')


if __name__ == '__main__':
main()
Loading
Loading