-
Notifications
You must be signed in to change notification settings - Fork 35
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Seed samples for lightning.qubit/kokkos
#1164
Conversation
lightning.qubit
lightning.qubit/kokkos
…make the generated samples deterministic (#927) ### Before submitting Please complete the following checklist when submitting a PR: - [x] All new features must include a unit test. If you've fixed a bug or added code that should be tested, add a test to the [`tests`](../tests) directory! - [x] All new functions and code must be clearly commented and documented. If you do make documentation changes, make sure that the docs build and render correctly by running `make docs`. - [x] Ensure that the test suite passes, by running `make test`. - [x] Add a new entry to the `.github/CHANGELOG.md` file, summarizing the change, and including a link back to the PR. - [x] Ensure that code is properly formatted by running `make format`. When all the above are checked, delete everything above the dashed line and fill in the pull request template. ------------------------------------------------------------------------------------------------------------ **Context:** [A while ago](PennyLaneAI/catalyst#936) a new `seed` option to `qjit` was added. The seed was used to make measurement results deterministic, but samples were still probabilistic. This is because within a `qjit` context, [measurements were controlled from the catalyst repo](https://github.com/PennyLaneAI/catalyst/blob/a580bada575793b780d5366aa77dff6157cd4f93/runtime/lib/backend/common/Utils.hpp#L274) , but samples were controlled by lightning. To resolve stochastically failing tests (i.e. flaky tests) in catalyst, we add seeding for samples in lightning. **Description of the Change:** When `qjit(seed=...)` receives a (unsigned 32 bit int) seed value from the user, the seed gets propagated through mlir and [generates a `std::mt19937` rng instance in the catalyst execution context](https://github.com/PennyLaneAI/catalyst/blob/934726fe750043886415953dbd89a4c4ddeb9a80/runtime/lib/capi/ExecutionContext.hpp#L268). This rng instance eventually becomes a field of the `Catalyst::Runtime::Simulator::LightningSimulator` (and kokkos) class [catalyst/runtime/lib/backend/lightning/lightning_dynamic/LightningSimulator.hpp](https://github.com/PennyLaneAI/catalyst/blob/a580bada575793b780d5366aa77dff6157cd4f93/runtime/lib/backend/lightning/lightning_dynamic/LightningSimulator.hpp#L54). To seed samples, catalyst uses this device rng instance on the state vector's `generate_samples` methods: PennyLaneAI/catalyst#1164. In lightning, the `generate_samples` method now takes in a seeding number. The catalyst devices pass in a seed into the lightning `generate_samples`; this seed is created deterministically from the aforementioned already seeded catalyst context rng instance. This makes the generated samples deterministc. **Benefits:** Fewer (hopefully no) stochatically failing frontend tests in catalyst. **Possible Drawbacks:** **Related GitHub Issues:** [sc-72878] --------- Co-authored-by: ringo-but-quantum <[email protected]>
…onsPI.hpp -> .....ImplementationsLM.hpp
build wheels since we are tracking a different lightning |
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## main #1164 +/- ##
=======================================
Coverage 97.86% 97.86%
=======================================
Files 76 76
Lines 10812 10812
Branches 1282 1282
=======================================
Hits 10581 10581
Misses 179 179
Partials 52 52 ☔ View full report in Codecov by Sentry. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks 🙏
Context:
There's still quite a few frontend tests stochastically failing because the
seed
option inqjit
only controls the measurements, but not the samples. We add seeding to the samples.Description of the Change:
When
qjit(seed=...)
receives a (unsigned 32 bit int) seed value from the user, the seed gets propagated through mlir and eventually becomes a field of theCatalyst::Runtime::Simulator::LightningSimulator
class, alongside the seededstd::mt19937
rng instance . This was done in #936.In #936 , the device's rng instance is used during measurements , but not during samples. This is because samples are performed from the
Pennylane::LightningQubit::Measures::Measurements
class through thegenerate_samples
methods, which is controlled by the lightning repo.To seed samples, we use the device rng instance to generate a deterministic seed to pass it onto the state vector's
generate_samples
methods. This is the only change in catalyst.In lightning, the
generate_samples
method now can take in a seeding number. The catalyst devices pass in a seed into the lightninggenerate_samples
; this seed is created deterministically from the aforementioned already seeded catalyst context rng instance. This makes the generated samples deterministc. The above is published on the lightning repo as the branch "seed_sample_lightning":PennyLaneAI/pennylane-lightning#927
PennyLaneAI/pennylane-lightning@6f3e0d5
Benefits:
Fewer (hopefully no) stochatically failing frontend tests.
Related GitHub Issues: #999
[sc-72878]