ModelBuilder.build() ignores the configured session when it reloads a model
Maintainer antworten meist innerhalb von 2 Tagen
Ein zugehöriger Pull Request wurde bereits gemerged.
- #6487 von @mohamedzeidan2021 — gemerged
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 72/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- aws, python
- Bereich
- cloud, machine-learning
Rechercherichtung
Der Fehler liegt in der letzten Rückgabe von ModelBuilder.build() in sagemaker/serve/model_builder.py, wo Model.get() ohne die konfigurierte Session aufgerufen wird. Lies nach, wie self.sagemaker_session in dieser Klasse gesetzt wird, und prüfe dann, ob Model.get() ein Session-Argument akzeptiert. Füge einen Unit-Test hinzu, der unterschiedliche Standard- und Ziel-boto-Sessions verwendet und prüft, dass Model.get() nach CreateModel die Ziel-Session erhält. Fertig ist es, wenn dieser Test besteht und die bestehenden Tests für ModelBuilder weiterhin bestehen.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
PySDK Version
- PySDK V2 (2.x)
- PySDK V3 (3.x)
Describe the bug
ModelBuilder.build() creates a SageMaker model with its configured
sagemaker_session. It then reloads the model with Model.get() without
passing that session.
If the configured session and default boto session use different AWS accounts,
the create request succeeds in the configured account. The subsequent describe
request uses the default account and fails because the model does not exist
there.
The relevant call in sagemaker/serve/model_builder.py is:
return Model.get(model_name=self.model_name, region=self.region)
To reproduce
Configure two AWS CLI profiles that use different AWS accounts. The target
profile must have SageMaker permissions and permission to pass the execution
role.
Set these environment variables:
export TARGET_PROFILE="<profile-for-target-account>"
export DEFAULT_PROFILE="<profile-for-different-account>"
export TARGET_ROLE_ARN="arn:aws:iam::<target-account-id>:role/<sagemaker-execution-role>"
export TARGET_BUCKET="<existing-bucket-in-target-account>"
export IMAGE_URI="<inference-image-uri-accessible-from-target-account>"
export AWS_REGION="us-east-2"
Run this script:
import os
import uuid
import boto3
from botocore.exceptions import ClientError
from sagemaker.core.helper.session_helper import Session
from sagemaker.core.resources import Model
from sagemaker.core.shapes import ContainerDefinition
from sagemaker.serve import ModelBuilder
region = os.environ["AWS_REGION"]
target_profile = os.environ["TARGET_PROFILE"]
default_profile = os.environ["DEFAULT_PROFILE"]
role_arn = os.environ["TARGET_ROLE_ARN"]
bucket = os.environ["TARGET_BUCKET"]
image_uri = os.environ["IMAGE_URI"]
model_name = f"modelbuilder-session-repro-{uuid.uuid4().hex[:8]}"
# Make the process default session use a different account.
boto3.setup_default_session(profile_name=default_profile, region_name=region)
target_boto_session = boto3.Session(
profile_name=target_profile,
region_name=region,
)
target_sagemaker_session = Session(
boto_session=target_boto_session,
default_bucket=bucket,
)
target_account = target_boto_session.client("sts").get_caller_identity()["Account"]
default_account = boto3.client("sts", region_name=region).get_caller_identity()["Account"]
print(f"Target account: {target_account}")
print(f"Default account: {default_account}")
source_model = Model(
model_name=f"{model_name}-source",
primary_container=ContainerDefinition(image=image_uri),
execution_role_arn=role_arn,
)
builder = ModelBuilder(
model=[source_model],
role_arn=role_arn,
sagemaker_session=target_sagemaker_session,
instance_type="ml.m5.large",
)
try:
builder.build(model_name=model_name)
finally:
# The create request succeeds before build() raises.
try:
target_sagemaker_session.sagemaker_client.delete_model(
ModelName=model_name,
)
except ClientError as error:
if error.response["Error"]["Code"] != "ValidationException":
raise
The script raises an error similar to:
botocore.exceptions.ClientError: An error occurred (ValidationException)
when calling the DescribeModel operation:
Could not find model "modelbuilder-session-repro-1234abcd".
Before cleanup, DescribeModel succeeds through target_sagemaker_session.
The model is present in the target account.
Expected behavior
ModelBuilder.build() must use the configured session for all operations.
The method must return the created Model resource from the target account.
The reload call can pass the boto session:
return Model.get(
model_name=self.model_name,
session=self.sagemaker_session.boto_session,
region=self.region,
)
Suggested patch:
diff --git a/src/sagemaker/serve/model_builder.py b/src/sagemaker/serve/model_builder.py
--- a/src/sagemaker/serve/model_builder.py
+++ b/src/sagemaker/serve/model_builder.py
@@
- return Model.get(model_name=self.model_name, region=self.region)
+ return Model.get(
+ model_name=self.model_name,
+ session=self.sagemaker_session.boto_session,
+ region=self.region,
+ )
The regression test must configure different default and target boto sessions.
It must make sure that Model.get() receives the target boto session after
CreateModel.
Screenshots or logs
Target account: <target-account-id>
Default account: <different-account-id>
Creating model with name: modelbuilder-session-repro-1234abcd
Model has been created: modelbuilder-session-repro-1234abcd
ValidationException: Could not find model
"modelbuilder-session-repro-1234abcd".
CloudTrail shows CreateModel in the target account. The failing
DescribeModel request uses the default account.
System information
- SageMaker Python SDK version: 3.24.0
- Framework name (eg. PyTorch) or algorithm (eg. KMeans): Not framework-specific
- Framework version: N/A
- Python version: 3.12.0
- CPU or GPU: CPU, Apple Silicon (arm64)
- Custom Docker image (Y/N): N
Additional context
The failure is hidden when the default boto session uses the same account as
the configured SageMaker session.
This also affects multi-container inference pipelines. CreateModel completes
in the target account, but endpoint creation never starts because the model
reload fails first.
- Vorherrschende Sprache
- Python
- Sterne
- 2.3k
- Forks
- 1.3k
- Ø Merge
- 2 T. 16 Std.
- Gemergte PRs (30 T.)
- 88
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus aws/sagemaker-python-sdk
-
`HyperparameterTuner` drops `ModelTrainer` checkpoint and retry configurationEvtl. vergeben Ein verknüpfter Pull Request ist offen oder bereits gemergt. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
aws/sagemaker-python-sdk#6500 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
[Bug] ModelTrainer with no input channels emits InputDataConfig: [], which CreatePipeline rejects (min=1) — v2 omitted the keyEvtl. vergeben @sagemaker-bot hat das vor 21 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
aws/sagemaker-python-sdk#6156 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 2 Tagen
-
sagemaker-train should depend on mlflow-skinny, following sagemaker-mlflow 0.5.0Evtl. vergeben @mohamedzeidan2021 hat das vor 22 Tagen übernommen. Offen
Schwierigkeit 2/5 Ein halber Tag Anfängerfreundlichkeit 72/100
aws/sagemaker-python-sdk#6152 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
[Bug] ModelTrainer drops TrainingJobName for PipelineSession, breaking use_custom_job_prefix on TrainingStepEvtl. vergeben @mohamedzeidan2021 hat das vor 26 Tagen übernommen. Offencomponent: pipelines type: bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
aws/sagemaker-python-sdk#5776 · 1 Kommentar · 1 Reaktion ·
Maintainer antworten meist innerhalb von 2 Tagen
-
`ModelTrainer` bug with method to load hyperparameters from file for Amazon Nova RecipeEvtl. vergeben @sagemaker-bot hat das vor 21 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
aws/sagemaker-python-sdk#5770 ·
Maintainer antworten meist innerhalb von 2 Tagen
Alle Issues in aws/sagemaker-python-sdk
Ähnliche Issues
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
anchore/grype-db#1149 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
[Bug]: `hermes plugins update` clones an entire monorepo twice - `subdir` is resolved but dropped at both catalog-update call sitesEvtl. vergeben @HootRock hat das heute übernommen. Offencomp/cli P2 type/perf
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
NousResearch/hermes-agent#142417 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
SMC SPEC
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
tenstorrent/tt-oca-harness#3287 ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug enhancement python
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
DewaldOosthuizen/tech-cheat-sheets-and-notes#392 ·
Maintainer antworten meist innerhalb von 1 Tag
-
security
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
fabriziosalmi/wildbox#801 ·
Maintainer antworten meist innerhalb von 1 Tag