aws / aws/sagemaker-python-sdk

Windows host writes sm_train.sh with CRLF in SDK v3, causing SageMaker training job bootstrap failure ($'\r': command not found)

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

説明

**PySDK Version**
- [ ] PySDK V2 (2.x)
- [x] PySDK V3 (3.x)

**Describe the bug**
When launching a SageMaker training job from Windows using `sagemaker.train.ModelTrainer` (SDK v3), the generated bootstrap script `sm_train.sh` is written with CRLF line endings. Inside the Linux training container, bash fails to parse it and the job exits before user training code starts.

The script appears to be written in `sagemaker/train/model_trainer.py` with:

`with open(os.path.join(tmp_dir.name, TRAIN_SCRIPT), "w") as f:`

which applies platform newline conversion on Windows (`\r\n`).

**To reproduce**
1. Use Windows host with SageMaker Python SDK v3.
2. Run this complete script (replace `ROLE_ARN` and `S3_INPUT`):

```python
from sagemaker.core import image_uris
from sagemaker.core.helper.session_helper import Session
from sagemaker.core.training.configs import SourceCode, Compute, InputData
from sagemaker.train import ModelTrainer

session = Session()
region = session.boto_region_name

training_image = image_uris.retrieve(
framework="pytorch",
region=region,
version="2.4.0",
py_version="py311",
instance_type="ml.g4dn.xlarge",
image_scope="training",
)

trainer = ModelTrainer(
sagemaker_session=session,
role="ROLE_ARN",
training_image=training_image,
source_code=SourceCode(
source_dir=".",
entry_script="sagemaker_entry.py",
requirements="requirements/sagemaker_train.txt",
),
compute=Compute(instance_type="ml.g4dn.xlarge", instance_count=1),
)

trainer.train(
input_data_config=[InputData(channel_name="train", data_source="S3_INPUT")],
wait=True,
logs=True,
)
```

3. Check CloudWatch logs for the training job.

**Expected behavior**
`sm_train.sh` should be written with LF (`\n`) and execute correctly in the Linux container, allowing the training entry point to start.

**Screenshots or logs**
Observed logs:

```text
/opt/ml/input/data/sm_drivers/sm_train.sh: line 1: $'\r': command not found
Starting training script#015
/opt/ml/input/data/sm_drivers/sm_train.sh: line 3: set: -#015: invalid option
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--]
/opt/ml/input/data/sm_drivers/sm_train.sh: line 5: $'\r': command not found
/opt/ml/input/data/sm_drivers/sm_train.sh: line 6: syntax error near unexpected token `$'{\r''
/opt/ml/input/data/sm_drivers/sm_train.sh: line 6: `handle_error() {#015'
```

**System information**
- **SageMaker Python SDK version**: 3.12.0
- **Framework name (eg. PyTorch) or algorithm (eg. KMeans)**: PyTorch
- **Framework version**: 2.4.0 (DLC)
- **Python version**: 3.11
- **CPU or GPU**: GPU (`ml.g4dn.xlarge`)
- **Custom Docker image (Y/N)**: N

**Additional context**
- Reproduced from Windows 10 host.
- Workaround: launching from Linux (WSL/Studio/EC2) avoids CRLF in `sm_train.sh`.
- Suggested fix in SDK: force LF on script write, e.g. `open(..., "w", newline="\n")`.

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

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

調査の方向性

sagemaker/train/model_trainer.py のスクリプト書き込みコード、特に issue に示されている open 呼び出しを調査し、Windows で生成されたファイルを再現します。sm_train.sh に LF の改行が含まれ、SageMaker コンテナのログに、報告されている bash のパースエラーなしでトレーニングのエントリーポイントが開始されたことが示されれば完了です。

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

評価

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

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

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