Skip to content

Load a method whose constant name collides with another method's - #21706

Open
shoumikhin wants to merge 1 commit into
pytorch:mainfrom
shoumikhin:cuda-constant-fqn-collision
Open

Load a method whose constant name collides with another method's#21706
shoumikhin wants to merge 1 commit into
pytorch:mainfrom
shoumikhin:cuda-constant-fqn-collision

Conversation

@shoumikhin

Copy link
Copy Markdown
Contributor

The problem

A program can hold several methods, for example one that fills a cache from a prompt and one
that runs a single step. The CUDA delegate can share a constant between them so one copy of a
weight serves every method that uses it. Sharing is keyed on the constant's name.

That key is not unique. A constant lifted out of a graph is named by its position within one
compiled module, so the first method's third constant and the second method's third constant are
both called _tensor_constant2, and they usually hold different data. Loading such a program
fails:

Constant '_tensor_constant2': size mismatch at dim 0 (cached=8448, new=6656)
Constant '_tensor_constant2' in method 'decode' is incompatible with the cached version
  from a previous method. Refusing to share.

The program is fine. Each method carries its own copy of the constant and can run with it. Only
the attempt to treat two unrelated tensors as one fails.

The change

Refusing to alias mismatched storage is correct, so that check stays. What changes is the
response: decline to share that one constant and let the method use its own copy, rather than
failing the load for the whole program. Constants that do match go on being shared exactly as
before, so a program with no collisions behaves identically.

One detail matters for correctness. The cache lookup runs before the tensors can be compared, so
a name match is only provisional at that point. A constant rejected after extraction has to be
left out of the user-managed pairs too, otherwise the method is pointed at a tensor it did not
ask for.

Scope

This fixes the load failure and nothing else. On the program used to test it, the run is not yet
deterministic across repeats, and that is also true before this change when sharing is turned
off, so it is a separate pre-existing issue rather than something this introduces or resolves.

Testing

Built the CUDA delegate from source on Linux x86_64 and ran a three-method program whose methods
have colliding constant names, comparing the same program and runner against an unmodified
delegate:

unmodified, sharing on:   load fails, no method runs
unmodified, sharing off:  loads, all three methods run
this change, sharing on:  loads, all three methods run

The first row is the failure above. The second shows the program itself is loadable, which is
what makes failing the load the wrong response.

Loading a multi-method program with cross-method weight sharing can fail:

  Constant '_tensor_constant2': size mismatch at dim 0 (cached=8448, new=6656)
  Constant '_tensor_constant2' in method 'decode' is incompatible with the
    cached version from a previous method. Refusing to share.

Constants lifted out of a graph are named by position within one compiled
module, so two methods can each own a "_tensor_constant2" holding unrelated
data. Sharing is keyed on that name, and a name alone is not evidence that two
methods refer to the same tensor.

Refusing to alias mismatched storage is right, but failing the whole load is
too strong: the method has its own copy of the constant and can use it. Decline
to share that one constant instead, and let every constant that does match go
on being shared.

The cache lookup runs before the tensors can be compared, so a name hit is
provisional. A constant rejected after extraction has to be excluded from the
user-managed pairs as well, or the method is left pointing at nothing.
Copilot AI lite review requested due to automatic review settings August 10, 2026 06:11
@pytorch-bot

pytorch-bot Bot commented Aug 10, 2026

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/21706

Note: Links to docs will display an error until the docs builds have been completed.

❌ 3 New Failures, 3 Unrelated Failures

As of commit daf2840 with merge base 48741ac (image):

NEW FAILURES - The following jobs have failed:

BROKEN TRUNK - The following jobs 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.

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Aug 10, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

Copy link
Copy Markdown

This PR needs a release notes: label

If your change should be included in the release notes (i.e. would users of this library care about this change?), please use a label starting with release notes:. This helps us keep track and include your important work in the next release notes.

To add a label, you can comment to pytorchbot, for example
@pytorchbot label "release notes: none"

For more information, see
https://github.com/pytorch/pytorch/wiki/PyTorch-AutoLabel-Bot#why-categorize-for-release-notes-and-how-does-it-work.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants