Pular para o conteúdo principal

KubeFlow

Definição

KubeFlow é um kit de ferramentas de ML de código aberto projetado para tornar a implantação de workflows de ML no Kubernetes simples, portátil e escalável. Foi originalmente criado pelo Google e agora é um projeto da Cloud Native Computing Foundation (CNCF) com ampla adoção industrial. O KubeFlow não tenta ser uma plataforma monolítica única; em vez disso, é uma coleção cuidadosamente selecionada de componentes nativos do Kubernetes que cada um resolve um problema distinto de infraestrutura de ML.

Os componentes principais são: KubeFlow Pipelines (KFP) para definir e executar workflows de ML baseados em DAG como trabalhos do Kubernetes; Katib para ajuste automatizado de hiperparâmetros e busca de arquitetura neural usando otimização bayesiana, busca aleatória ou aprendizado por reforço; KFServing (agora KServe) para serviço de modelos escalável com escalonamento sem servidor, implantações canary e suporte a múltiplos runtimes de serviço; e Servidores de Jupyter Notebook gerenciados pelo painel KubeFlow para desenvolvimento interativo em um ambiente multi-tenant. Toda a plataforma é instalada via um único conjunto de manifestos do Kubernetes e gerenciada por meio de uma interface web.

O ponto forte do KubeFlow é que ele roda em qualquer cluster Kubernetes — on-premises, GKE, EKS, AKS ou um cluster kind local — tornando-o adequado para organizações que exigem que os dados permaneçam em sua própria infraestrutura. Seu principal custo é a complexidade operacional: a curva de aprendizado é íngreme, e operar o KubeFlow em produção requer sólida expertise em Kubernetes.

Como funciona

KubeFlow Pipelines (KFP)

O KFP permite que cientistas de dados definam pipelines de ML como código Python usando o SDK do KFP. Cada etapa do pipeline é um componente containerizado: uma função Python decorada com @dsl.component é compilada em uma especificação de container que o KFP executa como um pod do Kubernetes. O DAG do pipeline é compilado para um arquivo de Representação Intermediária (IR YAML) que o controlador backend do KFP agenda no cluster. Essa abordagem significa que cada etapa é totalmente reprodutível: a imagem do container é fixada, entradas e saídas são artefatos rastreados no armazenamento de metadados do KFP (ML Metadata / MLMD), e todo o grafo de execução é visível na interface com logs, entradas, saídas e status por etapa.

Katib — Ajuste de Hiperparâmetros

O Katib é o componente AutoML do KubeFlow. Ele define um recurso customizado Kubernetes Experiment que especifica o espaço de busca (intervalos e tipos de parâmetros), a métrica objetivo (minimizar perda, maximizar acurácia) e o algoritmo de busca (otimização bayesiana via Processo Gaussiano, CMA-ES, busca aleatória ou busca em grade). O Katib executa trials em paralelo — cada trial é um trabalho de treinamento completo — e usa os resultados para sugerir melhores configurações para os trials subsequentes. A integração com o KFP significa que um pipeline completo (dados → engenharia de features → treino → avaliação) pode ser tratado como um único trial do Katib, permitindo AutoML de ponta a ponta em pipelines complexos.

KServe (anteriormente KFServing)

O KServe estende o Kubernetes com recursos customizados InferenceService que definem declarativamente implantações de serviço de modelos. Especifique o framework (sklearn, xgboost, pytorch, tensorflow, custom) e o URI do modelo (caminho S3, PVC) e o KServe gerencia: baixar o modelo, selecionar o runtime de serviço correto, configurar o proxy sidecar, expor o endpoint via Istio e escalar réplicas para zero quando inativo (modo sem servidor). Implantações canary dividem o tráfego entre duas versões do modelo por porcentagem, permitindo rollouts seguros. Os componentes transformer e explainer permitem conectar lógica de pré-processamento e explicabilidade baseada em SHAP ao lado do preditor.

Multi-tenancy e RBAC

O painel KubeFlow implementa multi-tenancy via namespaces do Kubernetes: cada usuário ou equipe obtém um namespace isolado com suas próprias cotas de recursos, servidores de notebooks e execuções de pipeline. O Controle de Acesso Baseado em Funções (RBAC) restringe quais usuários podem visualizar, executar ou gerenciar pipelines e modelos. Isso torna o KubeFlow adequado para grandes organizações onde múltiplas equipes compartilham um único cluster de GPU e precisam de isolamento sem clusters separados.

Quando usar / Quando NÃO usar

Usar quandoEvitar quando
As cargas de trabalho de ML são executadas em um cluster Kubernetes existenteA equipe não tem expertise em Kubernetes e não tem um engenheiro de plataforma dedicado
É necessária orquestração completa de pipelines, AutoML e serviço em uma plataformaUm serviço gerenciado (SageMaker, Vertex AI) se adequa à estratégia do provedor de nuvem
Requisitos de residência de dados impedem o uso de serviços de ML em nuvem gerenciadosApenas o serviço de modelos é necessário, não a orquestração completa do pipeline
A organização opera um cluster de GPU compartilhado com necessidades de multi-tenancyOs workflows de ML são simples o suficiente para um único script de treinamento
Recursos avançados de serviço são necessários (escalonamento sem servidor, canary, transformers)A velocidade de entrada em produção é mais importante do que o controle de infraestrutura

Comparações

CritérioKubeFlowML no Kubernetes (vanilla)
ComplexidadeAlta — muitos CRDs, controladores e dependências do IstioMédia — apenas objetos Kubernetes padrão
FuncionalidadesPipelines, AutoML (Katib), serviço (KServe), gerenciamento de notebooksO que você constrói e configura manualmente
Curva de aprendizadoÍngreme — requer conhecimento do domínio Kubernetes + KubeFlowMédia — conhecimento K8s padrão suficiente
FlexibilidadeModerada — extensível, mas vinculada às abstrações do KubeFlowAlta — controle total sobre cada recurso Kubernetes
Opções gerenciadasKubeFlow no GKE (Vertex AI Pipelines), AWS Managed KubeFlowQualquer Kubernetes gerenciado (EKS, GKE, AKS)
Tempo de configuraçãoDias a semanas para uma instalação de nível produçãoHoras a dias dependendo da complexidade da carga de trabalho

Vantagens e desvantagens

VantagensDesvantagens
Plataforma de ML unificada — pipelines, ajuste, serviço em um sistemaComplexidade operacional muito alta e grande número de componentes móveis
Agnóstico a nuvem — funciona em qualquer cluster KubernetesCurva de aprendizado íngreme; requer expertise em Kubernetes para operar
Serviço de modelos sem servidor com autoescalonamento para zeroInstalação exigente em recursos (Istio, Argo Workflows, MLMD, Knative)
Multi-tenancy sólido com isolamento de namespace e RBACUpgrades entre versões do KubeFlow podem ser complexos
Comunidade CNCF ativa e amplas integrações de ecossistemaDepurar falhas frequentemente requer entender múltiplas camadas (K8s → Argo → Python SDK)

Exemplos de código

# kubeflow_pipeline.py
# KubeFlow Pipelines v2 SDK — defines a two-step ML pipeline:
# 1. Data preprocessing component
# 2. Training component
# Requires: pip install kfp==2.*

from kfp import dsl
from kfp.client import Client


# --- Component 1: Preprocess raw CSV data ---

@dsl.component(
base_image="python:3.11-slim",
packages_to_install=["pandas==2.2.0", "scikit-learn==1.4.0"],
)
def preprocess(
raw_data_path: str,
output_features: dsl.Output[dsl.Dataset],
) -> None:
"""
Reads raw CSV, applies feature engineering, and writes features as Parquet.
KFP tracks output_features as a Dataset artifact with URI and metadata.
"""
import pandas as pd
from sklearn.preprocessing import StandardScaler

df = pd.read_csv(raw_data_path)

# Simple feature engineering: scale numeric columns
scaler = StandardScaler()
numeric_cols = df.select_dtypes("number").columns.tolist()
df[numeric_cols] = scaler.fit_transform(df[numeric_cols])

# KFP provides output_features.path — write artifact there
df.to_parquet(output_features.path, index=False)
print(f"Wrote {len(df)} rows to {output_features.path}")


# --- Component 2: Train a model on the preprocessed features ---

@dsl.component(
base_image="python:3.11-slim",
packages_to_install=["pandas==2.2.0", "scikit-learn==1.4.0", "joblib==1.3.0"],
)
def train(
features: dsl.Input[dsl.Dataset],
n_estimators: int,
model_output: dsl.Output[dsl.Model],
metrics_output: dsl.Output[dsl.Metrics],
) -> None:
"""
Trains a RandomForestClassifier and writes the model artifact + metrics.
"""
import json
import joblib
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

df = pd.read_parquet(features.path)
X = df.drop(columns=["label"]).values
y = df["label"].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

clf = RandomForestClassifier(n_estimators=n_estimators, random_state=42)
clf.fit(X_train, y_train)

accuracy = float(accuracy_score(y_test, clf.predict(X_test)))

# Write model artifact (KFP tracks the URI and lineage)
joblib.dump(clf, model_output.path)

# Log metrics — visible in the KubeFlow Pipelines UI
metrics_output.log_metric("accuracy", accuracy)
metrics_output.log_metric("n_estimators", n_estimators)
print(f"Accuracy: {accuracy:.4f}")


# --- Pipeline definition ---

@dsl.pipeline(
name="fraud-detection-pipeline",
description="Two-stage pipeline: preprocess CSV data, then train RandomForest.",
)
def fraud_pipeline(
raw_data_path: str = "gs://my-bucket/data/train.csv",
n_estimators: int = 100,
) -> None:
# Step 1: preprocess — runs in its own pod
preprocess_task = preprocess(raw_data_path=raw_data_path)

# Step 2: train — depends on the Dataset artifact from step 1
train_task = train(
features=preprocess_task.outputs["output_features"],
n_estimators=n_estimators,
)
# Assign this task to a node pool with GPU (optional resource request)
train_task.set_accelerator_type("NVIDIA_TESLA_T4").set_accelerator_limit(1)


# --- Submit the pipeline to a running KubeFlow Pipelines instance ---

if __name__ == "__main__":
# Connect to KFP backend (port-forward: kubectl port-forward -n kubeflow svc/ml-pipeline 8888:8888)
client = Client(host="http://localhost:8888")

run = client.create_run_from_pipeline_func(
pipeline_func=fraud_pipeline,
arguments={
"raw_data_path": "gs://my-bucket/data/train.csv",
"n_estimators": 200,
},
run_name="fraud-pipeline-run-v1",
experiment_name="fraud-detection",
)
print(f"Pipeline run created: {run.run_id}")
print(f"View at: http://localhost:8888/#/runs/details/{run.run_id}")

Recursos práticos

Veja também