feature: Torch dependency in sagameker-core to be made optional (5457) - #5707

Closed
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457
Closed

feature: Torch dependency in sagameker-core to be made optional (5457)#5707
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457

Conversation

@aviruthen

Copy link
Copy Markdown
Collaborator

Description

The torch>=1.9.0 dependency in sagemaker-core's pyproject.toml is listed as a hard/required dependency, but torch is only used in 3 places: (1) TorchTensorSerializer.init which already does a lazy from torch import Tensor, (2) TorchTensorDeserializer.init which already does a lazy from torch import from_numpy, and (3) torchrun_driver.py which runs inside a training container (not on the user's machine). All torch imports are already lazy/conditional, so making torch optional requires: moving it from dependencies to [project.optional-dependencies], adding try/except DeferredError pattern to the TorchTensorDeserializer (it currently raises a bare Exception), and ensuring the serializer/deserializer classes give clear error messages when torch is not installed.

Related Issue

Related issue: 5457

Changes Made

  • sagemaker-core/pyproject.toml
  • sagemaker-core/src/sagemaker/core/serializers/base.py
  • sagemaker-core/src/sagemaker/core/deserializers/base.py
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py

AI-Generated PR

This PR was automatically generated by the PySDK Issue Agent.

  • Confidence score: 85%
  • Classification: type: feature request
  • SDK version target: V3

Merge Checklist

  • Changes are backward compatible
  • Commit message follows prefix: description format
  • Unit tests added/updated
  • Integration tests added (if applicable)
  • Documentation updated (if applicable)

@sagemaker-botsagemaker-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI Code Review

This PR makes torch an optional dependency in sagemaker-core, which is a good change since torch is a heavy dependency only needed for specific serializer/deserializer classes. The implementation is mostly correct but has a few issues: the exception chaining pattern loses the original traceback, the test file has a line length violation, and the importlib.reload pattern in tests can cause flaky behavior in CI.

self.convert_npy_to_tensor = from_numpy
except ImportError:
raise Exception("Unable to import pytorch.")
raise ImportError(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The raise ImportError(...) inside an except ImportError block loses the original exception context. Use raise ImportError(...) from e to preserve the exception chain, which helps with debugging:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorDeserializer: ""pip install 'sagemaker-core[torch]'"
) frome

from torch import Tensor
try:
from torch import Tensor
except ImportError:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue here — use raise ... from e to preserve the exception chain:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorSerializer: ""pip install 'sagemaker-core[torch]'"
) frome

"""Verify TorchTensorDeserializer raises ImportError with helpful message when torch is missing."""
import importlib
import sagemaker.core.deserializers.base as base_module

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This docstring exceeds the 100-character line length limit. Consider wrapping it:

deftest_torch_tensor_deserializer_raises_import_error_when_torch_missing():
"""Verify TorchTensorDeserializer raises ImportError when torch is missing."""

from sagemaker.core.serializers.base import TorchTensorSerializer

serializer = TorchTensorSerializer()
assert serializer is not None

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests (test_torch_tensor_serializer_works_when_torch_installed and test_torch_tensor_deserializer_works_when_torch_installed) will fail in CI environments where torch is not installed. Since torch is now optional, the test environment may not have it. Consider guarding these with pytest.importorskip("torch") at the top of each test:

deftest_torch_tensor_serializer_works_when_torch_installed():
pytest.importorskip("torch")
...

"pylint>=3.0.0, <4.0.0"
]
torch = [
"torch>=1.9.0",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The all extras group duplicates the torch dependency string. If more optional dependencies are added later, this will need manual sync. Consider referencing the torch extra from all:

all = [
"sagemaker-core[torch]",
]

This keeps all as a meta-extra that automatically includes everything.

from __future__ import absolute_import

import sys
from unittest.mock import patch, MagicMock

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: MagicMock is imported but never used. Remove the unused import.

@awsaws deleted a comment from sagemaker-botMar 31, 2026
@aviruthen

Copy link
Copy Markdown
CollaboratorAuthor

🤖 Iteration #1 — Review Comments Addressed

Description

Make torch an optional dependency in sagemaker-core instead of a required one.

The torch>=1.9.0 dependency was listed as a hard/required dependency, but torch is only used in a few places where imports are already lazy/conditional:

  1. TorchTensorSerializer.__init__ - lazy from torch import Tensor
  2. TorchTensorDeserializer.__init__ - lazy from torch import from_numpy
  3. torchrun_driver.py - runs inside a training container, not on the user's machine

This change significantly reduces the install footprint of sagemaker-core for users who don't need torch functionality.

Changes Made

  • sagemaker-core/pyproject.toml: torch is already in [project.optional-dependencies] under torch and all extras. Updated all to reference sagemaker-core[torch] instead of duplicating the dependency string.
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserved exception chain with raise ... from e in TorchTensorSerializer.__init__.
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserved exception chain with raise ... from e in TorchTensorDeserializer.__init__.
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fixed docstring line length, added pytest.importorskip("torch") guards for tests that require torch, and removed unused MagicMock import.

Installation

Users who need torch functionality can install it via:

pip install 'sagemaker-core[torch]'# or
pip install 'sagemaker-core[all]'

Users who don't need torch get a leaner installation:

pip install sagemaker-core

Clear error messages are provided when attempting to use torch-dependent classes without torch installed.

Comments reviewed: 6
Files modified:sagemaker-core/pyproject.toml, sagemaker-core/src/sagemaker/core/deserializers/base.py, sagemaker-core/src/sagemaker/core/serializers/base.py, sagemaker-core/tests/unit/test_torch_optional_dependency.py

  • sagemaker-core/pyproject.toml: Change 'all' extras to reference 'torch' extra instead of duplicating the dependency string
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserve exception chain with 'from e' in TorchTensorDeserializer
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserve exception chain with 'from e' in TorchTensorSerializer
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fix docstring line length, add pytest.importorskip guards, remove unused MagicMock import

@aviruthen
aviruthen deleted the feature/torch-dependency-in-sagameker-core-to-be-made-5457 branch March 31, 2026 23:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aviruthen@sagemaker-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feature: Torch dependency in sagameker-core to be made optional (5457) - #5707

Closed
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457
Closed

feature: Torch dependency in sagameker-core to be made optional (5457)#5707
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457

Conversation

@aviruthen

Copy link
Copy Markdown
Collaborator

Description

The torch>=1.9.0 dependency in sagemaker-core's pyproject.toml is listed as a hard/required dependency, but torch is only used in 3 places: (1) TorchTensorSerializer.init which already does a lazy from torch import Tensor, (2) TorchTensorDeserializer.init which already does a lazy from torch import from_numpy, and (3) torchrun_driver.py which runs inside a training container (not on the user's machine). All torch imports are already lazy/conditional, so making torch optional requires: moving it from dependencies to [project.optional-dependencies], adding try/except DeferredError pattern to the TorchTensorDeserializer (it currently raises a bare Exception), and ensuring the serializer/deserializer classes give clear error messages when torch is not installed.

Related Issue

Related issue: 5457

Changes Made

  • sagemaker-core/pyproject.toml
  • sagemaker-core/src/sagemaker/core/serializers/base.py
  • sagemaker-core/src/sagemaker/core/deserializers/base.py
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py

AI-Generated PR

This PR was automatically generated by the PySDK Issue Agent.

  • Confidence score: 85%
  • Classification: type: feature request
  • SDK version target: V3

Merge Checklist

  • Changes are backward compatible
  • Commit message follows prefix: description format
  • Unit tests added/updated
  • Integration tests added (if applicable)
  • Documentation updated (if applicable)

@sagemaker-botsagemaker-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI Code Review

This PR makes torch an optional dependency in sagemaker-core, which is a good change since torch is a heavy dependency only needed for specific serializer/deserializer classes. The implementation is mostly correct but has a few issues: the exception chaining pattern loses the original traceback, the test file has a line length violation, and the importlib.reload pattern in tests can cause flaky behavior in CI.

self.convert_npy_to_tensor = from_numpy
except ImportError:
raise Exception("Unable to import pytorch.")
raise ImportError(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The raise ImportError(...) inside an except ImportError block loses the original exception context. Use raise ImportError(...) from e to preserve the exception chain, which helps with debugging:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorDeserializer: ""pip install 'sagemaker-core[torch]'"
) frome

from torch import Tensor
try:
from torch import Tensor
except ImportError:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue here — use raise ... from e to preserve the exception chain:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorSerializer: ""pip install 'sagemaker-core[torch]'"
) frome

"""Verify TorchTensorDeserializer raises ImportError with helpful message when torch is missing."""
import importlib
import sagemaker.core.deserializers.base as base_module

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This docstring exceeds the 100-character line length limit. Consider wrapping it:

deftest_torch_tensor_deserializer_raises_import_error_when_torch_missing():
"""Verify TorchTensorDeserializer raises ImportError when torch is missing."""

from sagemaker.core.serializers.base import TorchTensorSerializer

serializer = TorchTensorSerializer()
assert serializer is not None

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests (test_torch_tensor_serializer_works_when_torch_installed and test_torch_tensor_deserializer_works_when_torch_installed) will fail in CI environments where torch is not installed. Since torch is now optional, the test environment may not have it. Consider guarding these with pytest.importorskip("torch") at the top of each test:

deftest_torch_tensor_serializer_works_when_torch_installed():
pytest.importorskip("torch")
...

"pylint>=3.0.0, <4.0.0"
]
torch = [
"torch>=1.9.0",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The all extras group duplicates the torch dependency string. If more optional dependencies are added later, this will need manual sync. Consider referencing the torch extra from all:

all = [
"sagemaker-core[torch]",
]

This keeps all as a meta-extra that automatically includes everything.

from __future__ import absolute_import

import sys
from unittest.mock import patch, MagicMock

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: MagicMock is imported but never used. Remove the unused import.

@awsaws deleted a comment from sagemaker-botMar 31, 2026
@aviruthen

Copy link
Copy Markdown
CollaboratorAuthor

🤖 Iteration #1 — Review Comments Addressed

Description

Make torch an optional dependency in sagemaker-core instead of a required one.

The torch>=1.9.0 dependency was listed as a hard/required dependency, but torch is only used in a few places where imports are already lazy/conditional:

  1. TorchTensorSerializer.__init__ - lazy from torch import Tensor
  2. TorchTensorDeserializer.__init__ - lazy from torch import from_numpy
  3. torchrun_driver.py - runs inside a training container, not on the user's machine

This change significantly reduces the install footprint of sagemaker-core for users who don't need torch functionality.

Changes Made

  • sagemaker-core/pyproject.toml: torch is already in [project.optional-dependencies] under torch and all extras. Updated all to reference sagemaker-core[torch] instead of duplicating the dependency string.
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserved exception chain with raise ... from e in TorchTensorSerializer.__init__.
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserved exception chain with raise ... from e in TorchTensorDeserializer.__init__.
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fixed docstring line length, added pytest.importorskip("torch") guards for tests that require torch, and removed unused MagicMock import.

Installation

Users who need torch functionality can install it via:

pip install 'sagemaker-core[torch]'# or
pip install 'sagemaker-core[all]'

Users who don't need torch get a leaner installation:

pip install sagemaker-core

Clear error messages are provided when attempting to use torch-dependent classes without torch installed.

Comments reviewed: 6
Files modified:sagemaker-core/pyproject.toml, sagemaker-core/src/sagemaker/core/deserializers/base.py, sagemaker-core/src/sagemaker/core/serializers/base.py, sagemaker-core/tests/unit/test_torch_optional_dependency.py

  • sagemaker-core/pyproject.toml: Change 'all' extras to reference 'torch' extra instead of duplicating the dependency string
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserve exception chain with 'from e' in TorchTensorDeserializer
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserve exception chain with 'from e' in TorchTensorSerializer
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fix docstring line length, add pytest.importorskip guards, remove unused MagicMock import

@aviruthen
aviruthen deleted the feature/torch-dependency-in-sagameker-core-to-be-made-5457 branch March 31, 2026 23:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aviruthen@sagemaker-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feature: Torch dependency in sagameker-core to be made optional (5457) - #5707

Closed
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457
Closed

feature: Torch dependency in sagameker-core to be made optional (5457)#5707
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457

Conversation

@aviruthen

Copy link
Copy Markdown
Collaborator

Description

The torch>=1.9.0 dependency in sagemaker-core's pyproject.toml is listed as a hard/required dependency, but torch is only used in 3 places: (1) TorchTensorSerializer.init which already does a lazy from torch import Tensor, (2) TorchTensorDeserializer.init which already does a lazy from torch import from_numpy, and (3) torchrun_driver.py which runs inside a training container (not on the user's machine). All torch imports are already lazy/conditional, so making torch optional requires: moving it from dependencies to [project.optional-dependencies], adding try/except DeferredError pattern to the TorchTensorDeserializer (it currently raises a bare Exception), and ensuring the serializer/deserializer classes give clear error messages when torch is not installed.

Related Issue

Related issue: 5457

Changes Made

  • sagemaker-core/pyproject.toml
  • sagemaker-core/src/sagemaker/core/serializers/base.py
  • sagemaker-core/src/sagemaker/core/deserializers/base.py
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py

AI-Generated PR

This PR was automatically generated by the PySDK Issue Agent.

  • Confidence score: 85%
  • Classification: type: feature request
  • SDK version target: V3

Merge Checklist

  • Changes are backward compatible
  • Commit message follows prefix: description format
  • Unit tests added/updated
  • Integration tests added (if applicable)
  • Documentation updated (if applicable)

@sagemaker-botsagemaker-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI Code Review

This PR makes torch an optional dependency in sagemaker-core, which is a good change since torch is a heavy dependency only needed for specific serializer/deserializer classes. The implementation is mostly correct but has a few issues: the exception chaining pattern loses the original traceback, the test file has a line length violation, and the importlib.reload pattern in tests can cause flaky behavior in CI.

self.convert_npy_to_tensor = from_numpy
except ImportError:
raise Exception("Unable to import pytorch.")
raise ImportError(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The raise ImportError(...) inside an except ImportError block loses the original exception context. Use raise ImportError(...) from e to preserve the exception chain, which helps with debugging:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorDeserializer: ""pip install 'sagemaker-core[torch]'"
) frome

from torch import Tensor
try:
from torch import Tensor
except ImportError:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue here — use raise ... from e to preserve the exception chain:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorSerializer: ""pip install 'sagemaker-core[torch]'"
) frome

"""Verify TorchTensorDeserializer raises ImportError with helpful message when torch is missing."""
import importlib
import sagemaker.core.deserializers.base as base_module

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This docstring exceeds the 100-character line length limit. Consider wrapping it:

deftest_torch_tensor_deserializer_raises_import_error_when_torch_missing():
"""Verify TorchTensorDeserializer raises ImportError when torch is missing."""

from sagemaker.core.serializers.base import TorchTensorSerializer

serializer = TorchTensorSerializer()
assert serializer is not None

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests (test_torch_tensor_serializer_works_when_torch_installed and test_torch_tensor_deserializer_works_when_torch_installed) will fail in CI environments where torch is not installed. Since torch is now optional, the test environment may not have it. Consider guarding these with pytest.importorskip("torch") at the top of each test:

deftest_torch_tensor_serializer_works_when_torch_installed():
pytest.importorskip("torch")
...

"pylint>=3.0.0, <4.0.0"
]
torch = [
"torch>=1.9.0",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The all extras group duplicates the torch dependency string. If more optional dependencies are added later, this will need manual sync. Consider referencing the torch extra from all:

all = [
"sagemaker-core[torch]",
]

This keeps all as a meta-extra that automatically includes everything.

from __future__ import absolute_import

import sys
from unittest.mock import patch, MagicMock

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: MagicMock is imported but never used. Remove the unused import.

@awsaws deleted a comment from sagemaker-botMar 31, 2026
@aviruthen

Copy link
Copy Markdown
CollaboratorAuthor

🤖 Iteration #1 — Review Comments Addressed

Description

Make torch an optional dependency in sagemaker-core instead of a required one.

The torch>=1.9.0 dependency was listed as a hard/required dependency, but torch is only used in a few places where imports are already lazy/conditional:

  1. TorchTensorSerializer.__init__ - lazy from torch import Tensor
  2. TorchTensorDeserializer.__init__ - lazy from torch import from_numpy
  3. torchrun_driver.py - runs inside a training container, not on the user's machine

This change significantly reduces the install footprint of sagemaker-core for users who don't need torch functionality.

Changes Made

  • sagemaker-core/pyproject.toml: torch is already in [project.optional-dependencies] under torch and all extras. Updated all to reference sagemaker-core[torch] instead of duplicating the dependency string.
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserved exception chain with raise ... from e in TorchTensorSerializer.__init__.
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserved exception chain with raise ... from e in TorchTensorDeserializer.__init__.
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fixed docstring line length, added pytest.importorskip("torch") guards for tests that require torch, and removed unused MagicMock import.

Installation

Users who need torch functionality can install it via:

pip install 'sagemaker-core[torch]'# or
pip install 'sagemaker-core[all]'

Users who don't need torch get a leaner installation:

pip install sagemaker-core

Clear error messages are provided when attempting to use torch-dependent classes without torch installed.

Comments reviewed: 6
Files modified:sagemaker-core/pyproject.toml, sagemaker-core/src/sagemaker/core/deserializers/base.py, sagemaker-core/src/sagemaker/core/serializers/base.py, sagemaker-core/tests/unit/test_torch_optional_dependency.py

  • sagemaker-core/pyproject.toml: Change 'all' extras to reference 'torch' extra instead of duplicating the dependency string
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserve exception chain with 'from e' in TorchTensorDeserializer
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserve exception chain with 'from e' in TorchTensorSerializer
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fix docstring line length, add pytest.importorskip guards, remove unused MagicMock import

@aviruthen
aviruthen deleted the feature/torch-dependency-in-sagameker-core-to-be-made-5457 branch March 31, 2026 23:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aviruthen@sagemaker-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feature: Torch dependency in sagameker-core to be made optional (5457) - #5707

Closed
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457
Closed

feature: Torch dependency in sagameker-core to be made optional (5457)#5707
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457

Conversation

@aviruthen

Copy link
Copy Markdown
Collaborator

Description

The torch>=1.9.0 dependency in sagemaker-core's pyproject.toml is listed as a hard/required dependency, but torch is only used in 3 places: (1) TorchTensorSerializer.init which already does a lazy from torch import Tensor, (2) TorchTensorDeserializer.init which already does a lazy from torch import from_numpy, and (3) torchrun_driver.py which runs inside a training container (not on the user's machine). All torch imports are already lazy/conditional, so making torch optional requires: moving it from dependencies to [project.optional-dependencies], adding try/except DeferredError pattern to the TorchTensorDeserializer (it currently raises a bare Exception), and ensuring the serializer/deserializer classes give clear error messages when torch is not installed.

Related Issue

Related issue: 5457

Changes Made

  • sagemaker-core/pyproject.toml
  • sagemaker-core/src/sagemaker/core/serializers/base.py
  • sagemaker-core/src/sagemaker/core/deserializers/base.py
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py

AI-Generated PR

This PR was automatically generated by the PySDK Issue Agent.

  • Confidence score: 85%
  • Classification: type: feature request
  • SDK version target: V3

Merge Checklist

  • Changes are backward compatible
  • Commit message follows prefix: description format
  • Unit tests added/updated
  • Integration tests added (if applicable)
  • Documentation updated (if applicable)

@sagemaker-botsagemaker-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI Code Review

This PR makes torch an optional dependency in sagemaker-core, which is a good change since torch is a heavy dependency only needed for specific serializer/deserializer classes. The implementation is mostly correct but has a few issues: the exception chaining pattern loses the original traceback, the test file has a line length violation, and the importlib.reload pattern in tests can cause flaky behavior in CI.

self.convert_npy_to_tensor = from_numpy
except ImportError:
raise Exception("Unable to import pytorch.")
raise ImportError(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The raise ImportError(...) inside an except ImportError block loses the original exception context. Use raise ImportError(...) from e to preserve the exception chain, which helps with debugging:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorDeserializer: ""pip install 'sagemaker-core[torch]'"
) frome

from torch import Tensor
try:
from torch import Tensor
except ImportError:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue here — use raise ... from e to preserve the exception chain:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorSerializer: ""pip install 'sagemaker-core[torch]'"
) frome

"""Verify TorchTensorDeserializer raises ImportError with helpful message when torch is missing."""
import importlib
import sagemaker.core.deserializers.base as base_module

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This docstring exceeds the 100-character line length limit. Consider wrapping it:

deftest_torch_tensor_deserializer_raises_import_error_when_torch_missing():
"""Verify TorchTensorDeserializer raises ImportError when torch is missing."""

from sagemaker.core.serializers.base import TorchTensorSerializer

serializer = TorchTensorSerializer()
assert serializer is not None

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests (test_torch_tensor_serializer_works_when_torch_installed and test_torch_tensor_deserializer_works_when_torch_installed) will fail in CI environments where torch is not installed. Since torch is now optional, the test environment may not have it. Consider guarding these with pytest.importorskip("torch") at the top of each test:

deftest_torch_tensor_serializer_works_when_torch_installed():
pytest.importorskip("torch")
...

"pylint>=3.0.0, <4.0.0"
]
torch = [
"torch>=1.9.0",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The all extras group duplicates the torch dependency string. If more optional dependencies are added later, this will need manual sync. Consider referencing the torch extra from all:

all = [
"sagemaker-core[torch]",
]

This keeps all as a meta-extra that automatically includes everything.

from __future__ import absolute_import

import sys
from unittest.mock import patch, MagicMock

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: MagicMock is imported but never used. Remove the unused import.

@awsaws deleted a comment from sagemaker-botMar 31, 2026
@aviruthen

Copy link
Copy Markdown
CollaboratorAuthor

🤖 Iteration #1 — Review Comments Addressed

Description

Make torch an optional dependency in sagemaker-core instead of a required one.

The torch>=1.9.0 dependency was listed as a hard/required dependency, but torch is only used in a few places where imports are already lazy/conditional:

  1. TorchTensorSerializer.__init__ - lazy from torch import Tensor
  2. TorchTensorDeserializer.__init__ - lazy from torch import from_numpy
  3. torchrun_driver.py - runs inside a training container, not on the user's machine

This change significantly reduces the install footprint of sagemaker-core for users who don't need torch functionality.

Changes Made

  • sagemaker-core/pyproject.toml: torch is already in [project.optional-dependencies] under torch and all extras. Updated all to reference sagemaker-core[torch] instead of duplicating the dependency string.
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserved exception chain with raise ... from e in TorchTensorSerializer.__init__.
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserved exception chain with raise ... from e in TorchTensorDeserializer.__init__.
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fixed docstring line length, added pytest.importorskip("torch") guards for tests that require torch, and removed unused MagicMock import.

Installation

Users who need torch functionality can install it via:

pip install 'sagemaker-core[torch]'# or
pip install 'sagemaker-core[all]'

Users who don't need torch get a leaner installation:

pip install sagemaker-core

Clear error messages are provided when attempting to use torch-dependent classes without torch installed.

Comments reviewed: 6
Files modified:sagemaker-core/pyproject.toml, sagemaker-core/src/sagemaker/core/deserializers/base.py, sagemaker-core/src/sagemaker/core/serializers/base.py, sagemaker-core/tests/unit/test_torch_optional_dependency.py

  • sagemaker-core/pyproject.toml: Change 'all' extras to reference 'torch' extra instead of duplicating the dependency string
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserve exception chain with 'from e' in TorchTensorDeserializer
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserve exception chain with 'from e' in TorchTensorSerializer
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fix docstring line length, add pytest.importorskip guards, remove unused MagicMock import

@aviruthen
aviruthen deleted the feature/torch-dependency-in-sagameker-core-to-be-made-5457 branch March 31, 2026 23:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aviruthen@sagemaker-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feature: Torch dependency in sagameker-core to be made optional (5457) - #5707

Closed
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457
Closed

feature: Torch dependency in sagameker-core to be made optional (5457)#5707
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457

Conversation

@aviruthen

Copy link
Copy Markdown
Collaborator

Description

The torch>=1.9.0 dependency in sagemaker-core's pyproject.toml is listed as a hard/required dependency, but torch is only used in 3 places: (1) TorchTensorSerializer.init which already does a lazy from torch import Tensor, (2) TorchTensorDeserializer.init which already does a lazy from torch import from_numpy, and (3) torchrun_driver.py which runs inside a training container (not on the user's machine). All torch imports are already lazy/conditional, so making torch optional requires: moving it from dependencies to [project.optional-dependencies], adding try/except DeferredError pattern to the TorchTensorDeserializer (it currently raises a bare Exception), and ensuring the serializer/deserializer classes give clear error messages when torch is not installed.

Related Issue

Related issue: 5457

Changes Made

  • sagemaker-core/pyproject.toml
  • sagemaker-core/src/sagemaker/core/serializers/base.py
  • sagemaker-core/src/sagemaker/core/deserializers/base.py
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py

AI-Generated PR

This PR was automatically generated by the PySDK Issue Agent.

  • Confidence score: 85%
  • Classification: type: feature request
  • SDK version target: V3

Merge Checklist

  • Changes are backward compatible
  • Commit message follows prefix: description format
  • Unit tests added/updated
  • Integration tests added (if applicable)
  • Documentation updated (if applicable)

@sagemaker-botsagemaker-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI Code Review

This PR makes torch an optional dependency in sagemaker-core, which is a good change since torch is a heavy dependency only needed for specific serializer/deserializer classes. The implementation is mostly correct but has a few issues: the exception chaining pattern loses the original traceback, the test file has a line length violation, and the importlib.reload pattern in tests can cause flaky behavior in CI.

self.convert_npy_to_tensor = from_numpy
except ImportError:
raise Exception("Unable to import pytorch.")
raise ImportError(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The raise ImportError(...) inside an except ImportError block loses the original exception context. Use raise ImportError(...) from e to preserve the exception chain, which helps with debugging:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorDeserializer: ""pip install 'sagemaker-core[torch]'"
) frome

from torch import Tensor
try:
from torch import Tensor
except ImportError:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue here — use raise ... from e to preserve the exception chain:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorSerializer: ""pip install 'sagemaker-core[torch]'"
) frome

"""Verify TorchTensorDeserializer raises ImportError with helpful message when torch is missing."""
import importlib
import sagemaker.core.deserializers.base as base_module

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This docstring exceeds the 100-character line length limit. Consider wrapping it:

deftest_torch_tensor_deserializer_raises_import_error_when_torch_missing():
"""Verify TorchTensorDeserializer raises ImportError when torch is missing."""

from sagemaker.core.serializers.base import TorchTensorSerializer

serializer = TorchTensorSerializer()
assert serializer is not None

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests (test_torch_tensor_serializer_works_when_torch_installed and test_torch_tensor_deserializer_works_when_torch_installed) will fail in CI environments where torch is not installed. Since torch is now optional, the test environment may not have it. Consider guarding these with pytest.importorskip("torch") at the top of each test:

deftest_torch_tensor_serializer_works_when_torch_installed():
pytest.importorskip("torch")
...

"pylint>=3.0.0, <4.0.0"
]
torch = [
"torch>=1.9.0",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The all extras group duplicates the torch dependency string. If more optional dependencies are added later, this will need manual sync. Consider referencing the torch extra from all:

all = [
"sagemaker-core[torch]",
]

This keeps all as a meta-extra that automatically includes everything.

from __future__ import absolute_import

import sys
from unittest.mock import patch, MagicMock

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: MagicMock is imported but never used. Remove the unused import.

@awsaws deleted a comment from sagemaker-botMar 31, 2026
@aviruthen

Copy link
Copy Markdown
CollaboratorAuthor

🤖 Iteration #1 — Review Comments Addressed

Description

Make torch an optional dependency in sagemaker-core instead of a required one.

The torch>=1.9.0 dependency was listed as a hard/required dependency, but torch is only used in a few places where imports are already lazy/conditional:

  1. TorchTensorSerializer.__init__ - lazy from torch import Tensor
  2. TorchTensorDeserializer.__init__ - lazy from torch import from_numpy
  3. torchrun_driver.py - runs inside a training container, not on the user's machine

This change significantly reduces the install footprint of sagemaker-core for users who don't need torch functionality.

Changes Made

  • sagemaker-core/pyproject.toml: torch is already in [project.optional-dependencies] under torch and all extras. Updated all to reference sagemaker-core[torch] instead of duplicating the dependency string.
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserved exception chain with raise ... from e in TorchTensorSerializer.__init__.
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserved exception chain with raise ... from e in TorchTensorDeserializer.__init__.
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fixed docstring line length, added pytest.importorskip("torch") guards for tests that require torch, and removed unused MagicMock import.

Installation

Users who need torch functionality can install it via:

pip install 'sagemaker-core[torch]'# or
pip install 'sagemaker-core[all]'

Users who don't need torch get a leaner installation:

pip install sagemaker-core

Clear error messages are provided when attempting to use torch-dependent classes without torch installed.

Comments reviewed: 6
Files modified:sagemaker-core/pyproject.toml, sagemaker-core/src/sagemaker/core/deserializers/base.py, sagemaker-core/src/sagemaker/core/serializers/base.py, sagemaker-core/tests/unit/test_torch_optional_dependency.py

  • sagemaker-core/pyproject.toml: Change 'all' extras to reference 'torch' extra instead of duplicating the dependency string
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserve exception chain with 'from e' in TorchTensorDeserializer
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserve exception chain with 'from e' in TorchTensorSerializer
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fix docstring line length, add pytest.importorskip guards, remove unused MagicMock import

@aviruthen
aviruthen deleted the feature/torch-dependency-in-sagameker-core-to-be-made-5457 branch March 31, 2026 23:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aviruthen@sagemaker-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feature: Torch dependency in sagameker-core to be made optional (5457) - #5707

Closed
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457
Closed

feature: Torch dependency in sagameker-core to be made optional (5457)#5707
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457

Conversation

@aviruthen

Copy link
Copy Markdown
Collaborator

Description

The torch>=1.9.0 dependency in sagemaker-core's pyproject.toml is listed as a hard/required dependency, but torch is only used in 3 places: (1) TorchTensorSerializer.init which already does a lazy from torch import Tensor, (2) TorchTensorDeserializer.init which already does a lazy from torch import from_numpy, and (3) torchrun_driver.py which runs inside a training container (not on the user's machine). All torch imports are already lazy/conditional, so making torch optional requires: moving it from dependencies to [project.optional-dependencies], adding try/except DeferredError pattern to the TorchTensorDeserializer (it currently raises a bare Exception), and ensuring the serializer/deserializer classes give clear error messages when torch is not installed.

Related Issue

Related issue: 5457

Changes Made

  • sagemaker-core/pyproject.toml
  • sagemaker-core/src/sagemaker/core/serializers/base.py
  • sagemaker-core/src/sagemaker/core/deserializers/base.py
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py

AI-Generated PR

This PR was automatically generated by the PySDK Issue Agent.

  • Confidence score: 85%
  • Classification: type: feature request
  • SDK version target: V3

Merge Checklist

  • Changes are backward compatible
  • Commit message follows prefix: description format
  • Unit tests added/updated
  • Integration tests added (if applicable)
  • Documentation updated (if applicable)

@sagemaker-botsagemaker-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI Code Review

This PR makes torch an optional dependency in sagemaker-core, which is a good change since torch is a heavy dependency only needed for specific serializer/deserializer classes. The implementation is mostly correct but has a few issues: the exception chaining pattern loses the original traceback, the test file has a line length violation, and the importlib.reload pattern in tests can cause flaky behavior in CI.

self.convert_npy_to_tensor = from_numpy
except ImportError:
raise Exception("Unable to import pytorch.")
raise ImportError(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The raise ImportError(...) inside an except ImportError block loses the original exception context. Use raise ImportError(...) from e to preserve the exception chain, which helps with debugging:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorDeserializer: ""pip install 'sagemaker-core[torch]'"
) frome

from torch import Tensor
try:
from torch import Tensor
except ImportError:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue here — use raise ... from e to preserve the exception chain:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorSerializer: ""pip install 'sagemaker-core[torch]'"
) frome

"""Verify TorchTensorDeserializer raises ImportError with helpful message when torch is missing."""
import importlib
import sagemaker.core.deserializers.base as base_module

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This docstring exceeds the 100-character line length limit. Consider wrapping it:

deftest_torch_tensor_deserializer_raises_import_error_when_torch_missing():
"""Verify TorchTensorDeserializer raises ImportError when torch is missing."""

from sagemaker.core.serializers.base import TorchTensorSerializer

serializer = TorchTensorSerializer()
assert serializer is not None

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests (test_torch_tensor_serializer_works_when_torch_installed and test_torch_tensor_deserializer_works_when_torch_installed) will fail in CI environments where torch is not installed. Since torch is now optional, the test environment may not have it. Consider guarding these with pytest.importorskip("torch") at the top of each test:

deftest_torch_tensor_serializer_works_when_torch_installed():
pytest.importorskip("torch")
...

"pylint>=3.0.0, <4.0.0"
]
torch = [
"torch>=1.9.0",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The all extras group duplicates the torch dependency string. If more optional dependencies are added later, this will need manual sync. Consider referencing the torch extra from all:

all = [
"sagemaker-core[torch]",
]

This keeps all as a meta-extra that automatically includes everything.

from __future__ import absolute_import

import sys
from unittest.mock import patch, MagicMock

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: MagicMock is imported but never used. Remove the unused import.

@awsaws deleted a comment from sagemaker-botMar 31, 2026
@aviruthen

Copy link
Copy Markdown
CollaboratorAuthor

🤖 Iteration #1 — Review Comments Addressed

Description

Make torch an optional dependency in sagemaker-core instead of a required one.

The torch>=1.9.0 dependency was listed as a hard/required dependency, but torch is only used in a few places where imports are already lazy/conditional:

  1. TorchTensorSerializer.__init__ - lazy from torch import Tensor
  2. TorchTensorDeserializer.__init__ - lazy from torch import from_numpy
  3. torchrun_driver.py - runs inside a training container, not on the user's machine

This change significantly reduces the install footprint of sagemaker-core for users who don't need torch functionality.

Changes Made

  • sagemaker-core/pyproject.toml: torch is already in [project.optional-dependencies] under torch and all extras. Updated all to reference sagemaker-core[torch] instead of duplicating the dependency string.
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserved exception chain with raise ... from e in TorchTensorSerializer.__init__.
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserved exception chain with raise ... from e in TorchTensorDeserializer.__init__.
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fixed docstring line length, added pytest.importorskip("torch") guards for tests that require torch, and removed unused MagicMock import.

Installation

Users who need torch functionality can install it via:

pip install 'sagemaker-core[torch]'# or
pip install 'sagemaker-core[all]'

Users who don't need torch get a leaner installation:

pip install sagemaker-core

Clear error messages are provided when attempting to use torch-dependent classes without torch installed.

Comments reviewed: 6
Files modified:sagemaker-core/pyproject.toml, sagemaker-core/src/sagemaker/core/deserializers/base.py, sagemaker-core/src/sagemaker/core/serializers/base.py, sagemaker-core/tests/unit/test_torch_optional_dependency.py

  • sagemaker-core/pyproject.toml: Change 'all' extras to reference 'torch' extra instead of duplicating the dependency string
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserve exception chain with 'from e' in TorchTensorDeserializer
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserve exception chain with 'from e' in TorchTensorSerializer
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fix docstring line length, add pytest.importorskip guards, remove unused MagicMock import

@aviruthen
aviruthen deleted the feature/torch-dependency-in-sagameker-core-to-be-made-5457 branch March 31, 2026 23:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aviruthen@sagemaker-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feature: Torch dependency in sagameker-core to be made optional (5457) - #5707

Closed
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457
Closed

feature: Torch dependency in sagameker-core to be made optional (5457)#5707
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457

Conversation

@aviruthen

Copy link
Copy Markdown
Collaborator

Description

The torch>=1.9.0 dependency in sagemaker-core's pyproject.toml is listed as a hard/required dependency, but torch is only used in 3 places: (1) TorchTensorSerializer.init which already does a lazy from torch import Tensor, (2) TorchTensorDeserializer.init which already does a lazy from torch import from_numpy, and (3) torchrun_driver.py which runs inside a training container (not on the user's machine). All torch imports are already lazy/conditional, so making torch optional requires: moving it from dependencies to [project.optional-dependencies], adding try/except DeferredError pattern to the TorchTensorDeserializer (it currently raises a bare Exception), and ensuring the serializer/deserializer classes give clear error messages when torch is not installed.

Related Issue

Related issue: 5457

Changes Made

  • sagemaker-core/pyproject.toml
  • sagemaker-core/src/sagemaker/core/serializers/base.py
  • sagemaker-core/src/sagemaker/core/deserializers/base.py
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py

AI-Generated PR

This PR was automatically generated by the PySDK Issue Agent.

  • Confidence score: 85%
  • Classification: type: feature request
  • SDK version target: V3

Merge Checklist

  • Changes are backward compatible
  • Commit message follows prefix: description format
  • Unit tests added/updated
  • Integration tests added (if applicable)
  • Documentation updated (if applicable)

@sagemaker-botsagemaker-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI Code Review

This PR makes torch an optional dependency in sagemaker-core, which is a good change since torch is a heavy dependency only needed for specific serializer/deserializer classes. The implementation is mostly correct but has a few issues: the exception chaining pattern loses the original traceback, the test file has a line length violation, and the importlib.reload pattern in tests can cause flaky behavior in CI.

self.convert_npy_to_tensor = from_numpy
except ImportError:
raise Exception("Unable to import pytorch.")
raise ImportError(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The raise ImportError(...) inside an except ImportError block loses the original exception context. Use raise ImportError(...) from e to preserve the exception chain, which helps with debugging:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorDeserializer: ""pip install 'sagemaker-core[torch]'"
) frome

from torch import Tensor
try:
from torch import Tensor
except ImportError:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue here — use raise ... from e to preserve the exception chain:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorSerializer: ""pip install 'sagemaker-core[torch]'"
) frome

"""Verify TorchTensorDeserializer raises ImportError with helpful message when torch is missing."""
import importlib
import sagemaker.core.deserializers.base as base_module

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This docstring exceeds the 100-character line length limit. Consider wrapping it:

deftest_torch_tensor_deserializer_raises_import_error_when_torch_missing():
"""Verify TorchTensorDeserializer raises ImportError when torch is missing."""

from sagemaker.core.serializers.base import TorchTensorSerializer

serializer = TorchTensorSerializer()
assert serializer is not None

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests (test_torch_tensor_serializer_works_when_torch_installed and test_torch_tensor_deserializer_works_when_torch_installed) will fail in CI environments where torch is not installed. Since torch is now optional, the test environment may not have it. Consider guarding these with pytest.importorskip("torch") at the top of each test:

deftest_torch_tensor_serializer_works_when_torch_installed():
pytest.importorskip("torch")
...

"pylint>=3.0.0, <4.0.0"
]
torch = [
"torch>=1.9.0",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The all extras group duplicates the torch dependency string. If more optional dependencies are added later, this will need manual sync. Consider referencing the torch extra from all:

all = [
"sagemaker-core[torch]",
]

This keeps all as a meta-extra that automatically includes everything.

from __future__ import absolute_import

import sys
from unittest.mock import patch, MagicMock

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: MagicMock is imported but never used. Remove the unused import.

@awsaws deleted a comment from sagemaker-botMar 31, 2026
@aviruthen

Copy link
Copy Markdown
CollaboratorAuthor

🤖 Iteration #1 — Review Comments Addressed

Description

Make torch an optional dependency in sagemaker-core instead of a required one.

The torch>=1.9.0 dependency was listed as a hard/required dependency, but torch is only used in a few places where imports are already lazy/conditional:

  1. TorchTensorSerializer.__init__ - lazy from torch import Tensor
  2. TorchTensorDeserializer.__init__ - lazy from torch import from_numpy
  3. torchrun_driver.py - runs inside a training container, not on the user's machine

This change significantly reduces the install footprint of sagemaker-core for users who don't need torch functionality.

Changes Made

  • sagemaker-core/pyproject.toml: torch is already in [project.optional-dependencies] under torch and all extras. Updated all to reference sagemaker-core[torch] instead of duplicating the dependency string.
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserved exception chain with raise ... from e in TorchTensorSerializer.__init__.
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserved exception chain with raise ... from e in TorchTensorDeserializer.__init__.
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fixed docstring line length, added pytest.importorskip("torch") guards for tests that require torch, and removed unused MagicMock import.

Installation

Users who need torch functionality can install it via:

pip install 'sagemaker-core[torch]'# or
pip install 'sagemaker-core[all]'

Users who don't need torch get a leaner installation:

pip install sagemaker-core

Clear error messages are provided when attempting to use torch-dependent classes without torch installed.

Comments reviewed: 6
Files modified:sagemaker-core/pyproject.toml, sagemaker-core/src/sagemaker/core/deserializers/base.py, sagemaker-core/src/sagemaker/core/serializers/base.py, sagemaker-core/tests/unit/test_torch_optional_dependency.py

  • sagemaker-core/pyproject.toml: Change 'all' extras to reference 'torch' extra instead of duplicating the dependency string
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserve exception chain with 'from e' in TorchTensorDeserializer
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserve exception chain with 'from e' in TorchTensorSerializer
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fix docstring line length, add pytest.importorskip guards, remove unused MagicMock import

@aviruthen
aviruthen deleted the feature/torch-dependency-in-sagameker-core-to-be-made-5457 branch March 31, 2026 23:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aviruthen@sagemaker-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feature: Torch dependency in sagameker-core to be made optional (5457) - #5707

Closed
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457
Closed

feature: Torch dependency in sagameker-core to be made optional (5457)#5707
aviruthen wants to merge 2 commits into
aws:masterfrom
aviruthen:feature/torch-dependency-in-sagameker-core-to-be-made-5457

Conversation

@aviruthen

Copy link
Copy Markdown
Collaborator

Description

The torch>=1.9.0 dependency in sagemaker-core's pyproject.toml is listed as a hard/required dependency, but torch is only used in 3 places: (1) TorchTensorSerializer.init which already does a lazy from torch import Tensor, (2) TorchTensorDeserializer.init which already does a lazy from torch import from_numpy, and (3) torchrun_driver.py which runs inside a training container (not on the user's machine). All torch imports are already lazy/conditional, so making torch optional requires: moving it from dependencies to [project.optional-dependencies], adding try/except DeferredError pattern to the TorchTensorDeserializer (it currently raises a bare Exception), and ensuring the serializer/deserializer classes give clear error messages when torch is not installed.

Related Issue

Related issue: 5457

Changes Made

  • sagemaker-core/pyproject.toml
  • sagemaker-core/src/sagemaker/core/serializers/base.py
  • sagemaker-core/src/sagemaker/core/deserializers/base.py
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py

AI-Generated PR

This PR was automatically generated by the PySDK Issue Agent.

  • Confidence score: 85%
  • Classification: type: feature request
  • SDK version target: V3

Merge Checklist

  • Changes are backward compatible
  • Commit message follows prefix: description format
  • Unit tests added/updated
  • Integration tests added (if applicable)
  • Documentation updated (if applicable)

@sagemaker-botsagemaker-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI Code Review

This PR makes torch an optional dependency in sagemaker-core, which is a good change since torch is a heavy dependency only needed for specific serializer/deserializer classes. The implementation is mostly correct but has a few issues: the exception chaining pattern loses the original traceback, the test file has a line length violation, and the importlib.reload pattern in tests can cause flaky behavior in CI.

self.convert_npy_to_tensor = from_numpy
except ImportError:
raise Exception("Unable to import pytorch.")
raise ImportError(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The raise ImportError(...) inside an except ImportError block loses the original exception context. Use raise ImportError(...) from e to preserve the exception chain, which helps with debugging:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorDeserializer: ""pip install 'sagemaker-core[torch]'"
) frome

from torch import Tensor
try:
from torch import Tensor
except ImportError:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue here — use raise ... from e to preserve the exception chain:

exceptImportErrorase:
raiseImportError(
"Unable to import torch. Please install torch to use TorchTensorSerializer: ""pip install 'sagemaker-core[torch]'"
) frome

"""Verify TorchTensorDeserializer raises ImportError with helpful message when torch is missing."""
import importlib
import sagemaker.core.deserializers.base as base_module

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This docstring exceeds the 100-character line length limit. Consider wrapping it:

deftest_torch_tensor_deserializer_raises_import_error_when_torch_missing():
"""Verify TorchTensorDeserializer raises ImportError when torch is missing."""

from sagemaker.core.serializers.base import TorchTensorSerializer

serializer = TorchTensorSerializer()
assert serializer is not None

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests (test_torch_tensor_serializer_works_when_torch_installed and test_torch_tensor_deserializer_works_when_torch_installed) will fail in CI environments where torch is not installed. Since torch is now optional, the test environment may not have it. Consider guarding these with pytest.importorskip("torch") at the top of each test:

deftest_torch_tensor_serializer_works_when_torch_installed():
pytest.importorskip("torch")
...

"pylint>=3.0.0, <4.0.0"
]
torch = [
"torch>=1.9.0",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The all extras group duplicates the torch dependency string. If more optional dependencies are added later, this will need manual sync. Consider referencing the torch extra from all:

all = [
"sagemaker-core[torch]",
]

This keeps all as a meta-extra that automatically includes everything.

from __future__ import absolute_import

import sys
from unittest.mock import patch, MagicMock

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: MagicMock is imported but never used. Remove the unused import.

@awsaws deleted a comment from sagemaker-botMar 31, 2026
@aviruthen

Copy link
Copy Markdown
CollaboratorAuthor

🤖 Iteration #1 — Review Comments Addressed

Description

Make torch an optional dependency in sagemaker-core instead of a required one.

The torch>=1.9.0 dependency was listed as a hard/required dependency, but torch is only used in a few places where imports are already lazy/conditional:

  1. TorchTensorSerializer.__init__ - lazy from torch import Tensor
  2. TorchTensorDeserializer.__init__ - lazy from torch import from_numpy
  3. torchrun_driver.py - runs inside a training container, not on the user's machine

This change significantly reduces the install footprint of sagemaker-core for users who don't need torch functionality.

Changes Made

  • sagemaker-core/pyproject.toml: torch is already in [project.optional-dependencies] under torch and all extras. Updated all to reference sagemaker-core[torch] instead of duplicating the dependency string.
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserved exception chain with raise ... from e in TorchTensorSerializer.__init__.
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserved exception chain with raise ... from e in TorchTensorDeserializer.__init__.
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fixed docstring line length, added pytest.importorskip("torch") guards for tests that require torch, and removed unused MagicMock import.

Installation

Users who need torch functionality can install it via:

pip install 'sagemaker-core[torch]'# or
pip install 'sagemaker-core[all]'

Users who don't need torch get a leaner installation:

pip install sagemaker-core

Clear error messages are provided when attempting to use torch-dependent classes without torch installed.

Comments reviewed: 6
Files modified:sagemaker-core/pyproject.toml, sagemaker-core/src/sagemaker/core/deserializers/base.py, sagemaker-core/src/sagemaker/core/serializers/base.py, sagemaker-core/tests/unit/test_torch_optional_dependency.py

  • sagemaker-core/pyproject.toml: Change 'all' extras to reference 'torch' extra instead of duplicating the dependency string
  • sagemaker-core/src/sagemaker/core/deserializers/base.py: Preserve exception chain with 'from e' in TorchTensorDeserializer
  • sagemaker-core/src/sagemaker/core/serializers/base.py: Preserve exception chain with 'from e' in TorchTensorSerializer
  • sagemaker-core/tests/unit/test_torch_optional_dependency.py: Fix docstring line length, add pytest.importorskip guards, remove unused MagicMock import

@aviruthen
aviruthen deleted the feature/torch-dependency-in-sagameker-core-to-be-made-5457 branch March 31, 2026 23:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aviruthen@sagemaker-bot