Skip to content

feat(pt): add embedding sub cli for pt models#5571

Open
OutisLi wants to merge 4 commits into
deepmodeling:masterfrom
OutisLi:pr/embed
Open

feat(pt): add embedding sub cli for pt models#5571
OutisLi wants to merge 4 commits into
deepmodeling:masterfrom
OutisLi:pr/embed

Conversation

@OutisLi

@OutisLi OutisLi commented Jun 22, 2026

Copy link
Copy Markdown
Collaborator

Summary by CodeRabbit

  • New Features

    • Added dp embed CLI command to export model embeddings (descriptor, atomic feature, structural feature) to HDF5 format.
    • Added DeepPot.eval_embedding() Python API for embedding inference with configurable output dtype (fp32/fp64/native).
    • Support for multi-task model head selection via --head flag.
  • Documentation

    • Added comprehensive embedding extraction guide covering CLI usage, HDF5 output format, and Python API examples.

Comment thread source/tests/pt/model/test_embedding.py Fixed
@coderabbitai

coderabbitai Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a new dp embed CLI command and DeepEval.eval_embedding API that compute descriptor, atomic_feature, and structural_feature in a single forward pass without forces or virials. The old hook-based eval_descriptor/eval_fitting_last_layer mechanism (middle_output, RetrySignal, OOM retry) is replaced throughout the PyTorch fitting nets, atomic models, and model layer. Results are written to a gzip-compressed HDF5 file per system.

Changes

Embedding extraction feature

Layer / File(s) Summary
Fitting net: replace middle_output with return_atomic_feature
deepmd/pt/model/task/fitting.py, deepmd/pt/model/task/invar_fitting.py, deepmd/pt/model/task/dipole.py, deepmd/pt/model/task/polarizability.py, deepmd/pt/model/task/ener.py, deepmd/pt/model/task/sezm_ener.py, deepmd/pt/model/descriptor/sezm_nn/dens.py, deepmd/pt/model/atomic_model/sezm_atomic_model.py
Removes set_return_middle_output/middle_output state from GeneralFitting and SeZMDeNSFittingNet; adds return_atomic_feature: bool = False to _forward_common in all fitting nets, which now emits results["atomic_feature"] instead of results["middle_output"]; EnergyFittingNetDirect raises NotImplementedError when the flag is set.
Atomic model forward_embedding and has_embedding
deepmd/pt/model/atomic_model/base_atomic_model.py, deepmd/pt/model/atomic_model/dp_atomic_model.py, deepmd/pt/model/atomic_model/linear_atomic_model.py, deepmd/pt/model/model/dp_model.py
BaseAtomicModel gains has_embedding()/forward_embedding() stubs; DPAtomicModel gates autograd clone on return_atomic_feature, removes hook state, and implements forward_embedding with exclusion masking and structural_feature pooling; LinearEnergyAtomicModel delegates to the first embedding-capable sub-model with strict=True zip; DPModelCommon TorchScript hook methods are removed.
Model-level forward_embedding (DPModel and SeZMModel)
deepmd/pt/model/model/make_model.py, deepmd/pt/model/model/sezm_model.py
make_model.py adds a TorchScript-exported forward_embedding that builds the neighbor list and calls atomic_model.forward_embedding under no_grad; SeZMModel adds forward_embedding, threads embedding_only through forward_common/forward_common_lower/core_compute/trace_and_compile, manages a separate compiled_embedding cache, and removes dens-path eval-hook side effects.
DeepEvalBackend / DeepEval eval_embedding and PyTorch backend
deepmd/infer/deep_eval.py, deepmd/pt/infer/deep_eval.py
DeepEvalBackend gains abstract eval_embedding returning a 3-tuple; DeepEval.eval_embedding standardizes inputs and delegates; eval_descriptor/eval_fitting_last_layer gain dtype parameter; the PyTorch backend adds _EMBEDDING_DTYPE_TO_TORCH, implements eval_embedding/_eval_embedding calling model.forward_embedding and casting outputs, and rewrites the legacy methods as thin delegation wrappers removing hook/retry logic and RetrySignal.
dp embed CLI, HDF5 entrypoint, and eval_desc dtype
deepmd/main.py, deepmd/entrypoints/main.py, deepmd/entrypoints/embedding.py, deepmd/entrypoints/eval_desc.py
deepmd/main.py adds the embed subparser with model/system/output/dtype/head arguments and adds --dtype/--head to eval-desc; deepmd/entrypoints/main.py wires the embed command; embedding.py implements the full eval loop loading systems, calling eval_embedding, and writing compressed HDF5 datasets with group attributes; eval_desc.py adds dtype parameter and strips whitespace-only lines from datafile.
Documentation and tests
doc/inference/embedding.md, doc/inference/index.rst, doc/inference/python.md, doc/model/dpa4.md, doc/test/test.md, source/tests/pt/model/test_embedding.py, source/tests/pt/model/test_linear_atomic_model.py, source/tests/pt/test_eval_desc.py
Adds doc/inference/embedding.md documenting outputs and HDF5 format; updates dpa4.md, inference index, python.md, and test.md; adds test_embedding.py covering SeZM and se_e2_a embedding APIs, energy reconstruction, compiled parity, dtype propagation, entrypoint HDF5 writing, and the old-frozen-model error case; adds test_forward_embedding to linear atomic model test; updates test_eval_desc.py header; test_oom_retry.py is removed.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant main_py as main.py / entrypoints/main.py
    participant embedding_py as entrypoints/embedding.py
    participant DeepEval as DeepEval (deep_eval.py)
    participant PTDeepEval as PyTorch DeepEval (pt/infer/deep_eval.py)
    participant Model as SeZMModel / DPModel

    User->>main_py: dp embed -m model.pt -s ./data -o out.h5 --dtype fp32
    main_py->>embedding_py: embedding(model, system, output, dtype="fp32")
    loop per discovered system
        embedding_py->>embedding_py: DeepmdData(system_path)
        embedding_py->>DeepEval: eval_embedding(coords, cells, atype, dtype="fp32")
        DeepEval->>DeepEval: _standard_input(coords, cells, atype, mixed_type)
        DeepEval->>PTDeepEval: deep_eval.eval_embedding(coords, cells, atype, dtype="fp32")
        PTDeepEval->>Model: model.forward_embedding(coord, atype, box)
        Model-->>PTDeepEval: descriptor, atomic_feature, structural_feature
        PTDeepEval-->>DeepEval: float32 numpy arrays
        DeepEval-->>embedding_py: (descriptor, atomic_feature, structural_feature)
        embedding_py->>embedding_py: write HDF5 group + gzip datasets + attributes
    end
    embedding_py-->>User: out.h5
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • deepmodeling/deepmd-kit#5391: Adds eval_descriptor/eval_fitting_last_layer and the middle_output toggle via GeneralFitting.set_return_middle_output, which this PR replaces with the unified eval_embedding + return_atomic_feature/forward_embedding flow.

Suggested labels

enhancement

Suggested reviewers

  • njzjz
  • iProzd
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 57.47% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat(pt): add embedding sub cli for pt models' accurately and concisely summarizes the main change—adding a new embedding sub-command to the CLI for PyTorch models.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 6

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@deepmd/entrypoints/embedding.py`:
- Around line 116-120: The datalist.read().splitlines() call in the datafile
parsing section keeps blank lines, which can result in empty strings being
passed to DeepmdData and causing failures. Filter out blank lines when reading
from the datafile by adding a filter condition that excludes empty or
whitespace-only entries from the all_sys list. This ensures only valid system
entries are processed while preserving the original structure of the code.

In `@deepmd/pt/infer/deep_eval.py`:
- Around line 1208-1260: The eval_embedding method directly calls
self.dp.model["Default"].forward_embedding(...) which bypasses the data modifier
that would normally be applied through ModelWrapper. Add a guard condition that
checks if self.modifier is not None before proceeding with the forward_embedding
call, and raise an appropriate error or fail fast if a modifier exists, since
modifier-aware embedding processing is not yet implemented for this code path.

In `@deepmd/pt/model/atomic_model/linear_atomic_model.py`:
- Around line 341-349: Add explicit `strict=False` parameter to both zip() calls
in the list comprehensions to satisfy Ruff B905. The first zip() call combines
self.get_model_rcuts() and self.get_model_nsels(), and the second zip() call
combines self.mixed_types_list, raw_nlists, and self.get_model_sels(). Update
both invocations to include the strict parameter to explicitly indicate that the
iterables may have different lengths.

In `@deepmd/pt/model/task/fitting.py`:
- Around line 855-868: The atomic_feature tensor allocation in the
return_atomic_feature block accesses self.neuron[-1] without checking if the
neuron list is empty. When neuron=[] is configured, this causes an IndexError.
Fix this by replacing the hardcoded self.neuron[-1] with a conditional check
that determines the correct feature dimension. If self.neuron is not empty, use
self.neuron[-1], otherwise determine the feature width from an alternative
source such as the output shape of ll.call_until_last(xx) or from the
descriptor's feature dimension to ensure the atomic_feature tensor is allocated
with the correct size regardless of neuron configuration.

In `@doc/inference/embedding.md`:
- Line 44: On line 44 in the embedding.md file, remove the shell prompt marker
`$ ` from the command to comply with markdownlint rule MD014. Change `$ dp embed
--help` to just `dp embed --help` to fix the lint violation while preserving the
command documentation.

In `@source/tests/pt/model/test_embedding.py`:
- Around line 260-271: The tolerance values (rtol=1e-10 and atol=1e-12) in both
np.testing.assert_allclose calls for eval_descriptor and eval_fitting_last_layer
are too strict for float32 comparisons across separate forward passes, causing
intermittent test failures. Increase both the relative tolerance (rtol) and
absolute tolerance (atol) parameters in both assert_allclose calls to more
reasonable values that account for floating-point precision variations while
still validating correctness.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: cf1c59a0-671a-4d28-8ec5-c902cadd310c

📥 Commits

Reviewing files that changed from the base of the PR and between 03682bf and 8c191f0.

📒 Files selected for processing (30)
  • deepmd/entrypoints/embedding.py
  • deepmd/entrypoints/eval_desc.py
  • deepmd/entrypoints/main.py
  • deepmd/infer/deep_eval.py
  • deepmd/main.py
  • deepmd/pt/infer/deep_eval.py
  • deepmd/pt/model/atomic_model/base_atomic_model.py
  • deepmd/pt/model/atomic_model/dp_atomic_model.py
  • deepmd/pt/model/atomic_model/linear_atomic_model.py
  • deepmd/pt/model/atomic_model/sezm_atomic_model.py
  • deepmd/pt/model/descriptor/sezm_nn/dens.py
  • deepmd/pt/model/model/dp_model.py
  • deepmd/pt/model/model/make_model.py
  • deepmd/pt/model/model/sezm_model.py
  • deepmd/pt/model/task/dipole.py
  • deepmd/pt/model/task/ener.py
  • deepmd/pt/model/task/fitting.py
  • deepmd/pt/model/task/invar_fitting.py
  • deepmd/pt/model/task/polarizability.py
  • deepmd/pt/model/task/sezm_ener.py
  • doc/inference/embedding.md
  • doc/inference/index.rst
  • doc/inference/python.md
  • doc/model/dpa4.md
  • doc/test/test.md
  • source/tests/infer/test_models.py
  • source/tests/pt/model/test_embedding.py
  • source/tests/pt/model/test_linear_atomic_model.py
  • source/tests/pt/test_eval_desc.py
  • source/tests/pt/test_oom_retry.py
💤 Files with no reviewable changes (4)
  • source/tests/pt/test_oom_retry.py
  • deepmd/pt/model/atomic_model/sezm_atomic_model.py
  • deepmd/pt/model/model/dp_model.py
  • deepmd/pt/model/descriptor/sezm_nn/dens.py

Comment thread deepmd/entrypoints/embedding.py
Comment thread deepmd/pt/infer/deep_eval.py
Comment thread deepmd/pt/model/atomic_model/linear_atomic_model.py
Comment thread deepmd/pt/model/task/fitting.py
Comment thread doc/inference/embedding.md Outdated
Comment thread source/tests/pt/model/test_embedding.py
@codecov

codecov Bot commented Jun 22, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 91.89189% with 21 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.17%. Comparing base (03682bf) to head (2f63199).

Files with missing lines Patch % Lines
deepmd/entrypoints/embedding.py 93.05% 5 Missing ⚠️
deepmd/pt/infer/deep_eval.py 89.74% 4 Missing ⚠️
deepmd/pt/model/model/sezm_model.py 92.50% 3 Missing ⚠️
deepmd/pt/model/task/sezm_ener.py 0.00% 3 Missing ⚠️
deepmd/entrypoints/main.py 50.00% 2 Missing ⚠️
deepmd/entrypoints/eval_desc.py 0.00% 1 Missing ⚠️
deepmd/infer/deep_eval.py 91.66% 1 Missing ⚠️
...eepmd/pt/model/atomic_model/linear_atomic_model.py 94.11% 1 Missing ⚠️
deepmd/pt/model/task/ener.py 50.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #5571      +/-   ##
==========================================
+ Coverage   82.14%   82.17%   +0.02%     
==========================================
  Files         900      901       +1     
  Lines      104139   104266     +127     
  Branches     4471     4474       +3     
==========================================
+ Hits        85550    85676     +126     
  Misses      17178    17178              
- Partials     1411     1412       +1     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Comment thread deepmd/pt/infer/deep_eval.py
Comment thread deepmd/pt/infer/deep_eval.py
Comment thread deepmd/entrypoints/embedding.py
Comment thread deepmd/pt/infer/deep_eval.py Outdated

@njzjz-bot njzjz-bot 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.

Thanks for adding the embedding extraction path. I think this needs a few changes before merge, mainly around backend/API compatibility. The PR adds a PyTorch-only eval_embedding implementation, but the CLI/docs deprecate backend-generic descriptor APIs (dp eval-desc, DeepPot.eval_descriptor) in favor of dp embed / eval_embedding. That currently sends TensorFlow/Paddle users from a working descriptor path to an unsupported one. There is also no descriptor-only mode in the replacement command, so users who only need descriptors pay for fitting features and larger HDF5 output.

Reviewed by OpenClaw 2026.6.8 (844f405) (model: custom-chat-jinzhezeng-group/gpt-5.5).

Comment thread deepmd/main.py Outdated
Comment thread deepmd/main.py Outdated
Comment thread doc/inference/python.md Outdated
Comment thread deepmd/entrypoints/embedding.py
Comment thread deepmd/pt/infer/deep_eval.py
Comment thread deepmd/pt/infer/deep_eval.py
Comment thread deepmd/pt/infer/deep_eval.py
Comment thread deepmd/pt/infer/deep_eval.py Outdated
Comment thread doc/test/test.md Outdated
Comment thread deepmd/entrypoints/eval_desc.py Outdated
@OutisLi OutisLi requested a review from wanghan-iapcm June 22, 2026 16:04

@coderabbitai coderabbitai Bot 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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
deepmd/infer/deep_eval.py (1)

695-708: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Update the dtype wording in eval_embedding’s docstring.

Line 707 still says all embeddings are returned as float32, but Lines 737-738 now allow "fp64" and "native".

Proposed docstring adjustment
-        embeddings are returned as float32, which is ample for downstream
-        analysis.
+        embeddings are returned as float32 by default, which is ample for
+        downstream analysis. Pass ``dtype="fp64"`` or ``dtype="native"`` to
+        request a different output precision.

Also applies to: 737-738

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deepmd/infer/deep_eval.py` around lines 695 - 708, The docstring for the
eval_embedding method on line 712-713 states that all three embeddings are
returned as float32, but the implementation now supports configurable dtypes
including "fp64" and "native" (as shown in the dtype parameter). Update the
docstring statement that mentions float32 to reflect that the returned dtype
depends on the dtype parameter passed to the function, removing the hardcoded
reference to float32 and indicating that the embeddings are returned in the
specified dtype format.
deepmd/pt/infer/deep_eval.py (1)

1151-1164: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Update the float32-only wording now that dtype is configurable.

Line 1163 says all embeddings are returned as float32, but Lines 1192-1193 now document "fp64" and "native" as valid output dtypes.

Proposed docstring adjustment
-        total energy. All three embeddings are returned as float32, which is
-        ample for downstream analysis.
+        total energy. All three embeddings are returned as float32 by default,
+        which is ample for downstream analysis. Pass ``dtype="fp64"`` or
+        ``dtype="native"`` to request a different output precision.

Also applies to: 1192-1193

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@deepmd/pt/infer/deep_eval.py` around lines 1151 - 1164, The docstring for the
evaluate_descriptor_atomic_feature_and_structural_feature method (or similar
function name around line 1151-1164) contains outdated information stating that
all three embeddings are always returned as float32. Since the function now
includes a configurable dtype parameter that accepts "fp32", "fp64", and
"native" options (as documented in lines 1192-1193), update the docstring to
reflect that the output dtype depends on the dtype parameter passed to the
function, rather than claiming they are exclusively float32. Remove or modify
the sentence that incorrectly claims fixed float32 output and replace it with
text indicating the dtype is configurable via the dtype parameter.
♻️ Duplicate comments (1)
source/tests/pt/model/test_embedding.py (1)

264-279: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Loosen tolerances for float32 cross-call comparisons.

The tolerances rtol=1e-10, atol=1e-12 are tighter than float32 machine epsilon (~1e-7) and can cause flaky test failures across independent forward passes. Graph context shows float32 comparisons elsewhere in the codebase use rtol=1e-4.

Proposed fix
         np.testing.assert_allclose(
             dp.eval_descriptor(
                 self.coord_np, self.cell_np, self.atype_np, dtype="fp32"
             ),
             descriptor,
-            rtol=1e-10,
-            atol=1e-12,
+            rtol=1e-5,
+            atol=1e-6,
         )
         np.testing.assert_allclose(
             dp.eval_fitting_last_layer(
                 self.coord_np, self.cell_np, self.atype_np, dtype="fp32"
             ),
             atomic_feature,
-            rtol=1e-10,
-            atol=1e-12,
+            rtol=1e-5,
+            atol=1e-6,
         )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@source/tests/pt/model/test_embedding.py` around lines 264 - 279, The
tolerances rtol=1e-10, atol=1e-12 are too tight for float32 precision and cause
flaky test failures. Update both assert_allclose calls for eval_descriptor and
eval_fitting_last_layer to use rtol=1e-4 which aligns with float32 comparison
standards used elsewhere in the codebase. Change the rtol parameter from 1e-10
to 1e-4 and the atol parameter from 1e-12 to a value appropriate for float32
(typically around 1e-6 or 1e-5) in both assertions.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@deepmd/infer/deep_eval.py`:
- Around line 695-708: The docstring for the eval_embedding method on line
712-713 states that all three embeddings are returned as float32, but the
implementation now supports configurable dtypes including "fp64" and "native"
(as shown in the dtype parameter). Update the docstring statement that mentions
float32 to reflect that the returned dtype depends on the dtype parameter passed
to the function, removing the hardcoded reference to float32 and indicating that
the embeddings are returned in the specified dtype format.

In `@deepmd/pt/infer/deep_eval.py`:
- Around line 1151-1164: The docstring for the
evaluate_descriptor_atomic_feature_and_structural_feature method (or similar
function name around line 1151-1164) contains outdated information stating that
all three embeddings are always returned as float32. Since the function now
includes a configurable dtype parameter that accepts "fp32", "fp64", and
"native" options (as documented in lines 1192-1193), update the docstring to
reflect that the output dtype depends on the dtype parameter passed to the
function, rather than claiming they are exclusively float32. Remove or modify
the sentence that incorrectly claims fixed float32 output and replace it with
text indicating the dtype is configurable via the dtype parameter.

---

Duplicate comments:
In `@source/tests/pt/model/test_embedding.py`:
- Around line 264-279: The tolerances rtol=1e-10, atol=1e-12 are too tight for
float32 precision and cause flaky test failures. Update both assert_allclose
calls for eval_descriptor and eval_fitting_last_layer to use rtol=1e-4 which
aligns with float32 comparison standards used elsewhere in the codebase. Change
the rtol parameter from 1e-10 to 1e-4 and the atol parameter from 1e-12 to a
value appropriate for float32 (typically around 1e-6 or 1e-5) in both
assertions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: d11ec34e-9512-4db8-8896-57b97f9f5cc0

📥 Commits

Reviewing files that changed from the base of the PR and between 21bc006 and 2f63199.

📒 Files selected for processing (9)
  • deepmd/entrypoints/embedding.py
  • deepmd/entrypoints/eval_desc.py
  • deepmd/infer/deep_eval.py
  • deepmd/main.py
  • deepmd/pt/infer/deep_eval.py
  • doc/inference/embedding.md
  • doc/inference/python.md
  • doc/test/test.md
  • source/tests/pt/model/test_embedding.py
✅ Files skipped from review due to trivial changes (2)
  • doc/test/test.md
  • doc/inference/embedding.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • deepmd/entrypoints/embedding.py

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants