Model Training Infrastructure and Experimentation Questions
Design infrastructure and workflows to train machine learning models at scale and enable rapid experimentation. Core areas include distributed training strategies such as data parallelism model parallelism and pipeline parallelism; hardware and instance selection including graphics processing units and tensor processing units; efficient resource scheduling and autoscaling for training; hyperparameter tuning at scale using grid search random search and Bayesian optimization; experiment and metadata tracking, reproducibility and checkpointing, resume and fault tolerance strategies; pipeline automation, containerized reproducible training environments, dataset management, and trade offs between training speed cost and model quality to support iterative model development.
Sample Answer
WITH per_feature AS (
SELECT fd.run_b,
SUM(fd.dist * f.weight) AS feature_score
FROM feature_distance fd
JOIN feature_weights f ON fd.feature = f.feature
WHERE fd.run_a = :failing_run_id
GROUP BY fd.run_b
),
label_scores AS (
SELECT run_b, js_divergence(:failing_run_label_hist, label_hist) AS label_score
FROM label_histograms
WHERE run_b != :failing_run_id
)
SELECT p.run_b,
p.feature_score,
l.label_score,
(p.feature_score + :w_label * l.label_score + abs(r.row_count - :fail_row_count)/:norm_rowcount) AS total_score
FROM per_feature p
JOIN label_scores l USING(run_b)
JOIN runs r ON r.run_id = p.run_b
ORDER BY total_score ASC
LIMIT 50;Sample Answer
POST /api/v1/tenants/{t}/models
{
"name":"fraud-detector",
"version":"v1.2",
"artifact_uri":"s3://bucket/..",
"schema":"...",
"metadata":{...}
}POST /api/v1/tenants/{t}/deployments
{
"model_ref":"fraud-detector:v1.2",
"env":"prod",
"strategy":"canary",
"strategy_params":{"steps":[{"traffic":5,"duration":"10m"},{"traffic":50,"duration":"30m"}]},
"metrics":[{"name":"latency_p95","type":"decrease","threshold":0.05},{"name":"auroc","type":"increase","threshold":0.01}],
"auto_rollback": true
}POST /api/v1/tenants/{t}/experiments
{
"name":"feat-X-ab-test",
"variants":[{"model":"m:v1","traffic":50},{"model":"m:v2","traffic":50}],
"duration":"7d",
"metrics":["conversion","precision"],
"assignment_rule":"user_id_hash%100"
}POST /api/v1/tenants/{t}/models/{name}:{version}/promote
{ "from":"staging","to":"prod","run_tests":true }Sample Answer
import torch, random, numpy as np
def save_checkpoint(path, model, optimizer, scheduler, scaler, epoch, global_step, grad_accum,
dataloader_rng_state=None):
ckpt = {
"model": model.state_dict(),
"optimizer": optimizer.state_dict(),
"scheduler": scheduler.state_dict() if scheduler is not None else None,
"scaler": scaler.state_dict() if scaler is not None else None,
"epoch": epoch,
"global_step": global_step,
"grad_accum": grad_accum,
# RNG states for deterministic resume
"rng_python": random.getstate(),
"rng_numpy": np.random.get_state(),
"rng_torch_cpu": torch.get_rng_state(),
"rng_torch_cuda": torch.cuda.get_rng_state_all() if torch.cuda.is_available() else None,
"dataloader_rng": dataloader_rng_state # optional: e.g., sampler epoch/position
}
torch.save(ckpt, path)
def load_checkpoint(path, model, optimizer, scheduler, scaler):
ckpt = torch.load(path, map_location="cpu")
model.load_state_dict(ckpt["model"])
optimizer.load_state_dict(ckpt["optimizer"])
if scheduler is not None and ckpt["scheduler"] is not None:
scheduler.load_state_dict(ckpt["scheduler"])
if scaler is not None and ckpt.get("scaler") is not None:
scaler.load_state_dict(ckpt["scaler"])
# restore RNGs
random.setstate(ckpt["rng_python"])
np.random.set_state(ckpt["rng_numpy"])
torch.set_rng_state(ckpt["rng_torch_cpu"])
if torch.cuda.is_available() and ckpt["rng_torch_cuda"] is not None:
torch.cuda.set_rng_state_all(ckpt["rng_torch_cuda"])
return ckpt["epoch"], ckpt["global_step"], ckpt["grad_accum"], ckpt.get("dataloader_rng")
# Training loop with gradient accumulation
def train(train_loader, model, optimizer, scheduler=None, scaler=None,
grad_accum_steps=4, start_epoch=0, start_step=0, device="cuda"):
model.to(device)
global_step = start_step
for epoch in range(start_epoch, num_epochs):
# if using DistributedSampler: sampler.set_epoch(epoch) for deterministic order
if hasattr(train_loader.sampler, "set_epoch"):
train_loader.sampler.set_epoch(epoch)
optimizer.zero_grad()
for step, batch in enumerate(train_loader):
# Optionally skip already-processed batches when resuming mid-epoch:
if epoch == start_epoch and step < (start_step % len(train_loader)):
continue
inputs, targets = batch
inputs, targets = inputs.to(device), targets.to(device)
with torch.cuda.amp.autocast(enabled=(scaler is not None)):
outputs = model(inputs)
loss = loss_fn(outputs, targets) / grad_accum_steps
if scaler is not None:
scaler.scale(loss).backward()
else:
loss.backward()
# accumulate gradients; step every grad_accum_steps
if (global_step + 1) % grad_accum_steps == 0:
if scaler is not None:
scaler.step(optimizer)
scaler.update()
else:
optimizer.step()
if scheduler is not None:
scheduler.step()
optimizer.zero_grad()
# save checkpoint periodically
if global_step % save_every_steps == 0:
save_checkpoint(checkpoint_path, model, optimizer, scheduler, scaler,
epoch, global_step, grad_accum_steps)
global_step += 1Sample Answer
Sample Answer
Unlock Full Question Bank
Get access to hundreds of Model Training Infrastructure and Experimentation interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.