Modo local offline do SageMaker — treinamento com CatBoost

Treina contra um endpoint S3/STS suportado pelo moto através da biblioteca sagemaker-local (sem AWS). O trabalho é executado em um contêiner Docker local.

Dataset: diabetes (regressão), carregado dentro do contêiner de scikit-learn. A imagem construída sagemaker-local:latest já inclui CatBoost 1.2.7.

Cell 02Code
import os
from dataclasses import replace

from sagemaker.deserializers import JSONDeserializer
from sagemaker.estimator import Estimator
from sagemaker.serializers import JSONSerializer
from sagemaker_local.config import config_from_env
from sagemaker_local.session import make_local_session

cfg = replace(
    config_from_env(),
    bucket="sagemaker-catboost",
    image_tag="sagemaker-catboost:train",
)
boto_session, sm_session = make_local_session(cfg)

Treinamento

est.fit() runs synchronously in a local container; train.py loads diabetes and writes model.joblib to /opt/ml/model.

O Estimator genérico (traga seu próprio recipiente) aponta para a imagem local através do image_uri, portanto, nenhuma imagem da AWS é puxada.

Cell 04Code
est = Estimator(
    entry_point="train.py",
    source_dir=os.path.join(
        os.environ.get("SAGEMAKER_LOCAL_REPO_PATH", "/workspace"),
        "projects",
        "sagemaker_catboost",
        "src",
        "sagemaker_catboost",
    ),
    image_uri=cfg.image_tag,
    role=cfg.role_arn,
    instance_type="local",
    instance_count=1,
    sagemaker_session=sm_session,
    output_path=f"s3://{cfg.bucket}/models",
    hyperparameters={"dataset": "diabetes"},
)
est.fit()

Implantar e prever

As entradas são matrizes JSON 2-D, de modo que o manipulador de entrada de serviço padrão as analisa corretamente.

Cell 06Code
predictor = est.deploy(
    initial_instance_count=1,
    instance_type="local",
    serializer=JSONSerializer(),
    deserializer=JSONDeserializer(),
)
sample = [0.05, 0.08, 0.0, 0.02, 0.04, 0.06, 0.0, 0.0, 0.03, 0.05]
result = predictor.predict([sample])
print("predicted disease progression:", result)

Limpeza

Exclua o endpoint para que o contêiner de serviço seja liberado e a porta 8080 seja liberada.

Cell 08Code
predictor.delete_endpoint()