Hyperparameter Tuning (Katib)¶
Katib is the automated hyperparameter tuning system built into Kubeflow. It runs multiple trials in parallel, guided by a search algorithm (Bayesian optimisation, random search, grid search), and identifies the best hyperparameter configuration.
Supported algorithms¶
| Algorithm | Best for |
|---|---|
random |
Fast exploration, many parameters |
bayesianoptimization |
Expensive trials, continuous params |
grid |
Small discrete spaces |
hyperband |
Early stopping to reduce wasted compute |
cmaes |
Continuous numerical optimisation |
Define an Experiment¶
# katib-experiment.yaml
apiVersion: kubeflow.org/v1beta1
kind: Experiment
metadata:
name: bert-lr-sweep
namespace: rg-compsci
spec:
objective:
type: maximize
goal: 0.92
objectiveMetricName: val_accuracy
additionalMetricNames:
- val_loss
algorithm:
algorithmName: bayesianoptimization
parallelTrialCount: 2 # concurrent trials (GPU constrained)
maxTrialCount: 20
maxFailedTrialCount: 3
parameters:
- name: learning_rate
parameterType: double
feasibleSpace:
min: "1e-5"
max: "1e-3"
- name: batch_size
parameterType: int
feasibleSpace:
list: ["16", "32", "64"]
- name: lora_r
parameterType: int
feasibleSpace:
list: ["8", "16", "32"]
trialTemplate:
primaryContainerName: training-container
trialParameters:
- name: learning_rate
description: Learning rate
reference: learning_rate
- name: batch_size
reference: batch_size
- name: lora_r
reference: lora_r
trialSpec:
apiVersion: batch/v1
kind: Job
spec:
template:
spec:
containers:
- name: training-container
image: nvcr.io/nvidia/pytorch:24.08-py3
command:
- python
- /workspace/train.py
- --learning-rate=${trialParameters.learning_rate}
- --batch-size=${trialParameters.batch_size}
- --lora-r=${trialParameters.lora_r}
resources:
limits:
nvidia.com/gpu: "1"
restartPolicy: Never
Training script for Katib¶
Your training script must print metrics in the format Katib expects:
# train.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--learning-rate", type=float)
parser.add_argument("--batch-size", type=int)
parser.add_argument("--lora-r", type=int)
args = parser.parse_args()
# ... training code ...
val_accuracy = 0.87 # replace with actual metric
val_loss = 0.32
# Katib reads these from stdout
print(f"val_accuracy={val_accuracy}")
print(f"val_loss={val_loss}")
Submit the experiment¶
Monitor in the Kubeflow UI: Experiments (AutoML) → select your experiment → view trial status and metrics.
Retrieve best parameters¶
from kubeflow.katib import KatibClient
client = KatibClient(namespace="rg-compsci")
experiment = client.get_experiment("bert-lr-sweep")
best = experiment.status.current_optimal_trial
print("Best parameters:")
for param in best.parameter_assignments:
print(f" {param.name}: {param.value}")
print(f"Best val_accuracy: {best.observation.metrics[0].latest}")