Skip to content

Commit 19fa86c

Browse files
authored
fix: pass training_plan_arn through serverful compute reconstruction (#6258)
The serverful path in _train_serverful_smtj() reconstructs TrainingJobCompute with only 4 fields, silently dropping training_plan_arn. This causes customers using Flexible Training Plans with high-level trainers (SFTTrainer, DPOTrainer, etc.) to have their plan ARN ignored. Add training_plan_arn to the reconstruction and update tests.
1 parent dce06b1 commit 19fa86c

2 files changed

Lines changed: 34 additions & 0 deletions

File tree

‎sagemaker-train/src/sagemaker/train/base_trainer.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,6 +1158,7 @@ def _yaml_safe_default(value):
11581158
instance_count=compute.instance_count,
11591159
volume_size_in_gb=compute.volume_size_in_gb,
11601160
keep_alive_period_in_seconds=compute.keep_alive_period_in_seconds,
1161+
training_plan_arn=compute.training_plan_arn,
11611162
)
11621163

11631164
# Build input data config (datasets resolved earlier for recipe injection)

‎sagemaker-train/tests/unit/train/test_base_trainer_compute.py‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ def test_compute_attributes_forwarded(self):
115115
instance_count=4,
116116
volume_size_in_gb=300,
117117
keep_alive_period_in_seconds=1200,
118+
training_plan_arn=None,
118119
)
119120
trainer.training_dataset = "s3://my-bucket/data/train/"
120121

@@ -126,6 +127,38 @@ def test_compute_attributes_forwarded(self):
126127
assert forwarded.volume_size_in_gb == 300
127128
assert forwarded.keep_alive_period_in_seconds == 1200
128129

130+
def test_training_plan_arn_forwarded(self):
131+
trainer = _ConcreteTrainer()
132+
trainer.compute = MagicMock(
133+
instance_type="ml.p5.48xlarge",
134+
instance_count=2,
135+
volume_size_in_gb=500,
136+
keep_alive_period_in_seconds=0,
137+
training_plan_arn="arn:aws:sagemaker:us-west-2:123456789012:training-plan/my-plan",
138+
)
139+
trainer.training_dataset = "s3://my-bucket/data/train/"
140+
141+
kwargs = self._run(trainer)
142+
143+
forwarded = kwargs["compute"]
144+
assert forwarded.training_plan_arn == "arn:aws:sagemaker:us-west-2:123456789012:training-plan/my-plan"
145+
146+
def test_training_plan_arn_none_when_not_set(self):
147+
trainer = _ConcreteTrainer()
148+
trainer.compute = MagicMock(
149+
instance_type="ml.p4d.24xlarge",
150+
instance_count=1,
151+
volume_size_in_gb=30,
152+
keep_alive_period_in_seconds=0,
153+
training_plan_arn=None,
154+
)
155+
trainer.training_dataset = "s3://my-bucket/data/train/"
156+
157+
kwargs = self._run(trainer)
158+
159+
forwarded = kwargs["compute"]
160+
assert forwarded.training_plan_arn is None
161+
129162

130163
def _make_hyperpod_trainer(cluster_name="my-cluster", node_count=2):
131164
"""Build an SFTTrainer instance for _train_hyperpod without heavy __init__."""

0 commit comments

Comments
 (0)