← All Posts
MLOps · Production ML Case Studies

Migrate an ML Platform Without Losing the Experiment

Before you start: Run manifests and validated outputs.

Moving an ML platform is not just copying model files. Pipelines depend on schedules, identities, secrets, datasets, storage paths, compute images, external services, and assumptions buried in notebooks. The migration succeeds when a known experiment can run in the replacement environment and produce validated outputs for its consumers.

01InventoryWhat depends on what?
02RebuildIdentities, storage, compute, orchestration
03ReplayRun frozen representative workloads
04Cut overSwitch validated consumers
05RollbackRestore the previous working route
This is a synthetic migration playbook. Provider-specific commands should follow the services actually used by the platform.

Build a dependency graph, not a list of pipeline names

For each pipeline, record inputs, outputs, schedule, owner, identity, compute environment, external endpoints, secrets references, and downstream consumers. Include data-retention and region constraints. A pipeline definition can import a shared library or call a linked service whose dependency is not visible in its main configuration file.

The inventory becomes a checklist only after each row is tied to a concrete workload and validation result.
ObjectMigration evidence
DatasetImmutable version, size, count, schema, checksum or source manifest
Model artifactHash, loader version, signature, golden predictions
PipelineCode revision, parameters, schedule, dependency graph
IdentityRequired permissions and successful access checks
ConsumerExpected output contract and switching mechanism
External dependencyEndpoint, authentication, ownership, and retry behavior

Copy data with a consistency boundary

Decide whether sources are immutable, snapshotted, or changing during migration. A file-by-file copy of a mutable dataset can combine inconsistent versions. Use snapshots or a declared cutoff and catch-up procedure. Compare object manifests, row counts, schemas, and partition coverage; sample content checks alone do not establish completeness.

Preserve metadata and lineage needed to interpret artifacts. A model file without its feature mapping or tokenizer may load successfully and still be unusable. Test restore and load in the target environment before retiring the source. Provider backup mechanisms cover particular resources; they do not automatically reconstruct all orchestration and external dependencies.

Choose representative workloads

Replay small but structurally representative pipelines first: one distributed feature job, one training run, one batch inference job, one scheduled dependency chain, and one external-data ingestion. Then replay high-volume and failure-prone workloads. Include empty partitions, late data, duplicate inputs, permission failures, and retries.

Compare feature snapshots and golden predictions under declared tolerances. Check runtime, peak memory, partition skew, and cost alongside output correctness. New runtime or library versions may change floating-point results; isolate environment changes from model changes so differences can be explained.

Schedules and identities often fail after the happy path

A manually triggered job can work while its scheduled identity lacks access. Test the actual scheduler principal, time zone, dependency resolution, and retry policy. Confirm that a missed schedule can be replayed without duplicate outputs. Verify secret references and rotation behavior without copying secret values into source-controlled manifests.

In an Azure-oriented deployment, separate the roles of storage, Spark or SQL compute, and orchestration services such as Synapse pipelines or Data Factory. Record resource-specific endpoints and linked-service dependencies. Recreating a workspace does not automatically recreate every external system it called.

Publish one validated route at a time

Run source and target pipelines in parallel against a controlled snapshot or matched windows. Keep target outputs in separate versioned locations and compare them before switching consumers. Choose the switching unit: a pipeline family, dataset, or consumer. Freeze or coordinate changes during the cutover window so the two environments do not drift while being compared.

Define rollback triggers in advance: missing outputs, schema mismatch, unacceptable lag, or correctness regressions. Keep the prior artifacts and consumer route available until the target has passed the agreed observation period. Test the rollback procedure; an untested document is not a recovery capability.

A migration completion record

The final record should identify which workloads were replayed, which outputs matched, what differences were accepted, which schedules have run successfully, and who owns the replacement dependencies. Remove obsolete permissions and resources only after consumers are verified on the new route. The durable result is a reproducible platform specification, not merely an empty old workspace.

Check your understanding: Why can a successful manual run fail on its first scheduled execution?

The scheduled principal, parameters, time zone, or dependency context can differ. Validate the actual orchestration path, not only a developer-triggered run.

Sources and further reading