Fix embedding lowering crash when QNN_SDK_ROOT is unset#21051
Conversation
Summary: D110960687 (pytorch#20686) rewrote `Embedding.define_node` to select between the optimized and legacy pcq-embedding lowerings based on `is_qnn_sdk_version_less_than("2.48")`. That helper resolves the SDK version via `get_sdk_build_id`, which builds a path from `os.environ["QNN_SDK_ROOT"]`. `define_node` runs during AOT partitioning (`is_node_supported`), and AOT-only environments do not necessarily have `QNN_SDK_ROOT` set. In that case `os.path.join(os.environ.get("QNN_SDK_ROOT", None), ...)` raised `TypeError: expected str, bytes or os.PathLike object, not NoneType`, breaking every QNN lowering that contains an embedding — including the internal `test_dummy_llama_qnn_16a4w_aot_and_runtime`. Fall back to the legacy embedding lowering (valid on all QNN versions) when `QNN_SDK_ROOT` is unavailable, so the version-gated optimization is only taken when the SDK version can actually be determined. Also make `get_sdk_build_id` raise a clear `EnvironmentError` instead of a cryptic `TypeError` when the environment variable is missing. This diff was authored with Claude Code. Differential Revision: D112944232
🔗 Helpful Links🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/21051
Note: Links to docs will display an error until the docs builds have been completed. ❌ 3 New Failures, 1 Unrelated FailureAs of commit fdd05f2 with merge base a19d1ba ( NEW FAILURES - The following jobs have failed:
BROKEN TRUNK - The following job failed but were present on the merge base:👉 Rebase onto the `viable/strict` branch to avoid these failures
This comment was automatically generated by Dr. CI and updates every 15 minutes. |
|
@psiddh has exported this pull request. If you are a Meta employee, you can view the originating Diff in D112944232. |
This PR needs a
|
There was a problem hiding this comment.
Pull request overview
This PR fixes a crash in Qualcomm QNN embedding lowering during AOT partitioning when QNN_SDK_ROOT is unset, by preventing SDK-version probing in environments that don’t have an SDK path configured and by improving the error raised when the build-id helper is called without the required environment variable.
Changes:
- Make
get_sdk_build_id()explicitly raiseEnvironmentErrorwith a clear message whenQNN_SDK_ROOTis missing. - Update embedding lowering to fall back to the legacy lowering when
QNN_SDK_ROOTis unset, and only attempt the QNN 2.48+ optimized lowering when the SDK root is available.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| backends/qualcomm/utils/check_qnn_version.py | Adds an explicit environment-variable check and clearer exception for SDK build-id lookup. |
| backends/qualcomm/builders/op_embedding.py | Avoids version-gated optimized embedding lowering when SDK root is unavailable to prevent AOT partitioning crashes. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| # The optimized pattern requires QNN 2.48+. Resolving the SDK version | ||
| # relies on QNN_SDK_ROOT; when it is unavailable (e.g. AOT-only | ||
| # environments) fall back to the legacy lowering, which is valid on all | ||
| # QNN versions. | ||
| if not os.environ.get("QNN_SDK_ROOT") or is_qnn_sdk_version_less_than("2.48"): | ||
| return self.define_node_legacy(node, nodes_to_wrappers) |
Summary:
D110960687 (#20686) rewrote
Embedding.define_nodetoselect between the optimized and legacy pcq-embedding lowerings based on
is_qnn_sdk_version_less_than("2.48"). That helper resolves the SDK version viaget_sdk_build_id, which builds a path fromos.environ["QNN_SDK_ROOT"].define_noderuns during AOT partitioning (is_node_supported), and AOT-onlyenvironments do not necessarily have
QNN_SDK_ROOTset. In that caseos.path.join(os.environ.get("QNN_SDK_ROOT", None), ...)raisedTypeError: expected str, bytes or os.PathLike object, not NoneType, breakingevery QNN lowering that contains an embedding — including the internal
test_dummy_llama_qnn_16a4w_aot_and_runtime.Fall back to the legacy embedding lowering (valid on all QNN versions) when
QNN_SDK_ROOTis unavailable, so the version-gated optimization is only takenwhen the SDK version can actually be determined. Also make
get_sdk_build_idraise a clear
EnvironmentErrorinstead of a crypticTypeErrorwhen theenvironment variable is missing.
This diff was authored with Claude Code.
Differential Revision: D112944232