Skip to content
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

New extended prompt format for Canary, short utterances inference fix, and training micro-optimizations #11058

Merged
merged 19 commits into from
Dec 5, 2024

Conversation

pzelasko
Copy link
Collaborator

@pzelasko pzelasko commented Oct 28, 2024

What does this PR do ?

  • New prompt format
    • Prompt formatter definition
    • Special tokenizer build script
    • Unit tests for the new Canary prompt format.
  • Micro-optimizations (16% faster training step)
  • Option to enable loss mask on prompt tokens
  • Fix for inference of very short utterances

Collection: ASR

Changelog

  • Add specific line by line info of high level changes in this PR.

Usage

  • You can potentially add a usage example below
# Add a code snippet demonstrating how to use this 

GitHub Actions CI

The Jenkins CI system has been replaced by GitHub Actions self-hosted runners.

The GitHub Actions CI will run automatically when the "Run CICD" label is added to the PR.
To re-run CI remove and add the label again.
To run CI on an untrusted fork, a NeMo user with write access must first click "Approve and run".

Before your PR is "Ready for review"

Pre checks:

  • Make sure you read and followed Contributor guidelines
  • Did you write any new necessary tests?
  • Did you add or update any necessary documentation?
  • Does the PR affect components that are optional to install? (Ex: Numba, Pynini, Apex etc)
    • Reviewer: Does the PR have correct import guards for all optional libraries?

PR Type:

  • New Feature
  • Bugfix
  • Documentation

If you haven't finished some of the above items you can still open "Draft" PR.

Who can review?

Anyone in the community is free to review the PR once the checks have passed.
Contributor guidelines contains specific people who can review PRs to various areas.

Additional Information

  • Related to # (issue)

@@ -0,0 +1,40 @@
#!/usr/bin/env python
from pathlib import Path

Check notice

Code scanning / CodeQL

Unused import Note

Import of 'Path' is not used.
Copy link
Contributor

@bonham79 bonham79 left a comment

Choose a reason for hiding this comment

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

So I'm a bit hesitant to create a separate Canary2 prompt class. I think it sets a bad precedent for future Canary releases that could lead to bloat. Is there any motivated reason the original Canary tokenizer class can't just redefined and then there's a separate conversion script to write up that converts the old Canary model into the new version? There's only one anyhow, so it's not like it's going to create absurd cascade problems for users.


any_special_token_present = False

lang_dict_compat = {"en": "en-US", "es": "es-ES", "fr": "fr-FR", "de": "de-DE"}
Copy link
Contributor

Choose a reason for hiding this comment

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

es-US

f"Please ensure that every utterance in the input manifests contains these keys."
)

optional_slots = {
Copy link
Contributor

Choose a reason for hiding this comment

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

Is there a check to maintain consistency across slots or are you allowing variable slot sizes? (e.g. sample 1 has itn sample 2 does not have that slot.)

Copy link
Collaborator

@krishnacpuvvada krishnacpuvvada Oct 28, 2024

Choose a reason for hiding this comment

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

we are combining different datasets annotated for different things, so the flexibility is required atleast at the level of each manifest if not per sample.

Copy link
Collaborator

Choose a reason for hiding this comment

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

Hmm, most of these are binary prompts. What about just having default values for the prompts instead? Else I believe y'all are adding the extra difficulty of the model needing to learn variable length prompt input.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

There is no variable length (except if you add decoder context). We indeed have default values for slots here.

@@ -0,0 +1,40 @@
#!/usr/bin/env python
Copy link
Contributor

Choose a reason for hiding this comment

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

I don't believe this script is necessary. It can just be an example in the canary tutorial instead.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

The people building the new tokenizer for Canary 3 or community Canary forks will have an easier time and won't need to guess how the previous special tokenizers were built :)

Copy link
Collaborator

Choose a reason for hiding this comment

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

Those people will be using the tutorial anyhow no? From my understanding, Canary use hasn't picked up that much this year, so there's not a significant community. It's more likely you'll have greater growth with the current model, so providing backend support may not be crucial.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I'm re-doing the Canary 2 tokenizer right now and am grateful I put these scripts in here. Not removing them :)

@@ -0,0 +1,111 @@
#!/usr/bin/env python
Copy link
Contributor

Choose a reason for hiding this comment

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

ditto

# User prompt.
# This role is used for emotion / LID inference only - use it for two just two decoder inference steps
# to retrieve the recognized emotion and language tokens.
"user_partial": {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Leaving a note that this doesn't cover the cases like "identify language and transcribe with ITN" (which is fine for this version). should put sufficient guards regarding what users are allowed to ask in transcribe fn.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

That will be complicated to implement in transcribe fn in general. We should think about whether a new API specifically for Canary would be cleaner.

Copy link
Collaborator

Choose a reason for hiding this comment

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

+1 to new API, even already the prompt setup can be a bit bulky. Putting thought into API changes before it an actual problem could save some heartache.

)

# first, validate the utterance
expected_slots = {"source_lang", "target_lang", "pnc"}
Copy link
Collaborator

@krishnacpuvvada krishnacpuvvada Oct 28, 2024

Choose a reason for hiding this comment

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

how about expected_slots = formatter.expected_slots and same for optional_slots

should we make all the slots expected ie. source_lang, target_lang, pnc, itn, timestamp, diarize and we will set the default tags in data config yaml if something is missing in manifest file ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

it will require rebuilding manifests (or at least data configs) for existing data, a bit of extra headache that I'm not sure is worth the time. WDYT?

Copy link
Collaborator

Choose a reason for hiding this comment

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

it shouldn't require us to rebuild manifests. it should be doable using the tags we have in train_ds yaml config?

atleast may be the first part i.e, expected_slots = formatter.expected_slots ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

discussed offline - keeping the current code to hide the extra complexity of new canary2 slots for users that are not interested in them

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

after further conversation - made pnc optional too

if text.startswith(CANARY2_BOCTX):
# Canary 2 prompt format. It starts with decoder context, which should be tokenized using
# a different tokenizer than spl_tokens. We don't really know what it is, so we'll use the
# following HACK solution: look up 5th token which is target_lang and tokenize this part
Copy link
Collaborator

@krishnacpuvvada krishnacpuvvada Oct 28, 2024

Choose a reason for hiding this comment

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

limitation: Hack will error out if we are decoding with unk_lang as target_lang

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Yes. Better use single tokenizer in these cases...

Copy link
Contributor

This PR is stale because it has been open for 14 days with no activity. Remove stale label or comment or update or this will be closed in 7 days.

from lhotse.testing.dummies import DummyManifest
from lhotse import CutSet, MonoCut, SupervisionSegment
from lhotse.testing.dummies import DummyManifest, dummy_cut
from lhotse.testing.random import deterministic_rng

Check notice

Code scanning / CodeQL

Unused import Note test

Import of 'deterministic_rng' is not used.
@@ -0,0 +1,265 @@
#!/usr/bin/env python
import math

Check notice

Code scanning / CodeQL

Unused import Note

Import of 'math' is not used.
@@ -58,27 +58,7 @@ def _build_pos_enc(self, hidden_size, max_sequence_length, device=None):
self.register_buffer('pos_enc', pos_enc)

def forward(self, position_ids):
max_pos_id = position_ids.max()
# update positional encoding if needed
if max_pos_id >= self._max_sequence_length:
Copy link
Collaborator Author

@pzelasko pzelasko Dec 4, 2024

Choose a reason for hiding this comment

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

This check is super costly as it triggers a DtoH transfer and CUDA sync on every call to transformer decoder forward, and the proposed solution doesn't work anyway (bad results instead of a crash).

@@ -67,7 +67,8 @@

def lens_to_mask(lens, max_length):
batch_size = lens.shape[0]
mask = torch.arange(max_length).repeat(batch_size, 1).to(lens.device) < lens[:, None]
arange = torch.arange(max_length, device=lens.device)
mask = arange.expand(batch_size, max_length) < lens.unsqueeze(1)
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

micro-optimization, removes some copies and memory movement

@@ -673,24 +674,33 @@ def training_step(self, batch: PromptedAudioToTextMiniBatch, batch_nb):
return torch.tensor([0.0])

input_ids, labels = batch.get_decoder_inputs_outputs()
input_ids_lens = batch.prompted_transcript_lens - 1
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

fixing off-by-one issue that included an extra padding frame in decoder masks

num_frames = batch.audio_lens.sum().float()
num_tokens = batch.prompted_transcript_lens.sum().float()
tot_frames = torch.as_tensor(batch.audio.numel(), device=num_frames.device, dtype=torch.float)
tot_tokens = torch.as_tensor(batch.prompted_transcript.numel(), device=num_frames.device, dtype=torch.float)
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

micro-optimizations

'learning_rate': self._optimizer.param_groups[0]['lr'],
'batch_size': batch.audio.shape[0],
'learning_rate': torch.as_tensor(self._optimizer.param_groups[0]['lr']),
'batch_size': torch.as_tensor(batch.audio.shape[0]),
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

micro-optimizations (the PTL logger turned out to have an inefficient way of converting scalars to tensors)

@pzelasko pzelasko changed the title Next Canary's prompt format New extended prompt format for Canary, short utterances inference fix, and training micro-optimizations Dec 4, 2024
@pzelasko pzelasko marked this pull request as ready for review December 4, 2024 01:17
Copy link
Collaborator

@krishnacpuvvada krishnacpuvvada left a comment

Choose a reason for hiding this comment

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

LGTM overall; left a minor comment.
Great work!

Signed-off-by: Piotr Żelasko <[email protected]>
@pzelasko pzelasko added Run CICD and removed Run CICD labels Dec 4, 2024
@pzelasko pzelasko enabled auto-merge (squash) December 4, 2024 18:06
krishnacpuvvada
krishnacpuvvada previously approved these changes Dec 4, 2024
Copy link
Collaborator

@krishnacpuvvada krishnacpuvvada left a comment

Choose a reason for hiding this comment

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

LGTM

Signed-off-by: Piotr Żelasko <[email protected]>
Signed-off-by: Piotr Żelasko <[email protected]>
@pzelasko pzelasko added Run CICD and removed Run CICD labels Dec 4, 2024
Copy link
Contributor

github-actions bot commented Dec 4, 2024

beep boop 🤖: 🙏 The following files have warnings. In case you are familiar with these, please try helping us to improve the code base.


Your code was analyzed with PyLint. The following annotations have been identified:

************* Module nemo.collections.common.prompts.canary2
nemo/collections/common/prompts/canary2.py:37:0: C0301: Line too long (136/119) (line-too-long)
nemo/collections/common/prompts/canary2.py:30:0: C0115: Missing class docstring (missing-class-docstring)
nemo/collections/common/prompts/canary2.py:121:0: C0116: Missing function or method docstring (missing-function-docstring)
************* Module scripts.speech_recognition.canary.build_canary_1b_special_tokenizer
scripts/speech_recognition/canary/build_canary_1b_special_tokenizer.py:15:0: W0611: Unused Path imported from pathlib (unused-import)
************* Module scripts.speech_recognition.canary.build_canary_2_special_tokenizer
scripts/speech_recognition/canary/build_canary_2_special_tokenizer.py:86:0: C0116: Missing function or method docstring (missing-function-docstring)
scripts/speech_recognition/canary/build_canary_2_special_tokenizer.py:15:0: W0611: Unused import math (unused-import)
************* Module nemo.collections.asr.data.audio_to_text_lhotse_prompted
nemo/collections/asr/data/audio_to_text_lhotse_prompted.py:60:0: C0301: Line too long (133/119) (line-too-long)
nemo/collections/asr/data/audio_to_text_lhotse_prompted.py:27:0: C0115: Missing class docstring (missing-class-docstring)
nemo/collections/asr/data/audio_to_text_lhotse_prompted.py:113:0: C0115: Missing class docstring (missing-class-docstring)
************* Module nemo.collections.asr.models.aed_multitask_models
nemo/collections/asr/models/aed_multitask_models.py:695:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/asr/models/aed_multitask_models.py:737:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/asr/models/aed_multitask_models.py:788:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/asr/models/aed_multitask_models.py:796:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/asr/models/aed_multitask_models.py:1070:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/asr/models/aed_multitask_models.py:1136:0: C0116: Missing function or method docstring (missing-function-docstring)
************* Module nemo.collections.asr.modules.transformer.transformer_modules
nemo/collections/asr/modules/transformer/transformer_modules.py:60:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/asr/modules/transformer/transformer_modules.py:104:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/asr/modules/transformer/transformer_modules.py:163:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/asr/modules/transformer/transformer_modules.py:168:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/asr/modules/transformer/transformer_modules.py:219:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/asr/modules/transformer/transformer_modules.py:25:0: W0611: Unused logging imported from nemo.utils (unused-import)
************* Module nemo.collections.common.data.lhotse.dataloader
nemo/collections/common/data/lhotse/dataloader.py:110:0: C0301: Line too long (123/119) (line-too-long)
nemo/collections/common/data/lhotse/dataloader.py:126:0: C0301: Line too long (125/119) (line-too-long)
nemo/collections/common/data/lhotse/dataloader.py:134:0: C0301: Line too long (148/119) (line-too-long)
nemo/collections/common/data/lhotse/dataloader.py:231:0: C0301: Line too long (121/119) (line-too-long)
nemo/collections/common/data/lhotse/dataloader.py:232:0: C0301: Line too long (126/119) (line-too-long)
nemo/collections/common/data/lhotse/dataloader.py:233:0: C0301: Line too long (123/119) (line-too-long)
nemo/collections/common/data/lhotse/dataloader.py:577:0: C0301: Line too long (135/119) (line-too-long)
nemo/collections/common/data/lhotse/dataloader.py:717:0: C0301: Line too long (213/119) (line-too-long)
nemo/collections/common/data/lhotse/dataloader.py:724:0: C0301: Line too long (143/119) (line-too-long)
nemo/collections/common/data/lhotse/dataloader.py:169:0: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/data/lhotse/dataloader.py:426:0: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/data/lhotse/dataloader.py:477:0: C0115: Missing class docstring (missing-class-docstring)
nemo/collections/common/data/lhotse/dataloader.py:504:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/data/lhotse/dataloader.py:510:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/data/lhotse/dataloader.py:513:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/data/lhotse/dataloader.py:516:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/data/lhotse/dataloader.py:519:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/data/lhotse/dataloader.py:528:0: C0115: Missing class docstring (missing-class-docstring)
nemo/collections/common/data/lhotse/dataloader.py:530:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/data/lhotse/dataloader.py:533:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/data/lhotse/dataloader.py:539:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/data/lhotse/dataloader.py:567:0: C0115: Missing class docstring (missing-class-docstring)
nemo/collections/common/data/lhotse/dataloader.py:582:0: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/data/lhotse/dataloader.py:589:0: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/data/lhotse/dataloader.py:604:0: C0116: Missing function or method docstring (missing-function-docstring)
************* Module nemo.collections.common.tokenizers.canary_tokenizer
nemo/collections/common/tokenizers/canary_tokenizer.py:83:0: C0301: Line too long (120/119) (line-too-long)
nemo/collections/common/tokenizers/canary_tokenizer.py:56:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/tokenizers/canary_tokenizer.py:60:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/tokenizers/canary_tokenizer.py:64:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/tokenizers/canary_tokenizer.py:68:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/tokenizers/canary_tokenizer.py:108:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/collections/common/tokenizers/canary_tokenizer.py:114:4: C0116: Missing function or method docstring (missing-function-docstring)
************* Module nemo.utils.exp_manager
nemo/utils/exp_manager.py:353:0: C0301: Line too long (120/119) (line-too-long)
nemo/utils/exp_manager.py:378:0: C0301: Line too long (124/119) (line-too-long)
nemo/utils/exp_manager.py:382:0: C0301: Line too long (122/119) (line-too-long)
nemo/utils/exp_manager.py:387:0: C0301: Line too long (127/119) (line-too-long)
nemo/utils/exp_manager.py:401:0: C0301: Line too long (120/119) (line-too-long)
nemo/utils/exp_manager.py:408:0: C0301: Line too long (120/119) (line-too-long)
nemo/utils/exp_manager.py:409:0: C0301: Line too long (126/119) (line-too-long)
nemo/utils/exp_manager.py:411:0: C0301: Line too long (136/119) (line-too-long)
nemo/utils/exp_manager.py:413:0: C0301: Line too long (139/119) (line-too-long)
nemo/utils/exp_manager.py:423:0: C0301: Line too long (123/119) (line-too-long)
nemo/utils/exp_manager.py:424:0: C0301: Line too long (128/119) (line-too-long)
nemo/utils/exp_manager.py:425:0: C0301: Line too long (132/119) (line-too-long)
nemo/utils/exp_manager.py:426:0: C0301: Line too long (127/119) (line-too-long)
nemo/utils/exp_manager.py:514:0: C0301: Line too long (122/119) (line-too-long)
nemo/utils/exp_manager.py:602:0: C0301: Line too long (208/119) (line-too-long)
nemo/utils/exp_manager.py:603:0: C0301: Line too long (230/119) (line-too-long)
nemo/utils/exp_manager.py:605:0: C0301: Line too long (178/119) (line-too-long)
nemo/utils/exp_manager.py:642:0: C0301: Line too long (136/119) (line-too-long)
nemo/utils/exp_manager.py:777:0: C0301: Line too long (121/119) (line-too-long)
nemo/utils/exp_manager.py:785:0: C0301: Line too long (156/119) (line-too-long)
nemo/utils/exp_manager.py:832:0: C0301: Line too long (141/119) (line-too-long)
nemo/utils/exp_manager.py:840:0: C0301: Line too long (152/119) (line-too-long)
nemo/utils/exp_manager.py:1110:0: C0301: Line too long (142/119) (line-too-long)
nemo/utils/exp_manager.py:1134:0: C0301: Line too long (154/119) (line-too-long)
nemo/utils/exp_manager.py:1200:0: C0301: Line too long (120/119) (line-too-long)
nemo/utils/exp_manager.py:1219:0: C0301: Line too long (123/119) (line-too-long)
nemo/utils/exp_manager.py:1245:0: C0301: Line too long (121/119) (line-too-long)
nemo/utils/exp_manager.py:91:0: C0115: Missing class docstring (missing-class-docstring)
nemo/utils/exp_manager.py:106:0: C0115: Missing class docstring (missing-class-docstring)
nemo/utils/exp_manager.py:132:0: C0115: Missing class docstring (missing-class-docstring)
nemo/utils/exp_manager.py:141:0: C0115: Missing class docstring (missing-class-docstring)
nemo/utils/exp_manager.py:150:0: C0115: Missing class docstring (missing-class-docstring)
nemo/utils/exp_manager.py:161:0: C0115: Missing class docstring (missing-class-docstring)
nemo/utils/exp_manager.py:274:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:277:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:280:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:283:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:286:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:289:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:292:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:295:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:333:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:336:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:339:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:342:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:1126:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:1227:0: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:1246:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:1249:4: C0116: Missing function or method docstring (missing-function-docstring)
nemo/utils/exp_manager.py:1265:0: C0116: Missing function or method docstring (missing-function-docstring)

-----------------------------------
Your code has been rated at 9.41/10

Thank you for improving NeMo's documentation!

Copy link
Contributor

github-actions bot commented Dec 4, 2024

[🤖]: Hi @pzelasko 👋,

We wanted to let you know that a CICD pipeline for this PR just finished successfully

So it might be time to merge this PR or get some approvals

I'm just a bot so I'll leave it you what to do next.

//cc @pablo-garay @ko3n1g

Copy link
Collaborator

@krishnacpuvvada krishnacpuvvada left a comment

Choose a reason for hiding this comment

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

LGTM

@pzelasko pzelasko merged commit 4aa2e8a into main Dec 5, 2024
174 of 175 checks passed
@pzelasko pzelasko deleted the canary2 branch December 5, 2024 01:00
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