Source code for sagemaker.serve.deployment_progress

from rich.console import Console
from rich.panel import Panel
from rich.progress import Progress, SpinnerColumn, TextColumn, TimeElapsedColumn
from rich.status import Status
from rich.console import Group
from rich.live import Live
from rich.style import Style

[docs] class EndpointDeploymentProgress: """Rich console progress interface matching ModelTrainer design""" def __init__(self, endpoint_name: str): self.endpoint_name = endpoint_name self.console = Console() self.current_status = "Creating" self.live = None # Create progress bar with timer (like ModelTrainer) self.progress = Progress( SpinnerColumn("bouncingBar"), TextColumn("{task.description}"), TimeElapsedColumn(), ) self.progress.add_task("Waiting for Endpoint...") # Create status display self.status = Status("Current status: Creating") def __enter__(self): panel = Panel( Group(self.progress, self.status), title="Wait Log Panel", border_style=Style(color="blue") ) # Use the same console with frequent refresh for animations and timer self.live = Live(panel, console=self.console, refresh_per_second=4) self.live.start() return self def __exit__(self, exc_type, exc_val, exc_tb): if self.live: self.live.stop()
[docs] def log(self, message: str): """Log a message above the progress bar""" self.console.print(message)
[docs] def update_status(self, status: str): """Update the deployment status""" self.current_status = status if self.status: self.status.update(f"Current status: [bold]{status}")
def _deploy_done_with_progress(sagemaker_client, endpoint_name, progress_tracker=None): """Enhanced deployment checker with rich progress support""" in_progress_statuses = ["Creating", "Updating"] desc = sagemaker_client.describe_endpoint(EndpointName=endpoint_name) status = desc["EndpointStatus"] if progress_tracker: progress_tracker.update_status(status) else: # Fallback to original dots print("-" if status in in_progress_statuses else "!", end="", flush=True) return None if status in in_progress_statuses else desc def _live_logging_deploy_done_with_progress(sagemaker_client, endpoint_name, paginator, paginator_config, poll, progress_tracker=None): """Live logging deployment checker that routes logs to Rich progress tracker""" import time from botocore.exceptions import ClientError stop = False endpoint_status = None try: desc = sagemaker_client.describe_endpoint(EndpointName=endpoint_name) endpoint_status = desc["EndpointStatus"] except ClientError as e: if e.response["Error"]["Code"] == "ValidationException": return None raise e try: # Update status and check if we should stop if endpoint_status != "Creating": stop = True if endpoint_status == "InService" and progress_tracker: progress_tracker.log(f"✅ Created endpoint with name {endpoint_name}") elif endpoint_status != "InService": time.sleep(poll) # Fetch and route CloudWatch logs to progress tracker pages = paginator.paginate( logGroupName=f"/aws/sagemaker/Endpoints/{endpoint_name}", logStreamNamePrefix="AllTraffic/", PaginationConfig=paginator_config, ) for page in pages: if "nextToken" in page: paginator_config["StartingToken"] = page["nextToken"] for event in page["events"]: if progress_tracker: progress_tracker.log(event["message"]) # Update progress tracker status if progress_tracker: progress_tracker.update_status(endpoint_status) # Return desc if we should stop polling if stop: return desc except ClientError as e: if e.response["Error"]["Code"] == "ResourceNotFoundException": return None raise e return None