Qualcomm AI Engine Direct - Quantizer refine for qat - #6513

Merged
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine
Nov 6, 2024
Merged

Qualcomm AI Engine Direct - Quantizer refine for qat#6513
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine

Conversation

@chunit-quic

Copy link
Copy Markdown
Contributor
  • Reorginize qualcomm/quantizer
  • Split quantizer/utils.py to
    -- qconfig
    -- annotators
    -- observers directory
  • Change coresponding callees
  • Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
  • Add 16a4w conv test* (It is not compared with original model)

@pytorch-bot

pytorch-botBot commented Oct 28, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

✅ No Failures

As of commit 086cca4 with merge base 41a57e6 (image):
💚 Looks good so far! There are no failures yet. 💚

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 Oct 28, 2024
@chunit-quic
chunit-quic marked this pull request as draft October 28, 2024 03:58
@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai,

We implement the draft PR for

  1. Refine API of QnnQauntizer
  2. Add more qat quant confings
  3. Add 16a4w qat conv test case

We have another local branch which is testing QAT mobilenet v2 based on it. Yet we encounter some problems.
During QAT process, the the accuracy/loss seems to be reasonable if we only quantize conv ops. Yet if we quantize any other op, accuracy/loss drop significantly. Is there any known issue for this? Or maybe it just results from some missetting form us. (We can make a patch or update the local branch here if you are insterested in it)

Thank you. :)

@cccclai

Copy link
Copy Markdown
Contributor

@navsud can you review this PR?

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

Overall LGTM.
cc: @cccclai for final approval.

from torch.ao.quantization.observer import UniformQuantizationObserverBase


class ParamObserver(UniformQuantizationObserverBase):

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.

This looks great and is generic enough to be added into torch/ao/quantization/observer.py. If possible, please move it there as a follow-up.

How about renaming it to PerChannelParamObserver() or PerChannelWeightObserver?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's great to see you like it! Change the name and add a TODO for it

qscheme=torch.per_tensor_symmetric,
ch_axis=0,
reduce_range=True,
observer=MovingAverageMinMaxObserver,

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.

This should be PerChannelMovingAverageMinMaxObserver and qscheme=torch.per_channel_symmetric?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sorry for misunderstanding. This quant config is for per tensor specifically. The per channel one is here, and we use the condition of a quantizer member function here to assign per channel quant confing.

get_default_8bit_qat_proto,
get_default_8bit_qnn_ptq_config,
get_8a8w_qnn_ptq_config,
get_8a8w_qnn_qat_config,

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.

As a follow-up PR, can we unify/simplify: get_8a8w_qnn_ptq_config() and get_8a8w_qnn_qat_config() into get_8a8w_qnn_config() with the argument is_train=True/False, which will define whether we are doing PTQ vs. QAT.

@chunit-quicchunit-quicOct 29, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No problem. We would like to keep separated at first. Once it seems to be stable we will raise a PR to merge them.

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Overall LGTM. cc: @cccclai for final approval.

Hi @navsud

Thank you very much for reviewing! We just uploaded a patch based on comments. Just two questions we would like to ask.

  1. Does QAT only work for ops with weight at this moment? I tried to do QAT for a single op add, and got complained about no parameters to be trained. Is it expected?
  2. Similar to the point 1. We are not pretty sure whether we quantize ops of mobilenetV2 properly. Accuracy drop significantly during QAT if we add quant config to any op but convolution op. More details can be found in the first comment of the PR

Thank you for reading! If anything is unclear please feel free to let me know. I will try to describe it more. :D

Joey Tsai added 3 commits November 4, 2024 17:46
- Reorginize qualcomm/quantizer
- Split quantizer/utils.py to
-- qconfig
-- annotators
-- observers directory
- Change coresponding callees
- Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
- Add 16a4w conv test* (It is not compared with original model)
- Move and rename param_observer.py to per_channel_param_observer.py
- Add todo to merge qconfig
- Add todo for per_channel_param_observer.py
@chunit-quic
chunit-quicforce-pushed the dev1/chunit/qat_quantizer_refine branch from d542309 to 0e57c97CompareNovember 4, 2024 09:47
@chunit-quicchunit-quic changed the title [Qualcomm AI Engine Direct - Quantizer refine for qat]Qualcomm AI Engine Direct - Quantizer refine for qatNov 4, 2024

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

LGTM

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai, may you take a glance at this PR when you are free, and perhas merge it, if it looks good to you? Thanks :D

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

Looks good to me - thank you for adding the feature!

@cccclai
cccclai merged commit 068f43c into pytorch:mainNov 6, 2024
@cccclai

Copy link
Copy Markdown
Contributor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

It's fine. If so just let me know what should I fix and I will do it asap. :)

@cccclai

Copy link
Copy Markdown
Contributor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

No problem. The new PR is PR6747

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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Qualcomm AI Engine Direct - Quantizer refine for qat - #6513

Merged
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine
Nov 6, 2024
Merged

Qualcomm AI Engine Direct - Quantizer refine for qat#6513
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine

Conversation

@chunit-quic

Copy link
Copy Markdown
Contributor
  • Reorginize qualcomm/quantizer
  • Split quantizer/utils.py to
    -- qconfig
    -- annotators
    -- observers directory
  • Change coresponding callees
  • Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
  • Add 16a4w conv test* (It is not compared with original model)

@pytorch-bot

pytorch-botBot commented Oct 28, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

✅ No Failures

As of commit 086cca4 with merge base 41a57e6 (image):
💚 Looks good so far! There are no failures yet. 💚

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 Oct 28, 2024
@chunit-quic
chunit-quic marked this pull request as draft October 28, 2024 03:58
@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai,

We implement the draft PR for

  1. Refine API of QnnQauntizer
  2. Add more qat quant confings
  3. Add 16a4w qat conv test case

We have another local branch which is testing QAT mobilenet v2 based on it. Yet we encounter some problems.
During QAT process, the the accuracy/loss seems to be reasonable if we only quantize conv ops. Yet if we quantize any other op, accuracy/loss drop significantly. Is there any known issue for this? Or maybe it just results from some missetting form us. (We can make a patch or update the local branch here if you are insterested in it)

Thank you. :)

@cccclai

Copy link
Copy Markdown
Contributor

@navsud can you review this PR?

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

Overall LGTM.
cc: @cccclai for final approval.

from torch.ao.quantization.observer import UniformQuantizationObserverBase


class ParamObserver(UniformQuantizationObserverBase):

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.

This looks great and is generic enough to be added into torch/ao/quantization/observer.py. If possible, please move it there as a follow-up.

How about renaming it to PerChannelParamObserver() or PerChannelWeightObserver?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's great to see you like it! Change the name and add a TODO for it

qscheme=torch.per_tensor_symmetric,
ch_axis=0,
reduce_range=True,
observer=MovingAverageMinMaxObserver,

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.

This should be PerChannelMovingAverageMinMaxObserver and qscheme=torch.per_channel_symmetric?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sorry for misunderstanding. This quant config is for per tensor specifically. The per channel one is here, and we use the condition of a quantizer member function here to assign per channel quant confing.

get_default_8bit_qat_proto,
get_default_8bit_qnn_ptq_config,
get_8a8w_qnn_ptq_config,
get_8a8w_qnn_qat_config,

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.

As a follow-up PR, can we unify/simplify: get_8a8w_qnn_ptq_config() and get_8a8w_qnn_qat_config() into get_8a8w_qnn_config() with the argument is_train=True/False, which will define whether we are doing PTQ vs. QAT.

@chunit-quicchunit-quicOct 29, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No problem. We would like to keep separated at first. Once it seems to be stable we will raise a PR to merge them.

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Overall LGTM. cc: @cccclai for final approval.

Hi @navsud

Thank you very much for reviewing! We just uploaded a patch based on comments. Just two questions we would like to ask.

  1. Does QAT only work for ops with weight at this moment? I tried to do QAT for a single op add, and got complained about no parameters to be trained. Is it expected?
  2. Similar to the point 1. We are not pretty sure whether we quantize ops of mobilenetV2 properly. Accuracy drop significantly during QAT if we add quant config to any op but convolution op. More details can be found in the first comment of the PR

Thank you for reading! If anything is unclear please feel free to let me know. I will try to describe it more. :D

Joey Tsai added 3 commits November 4, 2024 17:46
- Reorginize qualcomm/quantizer
- Split quantizer/utils.py to
-- qconfig
-- annotators
-- observers directory
- Change coresponding callees
- Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
- Add 16a4w conv test* (It is not compared with original model)
- Move and rename param_observer.py to per_channel_param_observer.py
- Add todo to merge qconfig
- Add todo for per_channel_param_observer.py
@chunit-quic
chunit-quicforce-pushed the dev1/chunit/qat_quantizer_refine branch from d542309 to 0e57c97CompareNovember 4, 2024 09:47
@chunit-quicchunit-quic changed the title [Qualcomm AI Engine Direct - Quantizer refine for qat]Qualcomm AI Engine Direct - Quantizer refine for qatNov 4, 2024

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

LGTM

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai, may you take a glance at this PR when you are free, and perhas merge it, if it looks good to you? Thanks :D

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

Looks good to me - thank you for adding the feature!

@cccclai
cccclai merged commit 068f43c into pytorch:mainNov 6, 2024
@cccclai

Copy link
Copy Markdown
Contributor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

It's fine. If so just let me know what should I fix and I will do it asap. :)

@cccclai

Copy link
Copy Markdown
Contributor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

No problem. The new PR is PR6747

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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Qualcomm AI Engine Direct - Quantizer refine for qat - #6513

Merged
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine
Nov 6, 2024
Merged

Qualcomm AI Engine Direct - Quantizer refine for qat#6513
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine

Conversation

@chunit-quic

Copy link
Copy Markdown
Contributor
  • Reorginize qualcomm/quantizer
  • Split quantizer/utils.py to
    -- qconfig
    -- annotators
    -- observers directory
  • Change coresponding callees
  • Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
  • Add 16a4w conv test* (It is not compared with original model)

@pytorch-bot

pytorch-botBot commented Oct 28, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

✅ No Failures

As of commit 086cca4 with merge base 41a57e6 (image):
💚 Looks good so far! There are no failures yet. 💚

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 Oct 28, 2024
@chunit-quic
chunit-quic marked this pull request as draft October 28, 2024 03:58
@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai,

We implement the draft PR for

  1. Refine API of QnnQauntizer
  2. Add more qat quant confings
  3. Add 16a4w qat conv test case

We have another local branch which is testing QAT mobilenet v2 based on it. Yet we encounter some problems.
During QAT process, the the accuracy/loss seems to be reasonable if we only quantize conv ops. Yet if we quantize any other op, accuracy/loss drop significantly. Is there any known issue for this? Or maybe it just results from some missetting form us. (We can make a patch or update the local branch here if you are insterested in it)

Thank you. :)

@cccclai

Copy link
Copy Markdown
Contributor

@navsud can you review this PR?

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

Overall LGTM.
cc: @cccclai for final approval.

from torch.ao.quantization.observer import UniformQuantizationObserverBase


class ParamObserver(UniformQuantizationObserverBase):

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.

This looks great and is generic enough to be added into torch/ao/quantization/observer.py. If possible, please move it there as a follow-up.

How about renaming it to PerChannelParamObserver() or PerChannelWeightObserver?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's great to see you like it! Change the name and add a TODO for it

qscheme=torch.per_tensor_symmetric,
ch_axis=0,
reduce_range=True,
observer=MovingAverageMinMaxObserver,

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.

This should be PerChannelMovingAverageMinMaxObserver and qscheme=torch.per_channel_symmetric?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sorry for misunderstanding. This quant config is for per tensor specifically. The per channel one is here, and we use the condition of a quantizer member function here to assign per channel quant confing.

get_default_8bit_qat_proto,
get_default_8bit_qnn_ptq_config,
get_8a8w_qnn_ptq_config,
get_8a8w_qnn_qat_config,

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.

As a follow-up PR, can we unify/simplify: get_8a8w_qnn_ptq_config() and get_8a8w_qnn_qat_config() into get_8a8w_qnn_config() with the argument is_train=True/False, which will define whether we are doing PTQ vs. QAT.

@chunit-quicchunit-quicOct 29, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No problem. We would like to keep separated at first. Once it seems to be stable we will raise a PR to merge them.

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Overall LGTM. cc: @cccclai for final approval.

Hi @navsud

Thank you very much for reviewing! We just uploaded a patch based on comments. Just two questions we would like to ask.

  1. Does QAT only work for ops with weight at this moment? I tried to do QAT for a single op add, and got complained about no parameters to be trained. Is it expected?
  2. Similar to the point 1. We are not pretty sure whether we quantize ops of mobilenetV2 properly. Accuracy drop significantly during QAT if we add quant config to any op but convolution op. More details can be found in the first comment of the PR

Thank you for reading! If anything is unclear please feel free to let me know. I will try to describe it more. :D

Joey Tsai added 3 commits November 4, 2024 17:46
- Reorginize qualcomm/quantizer
- Split quantizer/utils.py to
-- qconfig
-- annotators
-- observers directory
- Change coresponding callees
- Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
- Add 16a4w conv test* (It is not compared with original model)
- Move and rename param_observer.py to per_channel_param_observer.py
- Add todo to merge qconfig
- Add todo for per_channel_param_observer.py
@chunit-quic
chunit-quicforce-pushed the dev1/chunit/qat_quantizer_refine branch from d542309 to 0e57c97CompareNovember 4, 2024 09:47
@chunit-quicchunit-quic changed the title [Qualcomm AI Engine Direct - Quantizer refine for qat]Qualcomm AI Engine Direct - Quantizer refine for qatNov 4, 2024

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

LGTM

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai, may you take a glance at this PR when you are free, and perhas merge it, if it looks good to you? Thanks :D

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

Looks good to me - thank you for adding the feature!

@cccclai
cccclai merged commit 068f43c into pytorch:mainNov 6, 2024
@cccclai

Copy link
Copy Markdown
Contributor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

It's fine. If so just let me know what should I fix and I will do it asap. :)

@cccclai

Copy link
Copy Markdown
Contributor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

No problem. The new PR is PR6747

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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Qualcomm AI Engine Direct - Quantizer refine for qat - #6513

Merged
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine
Nov 6, 2024
Merged

Qualcomm AI Engine Direct - Quantizer refine for qat#6513
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine

Conversation

@chunit-quic

Copy link
Copy Markdown
Contributor
  • Reorginize qualcomm/quantizer
  • Split quantizer/utils.py to
    -- qconfig
    -- annotators
    -- observers directory
  • Change coresponding callees
  • Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
  • Add 16a4w conv test* (It is not compared with original model)

@pytorch-bot

pytorch-botBot commented Oct 28, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

✅ No Failures

As of commit 086cca4 with merge base 41a57e6 (image):
💚 Looks good so far! There are no failures yet. 💚

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 Oct 28, 2024
@chunit-quic
chunit-quic marked this pull request as draft October 28, 2024 03:58
@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai,

We implement the draft PR for

  1. Refine API of QnnQauntizer
  2. Add more qat quant confings
  3. Add 16a4w qat conv test case

We have another local branch which is testing QAT mobilenet v2 based on it. Yet we encounter some problems.
During QAT process, the the accuracy/loss seems to be reasonable if we only quantize conv ops. Yet if we quantize any other op, accuracy/loss drop significantly. Is there any known issue for this? Or maybe it just results from some missetting form us. (We can make a patch or update the local branch here if you are insterested in it)

Thank you. :)

@cccclai

Copy link
Copy Markdown
Contributor

@navsud can you review this PR?

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

Overall LGTM.
cc: @cccclai for final approval.

from torch.ao.quantization.observer import UniformQuantizationObserverBase


class ParamObserver(UniformQuantizationObserverBase):

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.

This looks great and is generic enough to be added into torch/ao/quantization/observer.py. If possible, please move it there as a follow-up.

How about renaming it to PerChannelParamObserver() or PerChannelWeightObserver?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's great to see you like it! Change the name and add a TODO for it

qscheme=torch.per_tensor_symmetric,
ch_axis=0,
reduce_range=True,
observer=MovingAverageMinMaxObserver,

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.

This should be PerChannelMovingAverageMinMaxObserver and qscheme=torch.per_channel_symmetric?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sorry for misunderstanding. This quant config is for per tensor specifically. The per channel one is here, and we use the condition of a quantizer member function here to assign per channel quant confing.

get_default_8bit_qat_proto,
get_default_8bit_qnn_ptq_config,
get_8a8w_qnn_ptq_config,
get_8a8w_qnn_qat_config,

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.

As a follow-up PR, can we unify/simplify: get_8a8w_qnn_ptq_config() and get_8a8w_qnn_qat_config() into get_8a8w_qnn_config() with the argument is_train=True/False, which will define whether we are doing PTQ vs. QAT.

@chunit-quicchunit-quicOct 29, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No problem. We would like to keep separated at first. Once it seems to be stable we will raise a PR to merge them.

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Overall LGTM. cc: @cccclai for final approval.

Hi @navsud

Thank you very much for reviewing! We just uploaded a patch based on comments. Just two questions we would like to ask.

  1. Does QAT only work for ops with weight at this moment? I tried to do QAT for a single op add, and got complained about no parameters to be trained. Is it expected?
  2. Similar to the point 1. We are not pretty sure whether we quantize ops of mobilenetV2 properly. Accuracy drop significantly during QAT if we add quant config to any op but convolution op. More details can be found in the first comment of the PR

Thank you for reading! If anything is unclear please feel free to let me know. I will try to describe it more. :D

Joey Tsai added 3 commits November 4, 2024 17:46
- Reorginize qualcomm/quantizer
- Split quantizer/utils.py to
-- qconfig
-- annotators
-- observers directory
- Change coresponding callees
- Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
- Add 16a4w conv test* (It is not compared with original model)
- Move and rename param_observer.py to per_channel_param_observer.py
- Add todo to merge qconfig
- Add todo for per_channel_param_observer.py
@chunit-quic
chunit-quicforce-pushed the dev1/chunit/qat_quantizer_refine branch from d542309 to 0e57c97CompareNovember 4, 2024 09:47
@chunit-quicchunit-quic changed the title [Qualcomm AI Engine Direct - Quantizer refine for qat]Qualcomm AI Engine Direct - Quantizer refine for qatNov 4, 2024

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

LGTM

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai, may you take a glance at this PR when you are free, and perhas merge it, if it looks good to you? Thanks :D

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

Looks good to me - thank you for adding the feature!

@cccclai
cccclai merged commit 068f43c into pytorch:mainNov 6, 2024
@cccclai

Copy link
Copy Markdown
Contributor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

It's fine. If so just let me know what should I fix and I will do it asap. :)

@cccclai

Copy link
Copy Markdown
Contributor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

No problem. The new PR is PR6747

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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Qualcomm AI Engine Direct - Quantizer refine for qat - #6513

Merged
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine
Nov 6, 2024
Merged

Qualcomm AI Engine Direct - Quantizer refine for qat#6513
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine

Conversation

@chunit-quic

Copy link
Copy Markdown
Contributor
  • Reorginize qualcomm/quantizer
  • Split quantizer/utils.py to
    -- qconfig
    -- annotators
    -- observers directory
  • Change coresponding callees
  • Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
  • Add 16a4w conv test* (It is not compared with original model)

@pytorch-bot

pytorch-botBot commented Oct 28, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

✅ No Failures

As of commit 086cca4 with merge base 41a57e6 (image):
💚 Looks good so far! There are no failures yet. 💚

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 Oct 28, 2024
@chunit-quic
chunit-quic marked this pull request as draft October 28, 2024 03:58
@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai,

We implement the draft PR for

  1. Refine API of QnnQauntizer
  2. Add more qat quant confings
  3. Add 16a4w qat conv test case

We have another local branch which is testing QAT mobilenet v2 based on it. Yet we encounter some problems.
During QAT process, the the accuracy/loss seems to be reasonable if we only quantize conv ops. Yet if we quantize any other op, accuracy/loss drop significantly. Is there any known issue for this? Or maybe it just results from some missetting form us. (We can make a patch or update the local branch here if you are insterested in it)

Thank you. :)

@cccclai

Copy link
Copy Markdown
Contributor

@navsud can you review this PR?

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

Overall LGTM.
cc: @cccclai for final approval.

from torch.ao.quantization.observer import UniformQuantizationObserverBase


class ParamObserver(UniformQuantizationObserverBase):

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.

This looks great and is generic enough to be added into torch/ao/quantization/observer.py. If possible, please move it there as a follow-up.

How about renaming it to PerChannelParamObserver() or PerChannelWeightObserver?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's great to see you like it! Change the name and add a TODO for it

qscheme=torch.per_tensor_symmetric,
ch_axis=0,
reduce_range=True,
observer=MovingAverageMinMaxObserver,

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.

This should be PerChannelMovingAverageMinMaxObserver and qscheme=torch.per_channel_symmetric?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sorry for misunderstanding. This quant config is for per tensor specifically. The per channel one is here, and we use the condition of a quantizer member function here to assign per channel quant confing.

get_default_8bit_qat_proto,
get_default_8bit_qnn_ptq_config,
get_8a8w_qnn_ptq_config,
get_8a8w_qnn_qat_config,

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.

As a follow-up PR, can we unify/simplify: get_8a8w_qnn_ptq_config() and get_8a8w_qnn_qat_config() into get_8a8w_qnn_config() with the argument is_train=True/False, which will define whether we are doing PTQ vs. QAT.

@chunit-quicchunit-quicOct 29, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No problem. We would like to keep separated at first. Once it seems to be stable we will raise a PR to merge them.

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Overall LGTM. cc: @cccclai for final approval.

Hi @navsud

Thank you very much for reviewing! We just uploaded a patch based on comments. Just two questions we would like to ask.

  1. Does QAT only work for ops with weight at this moment? I tried to do QAT for a single op add, and got complained about no parameters to be trained. Is it expected?
  2. Similar to the point 1. We are not pretty sure whether we quantize ops of mobilenetV2 properly. Accuracy drop significantly during QAT if we add quant config to any op but convolution op. More details can be found in the first comment of the PR

Thank you for reading! If anything is unclear please feel free to let me know. I will try to describe it more. :D

Joey Tsai added 3 commits November 4, 2024 17:46
- Reorginize qualcomm/quantizer
- Split quantizer/utils.py to
-- qconfig
-- annotators
-- observers directory
- Change coresponding callees
- Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
- Add 16a4w conv test* (It is not compared with original model)
- Move and rename param_observer.py to per_channel_param_observer.py
- Add todo to merge qconfig
- Add todo for per_channel_param_observer.py
@chunit-quic
chunit-quicforce-pushed the dev1/chunit/qat_quantizer_refine branch from d542309 to 0e57c97CompareNovember 4, 2024 09:47
@chunit-quicchunit-quic changed the title [Qualcomm AI Engine Direct - Quantizer refine for qat]Qualcomm AI Engine Direct - Quantizer refine for qatNov 4, 2024

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

LGTM

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai, may you take a glance at this PR when you are free, and perhas merge it, if it looks good to you? Thanks :D

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

Looks good to me - thank you for adding the feature!

@cccclai
cccclai merged commit 068f43c into pytorch:mainNov 6, 2024
@cccclai

Copy link
Copy Markdown
Contributor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

It's fine. If so just let me know what should I fix and I will do it asap. :)

@cccclai

Copy link
Copy Markdown
Contributor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

No problem. The new PR is PR6747

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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Qualcomm AI Engine Direct - Quantizer refine for qat - #6513

Merged
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine
Nov 6, 2024
Merged

Qualcomm AI Engine Direct - Quantizer refine for qat#6513
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine

Conversation

@chunit-quic

Copy link
Copy Markdown
Contributor
  • Reorginize qualcomm/quantizer
  • Split quantizer/utils.py to
    -- qconfig
    -- annotators
    -- observers directory
  • Change coresponding callees
  • Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
  • Add 16a4w conv test* (It is not compared with original model)

@pytorch-bot

pytorch-botBot commented Oct 28, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

✅ No Failures

As of commit 086cca4 with merge base 41a57e6 (image):
💚 Looks good so far! There are no failures yet. 💚

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 Oct 28, 2024
@chunit-quic
chunit-quic marked this pull request as draft October 28, 2024 03:58
@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai,

We implement the draft PR for

  1. Refine API of QnnQauntizer
  2. Add more qat quant confings
  3. Add 16a4w qat conv test case

We have another local branch which is testing QAT mobilenet v2 based on it. Yet we encounter some problems.
During QAT process, the the accuracy/loss seems to be reasonable if we only quantize conv ops. Yet if we quantize any other op, accuracy/loss drop significantly. Is there any known issue for this? Or maybe it just results from some missetting form us. (We can make a patch or update the local branch here if you are insterested in it)

Thank you. :)

@cccclai

Copy link
Copy Markdown
Contributor

@navsud can you review this PR?

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

Overall LGTM.
cc: @cccclai for final approval.

from torch.ao.quantization.observer import UniformQuantizationObserverBase


class ParamObserver(UniformQuantizationObserverBase):

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.

This looks great and is generic enough to be added into torch/ao/quantization/observer.py. If possible, please move it there as a follow-up.

How about renaming it to PerChannelParamObserver() or PerChannelWeightObserver?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's great to see you like it! Change the name and add a TODO for it

qscheme=torch.per_tensor_symmetric,
ch_axis=0,
reduce_range=True,
observer=MovingAverageMinMaxObserver,

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.

This should be PerChannelMovingAverageMinMaxObserver and qscheme=torch.per_channel_symmetric?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sorry for misunderstanding. This quant config is for per tensor specifically. The per channel one is here, and we use the condition of a quantizer member function here to assign per channel quant confing.

get_default_8bit_qat_proto,
get_default_8bit_qnn_ptq_config,
get_8a8w_qnn_ptq_config,
get_8a8w_qnn_qat_config,

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.

As a follow-up PR, can we unify/simplify: get_8a8w_qnn_ptq_config() and get_8a8w_qnn_qat_config() into get_8a8w_qnn_config() with the argument is_train=True/False, which will define whether we are doing PTQ vs. QAT.

@chunit-quicchunit-quicOct 29, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No problem. We would like to keep separated at first. Once it seems to be stable we will raise a PR to merge them.

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Overall LGTM. cc: @cccclai for final approval.

Hi @navsud

Thank you very much for reviewing! We just uploaded a patch based on comments. Just two questions we would like to ask.

  1. Does QAT only work for ops with weight at this moment? I tried to do QAT for a single op add, and got complained about no parameters to be trained. Is it expected?
  2. Similar to the point 1. We are not pretty sure whether we quantize ops of mobilenetV2 properly. Accuracy drop significantly during QAT if we add quant config to any op but convolution op. More details can be found in the first comment of the PR

Thank you for reading! If anything is unclear please feel free to let me know. I will try to describe it more. :D

Joey Tsai added 3 commits November 4, 2024 17:46
- Reorginize qualcomm/quantizer
- Split quantizer/utils.py to
-- qconfig
-- annotators
-- observers directory
- Change coresponding callees
- Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
- Add 16a4w conv test* (It is not compared with original model)
- Move and rename param_observer.py to per_channel_param_observer.py
- Add todo to merge qconfig
- Add todo for per_channel_param_observer.py
@chunit-quic
chunit-quicforce-pushed the dev1/chunit/qat_quantizer_refine branch from d542309 to 0e57c97CompareNovember 4, 2024 09:47
@chunit-quicchunit-quic changed the title [Qualcomm AI Engine Direct - Quantizer refine for qat]Qualcomm AI Engine Direct - Quantizer refine for qatNov 4, 2024

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

LGTM

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai, may you take a glance at this PR when you are free, and perhas merge it, if it looks good to you? Thanks :D

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

Looks good to me - thank you for adding the feature!

@cccclai
cccclai merged commit 068f43c into pytorch:mainNov 6, 2024
@cccclai

Copy link
Copy Markdown
Contributor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

It's fine. If so just let me know what should I fix and I will do it asap. :)

@cccclai

Copy link
Copy Markdown
Contributor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

No problem. The new PR is PR6747

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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Qualcomm AI Engine Direct - Quantizer refine for qat - #6513

Merged
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine
Nov 6, 2024
Merged

Qualcomm AI Engine Direct - Quantizer refine for qat#6513
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine

Conversation

@chunit-quic

Copy link
Copy Markdown
Contributor
  • Reorginize qualcomm/quantizer
  • Split quantizer/utils.py to
    -- qconfig
    -- annotators
    -- observers directory
  • Change coresponding callees
  • Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
  • Add 16a4w conv test* (It is not compared with original model)

@pytorch-bot

pytorch-botBot commented Oct 28, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

✅ No Failures

As of commit 086cca4 with merge base 41a57e6 (image):
💚 Looks good so far! There are no failures yet. 💚

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 Oct 28, 2024
@chunit-quic
chunit-quic marked this pull request as draft October 28, 2024 03:58
@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai,

We implement the draft PR for

  1. Refine API of QnnQauntizer
  2. Add more qat quant confings
  3. Add 16a4w qat conv test case

We have another local branch which is testing QAT mobilenet v2 based on it. Yet we encounter some problems.
During QAT process, the the accuracy/loss seems to be reasonable if we only quantize conv ops. Yet if we quantize any other op, accuracy/loss drop significantly. Is there any known issue for this? Or maybe it just results from some missetting form us. (We can make a patch or update the local branch here if you are insterested in it)

Thank you. :)

@cccclai

Copy link
Copy Markdown
Contributor

@navsud can you review this PR?

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

Overall LGTM.
cc: @cccclai for final approval.

from torch.ao.quantization.observer import UniformQuantizationObserverBase


class ParamObserver(UniformQuantizationObserverBase):

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.

This looks great and is generic enough to be added into torch/ao/quantization/observer.py. If possible, please move it there as a follow-up.

How about renaming it to PerChannelParamObserver() or PerChannelWeightObserver?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's great to see you like it! Change the name and add a TODO for it

qscheme=torch.per_tensor_symmetric,
ch_axis=0,
reduce_range=True,
observer=MovingAverageMinMaxObserver,

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.

This should be PerChannelMovingAverageMinMaxObserver and qscheme=torch.per_channel_symmetric?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sorry for misunderstanding. This quant config is for per tensor specifically. The per channel one is here, and we use the condition of a quantizer member function here to assign per channel quant confing.

get_default_8bit_qat_proto,
get_default_8bit_qnn_ptq_config,
get_8a8w_qnn_ptq_config,
get_8a8w_qnn_qat_config,

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.

As a follow-up PR, can we unify/simplify: get_8a8w_qnn_ptq_config() and get_8a8w_qnn_qat_config() into get_8a8w_qnn_config() with the argument is_train=True/False, which will define whether we are doing PTQ vs. QAT.

@chunit-quicchunit-quicOct 29, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No problem. We would like to keep separated at first. Once it seems to be stable we will raise a PR to merge them.

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Overall LGTM. cc: @cccclai for final approval.

Hi @navsud

Thank you very much for reviewing! We just uploaded a patch based on comments. Just two questions we would like to ask.

  1. Does QAT only work for ops with weight at this moment? I tried to do QAT for a single op add, and got complained about no parameters to be trained. Is it expected?
  2. Similar to the point 1. We are not pretty sure whether we quantize ops of mobilenetV2 properly. Accuracy drop significantly during QAT if we add quant config to any op but convolution op. More details can be found in the first comment of the PR

Thank you for reading! If anything is unclear please feel free to let me know. I will try to describe it more. :D

Joey Tsai added 3 commits November 4, 2024 17:46
- Reorginize qualcomm/quantizer
- Split quantizer/utils.py to
-- qconfig
-- annotators
-- observers directory
- Change coresponding callees
- Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
- Add 16a4w conv test* (It is not compared with original model)
- Move and rename param_observer.py to per_channel_param_observer.py
- Add todo to merge qconfig
- Add todo for per_channel_param_observer.py
@chunit-quic
chunit-quicforce-pushed the dev1/chunit/qat_quantizer_refine branch from d542309 to 0e57c97CompareNovember 4, 2024 09:47
@chunit-quicchunit-quic changed the title [Qualcomm AI Engine Direct - Quantizer refine for qat]Qualcomm AI Engine Direct - Quantizer refine for qatNov 4, 2024

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

LGTM

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai, may you take a glance at this PR when you are free, and perhas merge it, if it looks good to you? Thanks :D

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

Looks good to me - thank you for adding the feature!

@cccclai
cccclai merged commit 068f43c into pytorch:mainNov 6, 2024
@cccclai

Copy link
Copy Markdown
Contributor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

It's fine. If so just let me know what should I fix and I will do it asap. :)

@cccclai

Copy link
Copy Markdown
Contributor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

No problem. The new PR is PR6747

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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Qualcomm AI Engine Direct - Quantizer refine for qat - #6513

Merged
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine
Nov 6, 2024
Merged

Qualcomm AI Engine Direct - Quantizer refine for qat#6513
cccclai merged 4 commits into
pytorch:mainfrom
CodeLinaro:dev1/chunit/qat_quantizer_refine

Conversation

@chunit-quic

Copy link
Copy Markdown
Contributor
  • Reorginize qualcomm/quantizer
  • Split quantizer/utils.py to
    -- qconfig
    -- annotators
    -- observers directory
  • Change coresponding callees
  • Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
  • Add 16a4w conv test* (It is not compared with original model)

@pytorch-bot

pytorch-botBot commented Oct 28, 2024

Copy link
Copy Markdown

🔗 Helpful Links

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

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

✅ No Failures

As of commit 086cca4 with merge base 41a57e6 (image):
💚 Looks good so far! There are no failures yet. 💚

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 Oct 28, 2024
@chunit-quic
chunit-quic marked this pull request as draft October 28, 2024 03:58
@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai,

We implement the draft PR for

  1. Refine API of QnnQauntizer
  2. Add more qat quant confings
  3. Add 16a4w qat conv test case

We have another local branch which is testing QAT mobilenet v2 based on it. Yet we encounter some problems.
During QAT process, the the accuracy/loss seems to be reasonable if we only quantize conv ops. Yet if we quantize any other op, accuracy/loss drop significantly. Is there any known issue for this? Or maybe it just results from some missetting form us. (We can make a patch or update the local branch here if you are insterested in it)

Thank you. :)

@cccclai

Copy link
Copy Markdown
Contributor

@navsud can you review this PR?

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

Overall LGTM.
cc: @cccclai for final approval.

from torch.ao.quantization.observer import UniformQuantizationObserverBase


class ParamObserver(UniformQuantizationObserverBase):

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.

This looks great and is generic enough to be added into torch/ao/quantization/observer.py. If possible, please move it there as a follow-up.

How about renaming it to PerChannelParamObserver() or PerChannelWeightObserver?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It's great to see you like it! Change the name and add a TODO for it

qscheme=torch.per_tensor_symmetric,
ch_axis=0,
reduce_range=True,
observer=MovingAverageMinMaxObserver,

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.

This should be PerChannelMovingAverageMinMaxObserver and qscheme=torch.per_channel_symmetric?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sorry for misunderstanding. This quant config is for per tensor specifically. The per channel one is here, and we use the condition of a quantizer member function here to assign per channel quant confing.

get_default_8bit_qat_proto,
get_default_8bit_qnn_ptq_config,
get_8a8w_qnn_ptq_config,
get_8a8w_qnn_qat_config,

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.

As a follow-up PR, can we unify/simplify: get_8a8w_qnn_ptq_config() and get_8a8w_qnn_qat_config() into get_8a8w_qnn_config() with the argument is_train=True/False, which will define whether we are doing PTQ vs. QAT.

@chunit-quicchunit-quicOct 29, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

No problem. We would like to keep separated at first. Once it seems to be stable we will raise a PR to merge them.

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Overall LGTM. cc: @cccclai for final approval.

Hi @navsud

Thank you very much for reviewing! We just uploaded a patch based on comments. Just two questions we would like to ask.

  1. Does QAT only work for ops with weight at this moment? I tried to do QAT for a single op add, and got complained about no parameters to be trained. Is it expected?
  2. Similar to the point 1. We are not pretty sure whether we quantize ops of mobilenetV2 properly. Accuracy drop significantly during QAT if we add quant config to any op but convolution op. More details can be found in the first comment of the PR

Thank you for reading! If anything is unclear please feel free to let me know. I will try to describe it more. :D

Joey Tsai added 3 commits November 4, 2024 17:46
- Reorginize qualcomm/quantizer
- Split quantizer/utils.py to
-- qconfig
-- annotators
-- observers directory
- Change coresponding callees
- Rename get_default_Nbit_qnn_ptq_config to get_NaNw_qnn_ptq_config
- Add 16a4w conv test* (It is not compared with original model)
- Move and rename param_observer.py to per_channel_param_observer.py
- Add todo to merge qconfig
- Add todo for per_channel_param_observer.py
@chunit-quic
chunit-quicforce-pushed the dev1/chunit/qat_quantizer_refine branch from d542309 to 0e57c97CompareNovember 4, 2024 09:47
@chunit-quicchunit-quic changed the title [Qualcomm AI Engine Direct - Quantizer refine for qat]Qualcomm AI Engine Direct - Quantizer refine for qatNov 4, 2024

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

LGTM

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

Hi @cccclai, may you take a glance at this PR when you are free, and perhas merge it, if it looks good to you? Thanks :D

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

Looks good to me - thank you for adding the feature!

@cccclai
cccclai merged commit 068f43c into pytorch:mainNov 6, 2024
@cccclai

Copy link
Copy Markdown
Contributor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

I notice that I didn't import to internal...in the worst case, if this diff breaks some tests, we may need to revert and reland it...

It's fine. If so just let me know what should I fix and I will do it asap. :)

@cccclai

Copy link
Copy Markdown
Contributor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

@chunit-quic

Copy link
Copy Markdown
ContributorAuthor

@chunit-quic Unfortunately it's reverted because it breaks internal test....can you submit a PR again?

No problem. The new PR is PR6747

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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@chunit-quic@cccclai@navsud@facebook-github-bot