Qualcomm AI Engine Direct - alias_copy op - #10319

Merged
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy
May 23, 2025
Merged

Qualcomm AI Engine Direct - alias_copy op#10319
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy

Conversation

@winskuo-quic

Copy link
Copy Markdown
Collaborator

Summary

Remove alias_copy op.

Test plan

Add UTs to ensure alias_copy is removed.

@pytorch-bot

pytorch-botBot commented Apr 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 1 New Failure

As of commit 4b587c0 with merge base 4e38f4a (image):

NEW FAILURE - The following job has failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-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 Apr 21, 2025
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Hi @cccclai, @billmguo,
This PR is the remove alias_copy operation.
Please have a look.
Thanks

@billmguobillmguo 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.

Work for me

def test_qnn_backend_alias(self):
module = Alias() # noqa: F405
sample_input = (torch.randn(1, 10),)
self.lower_module_and_test_output(module, sample_input)

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.

Are we testing alias op should still work, meaning they're not removed?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hi @cccclai,
Thanks for reviewing the PR.
Alias op will be removed.
This test is just to show alias can be properly removed and model is still working properly.
I have added some comments under the model.

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.

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

This test it to reproduce @billmguo error.
Without adding exir_ops.edge.aten.alias_copy.default to RemoveRedundancy pass, this test will fail during qnn_partitioner where it does not have op_builder for aten.alias_copy.default.

Thanks for the suggestion. That will probably be more straight forward as the unit test is not actually running the alias_op since it is dropped during RemoveRedundancy. Maybe we can add a new class for UT, targeting whether passes are working as expected.

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@cccclaicccclai added the release notes: qualcomm Changes to the Qualcomm backend delegate label Apr 22, 2025
@cccclai

Copy link
Copy Markdown
Contributor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

Thanks for sharing the results. I think this is failing by chances. I tested locally a couple times, and it all passed. I have changed to a simpler OP instead since the purpose here is to verify alias_copy is handled properly.
Would you mind if I push another PR for UT refactor to add a new class for passes related stuff later on? I think we will need to discuss internally first on how to refactor the UT classes.
Thanks

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

Hi @cccclai, @tugsbayasgalan,

Yes I am able to reproduce the issue after bumping the torch nightly version to "dev20250422".

I believe the reason is that we are trying to convert the quant weights back to floating point during

set_parameter(param, n.args[0], self.edge_program)

However, after the bumping the torch version, it seems like the FP weights are not properly saved.
We are using the following functions to get and set parameters.

It would be appreciated if you could share the best practices on handling parameters modification.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

I think I might know why it is not updating, but I need some time to verify if it is actually the root cause as I am currently blocked by something else.
I think when we are initializing the passes, we passed the exported_program into the constructor.

kwargs["edge_program"] =exported_program

Next, during the lowering process, when decomposition is called, we get a new exported_program with a shallow copy new_state_dict. https://github.com/pytorch/pytorch/blob/ad81eeb7c7c906e0cdd04a5cc8fdb9592281c317/torch/export/exported_program.py#L880
Then, when we are running the passes, we are updating our values to old state_dict in the old exported_program.
This is why we keep on getting incorrect params during QNN op builder.

Please let me know if there's anything that is still unclear.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

Ahh this makes sense. You should always work with state_dict of ep after running decompositions because the state dict can change after decompositions.

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

Hi @tugsbayasgalan,
Thanks for the suggestions.
We will work on Qualcomm code to make it compatible with new export behavior.
As you mentioned, it is probably safer to work on state dict of the ep after decomposition.

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

Sorry for the delay on pushing the PR.
We came up with couple solutions and were discussing internally which one is the best to resolve the uplevel error.
We will share the PR later today.

@cccclai

Copy link
Copy Markdown
Contributor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

@winskuo-quic
winskuo-quicforce-pushed the dev1/winskuo/alias_copy branch from 24f8528 to 4b587c0CompareMay 22, 2025 03:15
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

Just rebased. Thanks for reminder

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@facebook-github-bot
facebook-github-bot merged commit f24094e into pytorch:mainMay 23, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.release notes: qualcommChanges to the Qualcomm backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@winskuo-quic@facebook-github-bot@cccclai@tugsbayasgalan@billmguo
, '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

Qualcomm AI Engine Direct - alias_copy op - #10319

Merged
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy
May 23, 2025
Merged

Qualcomm AI Engine Direct - alias_copy op#10319
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy

Conversation

@winskuo-quic

Copy link
Copy Markdown
Collaborator

Summary

Remove alias_copy op.

Test plan

Add UTs to ensure alias_copy is removed.

@pytorch-bot

pytorch-botBot commented Apr 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 1 New Failure

As of commit 4b587c0 with merge base 4e38f4a (image):

NEW FAILURE - The following job has failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-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 Apr 21, 2025
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Hi @cccclai, @billmguo,
This PR is the remove alias_copy operation.
Please have a look.
Thanks

@billmguobillmguo 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.

Work for me

def test_qnn_backend_alias(self):
module = Alias() # noqa: F405
sample_input = (torch.randn(1, 10),)
self.lower_module_and_test_output(module, sample_input)

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.

Are we testing alias op should still work, meaning they're not removed?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hi @cccclai,
Thanks for reviewing the PR.
Alias op will be removed.
This test is just to show alias can be properly removed and model is still working properly.
I have added some comments under the model.

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.

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

This test it to reproduce @billmguo error.
Without adding exir_ops.edge.aten.alias_copy.default to RemoveRedundancy pass, this test will fail during qnn_partitioner where it does not have op_builder for aten.alias_copy.default.

Thanks for the suggestion. That will probably be more straight forward as the unit test is not actually running the alias_op since it is dropped during RemoveRedundancy. Maybe we can add a new class for UT, targeting whether passes are working as expected.

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@cccclaicccclai added the release notes: qualcomm Changes to the Qualcomm backend delegate label Apr 22, 2025
@cccclai

Copy link
Copy Markdown
Contributor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

Thanks for sharing the results. I think this is failing by chances. I tested locally a couple times, and it all passed. I have changed to a simpler OP instead since the purpose here is to verify alias_copy is handled properly.
Would you mind if I push another PR for UT refactor to add a new class for passes related stuff later on? I think we will need to discuss internally first on how to refactor the UT classes.
Thanks

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

Hi @cccclai, @tugsbayasgalan,

Yes I am able to reproduce the issue after bumping the torch nightly version to "dev20250422".

I believe the reason is that we are trying to convert the quant weights back to floating point during

set_parameter(param, n.args[0], self.edge_program)

However, after the bumping the torch version, it seems like the FP weights are not properly saved.
We are using the following functions to get and set parameters.

It would be appreciated if you could share the best practices on handling parameters modification.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

I think I might know why it is not updating, but I need some time to verify if it is actually the root cause as I am currently blocked by something else.
I think when we are initializing the passes, we passed the exported_program into the constructor.

kwargs["edge_program"] =exported_program

Next, during the lowering process, when decomposition is called, we get a new exported_program with a shallow copy new_state_dict. https://github.com/pytorch/pytorch/blob/ad81eeb7c7c906e0cdd04a5cc8fdb9592281c317/torch/export/exported_program.py#L880
Then, when we are running the passes, we are updating our values to old state_dict in the old exported_program.
This is why we keep on getting incorrect params during QNN op builder.

Please let me know if there's anything that is still unclear.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

Ahh this makes sense. You should always work with state_dict of ep after running decompositions because the state dict can change after decompositions.

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

Hi @tugsbayasgalan,
Thanks for the suggestions.
We will work on Qualcomm code to make it compatible with new export behavior.
As you mentioned, it is probably safer to work on state dict of the ep after decomposition.

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

Sorry for the delay on pushing the PR.
We came up with couple solutions and were discussing internally which one is the best to resolve the uplevel error.
We will share the PR later today.

@cccclai

Copy link
Copy Markdown
Contributor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

@winskuo-quic
winskuo-quicforce-pushed the dev1/winskuo/alias_copy branch from 24f8528 to 4b587c0CompareMay 22, 2025 03:15
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

Just rebased. Thanks for reminder

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@facebook-github-bot
facebook-github-bot merged commit f24094e into pytorch:mainMay 23, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.release notes: qualcommChanges to the Qualcomm backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@winskuo-quic@facebook-github-bot@cccclai@tugsbayasgalan@billmguo
, '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

Qualcomm AI Engine Direct - alias_copy op - #10319

Merged
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy
May 23, 2025
Merged

Qualcomm AI Engine Direct - alias_copy op#10319
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy

Conversation

@winskuo-quic

Copy link
Copy Markdown
Collaborator

Summary

Remove alias_copy op.

Test plan

Add UTs to ensure alias_copy is removed.

@pytorch-bot

pytorch-botBot commented Apr 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 1 New Failure

As of commit 4b587c0 with merge base 4e38f4a (image):

NEW FAILURE - The following job has failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-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 Apr 21, 2025
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Hi @cccclai, @billmguo,
This PR is the remove alias_copy operation.
Please have a look.
Thanks

@billmguobillmguo 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.

Work for me

def test_qnn_backend_alias(self):
module = Alias() # noqa: F405
sample_input = (torch.randn(1, 10),)
self.lower_module_and_test_output(module, sample_input)

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.

Are we testing alias op should still work, meaning they're not removed?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hi @cccclai,
Thanks for reviewing the PR.
Alias op will be removed.
This test is just to show alias can be properly removed and model is still working properly.
I have added some comments under the model.

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.

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

This test it to reproduce @billmguo error.
Without adding exir_ops.edge.aten.alias_copy.default to RemoveRedundancy pass, this test will fail during qnn_partitioner where it does not have op_builder for aten.alias_copy.default.

Thanks for the suggestion. That will probably be more straight forward as the unit test is not actually running the alias_op since it is dropped during RemoveRedundancy. Maybe we can add a new class for UT, targeting whether passes are working as expected.

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@cccclaicccclai added the release notes: qualcomm Changes to the Qualcomm backend delegate label Apr 22, 2025
@cccclai

Copy link
Copy Markdown
Contributor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

Thanks for sharing the results. I think this is failing by chances. I tested locally a couple times, and it all passed. I have changed to a simpler OP instead since the purpose here is to verify alias_copy is handled properly.
Would you mind if I push another PR for UT refactor to add a new class for passes related stuff later on? I think we will need to discuss internally first on how to refactor the UT classes.
Thanks

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

Hi @cccclai, @tugsbayasgalan,

Yes I am able to reproduce the issue after bumping the torch nightly version to "dev20250422".

I believe the reason is that we are trying to convert the quant weights back to floating point during

set_parameter(param, n.args[0], self.edge_program)

However, after the bumping the torch version, it seems like the FP weights are not properly saved.
We are using the following functions to get and set parameters.

It would be appreciated if you could share the best practices on handling parameters modification.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

I think I might know why it is not updating, but I need some time to verify if it is actually the root cause as I am currently blocked by something else.
I think when we are initializing the passes, we passed the exported_program into the constructor.

kwargs["edge_program"] =exported_program

Next, during the lowering process, when decomposition is called, we get a new exported_program with a shallow copy new_state_dict. https://github.com/pytorch/pytorch/blob/ad81eeb7c7c906e0cdd04a5cc8fdb9592281c317/torch/export/exported_program.py#L880
Then, when we are running the passes, we are updating our values to old state_dict in the old exported_program.
This is why we keep on getting incorrect params during QNN op builder.

Please let me know if there's anything that is still unclear.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

Ahh this makes sense. You should always work with state_dict of ep after running decompositions because the state dict can change after decompositions.

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

Hi @tugsbayasgalan,
Thanks for the suggestions.
We will work on Qualcomm code to make it compatible with new export behavior.
As you mentioned, it is probably safer to work on state dict of the ep after decomposition.

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

Sorry for the delay on pushing the PR.
We came up with couple solutions and were discussing internally which one is the best to resolve the uplevel error.
We will share the PR later today.

@cccclai

Copy link
Copy Markdown
Contributor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

@winskuo-quic
winskuo-quicforce-pushed the dev1/winskuo/alias_copy branch from 24f8528 to 4b587c0CompareMay 22, 2025 03:15
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

Just rebased. Thanks for reminder

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@facebook-github-bot
facebook-github-bot merged commit f24094e into pytorch:mainMay 23, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.release notes: qualcommChanges to the Qualcomm backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@winskuo-quic@facebook-github-bot@cccclai@tugsbayasgalan@billmguo
, '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

Qualcomm AI Engine Direct - alias_copy op - #10319

Merged
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy
May 23, 2025
Merged

Qualcomm AI Engine Direct - alias_copy op#10319
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy

Conversation

@winskuo-quic

Copy link
Copy Markdown
Collaborator

Summary

Remove alias_copy op.

Test plan

Add UTs to ensure alias_copy is removed.

@pytorch-bot

pytorch-botBot commented Apr 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 1 New Failure

As of commit 4b587c0 with merge base 4e38f4a (image):

NEW FAILURE - The following job has failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-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 Apr 21, 2025
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Hi @cccclai, @billmguo,
This PR is the remove alias_copy operation.
Please have a look.
Thanks

@billmguobillmguo 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.

Work for me

def test_qnn_backend_alias(self):
module = Alias() # noqa: F405
sample_input = (torch.randn(1, 10),)
self.lower_module_and_test_output(module, sample_input)

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.

Are we testing alias op should still work, meaning they're not removed?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hi @cccclai,
Thanks for reviewing the PR.
Alias op will be removed.
This test is just to show alias can be properly removed and model is still working properly.
I have added some comments under the model.

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.

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

This test it to reproduce @billmguo error.
Without adding exir_ops.edge.aten.alias_copy.default to RemoveRedundancy pass, this test will fail during qnn_partitioner where it does not have op_builder for aten.alias_copy.default.

Thanks for the suggestion. That will probably be more straight forward as the unit test is not actually running the alias_op since it is dropped during RemoveRedundancy. Maybe we can add a new class for UT, targeting whether passes are working as expected.

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@cccclaicccclai added the release notes: qualcomm Changes to the Qualcomm backend delegate label Apr 22, 2025
@cccclai

Copy link
Copy Markdown
Contributor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

Thanks for sharing the results. I think this is failing by chances. I tested locally a couple times, and it all passed. I have changed to a simpler OP instead since the purpose here is to verify alias_copy is handled properly.
Would you mind if I push another PR for UT refactor to add a new class for passes related stuff later on? I think we will need to discuss internally first on how to refactor the UT classes.
Thanks

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

Hi @cccclai, @tugsbayasgalan,

Yes I am able to reproduce the issue after bumping the torch nightly version to "dev20250422".

I believe the reason is that we are trying to convert the quant weights back to floating point during

set_parameter(param, n.args[0], self.edge_program)

However, after the bumping the torch version, it seems like the FP weights are not properly saved.
We are using the following functions to get and set parameters.

It would be appreciated if you could share the best practices on handling parameters modification.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

I think I might know why it is not updating, but I need some time to verify if it is actually the root cause as I am currently blocked by something else.
I think when we are initializing the passes, we passed the exported_program into the constructor.

kwargs["edge_program"] =exported_program

Next, during the lowering process, when decomposition is called, we get a new exported_program with a shallow copy new_state_dict. https://github.com/pytorch/pytorch/blob/ad81eeb7c7c906e0cdd04a5cc8fdb9592281c317/torch/export/exported_program.py#L880
Then, when we are running the passes, we are updating our values to old state_dict in the old exported_program.
This is why we keep on getting incorrect params during QNN op builder.

Please let me know if there's anything that is still unclear.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

Ahh this makes sense. You should always work with state_dict of ep after running decompositions because the state dict can change after decompositions.

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

Hi @tugsbayasgalan,
Thanks for the suggestions.
We will work on Qualcomm code to make it compatible with new export behavior.
As you mentioned, it is probably safer to work on state dict of the ep after decomposition.

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

Sorry for the delay on pushing the PR.
We came up with couple solutions and were discussing internally which one is the best to resolve the uplevel error.
We will share the PR later today.

@cccclai

Copy link
Copy Markdown
Contributor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

@winskuo-quic
winskuo-quicforce-pushed the dev1/winskuo/alias_copy branch from 24f8528 to 4b587c0CompareMay 22, 2025 03:15
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

Just rebased. Thanks for reminder

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@facebook-github-bot
facebook-github-bot merged commit f24094e into pytorch:mainMay 23, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.release notes: qualcommChanges to the Qualcomm backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@winskuo-quic@facebook-github-bot@cccclai@tugsbayasgalan@billmguo
, '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

Qualcomm AI Engine Direct - alias_copy op - #10319

Merged
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy
May 23, 2025
Merged

Qualcomm AI Engine Direct - alias_copy op#10319
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy

Conversation

@winskuo-quic

Copy link
Copy Markdown
Collaborator

Summary

Remove alias_copy op.

Test plan

Add UTs to ensure alias_copy is removed.

@pytorch-bot

pytorch-botBot commented Apr 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 1 New Failure

As of commit 4b587c0 with merge base 4e38f4a (image):

NEW FAILURE - The following job has failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-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 Apr 21, 2025
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Hi @cccclai, @billmguo,
This PR is the remove alias_copy operation.
Please have a look.
Thanks

@billmguobillmguo 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.

Work for me

def test_qnn_backend_alias(self):
module = Alias() # noqa: F405
sample_input = (torch.randn(1, 10),)
self.lower_module_and_test_output(module, sample_input)

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.

Are we testing alias op should still work, meaning they're not removed?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hi @cccclai,
Thanks for reviewing the PR.
Alias op will be removed.
This test is just to show alias can be properly removed and model is still working properly.
I have added some comments under the model.

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.

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

This test it to reproduce @billmguo error.
Without adding exir_ops.edge.aten.alias_copy.default to RemoveRedundancy pass, this test will fail during qnn_partitioner where it does not have op_builder for aten.alias_copy.default.

Thanks for the suggestion. That will probably be more straight forward as the unit test is not actually running the alias_op since it is dropped during RemoveRedundancy. Maybe we can add a new class for UT, targeting whether passes are working as expected.

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@cccclaicccclai added the release notes: qualcomm Changes to the Qualcomm backend delegate label Apr 22, 2025
@cccclai

Copy link
Copy Markdown
Contributor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

Thanks for sharing the results. I think this is failing by chances. I tested locally a couple times, and it all passed. I have changed to a simpler OP instead since the purpose here is to verify alias_copy is handled properly.
Would you mind if I push another PR for UT refactor to add a new class for passes related stuff later on? I think we will need to discuss internally first on how to refactor the UT classes.
Thanks

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

Hi @cccclai, @tugsbayasgalan,

Yes I am able to reproduce the issue after bumping the torch nightly version to "dev20250422".

I believe the reason is that we are trying to convert the quant weights back to floating point during

set_parameter(param, n.args[0], self.edge_program)

However, after the bumping the torch version, it seems like the FP weights are not properly saved.
We are using the following functions to get and set parameters.

It would be appreciated if you could share the best practices on handling parameters modification.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

I think I might know why it is not updating, but I need some time to verify if it is actually the root cause as I am currently blocked by something else.
I think when we are initializing the passes, we passed the exported_program into the constructor.

kwargs["edge_program"] =exported_program

Next, during the lowering process, when decomposition is called, we get a new exported_program with a shallow copy new_state_dict. https://github.com/pytorch/pytorch/blob/ad81eeb7c7c906e0cdd04a5cc8fdb9592281c317/torch/export/exported_program.py#L880
Then, when we are running the passes, we are updating our values to old state_dict in the old exported_program.
This is why we keep on getting incorrect params during QNN op builder.

Please let me know if there's anything that is still unclear.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

Ahh this makes sense. You should always work with state_dict of ep after running decompositions because the state dict can change after decompositions.

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

Hi @tugsbayasgalan,
Thanks for the suggestions.
We will work on Qualcomm code to make it compatible with new export behavior.
As you mentioned, it is probably safer to work on state dict of the ep after decomposition.

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

Sorry for the delay on pushing the PR.
We came up with couple solutions and were discussing internally which one is the best to resolve the uplevel error.
We will share the PR later today.

@cccclai

Copy link
Copy Markdown
Contributor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

@winskuo-quic
winskuo-quicforce-pushed the dev1/winskuo/alias_copy branch from 24f8528 to 4b587c0CompareMay 22, 2025 03:15
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

Just rebased. Thanks for reminder

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@facebook-github-bot
facebook-github-bot merged commit f24094e into pytorch:mainMay 23, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.release notes: qualcommChanges to the Qualcomm backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@winskuo-quic@facebook-github-bot@cccclai@tugsbayasgalan@billmguo
, '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

Qualcomm AI Engine Direct - alias_copy op - #10319

Merged
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy
May 23, 2025
Merged

Qualcomm AI Engine Direct - alias_copy op#10319
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy

Conversation

@winskuo-quic

Copy link
Copy Markdown
Collaborator

Summary

Remove alias_copy op.

Test plan

Add UTs to ensure alias_copy is removed.

@pytorch-bot

pytorch-botBot commented Apr 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 1 New Failure

As of commit 4b587c0 with merge base 4e38f4a (image):

NEW FAILURE - The following job has failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-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 Apr 21, 2025
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Hi @cccclai, @billmguo,
This PR is the remove alias_copy operation.
Please have a look.
Thanks

@billmguobillmguo 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.

Work for me

def test_qnn_backend_alias(self):
module = Alias() # noqa: F405
sample_input = (torch.randn(1, 10),)
self.lower_module_and_test_output(module, sample_input)

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.

Are we testing alias op should still work, meaning they're not removed?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hi @cccclai,
Thanks for reviewing the PR.
Alias op will be removed.
This test is just to show alias can be properly removed and model is still working properly.
I have added some comments under the model.

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.

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

This test it to reproduce @billmguo error.
Without adding exir_ops.edge.aten.alias_copy.default to RemoveRedundancy pass, this test will fail during qnn_partitioner where it does not have op_builder for aten.alias_copy.default.

Thanks for the suggestion. That will probably be more straight forward as the unit test is not actually running the alias_op since it is dropped during RemoveRedundancy. Maybe we can add a new class for UT, targeting whether passes are working as expected.

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@cccclaicccclai added the release notes: qualcomm Changes to the Qualcomm backend delegate label Apr 22, 2025
@cccclai

Copy link
Copy Markdown
Contributor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

Thanks for sharing the results. I think this is failing by chances. I tested locally a couple times, and it all passed. I have changed to a simpler OP instead since the purpose here is to verify alias_copy is handled properly.
Would you mind if I push another PR for UT refactor to add a new class for passes related stuff later on? I think we will need to discuss internally first on how to refactor the UT classes.
Thanks

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

Hi @cccclai, @tugsbayasgalan,

Yes I am able to reproduce the issue after bumping the torch nightly version to "dev20250422".

I believe the reason is that we are trying to convert the quant weights back to floating point during

set_parameter(param, n.args[0], self.edge_program)

However, after the bumping the torch version, it seems like the FP weights are not properly saved.
We are using the following functions to get and set parameters.

It would be appreciated if you could share the best practices on handling parameters modification.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

I think I might know why it is not updating, but I need some time to verify if it is actually the root cause as I am currently blocked by something else.
I think when we are initializing the passes, we passed the exported_program into the constructor.

kwargs["edge_program"] =exported_program

Next, during the lowering process, when decomposition is called, we get a new exported_program with a shallow copy new_state_dict. https://github.com/pytorch/pytorch/blob/ad81eeb7c7c906e0cdd04a5cc8fdb9592281c317/torch/export/exported_program.py#L880
Then, when we are running the passes, we are updating our values to old state_dict in the old exported_program.
This is why we keep on getting incorrect params during QNN op builder.

Please let me know if there's anything that is still unclear.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

Ahh this makes sense. You should always work with state_dict of ep after running decompositions because the state dict can change after decompositions.

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

Hi @tugsbayasgalan,
Thanks for the suggestions.
We will work on Qualcomm code to make it compatible with new export behavior.
As you mentioned, it is probably safer to work on state dict of the ep after decomposition.

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

Sorry for the delay on pushing the PR.
We came up with couple solutions and were discussing internally which one is the best to resolve the uplevel error.
We will share the PR later today.

@cccclai

Copy link
Copy Markdown
Contributor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

@winskuo-quic
winskuo-quicforce-pushed the dev1/winskuo/alias_copy branch from 24f8528 to 4b587c0CompareMay 22, 2025 03:15
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

Just rebased. Thanks for reminder

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@facebook-github-bot
facebook-github-bot merged commit f24094e into pytorch:mainMay 23, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.release notes: qualcommChanges to the Qualcomm backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@winskuo-quic@facebook-github-bot@cccclai@tugsbayasgalan@billmguo
, '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

Qualcomm AI Engine Direct - alias_copy op - #10319

Merged
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy
May 23, 2025
Merged

Qualcomm AI Engine Direct - alias_copy op#10319
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy

Conversation

@winskuo-quic

Copy link
Copy Markdown
Collaborator

Summary

Remove alias_copy op.

Test plan

Add UTs to ensure alias_copy is removed.

@pytorch-bot

pytorch-botBot commented Apr 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 1 New Failure

As of commit 4b587c0 with merge base 4e38f4a (image):

NEW FAILURE - The following job has failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-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 Apr 21, 2025
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Hi @cccclai, @billmguo,
This PR is the remove alias_copy operation.
Please have a look.
Thanks

@billmguobillmguo 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.

Work for me

def test_qnn_backend_alias(self):
module = Alias() # noqa: F405
sample_input = (torch.randn(1, 10),)
self.lower_module_and_test_output(module, sample_input)

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.

Are we testing alias op should still work, meaning they're not removed?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hi @cccclai,
Thanks for reviewing the PR.
Alias op will be removed.
This test is just to show alias can be properly removed and model is still working properly.
I have added some comments under the model.

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.

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

This test it to reproduce @billmguo error.
Without adding exir_ops.edge.aten.alias_copy.default to RemoveRedundancy pass, this test will fail during qnn_partitioner where it does not have op_builder for aten.alias_copy.default.

Thanks for the suggestion. That will probably be more straight forward as the unit test is not actually running the alias_op since it is dropped during RemoveRedundancy. Maybe we can add a new class for UT, targeting whether passes are working as expected.

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@cccclaicccclai added the release notes: qualcomm Changes to the Qualcomm backend delegate label Apr 22, 2025
@cccclai

Copy link
Copy Markdown
Contributor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

Thanks for sharing the results. I think this is failing by chances. I tested locally a couple times, and it all passed. I have changed to a simpler OP instead since the purpose here is to verify alias_copy is handled properly.
Would you mind if I push another PR for UT refactor to add a new class for passes related stuff later on? I think we will need to discuss internally first on how to refactor the UT classes.
Thanks

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

Hi @cccclai, @tugsbayasgalan,

Yes I am able to reproduce the issue after bumping the torch nightly version to "dev20250422".

I believe the reason is that we are trying to convert the quant weights back to floating point during

set_parameter(param, n.args[0], self.edge_program)

However, after the bumping the torch version, it seems like the FP weights are not properly saved.
We are using the following functions to get and set parameters.

It would be appreciated if you could share the best practices on handling parameters modification.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

I think I might know why it is not updating, but I need some time to verify if it is actually the root cause as I am currently blocked by something else.
I think when we are initializing the passes, we passed the exported_program into the constructor.

kwargs["edge_program"] =exported_program

Next, during the lowering process, when decomposition is called, we get a new exported_program with a shallow copy new_state_dict. https://github.com/pytorch/pytorch/blob/ad81eeb7c7c906e0cdd04a5cc8fdb9592281c317/torch/export/exported_program.py#L880
Then, when we are running the passes, we are updating our values to old state_dict in the old exported_program.
This is why we keep on getting incorrect params during QNN op builder.

Please let me know if there's anything that is still unclear.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

Ahh this makes sense. You should always work with state_dict of ep after running decompositions because the state dict can change after decompositions.

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

Hi @tugsbayasgalan,
Thanks for the suggestions.
We will work on Qualcomm code to make it compatible with new export behavior.
As you mentioned, it is probably safer to work on state dict of the ep after decomposition.

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

Sorry for the delay on pushing the PR.
We came up with couple solutions and were discussing internally which one is the best to resolve the uplevel error.
We will share the PR later today.

@cccclai

Copy link
Copy Markdown
Contributor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

@winskuo-quic
winskuo-quicforce-pushed the dev1/winskuo/alias_copy branch from 24f8528 to 4b587c0CompareMay 22, 2025 03:15
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

Just rebased. Thanks for reminder

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@facebook-github-bot
facebook-github-bot merged commit f24094e into pytorch:mainMay 23, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.release notes: qualcommChanges to the Qualcomm backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@winskuo-quic@facebook-github-bot@cccclai@tugsbayasgalan@billmguo
, '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

Qualcomm AI Engine Direct - alias_copy op - #10319

Merged
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy
May 23, 2025
Merged

Qualcomm AI Engine Direct - alias_copy op#10319
facebook-github-bot merged 2 commits into
pytorch:mainfrom
CodeLinaro:dev1/winskuo/alias_copy

Conversation

@winskuo-quic

Copy link
Copy Markdown
Collaborator

Summary

Remove alias_copy op.

Test plan

Add UTs to ensure alias_copy is removed.

@pytorch-bot

pytorch-botBot commented Apr 21, 2025

Copy link
Copy Markdown

🔗 Helpful Links

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

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

❌ 1 New Failure

As of commit 4b587c0 with merge base 4e38f4a (image):

NEW FAILURE - The following job has failed:

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-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 Apr 21, 2025
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Hi @cccclai, @billmguo,
This PR is the remove alias_copy operation.
Please have a look.
Thanks

@billmguobillmguo 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.

Work for me

def test_qnn_backend_alias(self):
module = Alias() # noqa: F405
sample_input = (torch.randn(1, 10),)
self.lower_module_and_test_output(module, sample_input)

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.

Are we testing alias op should still work, meaning they're not removed?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Hi @cccclai,
Thanks for reviewing the PR.
Alias op will be removed.
This test is just to show alias can be properly removed and model is still working properly.
I have added some comments under the model.

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.

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

hmm, I assume this test will work regardless with or without alias_op, correct? I was thinking export the graph and run to_backend, and check there is no alias op after that.

This test it to reproduce @billmguo error.
Without adding exir_ops.edge.aten.alias_copy.default to RemoveRedundancy pass, this test will fail during qnn_partitioner where it does not have op_builder for aten.alias_copy.default.

Thanks for the suggestion. That will probably be more straight forward as the unit test is not actually running the alias_op since it is dropped during RemoveRedundancy. Maybe we can add a new class for UT, targeting whether passes are working as expected.

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@cccclaicccclai added the release notes: qualcomm Changes to the Qualcomm backend delegate label Apr 22, 2025
@cccclai

Copy link
Copy Markdown
Contributor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

It seems like the test is failing

AssertionError: False is not true : ref_output:
tensor([[ 0.5914, -0.8622, 0.0214, -0.3349, 0.0285, -0.9833, -1.2256, 0.3349,
-0.7197, 0.3278]])
model_output:
tensor([[ 0.5914, 0.5914, -1.2185, -1.2185, 0.5914, -1.2185, -1.2185, -1.2185,
-1.2185, -1.2185]])

Thanks for sharing the results. I think this is failing by chances. I tested locally a couple times, and it all passed. I have changed to a simpler OP instead since the purpose here is to verify alias_copy is handled properly.
Would you mind if I push another PR for UT refactor to add a new class for passes related stuff later on? I think we will need to discuss internally first on how to refactor the UT classes.
Thanks

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

I have been looking at the failure and still haven't made much progress. It looks like qualcomm passes do something special to exported artifact state dicts down the line. Is it accurate? Can you point to me places where you deal with module state dicts?

Hi @cccclai, @tugsbayasgalan,

Yes I am able to reproduce the issue after bumping the torch nightly version to "dev20250422".

I believe the reason is that we are trying to convert the quant weights back to floating point during

set_parameter(param, n.args[0], self.edge_program)

However, after the bumping the torch version, it seems like the FP weights are not properly saved.
We are using the following functions to get and set parameters.

It would be appreciated if you could share the best practices on handling parameters modification.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

I am still confused how this logic could break your flow tho. Before returning state dict, i just shallow copy in export meaning they should be the same state dict lol. In what part of set_parameter does it fail?

I think I might know why it is not updating, but I need some time to verify if it is actually the root cause as I am currently blocked by something else.
I think when we are initializing the passes, we passed the exported_program into the constructor.

kwargs["edge_program"] =exported_program

Next, during the lowering process, when decomposition is called, we get a new exported_program with a shallow copy new_state_dict. https://github.com/pytorch/pytorch/blob/ad81eeb7c7c906e0cdd04a5cc8fdb9592281c317/torch/export/exported_program.py#L880
Then, when we are running the passes, we are updating our values to old state_dict in the old exported_program.
This is why we keep on getting incorrect params during QNN op builder.

Please let me know if there's anything that is still unclear.
Thanks

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

Ahh this makes sense. You should always work with state_dict of ep after running decompositions because the state dict can change after decompositions.

@tugsbayasgalan

Copy link
Copy Markdown
Contributor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

@winskuo-quic Just checking in, will you be working on making the qualcomm code compatible with new export behaviour?

Hi @tugsbayasgalan,
Thanks for the suggestions.
We will work on Qualcomm code to make it compatible with new export behavior.
As you mentioned, it is probably safer to work on state dict of the ep after decomposition.

@cccclai

Copy link
Copy Markdown
Contributor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Actually the failing might due to this change #10362, can you help checking if the test is still passing with pytorch/pytorch#151436?

Any update on this change? #10362 is currently pending due to the breakage

Sorry for the delay on pushing the PR.
We came up with couple solutions and were discussing internally which one is the best to resolve the uplevel error.
We will share the PR later today.

@cccclai

Copy link
Copy Markdown
Contributor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

@winskuo-quic
winskuo-quicforce-pushed the dev1/winskuo/alias_copy branch from 24f8528 to 4b587c0CompareMay 22, 2025 03:15
@winskuo-quic

Copy link
Copy Markdown
CollaboratorAuthor

Given that CI is green again, we can resume merging PRs now. Mind rebasing? This seems to be the oldest PR that needs to land

Just rebased. Thanks for reminder

@facebook-github-bot

Copy link
Copy Markdown
Contributor

@cccclai has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@facebook-github-bot
facebook-github-bot merged commit f24094e into pytorch:mainMay 23, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.release notes: qualcommChanges to the Qualcomm backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@winskuo-quic@facebook-github-bot@cccclai@tugsbayasgalan@billmguo