aws / aws/sagemaker-python-sdk

ModelBuilder.build() fails with ValueError in _tmpdir: model_path directory never created in passthrough path

クローズ
#5,748 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Python
スター
2.3k
フォーク
1.3k
平均マージ
1日 22時間
マージ済み PR(30日)
35

説明

## Description

`ModelBuilder.build()` fails with a `ValueError` when repacking model artifacts because `model_path` (which defaults to `/tmp/sagemaker/model-builder/`) is assigned to `sagemaker_session.settings._local_download_dir` but is never created on disk in the passthrough build path.

## Steps to Reproduce

```python
from sagemaker.serve.model_builder import ModelBuilder, SourceCode

mb = ModelBuilder(
image_uri=sklearn_image,
s3_model_data_url="s3://bucket/path/model.tar.gz",
role_arn=role,
sagemaker_session=session,
source_code=SourceCode(
source_dir="./inference/",
entry_script="inference.py"
),
)

model = mb.build() # <-- ValueError here
```

## Error

```
ValueError: Inputted directory for storing newly generated temporary directory does not exist:
'/tmp/sagemaker/model-builder/108d3308375c11f19f96222d70a99c6e'
```

## Root Cause

In `model_builder.py`, `model_path` defaults to a UUID-based temp path (line 236):

```python
model_path: Optional[str] = field(
default_factory=lambda: "/tmp/sagemaker/model-builder/" + uuid.uuid1().hex,
)
```

During `_build_single_modelbuilder()`, this path is assigned to the session settings (line 2465):

```python
self.sagemaker_session.settings._local_download_dir = self.model_path
```

The **only** `os.makedirs(self.model_path)` call exists inside `_save_model_inference_spec()` (line 1257-1258), but the passthrough build path (`_build_for_passthrough()`) **never calls** `_save_model_inference_spec()`. So the directory doesn't exist when the code reaches:

```
_build_for_passthrough() → _create_model() → _create_sagemaker_model()
→ _prepare_container_def() → _prepare_container_def_base() → _upload_code()
→ repack_model() → _tmpdir(directory=local_download_dir) → ValueError
```

## Suggested Fix

**Option A (targeted):** In `_build_single_modelbuilder()`, ensure `model_path` exists right after assigning it to `local_download_dir` (after line 2465):

```python
self.sagemaker_session.settings._local_download_dir = self.model_path
if self.model_path and not self.model_path.startswith("s3://"):
os.makedirs(self.model_path, exist_ok=True)
```

**Option B (defensive):** In `_tmpdir()` (`common_utils.py`), create the directory instead of raising:

```python
if directory is not None:
os.makedirs(directory, exist_ok=True)
```

Option A is more targeted. Option B is more defensive and would prevent similar issues from other callers.

## Workaround

```python
import os
os.makedirs(mb.model_path, exist_ok=True)
model = mb.build()
```

## Environment

- SageMaker Python SDK v3 (latest)
- Python 3.12
- Amazon Linux 2023

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

model_builder.py の _build_single_modelbuilder() から開始し、_build_for_passthrough() を通る passthrough パスを追跡します。common_utils.py の _tmpdir() を調べ、ModelBuilder.build() の例を再現します。完了条件は、アーティファクトを再パッケージ化するときに passthrough build が ValueError を発生させなくなることです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
aws, python
領域
cloud, machine-learning
issue の種類
バグ
難易度
2/5
見積もり時間
1〜3時間
活発さ
静か
明瞭さ
明確に書かれている
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。