From a7585b5d4ded47c7fb91a854576991c10afb94e9 Mon Sep 17 00:00:00 2001 From: David Dale Date: Fri, 10 Oct 2025 08:22:05 +0000 Subject: [PATCH 1/6] fairseq2 migration --- LICENSE.md | 2 +- NC_MODEL_LICENSE.md | 2 +- README.md | 14 +- .../{data => }/eng_flores200_dev_sample.tsv | 0 examples/inference_pipelines.ipynb | 62 +-- examples/sonar_text_demo.ipynb | 20 +- huggingface_pipelines/text.py | 24 +- materials/sonar_langs.jpg | Bin 0 -> 282643 bytes pyproject.toml | 10 +- requirements-dev.txt | 2 +- requirements.txt | 2 +- sonar/__init__.py | 196 ++++---- sonar/cards/sonar_mutox.yaml | 2 +- sonar/cards/sonar_speech_encoder.yaml | 456 +++++++++++------- sonar/cards/text_sonar_basic_decoder.yaml | 410 ++++++++-------- sonar/cards/text_sonar_basic_encoder.yaml | 410 ++++++++-------- sonar/cards/text_sonar_finetuned_decoder.yaml | 410 ++++++++-------- sonar/inference_pipelines/mutox_speech.py | 10 +- sonar/inference_pipelines/speech.py | 73 ++- sonar/inference_pipelines/text.py | 159 +++--- sonar/inference_pipelines/utils.py | 293 ++++++++++- sonar/models/blaser/__init__.py | 11 +- sonar/models/blaser/checkpoint.py | 20 + sonar/models/blaser/config.py | 13 +- sonar/models/blaser/factory.py | 2 +- sonar/models/blaser/handler.py | 45 -- sonar/models/blaser/loader.py | 7 +- sonar/models/encoder_model.py | 30 +- sonar/models/laser2_text/__init__.py | 23 +- sonar/models/laser2_text/checkpoint.py | 20 + sonar/models/laser2_text/config.py | 12 +- sonar/models/laser2_text/factory.py | 20 + sonar/models/laser2_text/handler.py | 57 --- sonar/models/laser2_text/tokenizer.py | 61 ++- sonar/models/mutox/__init__.py | 15 +- sonar/models/mutox/checkpoint.py | 24 + sonar/models/mutox/config.py | 12 +- sonar/models/mutox/factory.py | 3 +- sonar/models/mutox/handler.py | 44 -- sonar/models/mutox/loader.py | 7 +- sonar/models/sonar_speech/__init__.py | 19 +- sonar/models/sonar_speech/checkpoint.py | 82 ++++ sonar/models/sonar_speech/config.py | 29 +- sonar/models/sonar_speech/factory.py | 60 +-- sonar/models/sonar_speech/handler.py | 110 ----- sonar/models/sonar_speech/model.py | 36 +- sonar/models/sonar_text/__init__.py | 38 +- .../sonar_text/{handler.py => checkpoint.py} | 110 ++--- sonar/models/sonar_text/config.py | 33 +- sonar/models/sonar_text/factory.py | 150 ++++-- sonar/models/sonar_text/model.py | 103 ++-- sonar/models/sonar_translation/__init__.py | 1 + sonar/models/sonar_translation/factory.py | 3 +- sonar/models/sonar_translation/model.py | 135 ++++-- sonar/nn/__init__.py | 10 + sonar/nn/conditional_decoder_model.py | 101 ++-- sonar/nn/encoder_pooler.py | 30 +- sonar/nn/sequence.py | 87 ++++ tests/conftest.py | 4 +- .../data/audio_files/README.md | 2 +- tests/integration_tests/test_blaser.py | 4 +- tests/integration_tests/test_laser2_text.py | 15 +- tests/integration_tests/test_mutox.py | 4 +- .../test_sonar_speech_encoder.py | 13 +- tests/integration_tests/test_text_sonar.py | 40 +- tests/unit_tests/test_blaser_inference.py | 8 +- .../test_low_dimension_text_models.py | 39 +- tests/unit_tests/test_mutox.py | 21 +- tests/unit_tests/test_sonar_pooling.py | 23 +- tests/unit_tests/test_tied_weights.py | 32 +- 70 files changed, 2456 insertions(+), 1869 deletions(-) rename examples/{data => }/eng_flores200_dev_sample.tsv (100%) create mode 100644 materials/sonar_langs.jpg create mode 100644 sonar/models/blaser/checkpoint.py delete mode 100644 sonar/models/blaser/handler.py create mode 100644 sonar/models/laser2_text/checkpoint.py create mode 100644 sonar/models/laser2_text/factory.py delete mode 100644 sonar/models/laser2_text/handler.py create mode 100644 sonar/models/mutox/checkpoint.py delete mode 100644 sonar/models/mutox/handler.py create mode 100644 sonar/models/sonar_speech/checkpoint.py delete mode 100644 sonar/models/sonar_speech/handler.py rename sonar/models/sonar_text/{handler.py => checkpoint.py} (59%) create mode 100644 sonar/nn/sequence.py diff --git a/LICENSE.md b/LICENSE.md index 2e93333..d69c5b8 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -68,5 +68,5 @@ BUT BEWARE, the following speech encoders are released under a non commercial li | vie | vietnamese | https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.vie.pt | | yue | yue | https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.yue.pt | -The SONAR text encoder and decoder, as well as the BLASER 2.0 models, are released under the same non-commercial +The SONAR text encoder and decoder, as well as the BLASER 2.0 models, are released under the same non-commercial license ([NC_MODEL_LICENSE](NC_MODEL_LICENSE.md)). diff --git a/NC_MODEL_LICENSE.md b/NC_MODEL_LICENSE.md index 2a96631..b7f6692 100644 --- a/NC_MODEL_LICENSE.md +++ b/NC_MODEL_LICENSE.md @@ -58,7 +58,7 @@ exhaustive, and do not form part of our licenses. such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More_considerations - for the public: + for the public: wiki.creativecommons.org/Considerations_for_licensees ======================================================================= diff --git a/README.md b/README.md index 525d7fa..62fbbf7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [[Paper]](https://ai.meta.com/research/publications/sonar-sentence-level-multimodal-and-language-agnostic-representations/) [[Demo]](#usage) -We introduce SONAR, a new multilingual and multimodal fixed-size sentence embedding space, with a full suite of speech and text encoders and decoders. It substantially outperforms existing sentence embeddings such as LASER3 and LabSE on the xsim and xsim++ multilingual similarity search tasks. +We introduce SONAR, a new multilingual and multimodal fixed-size sentence embedding space, with a full suite of speech and text encoders and decoders. It substantially outperforms existing sentence embeddings such as LASER3 and LabSE on the xsim and xsim++ multilingual similarity search tasks. Speech segments can be embedded in the same SONAR embedding space using language-specific speech encoders trained in a teacher-student setting on speech transcription data. We also provide a single text decoder, which allows us to perform text-to-text and speech-to-text machine translation, including for zero-shot language and modality combinations. @@ -37,7 +37,7 @@ pip install fairseq2 --extra-index-url https://fair.pkg.atmeta.com/fairseq2/whl/ ``` If [fairseq2](https://github.com/facebookresearch/fairseq2) does not provide a build for your machine, check the readme of that project to build it locally. -We recommend installing SONAR only after you have a correct version of `fairseq2` installed. Note that SONAR currently relies on the stable version of fairseq2 0.4.5 (with minor variations possible). +We recommend installing SONAR only after you have a correct version of `fairseq2` installed. Note that SONAR currently relies on the stable version of `fairseq2>=0.5.0` (with minor variations possible). If you want to install SONAR manually, you can install it localy: @@ -150,7 +150,7 @@ assert sr == 16000, "Sample rate should be 16kHz" s2t_model.predict([inp], target_lang="eng_Latn") # ['Television reports show white smoke coming from the plant.'] -# passing multiple wav files +# passing multiple wav files s2t_model.predict(["./tests/integration_tests/data/audio_files/audio_1.wav", "./tests/integration_tests/data/audio_files/audio_2.wav"], target_lang="eng_Latn") # ['Television reports show white smoke coming from the plant.', @@ -161,8 +161,8 @@ s2t_model.predict(["./tests/integration_tests/data/audio_files/audio_1.wav", ### Predicting sentence similarity with BLASER 2.0 models BLASER 2.0 is a family of models for automatic evaluation of machine translation quality based on SONAR embeddings. -They predict [cross-lingual semantic similarity](https://github.com/facebookresearch/fairseq/tree/nllb/examples/nllb/human_XSTS_eval) -between the translation and the source (optionally, also using a reference translation). +They predict [cross-lingual semantic similarity](https://github.com/facebookresearch/fairseq/tree/nllb/examples/nllb/human_XSTS_eval) +between the translation and the source (optionally, also using a reference translation). ```Python from sonar.inference_pipelines.text import TextToEmbeddingModelPipeline @@ -182,7 +182,7 @@ with torch.inference_mode(): ``` Detailed model cards with more examples: [facebook/blaser-2.0-ref](https://huggingface.co/facebook/blaser-2.0-ref), -[facebook/blaser-2.0-qe](https://huggingface.co/facebook/blaser-2.0-qe). +[facebook/blaser-2.0-qe](https://huggingface.co/facebook/blaser-2.0-qe). ### Classifying the toxicity of sentences with MuTox @@ -554,6 +554,6 @@ See the [CONTRIBUTING](CONTRIBUTING.md) file for how to help out. SONAR code is released under the MIT license (see [CODE_LICENSE](CODE_LICENSE.md)). -Some of SONAR models are released with the same MIT license, BUT BEWARE, +Some of SONAR models are released with the same MIT license, BUT BEWARE, some of them are released under a non commercial license (see [NC_MODEL_LICENSE](NC_MODEL_LICENSE.md)). Please refer to [LICENSE](LICENSE.md) for the details. diff --git a/examples/data/eng_flores200_dev_sample.tsv b/examples/eng_flores200_dev_sample.tsv similarity index 100% rename from examples/data/eng_flores200_dev_sample.tsv rename to examples/eng_flores200_dev_sample.tsv diff --git a/examples/inference_pipelines.ipynb b/examples/inference_pipelines.ipynb index cc7acfb..eee95b8 100644 --- a/examples/inference_pipelines.ipynb +++ b/examples/inference_pipelines.ipynb @@ -12,24 +12,6 @@ "* Speech to Text translation" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Install sonar\n", - "\n", - "if sonar is not yet installed, install it:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install --quiet sonar-space" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -61,11 +43,13 @@ "metadata": {}, "outputs": [], "source": [ - "from sonar.models.sonar_speech.loader import load_sonar_speech_model\n", + "from fairseq2 import init_fairseq2\n", + "from fairseq2.data.text import get_text_tokenizer_hub\n", + "\n", + "from sonar.models.sonar_speech import get_sonar_speech_encoder_hub\n", "from sonar.models.sonar_text import (\n", - " load_sonar_text_decoder_model,\n", - " load_sonar_text_encoder_model,\n", - " load_sonar_tokenizer,\n", + " get_sonar_text_decoder_hub,\n", + " get_sonar_text_encoder_hub,\n", ")" ] }, @@ -75,7 +59,17 @@ "metadata": {}, "outputs": [], "source": [ - "speech_encoder_model = load_sonar_speech_model(\n", + "init_fairseq2()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "speech_encoder_hub = get_sonar_speech_encoder_hub()\n", + "speech_encoder_model = speech_encoder_hub.load(\n", " \"sonar_speech_encoder_eng\", device=device\n", ").eval()" ] @@ -86,7 +80,8 @@ "metadata": {}, "outputs": [], "source": [ - "text_encoder_model = load_sonar_text_encoder_model(\n", + "text_encoder_hub = get_sonar_text_encoder_hub()\n", + "text_encoder_model = text_encoder_hub.load(\n", " \"text_sonar_basic_encoder\", device=device\n", ").eval()" ] @@ -97,7 +92,8 @@ "metadata": {}, "outputs": [], "source": [ - "text_decoder_model = load_sonar_text_decoder_model(\n", + "text_decoder_hub = get_sonar_text_decoder_hub()\n", + "text_decoder_model = text_decoder_hub.load(\n", " \"text_sonar_basic_decoder\", device=device\n", ").eval()" ] @@ -109,7 +105,8 @@ "outputs": [], "source": [ "# tokenizer is compatible with nllb tokenizer logic already\n", - "text_tokenizer = load_sonar_tokenizer(\"text_sonar_basic_encoder\")" + "text_tokenizer_hub = get_text_tokenizer_hub()\n", + "text_tokenizer = text_tokenizer_hub.load(\"text_sonar_basic_encoder\")" ] }, { @@ -260,7 +257,7 @@ } ], "source": [ - "data_source = \"./data/eng_flores200_dev_sample.tsv\"\n", + "data_source = \"./eng_flores200_dev_sample.tsv\"\n", "text_emb = text_embedding_pipeline.predict(data_source, source_lang=\"eng_Latn\")\n", "text_emb" ] @@ -297,11 +294,18 @@ ")\n", "text_translation" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": ".venv", + "display_name": "sonar_fairseq2", "language": "python", "name": "python3" }, @@ -315,7 +319,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.8.17" }, "orig_nbformat": 4 }, diff --git a/examples/sonar_text_demo.ipynb b/examples/sonar_text_demo.ipynb index c793d74..763f846 100644 --- a/examples/sonar_text_demo.ipynb +++ b/examples/sonar_text_demo.ipynb @@ -1,21 +1,5 @@ { "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Install the dependencies" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install --quiet sonar-space seaborn pandas" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -219,14 +203,14 @@ " french_translated_sentences, [french_sentences], tokenize=\"flores200\"\n", ")\n", "print(\"*\" * 120)\n", - "print(\"english to french translation bleu score :\")\n", + "print(\"english to spanish translation bleu score :\")\n", "print(bleu_obj)\n", "\n", "bleu_obj = sacrebleu.corpus_bleu(\n", " english_translated_sentences, [english_sentences], tokenize=\"flores200\"\n", ")\n", "print(\"*\" * 120)\n", - "print(\"french to english translation bleu score :\")\n", + "print(\"spanish to english translation bleu score :\")\n", "print(bleu_obj)" ] }, diff --git a/huggingface_pipelines/text.py b/huggingface_pipelines/text.py index 4ebbc87..79a46f0 100644 --- a/huggingface_pipelines/text.py +++ b/huggingface_pipelines/text.py @@ -333,9 +333,9 @@ def process_batch(self, batch: Dict[str, Any]) -> Dict[str, Any]: ): all_embeddings = np.asarray(embeddings, dtype=self.config.dtype) all_decoded_texts = self.decode_embeddings(all_embeddings) - batch[ - f"{column}_{self.config.output_column_suffix}" - ] = all_decoded_texts + batch[f"{column}_{self.config.output_column_suffix}"] = ( + all_decoded_texts + ) elif all(isinstance(item, list) for item in embeddings): all_embeddings = np.vstack( [ @@ -351,9 +351,9 @@ def process_batch(self, batch: Dict[str, Any]) -> Dict[str, Any]: all_decoded_texts[start:end] for start, end in zip([0] + indices[:-1], indices) ] - batch[ - f"{column}_{self.config.output_column_suffix}" - ] = reconstructed_texts + batch[f"{column}_{self.config.output_column_suffix}"] = ( + reconstructed_texts + ) else: raise ValueError(f"Invalid input type for column {column}") logger.debug( @@ -490,9 +490,9 @@ def process_batch(self, batch: Dict[str, Any]) -> Dict[str, Any]: # Case: List of individual strings all_texts = batch[column] all_embeddings = self.encode_texts(all_texts) - batch[ - f"{column}_{self.config.output_column_suffix}" - ] = all_embeddings + batch[f"{column}_{self.config.output_column_suffix}"] = ( + all_embeddings + ) elif all(isinstance(item, list) for item in batch[column]): # Case: List of lists (sentences) all_sentences = [ @@ -513,9 +513,9 @@ def process_batch(self, batch: Dict[str, Any]) -> Dict[str, Any]: for start, end in zip([0] + indices[:-1], indices) ] - batch[ - f"{column}_{self.config.output_column_suffix}" - ] = sentence_embeddings + batch[f"{column}_{self.config.output_column_suffix}"] = ( + sentence_embeddings + ) else: raise ValueError( diff --git a/materials/sonar_langs.jpg b/materials/sonar_langs.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bbf9cadcebb25c361d8e1f04b7aa19d6172a6e2d GIT binary patch literal 282643 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%0ADL;Wi=skYeEKE3kUMeK*a)sLiH* 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

=DZLw%0z{R^ z$yL%6X6Ia)VjNgXO=O5AXF4hSil~#t*$=mc&hW>d1esxJ|Ip@c{N4WlpaX-=+xiA% z`woF)R4K6m38Eu!QZw)pxIm<(V;8IWqF#+Lv&f6EGrit7fu$FIv6F0$v!P zA4aW}7mEy!jMJ>T<5@NO`lz+cf#c7l=JDYns1zcliVUJj)7h5T8FF1k@9GWI*2rvW zv>OGVp*i`Rdr}X1tkFGW!Dud|!T9>!19oqB`dF3uKH>)gh{r+m!wDFTSwpyF5%Shj z<;94Pox1n)KfKo5w`Do;m5-qFmg~ZQida1mfqj}|%)R@Yn7X0Z=t%^T1nKCIFJtX` z&%AnqJIZq8oHSB*r!+X_hdeV<$k0`S+IYf}8;S0>iS+|F%?_}4a0J_#$TW_7V2E}G zv7X~n_O;?z>WJgVhvoCjZJC3$0iz41F;a#ClZ!fMHow-h5QR^>@kDUtyicmiw?cZn~TNV^nu*neKtji4W7RS^565Wi2q1=>-fjMZb#tLcV86 zyT915CE@F|^|PR>-=bJ!hxTZaUR(DR_{_TJstv6@@W;P5038Q-j_kssJ7@rPb&zx*mM5^ zct0G{PF@b9A*b$PoS+Wo5t4Qm))3vg+P6OQq4H6 zD{V9>cP=iuNJK4h@NwC_ujSBd!Iew0{XKJzs>3d$W^h{3pe|f0Xrk_1-;;sx1+#=t z+9XlaeB=B>h1LR`M)u(CGFqDsY!@LLu!3aL9dB+1!VfNs9W69SsA-Rszg6WoPS~Rt zrdF#P9Gdtgr|iKmSj4d?^ZZVrR7`@P={Xdn<)26dmC;L-nZ@k()3grt6CbPFC48Ti zh4T|5#0AE>e*W3jm%8mz?b?wyF!@ub#tFip{0dV5`6-qSzJ^aUEAQ6aJvX{u~*GIo@{+000B~h1&XT1R{NhQV` z+ROxy6GeNuhi!sxo0}mg)AjtAVyj6DS;`?g3%?Y1G~R9xYjwS~r%W`&?cDE25>siq zKfTF3VcBR#JxkytE(|^${z@skTQ^Q;cc>O)sCNnXd;ngk)|8r1wVRcGf2)vc)YHh% zJ-KG&|KYTHT?!d=$w*ico|NNfAsUIZ+FOI2at86RadmyJKBDP zdLLR-$*FSvX}5Y?2IlCC9VR#1RL-rEO8elo5(7lRiW^uhbhPcw-h9T{@2F`d*UHj! zb{FK03PQsC^?mQgTqF71LTOc&WFb9 z52);)gMnoGK&Hnil&cJU6nH(t4R+7BkoQw(a{rAM zwY1#|S}JdMJAWo}q&J{0D##4R#d9vi#8Sl^sKiXH@{%)z>+4kb_{ILoSeP$A(?r1C z_q?)Lqqs}mzJw!)69J%VRUB-Ur_G|771WAsT%g31Db

=DZLw%0z{R^ z$yL%6X6Ia)VjNgXO=O5AXF4hSil~#t*$=mc&hW>d1esxJ|Ip@c{N4WlpaX-=+xiA% z`woF)R4K6m38Eu!QZw)pxIm<(V;8IWqF#+Lv&f6EGrit7fu$FIv6F0$v!P zA4aW}7mEy!jMJ>T<5@NO`lz+cf#c7l=JDYns1zcliVUJj)7h5T8FF1k@9GWI*2rvW zv>OGVp*i`Rdr}X1tkFGW!Dud|!T9>!19oqB`dF3uKH>)gh{r+m!wDFTSwpyF5%Shj z<;94Pox1n)KfKo5w`Do;m5-qFmg~ZQida1mfqj}|%)R@Yn7X0Z=t%^T1nKCIFJtX` z&%AnqJIZq8oHSB*r!+X_hdeV<$k0`S+IYf}8;S0>iS+|F%?_}4a0J_#$TW_7V2E}G zv7X~n_O;?z>WJgVhvoCjZJC3$0iz41F;a#ClZ!fMHow-h5QR^>@kDUtyicmiw?cZn~TNV^nu*neKtji4W7RS^565Wi2q1=>-fjMZb#tLcV86 zyT915CE@F|^|PR>-=bJ!hxTZaUR(DR_{_TJstv6@@W;P5038Q-j_kssJ7@rPb&zx*mM5^ zct0G{PF@b9A*b$PoS+Wo5t4Qm))3vg+P6OQq4H6 zD{V9>cP=iuNJK4h@NwC_ujSBd!Iew0{XKJzs>3d$W^h{3pe|f0Xrk_1-;;sx1+#=t z+9XlaeB=B>h1LR`M)u(CGFqDsY!@LLu!3aL9dB+1!VfNs9W69SsA-Rszg6WoPS~Rt zrdF#P9Gdtgr|iKmSj4d?^ZZVrR7`@P={Xdn<)26dmC;L-nZ@k()3grt6CbPFC48Ti zh4T|5#0AE>e*W3jm%8mz?b?wyF!@ub#tFip{0dV5`6-qSzJ^aUEAQ6aJvX{u~*GIo@{+000B~h1&XT1R{NhQV` z+ROxy6GeNuhi!sxo0}mg)AjtAVyj6DS;`?g3%?Y1G~R9xYjwS~r%W`&?cDE25>siq zKfTF3VcBR#JxkytE(|^${z@skTQ^Q;cc>O)sCNnXd;ngk)|8r1wVRcGf2)vc)YHh% zJ-KG&|KYTHT?!d=$w*ico|NNfAsUIZ+FOI2at86RadmyJKBDP zdLLR-$*FSvX}5Y?2IlCC9VR#1RL-rEO8elo5(7lRiW^uhbhPcw-h9T{@2F`d*UHj! zb{FK03PQsC^?mQgTqF71LTOc&WFb9 z52);)gMnoGK&Hnil&cJU6nH(t4R+7BkoQw(a{rAM zwY1#|S}JdMJAWo}q&J{0D##4R#d9vi#8Sl^sKiXH@{%)z>+4kb_{ILoSeP$A(?r1C z_q?)Lqqs}mzJw!)69J%VRUB-Ur_G|771WAsT%g31Db

+D%BFENHs6B(-F9ay+uW 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Ǥ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 a;SK!-`C|m$YZ_E8NmrZy_aFM-)c*ir7bVaD From 469e5497823d1918c0277506def97a38dda8352b Mon Sep 17 00:00:00 2001 From: David Dale Date: Fri, 10 Oct 2025 12:33:18 +0200 Subject: [PATCH 4/6] Apply suggestions from code review (up minimal fs2 to 0.5.2) Co-authored-by: Artem Kozhevnikov --- README.md | 2 +- pyproject.toml | 4 ++-- requirements.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index aa999e4..7691844 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ pip install -e . ### Versions Unfortunately, SONAR code is very much tied to fairseq2 code, and thus only specific version are compatible with each other: -- `sonar-space~=0.5.0` (the current version) requires `fairseq2>=0.5.0` +- `sonar-space~=0.5.0` (the current version) requires `fairseq2>=0.5.2` - `sonar-space~=0.4.0` required `fairseq2~=0.4.0` - `sonar-space~=0.2.0` required `fairseq2~=0.2.0` diff --git a/pyproject.toml b/pyproject.toml index 52e8e23..cbe6d59 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,8 +53,8 @@ dependencies = [ cpu = [ "torch==2.5.1+cpu", "torchaudio==2.5.1+cpu", - "fairseq2n>=0.5.0", - "fairseq2>=0.5.0", + "fairseq2n>=0.5.2", + "fairseq2>=0.5.2", ] hg = [ "transformers>=4.44.0", diff --git a/requirements.txt b/requirements.txt index 6da44fb..3b51293 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -fairseq2>=0.5.0 +fairseq2>=0.5.2 mpmath==1.3.0 numpy>=1.21 torch From 45c1a37ba744b3b172fce5b8a4d4323b4b76251f Mon Sep 17 00:00:00 2001 From: David Dale Date: Fri, 10 Oct 2025 10:42:23 +0000 Subject: [PATCH 5/6] get rid of requirements.txt --- .github/workflows/lint_and_test.yml | 13 ++++--------- README.md | 2 +- pyproject.toml | 5 ++++- requirements-dev.txt | 13 ------------- requirements.txt | 8 -------- 5 files changed, 9 insertions(+), 32 deletions(-) delete mode 100644 requirements-dev.txt delete mode 100644 requirements.txt diff --git a/.github/workflows/lint_and_test.yml b/.github/workflows/lint_and_test.yml index 232d25b..d430c65 100644 --- a/.github/workflows/lint_and_test.yml +++ b/.github/workflows/lint_and_test.yml @@ -28,8 +28,7 @@ jobs: run: | sudo apt-get install libsndfile1 python -m pip install --upgrade pip - pip install -r requirements-dev.txt - pip install -e . + pip install -e ".[dev]" - name: Lint with flake8 run: | # stop the build if there are Python syntax errors or undefined names @@ -58,9 +57,7 @@ jobs: run: | sudo apt-get install libsndfile1 python -m pip install --upgrade pip - pip install --extra-index-url https://fair.pkg.atmeta.com/fairseq2/whl/pt2.5.1/cpu -r requirements.txt - pip install -r requirements-dev.txt - pip install -e . + pip install -e --extra-index-url https://fair.pkg.atmeta.com/fairseq2/whl/pt2.5.1/cpu ".[dev]" - name: mypy run: mypy --install-types --non-interactive ./ --cache-dir=.mypy_cache/ @@ -81,8 +78,7 @@ jobs: - name: Install dependencies run: | sudo apt-get install libsndfile1 - pip install -r requirements-dev.txt - pip install -e . + pip install -e ".[dev]" - name: pytest_unit run: pytest -s -v tests/unit_tests/ @@ -104,8 +100,7 @@ jobs: run: | sudo apt-get install libsndfile1 python -m pip install --upgrade pip - pip install -r requirements-dev.txt - pip install -e . + pip install -e ".[dev]" - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@main with: diff --git a/README.md b/README.md index 7691844..b47218b 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ pip install fairseq2 --extra-index-url https://fair.pkg.atmeta.com/fairseq2/whl/ ``` If [fairseq2](https://github.com/facebookresearch/fairseq2) does not provide a build for your machine, check the readme of that project to build it locally. -We recommend installing SONAR only after you have a correct version of `fairseq2` installed. Note that SONAR currently relies on the stable version of `fairseq2>=0.5.0` (with minor variations possible). +We recommend installing SONAR only after you have a correct version of `fairseq2` installed. Note that SONAR currently relies on the stable version of `fairseq2>=0.5.2` (with minor variations possible). If you want to install SONAR manually, you can install it localy: diff --git a/pyproject.toml b/pyproject.toml index cbe6d59..a9d104a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,8 @@ dependencies = [ # see https://github.com/facebookresearch/fairseq2 # we require a relaxed version of fairseq2 so that the users can be flexible with it # (depending on the other dependencies of their project) - "fairseq2>=0.5.0", + "fairseq2>=0.5.2", + # "mpmath==1.3.0", # I am not sure if we need it "numpy>=1.21", "torch", "torchaudio", @@ -49,6 +50,8 @@ dependencies = [ # Linters "mypy>=0.782", "pylint>=2.8.0", + "flake8", + "types-tqdm" ] cpu = [ "torch==2.5.1+cpu", diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index ea1bfc6..0000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,13 +0,0 @@ -# Test -pytest>=4.3.0 -pytest-asyncio>=0.15.0 -pytest-cov>=2.6.1 -coverage[toml]>=5.1 -# Format -black==25.1.0 -isort>=5.10.1 -# Linter -mypy>=0.782 -pylint>=2.8.0 -flake8 -types-tqdm diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 3b51293..0000000 --- a/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -fairseq2>=0.5.2 -mpmath==1.3.0 -numpy>=1.21 -torch -torchaudio -sox -soundfile -tqdm From 9923aee5ea0c8a77db6c945288f75a31e797dd6f Mon Sep 17 00:00:00 2001 From: David Dale Date: Fri, 10 Oct 2025 10:51:41 +0000 Subject: [PATCH 6/6] up torch version --- .github/workflows/lint_and_test.yml | 2 +- pyproject.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/lint_and_test.yml b/.github/workflows/lint_and_test.yml index d430c65..dfb0909 100644 --- a/.github/workflows/lint_and_test.yml +++ b/.github/workflows/lint_and_test.yml @@ -57,7 +57,7 @@ jobs: run: | sudo apt-get install libsndfile1 python -m pip install --upgrade pip - pip install -e --extra-index-url https://fair.pkg.atmeta.com/fairseq2/whl/pt2.5.1/cpu ".[dev]" + pip install -e ".[dev]" --extra-index-url https://fair.pkg.atmeta.com/fairseq2/whl/pt2.6.0/cpu - name: mypy run: mypy --install-types --non-interactive ./ --cache-dir=.mypy_cache/ diff --git a/pyproject.toml b/pyproject.toml index a9d104a..729974d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,8 +54,8 @@ dependencies = [ "types-tqdm" ] cpu = [ - "torch==2.5.1+cpu", - "torchaudio==2.5.1+cpu", + "torch==2.6.0+cpu", + "torchaudio==2.6.0+cpu", "fairseq2n>=0.5.2", "fairseq2>=0.5.2", ]

+D%BFENHs6B(-F9ay+uW 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Ǥ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 a;SK!-`C|m$YZ_E8NmrZy_aFM-)c*ir7bVaD literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index 531037f..52e8e23 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,9 @@ classifiers=[ dependencies = [ # fairseq2 is installed with the cpu deps; if you want a gpu build, you need to install it manually. # see https://github.com/facebookresearch/fairseq2 - "fairseq2~=0.4.0", + # we require a relaxed version of fairseq2 so that the users can be flexible with it + # (depending on the other dependencies of their project) + "fairseq2>=0.5.0", "numpy>=1.21", "torch", "torchaudio", @@ -42,7 +44,7 @@ dependencies = [ "pytest-cov>=2.6.1", "coverage[toml]>=5.1", # Format - "black==22.3.0", + "black==25.1.0", "isort>=5.10.1", # Linters "mypy>=0.782", @@ -51,8 +53,8 @@ dependencies = [ cpu = [ "torch==2.5.1+cpu", "torchaudio==2.5.1+cpu", - "fairseq2n~=0.4.0", - "fairseq2~=0.4.0", + "fairseq2n>=0.5.0", + "fairseq2>=0.5.0", ] hg = [ "transformers>=4.44.0", diff --git a/requirements-dev.txt b/requirements-dev.txt index 0390385..ea1bfc6 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,7 +4,7 @@ pytest-asyncio>=0.15.0 pytest-cov>=2.6.1 coverage[toml]>=5.1 # Format -black==22.3.0 +black==25.1.0 isort>=5.10.1 # Linter mypy>=0.782 diff --git a/requirements.txt b/requirements.txt index 62c4e04..6da44fb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -fairseq2>=0.4.0 +fairseq2>=0.5.0 mpmath==1.3.0 numpy>=1.21 torch diff --git a/sonar/__init__.py b/sonar/__init__.py index 79c15e0..29e5685 100644 --- a/sonar/__init__.py +++ b/sonar/__init__.py @@ -8,143 +8,155 @@ SONAR provides a set of speech and text encoders for multilingual, multimodal semantic embedding. """ -from fairseq2 import setup_fairseq2 -from fairseq2.config_registry import ConfigProvider -from fairseq2.context import RuntimeContext -from fairseq2.data.text.tokenizers import TextTokenizerHandler -from fairseq2.models import ModelHandler -from fairseq2.setup import register_package_metadata_provider -from fairseq2.utils.file import TorchTensorLoader +from types import NoneType + +from fairseq2.composition.assets import register_package_assets +from fairseq2.composition.models import register_model_family +from fairseq2.composition.tokenizers import register_tokenizer_family +from fairseq2.runtime.dependency import DependencyContainer from sonar.models.blaser import ( + BLASER_FAMILY, BlaserConfig, - BlaserModelHandler, - register_blaser_configs, + BlaserModel, + _convert_blaser_checkpoint, + _create_blaser_model, + _register_blaser_configs, ) from sonar.models.laser2_text import ( + LASER2_FAMILY, Laser2Config, - Laser2ModelHandler, - Laser2TokenizerHandler, - register_laser2_configs, + LaserLstmEncoder, + _convert_laser2_checkpoint, + _create_laser2_model, + _load_laser2_tokenizer, + _register_laser2_configs, +) +from sonar.models.laser2_text.tokenizer import Laser2Tokenizer +from sonar.models.mutox import ( + MUTOX_FAMILY, + MutoxClassifier, + MutoxConfig, + _convert_mutox_checkpoint, + _create_mutox_model, + _register_mutox_configs, ) -from sonar.models.mutox import MutoxConfig, MutoxModelHandler, register_mutox_configs from sonar.models.sonar_speech import ( + SONAR_SPEECH_FAMILY, SonarSpeechEncoderConfig, - SonarSpeechEncoderHandler, - register_sonar_speech_encoder_configs, + SonarSpeechEncoderModel, + _convert_sonar_speech_checkpoint, + _create_sonar_speech_encoder_model, + _register_sonar_speech_encoder_configs, ) from sonar.models.sonar_text import ( + SONAR_TEXT_DECODER_FAMILY, + SONAR_TEXT_ENCODER_FAMILY, + ConditionalTransformerDecoderModel, SonarTextDecoderConfig, - SonarTextDecoderHandler, SonarTextEncoderConfig, - SonarTextEncoderHandler, - register_sonar_text_decoder_configs, - register_sonar_text_encoder_configs, + SonarTextTransformerEncoderModel, + _convert_sonar_text_decoder_checkpoint, + _convert_sonar_text_encoder_checkpoint, + _create_sonar_text_decoder_model, + _create_sonar_text_encoder_model, + _register_sonar_text_decoder_configs, + _register_sonar_text_encoder_configs, ) -__version__ = "0.4.0" +__version__ = "0.5.0" -def setup_fairseq2_extension(context: RuntimeContext) -> None: +def setup_fairseq2_extension(container: DependencyContainer) -> None: # Make sure that the default fairseq2 asset store can resolve cards under # the directory /cards. - register_package_metadata_provider(context, "sonar.cards") - - _register_models(context) - - _register_text_tokenizers(context) - - -def _register_models(context: RuntimeContext) -> None: - asset_download_manager = context.asset_download_manager - - tensor_loader = TorchTensorLoader(context.file_system, restrict=False) + register_package_assets(container, "sonar.cards") - registry = context.get_registry(ModelHandler) + _register_models(container) - handler: ModelHandler + _register_text_tokenizers(container) - configs: ConfigProvider[object] +def _register_models(container: DependencyContainer) -> None: # Blaser - configs = context.get_config_registry(BlaserConfig) - - default_arch = "basic_ref" - - handler = BlaserModelHandler( - configs, default_arch, asset_download_manager, tensor_loader + register_model_family( + container, + BLASER_FAMILY, + kls=BlaserModel, + config_kls=BlaserConfig, + factory=_create_blaser_model, + state_dict_converter=_convert_blaser_checkpoint, ) - registry.register(handler.family, handler) - - register_blaser_configs(context) + _register_blaser_configs(container) # Laser2 - configs = context.get_config_registry(Laser2Config) - - default_arch = "laser2" - - handler = Laser2ModelHandler( - configs, default_arch, asset_download_manager, tensor_loader + register_model_family( + container, + LASER2_FAMILY, + kls=LaserLstmEncoder, + config_kls=Laser2Config, + factory=_create_laser2_model, + state_dict_converter=_convert_laser2_checkpoint, ) - registry.register(handler.family, handler) - - register_laser2_configs(context) + _register_laser2_configs(container) # mutox - configs = context.get_config_registry(MutoxConfig) - default_arch = "mutox" - handler = MutoxModelHandler( - configs, default_arch, asset_download_manager, tensor_loader + register_model_family( + container, + MUTOX_FAMILY, + kls=MutoxClassifier, + config_kls=MutoxConfig, + factory=_create_mutox_model, + state_dict_converter=_convert_mutox_checkpoint, ) - registry.register(handler.family, handler) - register_mutox_configs(context) - # SONAR Speech Encoder - configs = context.get_config_registry(SonarSpeechEncoderConfig) - - default_arch = "english" + _register_mutox_configs(container) - handler = SonarSpeechEncoderHandler( - configs, default_arch, asset_download_manager, tensor_loader + # SONAR Speech Encoder + register_model_family( + container, + SONAR_SPEECH_FAMILY, + kls=SonarSpeechEncoderModel, + config_kls=SonarSpeechEncoderConfig, + factory=_create_sonar_speech_encoder_model, + state_dict_converter=_convert_sonar_speech_checkpoint, ) - registry.register(handler.family, handler) - - register_sonar_speech_encoder_configs(context) + _register_sonar_speech_encoder_configs(container) # SONAR Text Encoder - configs = context.get_config_registry(SonarTextEncoderConfig) - - default_arch = "basic" - - handler = SonarTextEncoderHandler( - configs, default_arch, asset_download_manager, tensor_loader + register_model_family( + container, + SONAR_TEXT_ENCODER_FAMILY, + kls=SonarTextTransformerEncoderModel, + config_kls=SonarTextEncoderConfig, + factory=_create_sonar_text_encoder_model, + state_dict_converter=_convert_sonar_text_encoder_checkpoint, ) - registry.register(handler.family, handler) - - register_sonar_text_encoder_configs(context) + _register_sonar_text_encoder_configs(container) # SONAR Text Decoder - configs = context.get_config_registry(SonarTextDecoderConfig) - - default_arch = "basic" - - handler = SonarTextDecoderHandler( - configs, default_arch, asset_download_manager, tensor_loader + register_model_family( + container, + SONAR_TEXT_DECODER_FAMILY, + kls=ConditionalTransformerDecoderModel, + config_kls=SonarTextDecoderConfig, + state_dict_converter=_convert_sonar_text_decoder_checkpoint, + factory=_create_sonar_text_decoder_model, ) - registry.register(handler.family, handler) - - register_sonar_text_decoder_configs(context) + _register_sonar_text_decoder_configs(container) -def _register_text_tokenizers(context: RuntimeContext) -> None: - registry = context.get_registry(TextTokenizerHandler) - +def _register_text_tokenizers(container: DependencyContainer) -> None: # Laser2 - handler = Laser2TokenizerHandler(context.asset_download_manager) - - registry.register(handler.family, handler) + register_tokenizer_family( + container, + LASER2_FAMILY, + kls=Laser2Tokenizer, + config_kls=NoneType, + loader=_load_laser2_tokenizer, + ) diff --git a/sonar/cards/sonar_mutox.yaml b/sonar/cards/sonar_mutox.yaml index fef19aa..3f63fae 100644 --- a/sonar/cards/sonar_mutox.yaml +++ b/sonar/cards/sonar_mutox.yaml @@ -13,4 +13,4 @@ name: sonar_mutox model_family: mutox_classifier model_arch: mutox checkpoint: "https://dl.fbaipublicfiles.com/seamless/models/mutox.pt" -input_size: 1024 \ No newline at end of file +input_size: 1024 diff --git a/sonar/cards/sonar_speech_encoder.yaml b/sonar/cards/sonar_speech_encoder.yaml index bbeffc7..2e48c2b 100644 --- a/sonar/cards/sonar_speech_encoder.yaml +++ b/sonar/cards/sonar_speech_encoder.yaml @@ -13,45 +13,55 @@ model_arch: non_english name: sonar_speech_encoder_arb base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.arb.pt" -default_lang: arb -langs: - - arb +tokenizer_config: + _set_: + default_lang: arb + langs: + - arb --- name: sonar_speech_encoder_cat base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.cat.pt" -default_lang: cat -langs: - - cat +tokenizer_config: + _set_: + default_lang: cat + langs: + - cat --- name: sonar_speech_encoder_cym base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.cym.pt" -default_lang: cym -langs: - - cym +tokenizer_config: + _set_: + default_lang: cym + langs: + - cym --- name: sonar_speech_encoder_dan base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.dan.pt" -default_lang: dan -langs: - - dan +tokenizer_config: + _set_: + default_lang: dan + langs: + - dan --- name: sonar_speech_encoder_deu base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.deu.pt" -default_lang: deu -langs: - - deu +tokenizer_config: + _set_: + default_lang: deu + langs: + - deu --- @@ -59,465 +69,569 @@ name: sonar_speech_encoder_eng base: sonar_speech_encoder_base model_arch: english checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.eng.pt" -default_lang: eng -langs: - - eng +tokenizer_config: + _set_: + default_lang: eng + langs: + - eng --- name: sonar_speech_encoder_est base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.est.pt" -default_lang: est -langs: - - est +tokenizer_config: + _set_: + default_lang: est + langs: + - est --- name: sonar_speech_encoder_fin base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.fin.pt" -default_lang: fin -langs: - - fin +tokenizer_config: + _set_: + default_lang: fin + langs: + - fin --- name: sonar_speech_encoder_fra base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.fra.pt" -default_lang: fra -langs: - - fra +tokenizer_config: + _set_: + default_lang: fra + langs: + - fra --- name: sonar_speech_encoder_ind base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.ind.pt" -default_lang: ind -langs: - - ind +tokenizer_config: + _set_: + default_lang: ind + langs: + - ind --- name: sonar_speech_encoder_ita base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.ita.pt" -default_lang: ita -langs: - - ita +tokenizer_config: + _set_: + default_lang: ita + langs: + - ita --- name: sonar_speech_encoder_kor base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.kor.pt" -default_lang: kor -langs: - - kor +tokenizer_config: + _set_: + default_lang: kor + langs: + - kor --- name: sonar_speech_encoder_nld base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.nld.pt" -default_lang: nld -langs: - - nld +tokenizer_config: + _set_: + default_lang: nld + langs: + - nld --- name: sonar_speech_encoder_pes base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.pes.pt" -default_lang: pes -langs: - - pes +tokenizer_config: + _set_: + default_lang: pes + langs: + - pes --- name: sonar_speech_encoder_por base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.por.pt" -default_lang: por -langs: - - por +tokenizer_config: + _set_: + default_lang: por + langs: + - por --- name: sonar_speech_encoder_ron base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.ron.pt" -default_lang: ron -langs: - - ron +tokenizer_config: + _set_: + default_lang: ron + langs: + - ron --- name: sonar_speech_encoder_spa base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.spa.pt" -default_lang: spa -langs: - - spa +tokenizer_config: + _set_: + default_lang: spa + langs: + - spa --- name: sonar_speech_encoder_swh base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.swh.pt" -default_lang: swh -langs: - - swh +tokenizer_config: + _set_: + default_lang: swh + langs: + - swh --- name: sonar_speech_encoder_tgl base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.tgl.pt" -default_lang: tgl -langs: - - tgl +tokenizer_config: + _set_: + default_lang: tgl + langs: + - tgl --- name: sonar_speech_encoder_tur base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.tur.pt" -default_lang: tur -langs: - - tur +tokenizer_config: + _set_: + default_lang: tur + langs: + - tur --- name: sonar_speech_encoder_uzn base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v3ap.uzn.pt" -default_lang: uzn -langs: - - uzn +tokenizer_config: + _set_: + default_lang: uzn + langs: + - uzn --- name: sonar_speech_encoder_asm base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.asm.pt" -default_lang: asm -langs: - - asm +tokenizer_config: + _set_: + default_lang: asm + langs: + - asm --- name: sonar_speech_encoder_bel base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.bel.pt" -default_lang: bel -langs: - - bel +tokenizer_config: + _set_: + default_lang: bel + langs: + - bel --- name: sonar_speech_encoder_ben base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.ben.pt" -default_lang: ben -langs: - - ben +tokenizer_config: + _set_: + default_lang: ben + langs: + - ben --- name: sonar_speech_encoder_bos base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.bos.pt" -default_lang: bos -langs: - - bos +tokenizer_config: + _set_: + default_lang: bos + langs: + - bos --- name: sonar_speech_encoder_bul base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.bul.pt" -default_lang: bul -langs: - - bul +tokenizer_config: + _set_: + default_lang: bul + langs: + - bul --- name: sonar_speech_encoder_ces base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.ces.pt" -default_lang: ces -langs: - - ces +tokenizer_config: + _set_: + default_lang: ces + langs: + - ces --- name: sonar_speech_encoder_cmn base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.cmn.pt" -default_lang: cmn -langs: - - cmn +tokenizer_config: + _set_: + default_lang: cmn + langs: + - cmn --- name: sonar_speech_encoder_guj base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.guj.pt" -default_lang: guj -langs: - - guj +tokenizer_config: + _set_: + default_lang: guj + langs: + - guj --- name: sonar_speech_encoder_heb base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.heb.pt" -default_lang: heb -langs: - - heb +tokenizer_config: + _set_: + default_lang: heb + langs: + - heb --- name: sonar_speech_encoder_hin base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.hin.pt" -default_lang: hin -langs: - - hin +tokenizer_config: + _set_: + default_lang: hin + langs: + - hin --- name: sonar_speech_encoder_hrv base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.hrv.pt" -default_lang: hrv -langs: - - hrv +tokenizer_config: + _set_: + default_lang: hrv + langs: + - hrv --- name: sonar_speech_encoder_jpn base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.jpn.pt" -default_lang: jpn -langs: - - jpn +tokenizer_config: + _set_: + default_lang: jpn + langs: + - jpn --- name: sonar_speech_encoder_kan base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.kan.pt" -default_lang: kan -langs: - - kan +tokenizer_config: + _set_: + default_lang: kan + langs: + - kan --- name: sonar_speech_encoder_lao base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.lao.pt" -default_lang: lao -langs: - - lao +tokenizer_config: + _set_: + default_lang: lao + langs: + - lao --- name: sonar_speech_encoder_lit base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.lit.pt" -default_lang: lit -langs: - - lit +tokenizer_config: + _set_: + default_lang: lit + langs: + - lit --- name: sonar_speech_encoder_lvs base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.lvs.pt" -default_lang: lvs -langs: - - lvs +tokenizer_config: + _set_: + default_lang: lvs + langs: + - lvs --- name: sonar_speech_encoder_mal base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.mal.pt" -default_lang: mal -langs: - - mal +tokenizer_config: + _set_: + default_lang: mal + langs: + - mal --- name: sonar_speech_encoder_mar base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.mar.pt" -default_lang: mar -langs: - - mar +tokenizer_config: + _set_: + default_lang: mar + langs: + - mar --- name: sonar_speech_encoder_mkd base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.mkd.pt" -default_lang: mkd -langs: - - mkd +tokenizer_config: + _set_: + default_lang: mkd + langs: + - mkd --- name: sonar_speech_encoder_mlt base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.mlt.pt" -default_lang: mlt -langs: - - mlt +tokenizer_config: + _set_: + default_lang: mlt + langs: + - mlt --- name: sonar_speech_encoder_npi base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.npi.pt" -default_lang: npi -langs: - - npi +tokenizer_config: + _set_: + default_lang: npi + langs: + - npi --- name: sonar_speech_encoder_ory base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.ory.pt" -default_lang: ory -langs: - - ory +tokenizer_config: + _set_: + default_lang: ory + langs: + - ory --- name: sonar_speech_encoder_pan base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.pan.pt" -default_lang: pan -langs: - - pan +tokenizer_config: + _set_: + default_lang: pan + langs: + - pan --- name: sonar_speech_encoder_pol base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.pol.pt" -default_lang: pol -langs: - - pol +tokenizer_config: + _set_: + default_lang: pol + langs: + - pol --- name: sonar_speech_encoder_rus base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.rus.pt" -default_lang: rus -langs: - - rus +tokenizer_config: + _set_: + default_lang: rus + langs: + - rus --- name: sonar_speech_encoder_slk base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.slk.pt" -default_lang: slk -langs: - - slk +tokenizer_config: + _set_: + default_lang: slk + langs: + - slk --- name: sonar_speech_encoder_slv base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.slv.pt" -default_lang: slv -langs: - - slv +tokenizer_config: + _set_: + default_lang: slv + langs: + - slv --- name: sonar_speech_encoder_snd base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.snd.pt" -default_lang: snd -langs: - - snd +tokenizer_config: + _set_: + default_lang: snd + langs: + - snd --- name: sonar_speech_encoder_srp base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.srp.pt" -default_lang: srp -langs: - - srp +tokenizer_config: + _set_: + default_lang: srp + langs: + - srp --- name: sonar_speech_encoder_tam base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.tam.pt" -default_lang: tam -langs: - - tam +tokenizer_config: + _set_: + default_lang: tam + langs: + - tam --- name: sonar_speech_encoder_tel base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.tel.pt" -default_lang: tel -langs: - - tel +tokenizer_config: + _set_: + default_lang: tel + langs: + - tel --- name: sonar_speech_encoder_tha base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.tha.pt" -default_lang: tha -langs: - - tha +tokenizer_config: + _set_: + default_lang: tha + langs: + - tha --- name: sonar_speech_encoder_ukr base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.ukr.pt" -default_lang: ukr -langs: - - ukr +tokenizer_config: + _set_: + default_lang: ukr + langs: + - ukr --- name: sonar_speech_encoder_urd base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.urd.pt" -default_lang: urd -langs: - - urd +tokenizer_config: + _set_: + default_lang: urd + langs: + - urd --- name: sonar_speech_encoder_vie base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.vie.pt" -default_lang: vie -langs: - - vie +tokenizer_config: + _set_: + default_lang: vie + langs: + - vie --- name: sonar_speech_encoder_yue base: sonar_speech_encoder_base checkpoint: "https://dl.fbaipublicfiles.com/SONAR/spenc.v5ap.yue.pt" -default_lang: yue -langs: - - yue +tokenzier_config: + _set_: + default_lang: yue + langs: + - yue diff --git a/sonar/cards/text_sonar_basic_decoder.yaml b/sonar/cards/text_sonar_basic_decoder.yaml index b90cbbb..78f3f5f 100644 --- a/sonar/cards/text_sonar_basic_decoder.yaml +++ b/sonar/cards/text_sonar_basic_decoder.yaml @@ -10,207 +10,209 @@ model_arch: basic checkpoint: "https://dl.fbaipublicfiles.com/SONAR/sonar_text_decoder.pt" tokenizer: "https://dl.fbaipublicfiles.com/SONAR/sentencepiece.source.256000.model" tokenizer_family: nllb -default_lang: eng_Latn -langs: - - ace_Arab - - ace_Latn - - acm_Arab - - acq_Arab - - aeb_Arab - - afr_Latn - - ajp_Arab - - aka_Latn - - amh_Ethi - - apc_Arab - - arb_Arab - - ars_Arab - - ary_Arab - - arz_Arab - - asm_Beng - - ast_Latn - - awa_Deva - - ayr_Latn - - azb_Arab - - azj_Latn - - bak_Cyrl - - bam_Latn - - ban_Latn - - bel_Cyrl - - bem_Latn - - ben_Beng - - bho_Deva - - bjn_Arab - - bjn_Latn - - bod_Tibt - - bos_Latn - - bug_Latn - - bul_Cyrl - - cat_Latn - - ceb_Latn - - ces_Latn - - cjk_Latn - - ckb_Arab - - crh_Latn - - cym_Latn - - dan_Latn - - deu_Latn - - dik_Latn - - dyu_Latn - - dzo_Tibt - - ell_Grek - - eng_Latn - - epo_Latn - - est_Latn - - eus_Latn - - ewe_Latn - - fao_Latn - - pes_Arab - - fij_Latn - - fin_Latn - - fon_Latn - - fra_Latn - - fur_Latn - - fuv_Latn - - gla_Latn - - gle_Latn - - glg_Latn - - grn_Latn - - guj_Gujr - - hat_Latn - - hau_Latn - - heb_Hebr - - hin_Deva - - hne_Deva - - hrv_Latn - - hun_Latn - - hye_Armn - - ibo_Latn - - ilo_Latn - - ind_Latn - - isl_Latn - - ita_Latn - - jav_Latn - - jpn_Jpan - - kab_Latn - - kac_Latn - - kam_Latn - - kan_Knda - - kas_Arab - - kas_Deva - - kat_Geor - - knc_Arab - - knc_Latn - - kaz_Cyrl - - kbp_Latn - - kea_Latn - - khm_Khmr - - kik_Latn - - kin_Latn - - kir_Cyrl - - kmb_Latn - - kon_Latn - - kor_Hang - - kmr_Latn - - lao_Laoo - - lvs_Latn - - lij_Latn - - lim_Latn - - lin_Latn - - lit_Latn - - lmo_Latn - - ltg_Latn - - ltz_Latn - - lua_Latn - - lug_Latn - - luo_Latn - - lus_Latn - - mag_Deva - - mai_Deva - - mal_Mlym - - mar_Deva - - min_Latn - - mkd_Cyrl - - plt_Latn - - mlt_Latn - - mni_Beng - - khk_Cyrl - - mos_Latn - - mri_Latn - - zsm_Latn - - mya_Mymr - - nld_Latn - - nno_Latn - - nob_Latn - - npi_Deva - - nso_Latn - - nus_Latn - - nya_Latn - - oci_Latn - - gaz_Latn - - ory_Orya - - pag_Latn - - pan_Guru - - pap_Latn - - pol_Latn - - por_Latn - - prs_Arab - - pbt_Arab - - quy_Latn - - ron_Latn - - run_Latn - - rus_Cyrl - - sag_Latn - - san_Deva - - sat_Beng - - scn_Latn - - shn_Mymr - - sin_Sinh - - slk_Latn - - slv_Latn - - smo_Latn - - sna_Latn - - snd_Arab - - som_Latn - - sot_Latn - - spa_Latn - - als_Latn - - srd_Latn - - srp_Cyrl - - ssw_Latn - - sun_Latn - - swe_Latn - - swh_Latn - - szl_Latn - - tam_Taml - - tat_Cyrl - - tel_Telu - - tgk_Cyrl - - tgl_Latn - - tha_Thai - - tir_Ethi - - taq_Latn - - taq_Tfng - - tpi_Latn - - tsn_Latn - - tso_Latn - - tuk_Latn - - tum_Latn - - tur_Latn - - twi_Latn - - tzm_Tfng - - uig_Arab - - ukr_Cyrl - - umb_Latn - - urd_Arab - - uzn_Latn - - vec_Latn - - vie_Latn - - war_Latn - - wol_Latn - - xho_Latn - - ydd_Hebr - - yor_Latn - - yue_Hant - - zho_Hans - - zho_Hant - - zul_Latn +tokenizer_config: + _set_: + default_lang: eng_Latn + langs: + - ace_Arab + - ace_Latn + - acm_Arab + - acq_Arab + - aeb_Arab + - afr_Latn + - ajp_Arab + - aka_Latn + - amh_Ethi + - apc_Arab + - arb_Arab + - ars_Arab + - ary_Arab + - arz_Arab + - asm_Beng + - ast_Latn + - awa_Deva + - ayr_Latn + - azb_Arab + - azj_Latn + - bak_Cyrl + - bam_Latn + - ban_Latn + - bel_Cyrl + - bem_Latn + - ben_Beng + - bho_Deva + - bjn_Arab + - bjn_Latn + - bod_Tibt + - bos_Latn + - bug_Latn + - bul_Cyrl + - cat_Latn + - ceb_Latn + - ces_Latn + - cjk_Latn + - ckb_Arab + - crh_Latn + - cym_Latn + - dan_Latn + - deu_Latn + - dik_Latn + - dyu_Latn + - dzo_Tibt + - ell_Grek + - eng_Latn + - epo_Latn + - est_Latn + - eus_Latn + - ewe_Latn + - fao_Latn + - pes_Arab + - fij_Latn + - fin_Latn + - fon_Latn + - fra_Latn + - fur_Latn + - fuv_Latn + - gla_Latn + - gle_Latn + - glg_Latn + - grn_Latn + - guj_Gujr + - hat_Latn + - hau_Latn + - heb_Hebr + - hin_Deva + - hne_Deva + - hrv_Latn + - hun_Latn + - hye_Armn + - ibo_Latn + - ilo_Latn + - ind_Latn + - isl_Latn + - ita_Latn + - jav_Latn + - jpn_Jpan + - kab_Latn + - kac_Latn + - kam_Latn + - kan_Knda + - kas_Arab + - kas_Deva + - kat_Geor + - knc_Arab + - knc_Latn + - kaz_Cyrl + - kbp_Latn + - kea_Latn + - khm_Khmr + - kik_Latn + - kin_Latn + - kir_Cyrl + - kmb_Latn + - kon_Latn + - kor_Hang + - kmr_Latn + - lao_Laoo + - lvs_Latn + - lij_Latn + - lim_Latn + - lin_Latn + - lit_Latn + - lmo_Latn + - ltg_Latn + - ltz_Latn + - lua_Latn + - lug_Latn + - luo_Latn + - lus_Latn + - mag_Deva + - mai_Deva + - mal_Mlym + - mar_Deva + - min_Latn + - mkd_Cyrl + - plt_Latn + - mlt_Latn + - mni_Beng + - khk_Cyrl + - mos_Latn + - mri_Latn + - zsm_Latn + - mya_Mymr + - nld_Latn + - nno_Latn + - nob_Latn + - npi_Deva + - nso_Latn + - nus_Latn + - nya_Latn + - oci_Latn + - gaz_Latn + - ory_Orya + - pag_Latn + - pan_Guru + - pap_Latn + - pol_Latn + - por_Latn + - prs_Arab + - pbt_Arab + - quy_Latn + - ron_Latn + - run_Latn + - rus_Cyrl + - sag_Latn + - san_Deva + - sat_Beng + - scn_Latn + - shn_Mymr + - sin_Sinh + - slk_Latn + - slv_Latn + - smo_Latn + - sna_Latn + - snd_Arab + - som_Latn + - sot_Latn + - spa_Latn + - als_Latn + - srd_Latn + - srp_Cyrl + - ssw_Latn + - sun_Latn + - swe_Latn + - swh_Latn + - szl_Latn + - tam_Taml + - tat_Cyrl + - tel_Telu + - tgk_Cyrl + - tgl_Latn + - tha_Thai + - tir_Ethi + - taq_Latn + - taq_Tfng + - tpi_Latn + - tsn_Latn + - tso_Latn + - tuk_Latn + - tum_Latn + - tur_Latn + - twi_Latn + - tzm_Tfng + - uig_Arab + - ukr_Cyrl + - umb_Latn + - urd_Arab + - uzn_Latn + - vec_Latn + - vie_Latn + - war_Latn + - wol_Latn + - xho_Latn + - ydd_Hebr + - yor_Latn + - yue_Hant + - zho_Hans + - zho_Hant + - zul_Latn diff --git a/sonar/cards/text_sonar_basic_encoder.yaml b/sonar/cards/text_sonar_basic_encoder.yaml index c58bd7b..1799941 100644 --- a/sonar/cards/text_sonar_basic_encoder.yaml +++ b/sonar/cards/text_sonar_basic_encoder.yaml @@ -10,207 +10,209 @@ model_arch: basic checkpoint: "https://dl.fbaipublicfiles.com/SONAR/sonar_text_encoder.pt" tokenizer: "https://dl.fbaipublicfiles.com/SONAR/sentencepiece.source.256000.model" tokenizer_family: nllb -default_lang: eng_Latn -langs: - - ace_Arab - - ace_Latn - - acm_Arab - - acq_Arab - - aeb_Arab - - afr_Latn - - ajp_Arab - - aka_Latn - - amh_Ethi - - apc_Arab - - arb_Arab - - ars_Arab - - ary_Arab - - arz_Arab - - asm_Beng - - ast_Latn - - awa_Deva - - ayr_Latn - - azb_Arab - - azj_Latn - - bak_Cyrl - - bam_Latn - - ban_Latn - - bel_Cyrl - - bem_Latn - - ben_Beng - - bho_Deva - - bjn_Arab - - bjn_Latn - - bod_Tibt - - bos_Latn - - bug_Latn - - bul_Cyrl - - cat_Latn - - ceb_Latn - - ces_Latn - - cjk_Latn - - ckb_Arab - - crh_Latn - - cym_Latn - - dan_Latn - - deu_Latn - - dik_Latn - - dyu_Latn - - dzo_Tibt - - ell_Grek - - eng_Latn - - epo_Latn - - est_Latn - - eus_Latn - - ewe_Latn - - fao_Latn - - pes_Arab - - fij_Latn - - fin_Latn - - fon_Latn - - fra_Latn - - fur_Latn - - fuv_Latn - - gla_Latn - - gle_Latn - - glg_Latn - - grn_Latn - - guj_Gujr - - hat_Latn - - hau_Latn - - heb_Hebr - - hin_Deva - - hne_Deva - - hrv_Latn - - hun_Latn - - hye_Armn - - ibo_Latn - - ilo_Latn - - ind_Latn - - isl_Latn - - ita_Latn - - jav_Latn - - jpn_Jpan - - kab_Latn - - kac_Latn - - kam_Latn - - kan_Knda - - kas_Arab - - kas_Deva - - kat_Geor - - knc_Arab - - knc_Latn - - kaz_Cyrl - - kbp_Latn - - kea_Latn - - khm_Khmr - - kik_Latn - - kin_Latn - - kir_Cyrl - - kmb_Latn - - kon_Latn - - kor_Hang - - kmr_Latn - - lao_Laoo - - lvs_Latn - - lij_Latn - - lim_Latn - - lin_Latn - - lit_Latn - - lmo_Latn - - ltg_Latn - - ltz_Latn - - lua_Latn - - lug_Latn - - luo_Latn - - lus_Latn - - mag_Deva - - mai_Deva - - mal_Mlym - - mar_Deva - - min_Latn - - mkd_Cyrl - - plt_Latn - - mlt_Latn - - mni_Beng - - khk_Cyrl - - mos_Latn - - mri_Latn - - zsm_Latn - - mya_Mymr - - nld_Latn - - nno_Latn - - nob_Latn - - npi_Deva - - nso_Latn - - nus_Latn - - nya_Latn - - oci_Latn - - gaz_Latn - - ory_Orya - - pag_Latn - - pan_Guru - - pap_Latn - - pol_Latn - - por_Latn - - prs_Arab - - pbt_Arab - - quy_Latn - - ron_Latn - - run_Latn - - rus_Cyrl - - sag_Latn - - san_Deva - - sat_Beng - - scn_Latn - - shn_Mymr - - sin_Sinh - - slk_Latn - - slv_Latn - - smo_Latn - - sna_Latn - - snd_Arab - - som_Latn - - sot_Latn - - spa_Latn - - als_Latn - - srd_Latn - - srp_Cyrl - - ssw_Latn - - sun_Latn - - swe_Latn - - swh_Latn - - szl_Latn - - tam_Taml - - tat_Cyrl - - tel_Telu - - tgk_Cyrl - - tgl_Latn - - tha_Thai - - tir_Ethi - - taq_Latn - - taq_Tfng - - tpi_Latn - - tsn_Latn - - tso_Latn - - tuk_Latn - - tum_Latn - - tur_Latn - - twi_Latn - - tzm_Tfng - - uig_Arab - - ukr_Cyrl - - umb_Latn - - urd_Arab - - uzn_Latn - - vec_Latn - - vie_Latn - - war_Latn - - wol_Latn - - xho_Latn - - ydd_Hebr - - yor_Latn - - yue_Hant - - zho_Hans - - zho_Hant - - zul_Latn +tokenizer_config: + _set_: + default_lang: eng_Latn + langs: + - ace_Arab + - ace_Latn + - acm_Arab + - acq_Arab + - aeb_Arab + - afr_Latn + - ajp_Arab + - aka_Latn + - amh_Ethi + - apc_Arab + - arb_Arab + - ars_Arab + - ary_Arab + - arz_Arab + - asm_Beng + - ast_Latn + - awa_Deva + - ayr_Latn + - azb_Arab + - azj_Latn + - bak_Cyrl + - bam_Latn + - ban_Latn + - bel_Cyrl + - bem_Latn + - ben_Beng + - bho_Deva + - bjn_Arab + - bjn_Latn + - bod_Tibt + - bos_Latn + - bug_Latn + - bul_Cyrl + - cat_Latn + - ceb_Latn + - ces_Latn + - cjk_Latn + - ckb_Arab + - crh_Latn + - cym_Latn + - dan_Latn + - deu_Latn + - dik_Latn + - dyu_Latn + - dzo_Tibt + - ell_Grek + - eng_Latn + - epo_Latn + - est_Latn + - eus_Latn + - ewe_Latn + - fao_Latn + - pes_Arab + - fij_Latn + - fin_Latn + - fon_Latn + - fra_Latn + - fur_Latn + - fuv_Latn + - gla_Latn + - gle_Latn + - glg_Latn + - grn_Latn + - guj_Gujr + - hat_Latn + - hau_Latn + - heb_Hebr + - hin_Deva + - hne_Deva + - hrv_Latn + - hun_Latn + - hye_Armn + - ibo_Latn + - ilo_Latn + - ind_Latn + - isl_Latn + - ita_Latn + - jav_Latn + - jpn_Jpan + - kab_Latn + - kac_Latn + - kam_Latn + - kan_Knda + - kas_Arab + - kas_Deva + - kat_Geor + - knc_Arab + - knc_Latn + - kaz_Cyrl + - kbp_Latn + - kea_Latn + - khm_Khmr + - kik_Latn + - kin_Latn + - kir_Cyrl + - kmb_Latn + - kon_Latn + - kor_Hang + - kmr_Latn + - lao_Laoo + - lvs_Latn + - lij_Latn + - lim_Latn + - lin_Latn + - lit_Latn + - lmo_Latn + - ltg_Latn + - ltz_Latn + - lua_Latn + - lug_Latn + - luo_Latn + - lus_Latn + - mag_Deva + - mai_Deva + - mal_Mlym + - mar_Deva + - min_Latn + - mkd_Cyrl + - plt_Latn + - mlt_Latn + - mni_Beng + - khk_Cyrl + - mos_Latn + - mri_Latn + - zsm_Latn + - mya_Mymr + - nld_Latn + - nno_Latn + - nob_Latn + - npi_Deva + - nso_Latn + - nus_Latn + - nya_Latn + - oci_Latn + - gaz_Latn + - ory_Orya + - pag_Latn + - pan_Guru + - pap_Latn + - pol_Latn + - por_Latn + - prs_Arab + - pbt_Arab + - quy_Latn + - ron_Latn + - run_Latn + - rus_Cyrl + - sag_Latn + - san_Deva + - sat_Beng + - scn_Latn + - shn_Mymr + - sin_Sinh + - slk_Latn + - slv_Latn + - smo_Latn + - sna_Latn + - snd_Arab + - som_Latn + - sot_Latn + - spa_Latn + - als_Latn + - srd_Latn + - srp_Cyrl + - ssw_Latn + - sun_Latn + - swe_Latn + - swh_Latn + - szl_Latn + - tam_Taml + - tat_Cyrl + - tel_Telu + - tgk_Cyrl + - tgl_Latn + - tha_Thai + - tir_Ethi + - taq_Latn + - taq_Tfng + - tpi_Latn + - tsn_Latn + - tso_Latn + - tuk_Latn + - tum_Latn + - tur_Latn + - twi_Latn + - tzm_Tfng + - uig_Arab + - ukr_Cyrl + - umb_Latn + - urd_Arab + - uzn_Latn + - vec_Latn + - vie_Latn + - war_Latn + - wol_Latn + - xho_Latn + - ydd_Hebr + - yor_Latn + - yue_Hant + - zho_Hans + - zho_Hant + - zul_Latn diff --git a/sonar/cards/text_sonar_finetuned_decoder.yaml b/sonar/cards/text_sonar_finetuned_decoder.yaml index bd738b7..2b491a6 100644 --- a/sonar/cards/text_sonar_finetuned_decoder.yaml +++ b/sonar/cards/text_sonar_finetuned_decoder.yaml @@ -11,207 +11,209 @@ model_arch: basic checkpoint: "https://dl.fbaipublicfiles.com/SONAR/finetuned_decoder.pt" tokenizer: "https://dl.fbaipublicfiles.com/SONAR/sentencepiece.source.256000.model" tokenizer_family: nllb -default_lang: eng_Latn -langs: - - ace_Arab - - ace_Latn - - acm_Arab - - acq_Arab - - aeb_Arab - - afr_Latn - - ajp_Arab - - aka_Latn - - amh_Ethi - - apc_Arab - - arb_Arab - - ars_Arab - - ary_Arab - - arz_Arab - - asm_Beng - - ast_Latn - - awa_Deva - - ayr_Latn - - azb_Arab - - azj_Latn - - bak_Cyrl - - bam_Latn - - ban_Latn - - bel_Cyrl - - bem_Latn - - ben_Beng - - bho_Deva - - bjn_Arab - - bjn_Latn - - bod_Tibt - - bos_Latn - - bug_Latn - - bul_Cyrl - - cat_Latn - - ceb_Latn - - ces_Latn - - cjk_Latn - - ckb_Arab - - crh_Latn - - cym_Latn - - dan_Latn - - deu_Latn - - dik_Latn - - dyu_Latn - - dzo_Tibt - - ell_Grek - - eng_Latn - - epo_Latn - - est_Latn - - eus_Latn - - ewe_Latn - - fao_Latn - - pes_Arab - - fij_Latn - - fin_Latn - - fon_Latn - - fra_Latn - - fur_Latn - - fuv_Latn - - gla_Latn - - gle_Latn - - glg_Latn - - grn_Latn - - guj_Gujr - - hat_Latn - - hau_Latn - - heb_Hebr - - hin_Deva - - hne_Deva - - hrv_Latn - - hun_Latn - - hye_Armn - - ibo_Latn - - ilo_Latn - - ind_Latn - - isl_Latn - - ita_Latn - - jav_Latn - - jpn_Jpan - - kab_Latn - - kac_Latn - - kam_Latn - - kan_Knda - - kas_Arab - - kas_Deva - - kat_Geor - - knc_Arab - - knc_Latn - - kaz_Cyrl - - kbp_Latn - - kea_Latn - - khm_Khmr - - kik_Latn - - kin_Latn - - kir_Cyrl - - kmb_Latn - - kon_Latn - - kor_Hang - - kmr_Latn - - lao_Laoo - - lvs_Latn - - lij_Latn - - lim_Latn - - lin_Latn - - lit_Latn - - lmo_Latn - - ltg_Latn - - ltz_Latn - - lua_Latn - - lug_Latn - - luo_Latn - - lus_Latn - - mag_Deva - - mai_Deva - - mal_Mlym - - mar_Deva - - min_Latn - - mkd_Cyrl - - plt_Latn - - mlt_Latn - - mni_Beng - - khk_Cyrl - - mos_Latn - - mri_Latn - - zsm_Latn - - mya_Mymr - - nld_Latn - - nno_Latn - - nob_Latn - - npi_Deva - - nso_Latn - - nus_Latn - - nya_Latn - - oci_Latn - - gaz_Latn - - ory_Orya - - pag_Latn - - pan_Guru - - pap_Latn - - pol_Latn - - por_Latn - - prs_Arab - - pbt_Arab - - quy_Latn - - ron_Latn - - run_Latn - - rus_Cyrl - - sag_Latn - - san_Deva - - sat_Beng - - scn_Latn - - shn_Mymr - - sin_Sinh - - slk_Latn - - slv_Latn - - smo_Latn - - sna_Latn - - snd_Arab - - som_Latn - - sot_Latn - - spa_Latn - - als_Latn - - srd_Latn - - srp_Cyrl - - ssw_Latn - - sun_Latn - - swe_Latn - - swh_Latn - - szl_Latn - - tam_Taml - - tat_Cyrl - - tel_Telu - - tgk_Cyrl - - tgl_Latn - - tha_Thai - - tir_Ethi - - taq_Latn - - taq_Tfng - - tpi_Latn - - tsn_Latn - - tso_Latn - - tuk_Latn - - tum_Latn - - tur_Latn - - twi_Latn - - tzm_Tfng - - uig_Arab - - ukr_Cyrl - - umb_Latn - - urd_Arab - - uzn_Latn - - vec_Latn - - vie_Latn - - war_Latn - - wol_Latn - - xho_Latn - - ydd_Hebr - - yor_Latn - - yue_Hant - - zho_Hans - - zho_Hant - - zul_Latn +tokenizer_config: + _set_: + default_lang: eng_Latn + langs: + - ace_Arab + - ace_Latn + - acm_Arab + - acq_Arab + - aeb_Arab + - afr_Latn + - ajp_Arab + - aka_Latn + - amh_Ethi + - apc_Arab + - arb_Arab + - ars_Arab + - ary_Arab + - arz_Arab + - asm_Beng + - ast_Latn + - awa_Deva + - ayr_Latn + - azb_Arab + - azj_Latn + - bak_Cyrl + - bam_Latn + - ban_Latn + - bel_Cyrl + - bem_Latn + - ben_Beng + - bho_Deva + - bjn_Arab + - bjn_Latn + - bod_Tibt + - bos_Latn + - bug_Latn + - bul_Cyrl + - cat_Latn + - ceb_Latn + - ces_Latn + - cjk_Latn + - ckb_Arab + - crh_Latn + - cym_Latn + - dan_Latn + - deu_Latn + - dik_Latn + - dyu_Latn + - dzo_Tibt + - ell_Grek + - eng_Latn + - epo_Latn + - est_Latn + - eus_Latn + - ewe_Latn + - fao_Latn + - pes_Arab + - fij_Latn + - fin_Latn + - fon_Latn + - fra_Latn + - fur_Latn + - fuv_Latn + - gla_Latn + - gle_Latn + - glg_Latn + - grn_Latn + - guj_Gujr + - hat_Latn + - hau_Latn + - heb_Hebr + - hin_Deva + - hne_Deva + - hrv_Latn + - hun_Latn + - hye_Armn + - ibo_Latn + - ilo_Latn + - ind_Latn + - isl_Latn + - ita_Latn + - jav_Latn + - jpn_Jpan + - kab_Latn + - kac_Latn + - kam_Latn + - kan_Knda + - kas_Arab + - kas_Deva + - kat_Geor + - knc_Arab + - knc_Latn + - kaz_Cyrl + - kbp_Latn + - kea_Latn + - khm_Khmr + - kik_Latn + - kin_Latn + - kir_Cyrl + - kmb_Latn + - kon_Latn + - kor_Hang + - kmr_Latn + - lao_Laoo + - lvs_Latn + - lij_Latn + - lim_Latn + - lin_Latn + - lit_Latn + - lmo_Latn + - ltg_Latn + - ltz_Latn + - lua_Latn + - lug_Latn + - luo_Latn + - lus_Latn + - mag_Deva + - mai_Deva + - mal_Mlym + - mar_Deva + - min_Latn + - mkd_Cyrl + - plt_Latn + - mlt_Latn + - mni_Beng + - khk_Cyrl + - mos_Latn + - mri_Latn + - zsm_Latn + - mya_Mymr + - nld_Latn + - nno_Latn + - nob_Latn + - npi_Deva + - nso_Latn + - nus_Latn + - nya_Latn + - oci_Latn + - gaz_Latn + - ory_Orya + - pag_Latn + - pan_Guru + - pap_Latn + - pol_Latn + - por_Latn + - prs_Arab + - pbt_Arab + - quy_Latn + - ron_Latn + - run_Latn + - rus_Cyrl + - sag_Latn + - san_Deva + - sat_Beng + - scn_Latn + - shn_Mymr + - sin_Sinh + - slk_Latn + - slv_Latn + - smo_Latn + - sna_Latn + - snd_Arab + - som_Latn + - sot_Latn + - spa_Latn + - als_Latn + - srd_Latn + - srp_Cyrl + - ssw_Latn + - sun_Latn + - swe_Latn + - swh_Latn + - szl_Latn + - tam_Taml + - tat_Cyrl + - tel_Telu + - tgk_Cyrl + - tgl_Latn + - tha_Thai + - tir_Ethi + - taq_Latn + - taq_Tfng + - tpi_Latn + - tsn_Latn + - tso_Latn + - tuk_Latn + - tum_Latn + - tur_Latn + - twi_Latn + - tzm_Tfng + - uig_Arab + - ukr_Cyrl + - umb_Latn + - urd_Arab + - uzn_Latn + - vec_Latn + - vie_Latn + - war_Latn + - wol_Latn + - xho_Latn + - ydd_Hebr + - yor_Latn + - yue_Hant + - zho_Hans + - zho_Hant + - zul_Latn diff --git a/sonar/inference_pipelines/mutox_speech.py b/sonar/inference_pipelines/mutox_speech.py index 6ab2f1b..e8efc22 100644 --- a/sonar/inference_pipelines/mutox_speech.py +++ b/sonar/inference_pipelines/mutox_speech.py @@ -7,8 +7,8 @@ from typing import Union import torch -from fairseq2.data import DataPipelineBuilder -from fairseq2.typing import Device +from fairseq2.data.data_pipeline import DataPipelineBuilder +from fairseq2.device import Device from sonar.inference_pipelines.speech import ( AudioToFbankDataPipelineBuilder, @@ -44,7 +44,7 @@ def __init__( self.model.to(device).eval() if isinstance(mutox_classifier, str): - self.mutox_classifier = get_mutox_model_hub().load( + self.mutox_classifier = get_mutox_model_hub().load_model( mutox_classifier, device=device, ) @@ -61,8 +61,8 @@ def load_model_from_name( device: Device = CPU_DEVICE, ) -> "MutoxSpeechClassifierPipeline": encoder_hub = get_sonar_speech_encoder_hub() - encoder = encoder_hub.load(encoder_name, device=device) - mutox_classifier = get_mutox_model_hub().load( + encoder = encoder_hub.load_model(encoder_name, device=device) + mutox_classifier = get_mutox_model_hub().load_model( mutox_classifier_name, device=device, ) diff --git a/sonar/inference_pipelines/speech.py b/sonar/inference_pipelines/speech.py index 4e8e41f..9460337 100644 --- a/sonar/inference_pipelines/speech.py +++ b/sonar/inference_pipelines/speech.py @@ -8,25 +8,24 @@ from dataclasses import dataclass from functools import lru_cache from pathlib import Path -from typing import Iterable, List, Optional, Sequence, Union, cast +from typing import Iterable, List, Optional, Sequence, Union -import fairseq2 import torch -from fairseq2.data import ( +from fairseq2.data._memory import MemoryBlock +from fairseq2.data.audio import AudioDecoder, WaveformToFbankConverter +from fairseq2.data.data_pipeline import ( Collater, DataPipeline, DataPipelineBuilder, FileMapper, - MemoryBlock, read_sequence, ) -from fairseq2.data.audio import AudioDecoder, WaveformToFbankConverter from fairseq2.data.text import StrSplitter, read_text -from fairseq2.data.text.tokenizers import TextTokenizer, get_text_tokenizer_hub -from fairseq2.generation import BeamSearchSeq2SeqGenerator +from fairseq2.data.tokenizers import Tokenizer, load_tokenizer +from fairseq2.data_type import DataType +from fairseq2.device import Device +from fairseq2.generation.beam_search.generator import BeamSearchSeq2SeqGenerator from fairseq2.generation.text import SequenceToTextConverter -from fairseq2.models.sequence import SequenceBatch -from fairseq2.typing import DataType, Device from sonar.inference_pipelines.utils import add_progress_bar, extract_sequence_batch from sonar.models.encoder_model import SonarEncoderModel @@ -179,7 +178,7 @@ def __init__(self, model: SonarSpeechEncoderModel) -> None: @classmethod def load_model_from_name(cls, encoder_name: str) -> "SpeechToEmbeddingPipeline": encoder_hub = get_sonar_speech_encoder_hub() - encoder = encoder_hub.load(encoder_name, device=CPU_DEVICE) + encoder = encoder_hub.load_model(encoder_name, device=CPU_DEVICE) return cls(model=encoder) def prebuild_pipeline(self, context: SpeechInferenceParams) -> DataPipelineBuilder: @@ -196,7 +195,8 @@ def prebuild_pipeline(self, context: SpeechInferenceParams) -> DataPipelineBuild @torch.inference_mode() def run_inference(self, data: dict) -> dict: # TODO assert all(data['sample_rate'] == 16000.0) - return self.model(data["fbank"]) + # Note the fan-out which unpacks the Tuple[Tensor, BatchLayout] + return self.model(*data["fbank"]) class SpeechToTextPipeline(SpeechInferencePipeline): @@ -225,11 +225,9 @@ class SpeechToTextPipeline(SpeechInferencePipeline): AudioToFbankDataPipelineBuilder() ) model: SonarEncoderDecoderModel - tokenizer: TextTokenizer + tokenizer: Tokenizer - def __init__( - self, model: SonarEncoderDecoderModel, tokenizer: TextTokenizer - ) -> None: + def __init__(self, model: SonarEncoderDecoderModel, tokenizer: Tokenizer) -> None: self.model = model.eval() self.tokenizer = tokenizer @@ -237,21 +235,22 @@ def __init__( def load_model_from_name( cls, encoder_name: str, decoder_name: str ) -> "SpeechToTextPipeline": - tokenizer_hub = get_text_tokenizer_hub() - tokenizer = tokenizer_hub.load(decoder_name) + tokenizer = load_tokenizer(decoder_name) encoder_hub = get_sonar_speech_encoder_hub() - encoder = encoder_hub.load(encoder_name, device=CPU_DEVICE) + encoder = encoder_hub.load_model(encoder_name, device=CPU_DEVICE) decoder_hub = get_sonar_text_decoder_hub() - decoder = decoder_hub.load(decoder_name, device=CPU_DEVICE) + decoder = decoder_hub.load_model(decoder_name, device=CPU_DEVICE) model = SonarEncoderDecoderModel(encoder, decoder).eval() return cls(model=model, tokenizer=tokenizer) def prebuild_pipeline(self, context: SpeechInferenceParams) -> DataPipelineBuilder: assert context.target_lang is not None - generator = BeamSearchSeq2SeqGenerator(self.model.to(context.device)) + generator = BeamSearchSeq2SeqGenerator( + self.model.to(context.device), self.tokenizer.vocab_info + ) converter = SequenceToTextConverter( generator, self.tokenizer, @@ -260,8 +259,8 @@ def prebuild_pipeline(self, context: SpeechInferenceParams) -> DataPipelineBuild ) def _do_generate(data: dict) -> List[str]: - batch = cast(SequenceBatch, data["fbank"]) - texts, _ = converter.batch_convert(batch.seqs, batch.padding_mask) + seqs, seqs_layout = data["fbank"] + texts, _ = converter.batch_convert(seqs, seqs_layout) return texts return ( @@ -279,7 +278,6 @@ class SpeechModelPipelineInterface(torch.nn.Module): def __init__(self, fbank_dtype: DataType) -> None: super().__init__() - fairseq2.setup_fairseq2() self.convert_to_fbank = WaveformToFbankConverter( num_mel_bins=80, waveform_scale=2**15, @@ -310,13 +308,13 @@ def _decode_audio(self, inp: Union[str, torch.Tensor]) -> dict: class SpeechToTextModelPipeline(SpeechModelPipelineInterface): model: SonarEncoderDecoderModel - tokenizer: TextTokenizer + tokenizer: Tokenizer def __init__( self, encoder: Union[str, SonarEncoderModel], decoder: Union[str, ConditionalTransformerDecoderModel], - tokenizer: Union[str, TextTokenizer], + tokenizer: Union[str, Tokenizer], device: Device = CPU_DEVICE, fbank_dtype: DataType = torch.float32, ) -> None: @@ -324,7 +322,7 @@ def __init__( Args: encoder (Union[str, SonarEncoderModel]): either cart name or model object decoder (Union[str, ConditionalTransformerDecoderModel]): either cart name or model object - tokenizer (Union[str, TextTokenizer]): either cart name or tokenizer object + tokenizer (Union[str, Tokenizer]): either cart name or tokenizer object device (device, optional): . Defaults to CPU_DEVICE. fbank_dtype (DataType, optional):. Defaults to torch.float32. """ @@ -332,16 +330,15 @@ def __init__( super().__init__(fbank_dtype) if isinstance(encoder, str): encoder_hub = get_sonar_speech_encoder_hub() - encoder = encoder_hub.load(encoder, device=device) + encoder = encoder_hub.load_model(encoder, device=device) if isinstance(decoder, str): decoder_hub = get_sonar_text_decoder_hub() - decoder = decoder_hub.load(decoder, device=device) + decoder = decoder_hub.load_model(decoder, device=device) if isinstance(tokenizer, str): - tokenizer_hub = get_text_tokenizer_hub() - tokenizer = tokenizer_hub.load(tokenizer) + tokenizer = load_tokenizer(tokenizer) self.tokenizer = tokenizer - self.model = SonarEncoderDecoderModel(encoder, decoder).to(device).eval() + self.model = SonarEncoderDecoderModel(encoder, decoder).to(device).eval() # type: ignore # Only quantize the model in CUDA to bypass the error "LayerNormKernelImpl" not implemented for 'Half' # in some CUDAs and torch versions @@ -361,7 +358,7 @@ def predict( **generator_kwargs, ) -> List[str]: generator = BeamSearchSeq2SeqGenerator( - self.model.to(self.device), **generator_kwargs + self.model.to(self.device), self.tokenizer.vocab_info, **generator_kwargs ) converter = SequenceToTextConverter( generator, @@ -371,8 +368,8 @@ def predict( ) def _do_generate(data: dict) -> List[str]: - batch = cast(SequenceBatch, data["fbank"]) - texts, _ = converter.batch_convert(batch.seqs, batch.padding_mask) + seqs, seqs_layout = data["fbank"] + texts, _ = converter.batch_convert(seqs, seqs_layout) return texts pipeline: Iterable = ( @@ -401,7 +398,7 @@ def _do_generate(data: dict) -> List[str]: class SpeechToEmbeddingModelPipeline(SpeechModelPipelineInterface): model: SonarEncoderModel - tokenizer: TextTokenizer + tokenizer: Tokenizer def __init__( self, @@ -420,8 +417,8 @@ def __init__( if isinstance(encoder, str): encoder_hub = get_sonar_speech_encoder_hub() - encoder = encoder_hub.load(encoder, device=device) - self.model = encoder.to(device).eval() + encoder = encoder_hub.load_model(encoder, device=device) + self.model = encoder.to(device).eval() # type: ignore # Only quantize the model in CUDA to bypass the error "LayerNormKernelImpl" not implemented for 'Half' # in some CUDAs and torch versions @@ -449,7 +446,7 @@ def build_predict_pipeline( lambda fbank: extract_sequence_batch(fbank, self.device), selector="fbank", ) - .map(lambda data: self.model(data["fbank"]).sentence_embeddings) + .map(lambda data: self.model(*data["fbank"]).sentence_embeddings) ) return pipeline diff --git a/sonar/inference_pipelines/text.py b/sonar/inference_pipelines/text.py index 34ab79b..3fba2e5 100644 --- a/sonar/inference_pipelines/text.py +++ b/sonar/inference_pipelines/text.py @@ -8,26 +8,25 @@ from pathlib import Path from typing import Dict, Iterable, List, Optional, Sequence, Union, cast -import fairseq2 import torch -from fairseq2.data import Collater, read_sequence +from fairseq2.data.data_pipeline import Collater, read_sequence from fairseq2.data.text import read_text -from fairseq2.data.text.tokenizers import TextTokenizer, get_text_tokenizer_hub -from fairseq2.generation import ( - BeamSearchSeq2SeqGenerator, - Sampler, - SamplingSeq2SeqGenerator, - Seq2SeqGenerator, +from fairseq2.data.tokenizers import Tokenizer, load_tokenizer +from fairseq2.data_type import DataType +from fairseq2.device import CPU, Device +from fairseq2.generation import Seq2SeqGenerator +from fairseq2.generation.beam_search.generator import BeamSearchSeq2SeqGenerator +from fairseq2.generation.sampling import Sampler, SamplingSeq2SeqGenerator +from fairseq2.models import load_model +from fairseq2.nn import BatchLayout + +from sonar.inference_pipelines.utils import ( + SequenceToTextConverter, + TextTranslator, + add_progress_bar, + extract_sequence_batch, ) -from fairseq2.generation.text import SequenceToTextConverter, TextTranslator -from fairseq2.typing import CPU, DataType, Device - -from sonar.inference_pipelines.utils import add_progress_bar, extract_sequence_batch from sonar.models.encoder_model import SonarEncoderModel -from sonar.models.sonar_text import ( - get_sonar_text_decoder_hub, - get_sonar_text_encoder_hub, -) from sonar.models.sonar_translation import SonarEncoderDecoderModel from sonar.models.sonar_translation.model import DummyEncoderModel from sonar.nn.conditional_decoder_model import ConditionalTransformerDecoderModel @@ -56,13 +55,17 @@ def __exit__(self, exc_type, exc_value, traceback): class TextToTextModelPipeline(torch.nn.Module): model: SonarEncoderDecoderModel - tokenizer: TextTokenizer + tokenizer: Tokenizer def __init__( self, encoder: Union[str, SonarEncoderModel], decoder: Union[str, ConditionalTransformerDecoderModel], - tokenizer: Union[str, TextTokenizer], + tokenizer: Optional[ + Union[str, Tokenizer] + ] = None, # did not remove this to avoid breaking existing code + encoder_tokenizer: Optional[Union[str, Tokenizer]] = None, + decoder_tokenizer: Optional[Union[str, Tokenizer]] = None, device: Device = CPU, dtype: Optional[DataType] = None, ) -> None: @@ -70,23 +73,40 @@ def __init__( Args: encoder (Union[str, SonarEncoderModel]): either card name or model object decoder (Union[str, ConditionalTransformerDecoderModel]): either card name or model object - tokenizer (Union[str, TextTokenizer]): either card name or tokenizer object + tokenizer (Union[str, Tokenizer], optional): either card name or tokenizer object. Defaults to None. + encoder_tokenizer (Union[str, Tokenizer], optional): either card name or tokenizer object. Defaults to None. + decoder_tokenizer (Union[str, Tokenizer], optional): either card name or tokenizer object. Defaults to None. device (Device, optional): Defaults to CPU. dtype (DataType, optional): The data type of the model parameters and buffers. """ super().__init__() - fairseq2.setup_fairseq2() if isinstance(encoder, str): - encoder_hub = get_sonar_text_encoder_hub() - encoder = encoder_hub.load(encoder, device=device, dtype=dtype) + encoder = load_model(encoder, device=device, dtype=dtype) # type: ignore if isinstance(decoder, str): - decoder_hub = get_sonar_text_decoder_hub() - decoder = decoder_hub.load(decoder, device=device, dtype=dtype) + decoder = load_model(decoder, device=device, dtype=dtype) # type: ignore if isinstance(tokenizer, str): - tokenizer_hub = get_text_tokenizer_hub() - tokenizer = tokenizer_hub.load(tokenizer) + tokenizer = load_tokenizer(tokenizer) + + assert tokenizer is not None or ( + encoder_tokenizer is not None and decoder_tokenizer is not None + ), "Either tokenizer or both encoder_tokenizer and decoder_tokenizer must be provided" + + if tokenizer is not None: + if isinstance(tokenizer, str): + tokenizer = load_tokenizer(tokenizer) + self.encoder_tokenizer = tokenizer + self.decoder_tokenizer = tokenizer + else: + if isinstance(encoder_tokenizer, str): + encoder_tokenizer = load_tokenizer(encoder_tokenizer) + if isinstance(decoder_tokenizer, str): + decoder_tokenizer = load_tokenizer(decoder_tokenizer) + assert ( + encoder_tokenizer is not None and decoder_tokenizer is not None + ), "we need both encoder_tokenizer and decoder_tokenizer if tokenizer is not provided" # noqa + self.encoder_tokenizer = encoder_tokenizer + self.decoder_tokenizer = decoder_tokenizer - self.tokenizer = tokenizer self.model = SonarEncoderDecoderModel(encoder, decoder).eval() # type: ignore @torch.inference_mode() @@ -95,23 +115,43 @@ def predict( input: Union[Path, Sequence[str]], source_lang: str, target_lang: str, + source_mode: str = "source", + target_mode: str = "target", batch_size: int = 5, progress_bar: bool = False, **generator_kwargs, ) -> List[str]: # truncate the max seq len to avoid model to fail generator_kwargs = generator_kwargs or {} - model_max_seq_len = self.model.decoder.decoder_frontend.pos_encoder.max_seq_len # type: ignore[union-attr] + + model_max_seq_len = cast( + int | None, + ( + self.model.decoder.decoder_frontend.pos_encoder.max_seq_len + if self.model.decoder.decoder_frontend.pos_encoder is not None + else self.model.decoder.decoder.layers[ + 0 + ].self_attn.pos_encoder.max_seq_len + ), + ) # type: ignore[union-attr] + if model_max_seq_len is None: + model_max_seq_len = generator_kwargs.get("max_seq_len", model_max_seq_len) + generator_kwargs["max_seq_len"] = min( - model_max_seq_len, generator_kwargs.get("max_seq_len", model_max_seq_len) + model_max_seq_len, + generator_kwargs.get("max_seq_len", model_max_seq_len), # type: ignore + ) + generator = BeamSearchSeq2SeqGenerator( + self.model, self.decoder_tokenizer.vocab_info, **generator_kwargs ) - - generator = BeamSearchSeq2SeqGenerator(self.model, **generator_kwargs) translator = TextTranslator( generator, - tokenizer=self.tokenizer, + encoder_tokenizer=self.encoder_tokenizer, # type: ignore + decoder_tokenizer=self.decoder_tokenizer, # type: ignore source_lang=source_lang, target_lang=target_lang, + source_mode=source_mode, + target_mode=target_mode, ) def _do_translate(src_texts: List[str]) -> List[str]: @@ -139,30 +179,27 @@ def _do_translate(src_texts: List[str]) -> List[str]: class TextToEmbeddingModelPipeline(torch.nn.Module): model: SonarEncoderModel - tokenizer: TextTokenizer + tokenizer: Tokenizer def __init__( self, encoder: Union[str, SonarEncoderModel], - tokenizer: Union[str, TextTokenizer], + tokenizer: Union[str, Tokenizer], device: Device = CPU, dtype: Optional[DataType] = None, ) -> None: """ Args: encoder (Union[str, SonarEncoderModel]): either card name or model object - tokenizer (Union[str, TextTokenizer]): either card name or tokenizer object + tokenizer (Union[str, Tokenizer]): either card name or tokenizer object device (device, optional): Defaults to CPU. dtype (DataType, optional): The data type of the model parameters and buffers. """ super().__init__() - fairseq2.setup_fairseq2() if isinstance(encoder, str): - encoder_hub = get_sonar_text_encoder_hub() - encoder = encoder_hub.load(encoder, device=device, dtype=dtype) + encoder = load_model(encoder, device=device, dtype=dtype) # type: ignore if isinstance(tokenizer, str): - tokenizer_hub = get_text_tokenizer_hub() - tokenizer = tokenizer_hub.load(tokenizer) + tokenizer = load_tokenizer(tokenizer) self.tokenizer = tokenizer @@ -174,7 +211,7 @@ def __init__( def predict( self, input: Union[Path, Sequence[str]], - source_lang: str, + source_lang: str | None = None, batch_size: Optional[int] = 5, batch_max_tokens: Optional[int] = None, max_seq_len: Optional[int] = None, @@ -199,7 +236,14 @@ def predict( tokenizer_encoder = self.tokenizer.create_encoder( lang=source_lang, device=self.device ) - model_max_len = cast(int | None, self.model.encoder_frontend.pos_encoder.max_seq_len) # type: ignore[union-attr] + model_max_len = cast( + int | None, + ( + self.model.encoder_frontend.pos_encoder.max_seq_len + if self.model.encoder_frontend.pos_encoder is not None + else self.model.encoder.layers[0].self_attn.pos_encoder.max_seq_len + ), + ) # type: ignore if max_seq_len is None: max_seq_len = model_max_len if max_seq_len is not None and model_max_len is not None: @@ -241,7 +285,7 @@ def truncate(x: torch.Tensor) -> torch.Tensor: .map(Collater(self.tokenizer.vocab_info.pad_idx)) .map(lambda x: extract_sequence_batch(x, self.device)) .prefetch(2) - .map(self.model) + .map(lambda x: self.model(*x)) .map(lambda x: x.sentence_embeddings.to(target_device or self.device)) .and_return() ) @@ -271,32 +315,29 @@ def truncate(x: torch.Tensor) -> torch.Tensor: class EmbeddingToTextModelPipeline(torch.nn.Module): model: SonarEncoderDecoderModel - tokenizer: TextTokenizer + tokenizer: Tokenizer def __init__( self, decoder: Union[str, ConditionalTransformerDecoderModel], - tokenizer: Union[str, TextTokenizer], + tokenizer: Union[str, Tokenizer], device: Device = CPU, dtype: Optional[DataType] = None, ) -> None: """ Args: decoder (Union[str, ConditionalTransformerDecoderModel]): either card name or model object - tokenizer (Union[str, TextTokenizer]): either card name or tokenizer object + tokenizer (Union[str, Tokenizer]): either card name or tokenizer object device (device, optional): Defaults to CPU. dtype (DataType, optional): The data type of the model parameters and buffers. """ super().__init__() - fairseq2.setup_fairseq2() if isinstance(decoder, str): - decoder_hub = get_sonar_text_decoder_hub() - decoder = decoder_hub.load(decoder, device=device, dtype=dtype) + decoder = load_model(decoder, device=device, dtype=dtype) # type: ignore if isinstance(tokenizer, str): - tokenizer_hub = get_text_tokenizer_hub() - tokenizer = tokenizer_hub.load(tokenizer) + tokenizer = load_tokenizer(tokenizer) - encoder = DummyEncoderModel(decoder.model_dim) # type: ignore + encoder = DummyEncoderModel() # type: ignore self.device = device self.tokenizer = tokenizer @@ -307,6 +348,7 @@ def predict( self, inputs: torch.Tensor, target_lang: str, + target_mode: str = "target", batch_size: int = 5, progress_bar: bool = False, sampler: Optional[Sampler] = None, @@ -314,22 +356,25 @@ def predict( ) -> List[str]: if sampler is not None: generator: Seq2SeqGenerator = SamplingSeq2SeqGenerator( - self.model, sampler, **generator_kwargs + self.model, self.tokenizer.vocab_info, sampler, **generator_kwargs ) else: - generator = BeamSearchSeq2SeqGenerator(self.model, **generator_kwargs) + generator = BeamSearchSeq2SeqGenerator( + self.model, self.tokenizer.vocab_info, **generator_kwargs + ) converter = SequenceToTextConverter( generator, self.tokenizer, task="translation", target_lang=target_lang, + mode=target_mode, ) def _do_translate(src_tensors: List[torch.Tensor]) -> List[str]: - texts, _ = converter.batch_convert( - torch.stack(src_tensors).to(self.device), None - ) + seqs = torch.stack(src_tensors).to(self.device) + seqs_layout = BatchLayout.of(seqs) + texts, _ = converter.batch_convert(seqs, seqs_layout) return texts pipeline: Iterable = ( diff --git a/sonar/inference_pipelines/utils.py b/sonar/inference_pipelines/utils.py index 93dbf96..5463cb6 100644 --- a/sonar/inference_pipelines/utils.py +++ b/sonar/inference_pipelines/utils.py @@ -5,20 +5,39 @@ # LICENSE file in the root directory of this source tree. import math +from collections.abc import Sequence from pathlib import Path -from typing import Iterable, Optional, Union +from typing import Iterable, Optional, Tuple, Union, final -from fairseq2.data import SequenceData -from fairseq2.models.sequence import SequenceBatch -from fairseq2.nn.padding import get_seqs_and_padding_mask -from fairseq2.typing import Device +from fairseq2.data.data_pipeline import SequenceData +from fairseq2.data.tokenizers import TokenDecoder, TokenEncoder, Tokenizer +from fairseq2.device import Device +from fairseq2.error import InternalError +from fairseq2.generation import Seq2SeqGenerator, SequenceGeneratorOutput +from fairseq2.nn import BatchLayout +from fairseq2.nn.utils.module import maybe_infer_device +from fairseq2.nn.utils.padding import pad_seqs +from torch import Tensor from tqdm.auto import tqdm -def extract_sequence_batch(x: SequenceData, device: Device) -> SequenceBatch: - seqs, padding_mask = get_seqs_and_padding_mask(x, device=device) +def extract_sequence_batch( + x: SequenceData, device: Device +) -> Tuple[Tensor, BatchLayout]: + """ + Naive conversion from `SequenceData` to `SequenceBatch` without padding or packing. + Moving `x` to device for backward compatibility of this function definition. + + This was a call to deprecated `get_seqs_and_padding_mask` in fs2:v0.4.6. - return SequenceBatch(seqs, padding_mask) + Args: + x (SequenceData): holding sequences and their lengths + device (Device): the computing device (cuda, cpu, etc.) + Returns: + SequenceBatch: rewrapped `x` and moved to `device` + """ + seqs, seq_lens = x["seqs"].to(device), x["seq_lens"] + return seqs, BatchLayout.of(seqs, seq_lens) def add_progress_bar( @@ -44,3 +63,261 @@ def add_progress_bar( total = math.ceil(len(inputs) / batch_size) # type: ignore return tqdm(sequence, total=total, **kwargs) + + +@final +class SequenceToTextConverter: + """Converts source sequences to text.""" + + # cirquit: This is a carbon copy of fs2:v0.5 with additional `mode` + # parameter passed to the tokenizer encoder. Should be upstreamed. + _generator: Seq2SeqGenerator + _target_prefix_seq: Tensor + _text_decoder: TokenDecoder + + def __init__( + self, + generator: Seq2SeqGenerator, + tokenizer: Tokenizer, + task: str, + target_lang: str | None = None, + mode: str = "target", + skip_special_tokens: bool = True, + ) -> None: + """ + :param generator: + The sequence-to-sequence generator. + :param tokenizer: + The text tokenizer. + :param task: + The conversion task (e.g. translation, transcription). + :param target_lang: + The target language for conversion. + :param mode: + The mode in which to generate token indices. Typically, translation + tasks use ``mode`` to distinguish between different modes such as + 'source' or 'target'. + :param skip_special_tokens: + Whether the tokenizer decoder skips outputting special tokens like . + """ + self._generator = generator + + try: + device = maybe_infer_device(generator.model) + except ValueError as ex: + raise ValueError( + "The device of `generator.model` is not valid. See the nested exception for details." + ) from ex + + target_text_encoder = tokenizer.create_encoder( + task=task, lang=target_lang, mode=mode, device=device + ) + + # (S) + target_prefix_seq = target_text_encoder.prefix_indices + if target_prefix_seq is None: + raise ValueError( + "`tokenizer` must specify a prefix sequence for the target language." + ) + + self._target_prefix_seq = target_prefix_seq + self._text_decoder = tokenizer.create_decoder( + skip_special_tokens=skip_special_tokens + ) + + def __call__(self, source_seqs: Tensor) -> tuple[str, SequenceGeneratorOutput]: + """ + :param source_seqs: + The source sequence. *Shape:* :math:`(S,*)`, where :math:`S` is the + sequence length and :math:`*` is any number of sequence-specific + dimensions including none. + + :returns: + - The converted text. + - The output of the underlying sequence-to-sequence generator. + """ + source_seqs = source_seqs.unsqueeze(0) + source_seqs_layout = BatchLayout.of(source_seqs) + texts, generator_output = self._do_convert(source_seqs, source_seqs_layout) + + return texts[0], generator_output + + def batch_convert( + self, source_seqs: Tensor, source_seqs_layout: BatchLayout + ) -> tuple[list[str], SequenceGeneratorOutput]: + """ + :param source_seqs: + The source sequences. *Shape:* :math:`(N,S,*)`, where :math:`N` is + the batch size, :math:`S` is the sequence length, and :math:`*` is + any number of sequence-specific dimensions including none. + + :returns: + - The converted texts. + - The output of the underlying sequence-to-sequence generator. + """ + if len(source_seqs) == 0: + raise ValueError( + "`source_seqs` must contain at least one element, but is empty instead." + ) + + return self._do_convert(source_seqs, source_seqs_layout) + + def _do_convert( + self, + source_seqs: Tensor, + source_seqs_layout: BatchLayout, + ) -> tuple[list[str], SequenceGeneratorOutput]: + """A subclass should call this method for actual text conversion. + + :param source_seqs: + The source sequences. *Shape:* :math:`(N,S,*)`, where :math:`N` is + the batch size, :math:`S` is the sequence length, and :math:`*` is + any number of sequence-specific dimensions including none. + + :returns: + - The converted texts. + - The output of the underlying sequence-to-sequence generator. + """ + batch_size = source_seqs.size(0) + + # (S) -> (N, S) + target_prefix_seqs = self._target_prefix_seq.expand(batch_size, -1) + target_prefix_layout = BatchLayout.of(target_prefix_seqs) + + generator_output = self._generator( + source_seqs, source_seqs_layout, target_prefix_seqs, target_prefix_layout + ) + + texts: list[str] = [] + + for idx, hypotheses in enumerate(generator_output.hypotheses): + if len(hypotheses) == 0: + raise InternalError( + f"The sequence generator returned no hypothesis at index {idx}." + ) + + texts.append(self._text_decoder(hypotheses[0].seq)) + + return texts, generator_output + + +@final +class TextTranslator: + """Translates text from one language to another.""" + + # TODO: cirquit - this is a carbon copy of fs2:v0.5 TextTranslator except for + # - SequenceToTextConverter.skip_special_tokens=True and the source_mode + # - call to pad_seqs with self._pad_ixd which comes from the encoder_tokenizer.vocab_info + + _converter: SequenceToTextConverter + _pad_idx: int + _source_text_encoder: TokenEncoder + _max_source_len: int | None + + def __init__( + self, + generator: Seq2SeqGenerator, + encoder_tokenizer: Tokenizer, + decoder_tokenizer: Tokenizer, + source_lang: str | None = None, + target_lang: str | None = None, + source_mode: str = "source", # this was also added + target_mode: str = "target", + *, + max_source_len: int | None = None, + skip_special_tokens: bool = True, + ) -> None: + """ + :param generator: + The sequence-to-sequence generator. + :param tokenizer: + The text tokenizer. + :param source_lang: + The source language. + :param target_lang: + The target language. + :param max_source_len: + The maximum number of tokens above which the source sequence gets + truncated. + :param skip_special_tokens: + Whether the tokenizer decoder skips outputting special tokens like . + """ + task = "translation" + + self._converter = SequenceToTextConverter( + generator=generator, + tokenizer=decoder_tokenizer, + task=task, + target_lang=target_lang, + mode=target_mode, + skip_special_tokens=skip_special_tokens, + ) + + pad_idx = encoder_tokenizer.vocab_info.pad_idx + if pad_idx is None: + raise ValueError( + "``vocab_info` of `tokenizer` must have a PAD symbol defined." + ) + + self._pad_idx = pad_idx + + try: + device = maybe_infer_device(generator.model) + except ValueError as ex: + raise ValueError( + "The device of `generator.model` is not valid. See the nested exception for details." + ) from ex + + self._source_text_encoder = encoder_tokenizer.create_encoder( + task="translation", lang=source_lang, mode=source_mode, device=device + ) + + if max_source_len is not None and max_source_len <= 0: + raise ValueError( + f"`max_source_len` must be greater than or equal to 1, but is {max_source_len} instead." + ) + + self._max_source_len = max_source_len + + def __call__(self, source_text: str) -> tuple[str, SequenceGeneratorOutput]: + """ + :param source_text: + The text in the source language. + + :returns: + - The translated text. + - The output of the underlying sequence-to-sequence generator. + """ + source_seq = self._source_text_encoder(source_text) + + if self._max_source_len: + source_seq = source_seq[: self._max_source_len] + + return self._converter(source_seq) + + def batch_translate( + self, source_texts: Sequence[str] + ) -> tuple[list[str], SequenceGeneratorOutput]: + """ + :param source_texts: + The texts in the source language. + + :returns: + - The translated texts. + - The output of the underlying sequence-to-sequence generator. + """ + if len(source_texts) == 0: + raise ValueError( + "`source_texts` must contain at least one element, but is empty instead." + ) + + source_seq_list = [self._source_text_encoder(t) for t in source_texts] + + if self._max_source_len: + source_seq_list = [seq[: self._max_source_len] for seq in source_seq_list] + + source_seqs, source_seqs_layout = pad_seqs( + source_seq_list, pad_value=self._pad_idx + ) + + return self._converter.batch_convert(source_seqs, source_seqs_layout) diff --git a/sonar/models/blaser/__init__.py b/sonar/models/blaser/__init__.py index 597db68..0334a42 100644 --- a/sonar/models/blaser/__init__.py +++ b/sonar/models/blaser/__init__.py @@ -4,16 +4,19 @@ # This source code is licensed under the license found in the # LICENSE file in the root directory of this source tree. +from sonar.models.blaser.checkpoint import ( + _convert_blaser_checkpoint as _convert_blaser_checkpoint, +) +from sonar.models.blaser.config import BLASER_FAMILY as BLASER_FAMILY from sonar.models.blaser.config import BlaserConfig as BlaserConfig from sonar.models.blaser.config import ( - register_blaser_configs as register_blaser_configs, + _register_blaser_configs as _register_blaser_configs, ) -from sonar.models.blaser.factory import create_blaser_model as create_blaser_model -from sonar.models.blaser.handler import BlaserModelHandler as BlaserModelHandler +from sonar.models.blaser.factory import _create_blaser_model as _create_blaser_model from sonar.models.blaser.model import BlaserModel as BlaserModel # isort: split from fairseq2.models import ModelHubAccessor -get_blaser_model_hub = ModelHubAccessor(BlaserModel, BlaserConfig) +get_blaser_model_hub = ModelHubAccessor(BLASER_FAMILY, BlaserModel, BlaserConfig) diff --git a/sonar/models/blaser/checkpoint.py b/sonar/models/blaser/checkpoint.py new file mode 100644 index 0000000..f749223 --- /dev/null +++ b/sonar/models/blaser/checkpoint.py @@ -0,0 +1,20 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. +from typing import cast + +from sonar.models.blaser.config import BlaserConfig + + +def _convert_blaser_checkpoint( + state_dict: dict[str, object], config: BlaserConfig +) -> dict[str, object]: + # fairseq2 does not use a top-level "model" keyword anymore (v0.5+) + try: + state_dict = cast(dict[str, object], state_dict["model"]) + except KeyError: + pass + + return state_dict diff --git a/sonar/models/blaser/config.py b/sonar/models/blaser/config.py index 58f919e..21bb382 100644 --- a/sonar/models/blaser/config.py +++ b/sonar/models/blaser/config.py @@ -5,12 +5,15 @@ # LICENSE file in the root directory of this source tree. from dataclasses import dataclass, field -from typing import List +from typing import Final, List -from fairseq2.context import RuntimeContext +from fairseq2.runtime.config_registry import ConfigRegistrar +from fairseq2.runtime.dependency import DependencyContainer from sonar.models.blaser.model import ACTIVATIONS, BLASER_INPUT_FORMS +BLASER_FAMILY: Final = "blaser" + @dataclass class BlaserConfig: @@ -35,10 +38,8 @@ def __post__init__(self): ) -def register_blaser_configs(context: RuntimeContext) -> None: - registry = context.get_config_registry(BlaserConfig) - - arch = registry.decorator +def _register_blaser_configs(container: DependencyContainer) -> None: + arch = ConfigRegistrar(container, BlaserConfig) @arch("basic_ref") def basic_ref() -> BlaserConfig: diff --git a/sonar/models/blaser/factory.py b/sonar/models/blaser/factory.py index b7f59a0..5b9da64 100644 --- a/sonar/models/blaser/factory.py +++ b/sonar/models/blaser/factory.py @@ -10,5 +10,5 @@ from sonar.models.blaser.model import BlaserModel -def create_blaser_model(config: BlaserConfig) -> BlaserModel: +def _create_blaser_model(config: BlaserConfig) -> BlaserModel: return BlaserModel(**asdict(config)) diff --git a/sonar/models/blaser/handler.py b/sonar/models/blaser/handler.py deleted file mode 100644 index f5f0ecf..0000000 --- a/sonar/models/blaser/handler.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the BSD-style license found in the -# LICENSE file in the root directory of this source tree. - -from typing import cast, final - -from fairseq2.models import AbstractModelHandler -from torch.nn import Module -from typing_extensions import override - -from sonar.models.blaser.config import BlaserConfig -from sonar.models.blaser.factory import create_blaser_model -from sonar.models.blaser.model import BlaserModel - - -@final -class BlaserModelHandler(AbstractModelHandler): - @override - @property - def family(self) -> str: - return "blaser" - - @override - @property - def kls(self) -> type[Module]: - return BlaserModel - - @override - def _create_model(self, config: object) -> Module: - config = cast(BlaserConfig, config) - - return create_blaser_model(config) - - @override - def _convert_checkpoint( - self, checkpoint: dict[str, object], config: object - ) -> dict[str, object]: - # Return directly if found fairseq2 attribute in state dict - if "model" in checkpoint: - return checkpoint - - # Othewise (the old checkpoint format), move the whole state dict to the "model" section - return {"model": checkpoint} diff --git a/sonar/models/blaser/loader.py b/sonar/models/blaser/loader.py index 84efe5f..4b23a84 100644 --- a/sonar/models/blaser/loader.py +++ b/sonar/models/blaser/loader.py @@ -4,8 +4,6 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. -import fairseq2 - from sonar.models.blaser import get_blaser_model_hub from sonar.models.blaser.model import BlaserModel @@ -13,9 +11,8 @@ def load_blaser_model(model_name: str) -> BlaserModel: """ This file exists purely for backward compatibility of the package interface! - Normally, the user is encouraged to call `setup_fairseq2` and `get_blaser_model_hub` on their own. + Normally, the user is encouraged to call `get_blaser_model_hub` on their own. """ - fairseq2.setup_fairseq2() model_hub = get_blaser_model_hub() - model = model_hub.load(model_name) + model = model_hub.load_model(model_name) return model diff --git a/sonar/models/encoder_model.py b/sonar/models/encoder_model.py index ff1df72..91e5dd0 100644 --- a/sonar/models/encoder_model.py +++ b/sonar/models/encoder_model.py @@ -6,10 +6,8 @@ from abc import ABC, abstractmethod from dataclasses import dataclass -from typing import Optional -from fairseq2.models.sequence import SequenceBatch -from fairseq2.nn.padding import PaddingMask +from fairseq2.nn.batch_layout import BatchLayout from torch import Tensor from torch.nn import Module @@ -31,37 +29,21 @@ class SonarEncoderOutput: dimensionality of the model. """ - padding_mask: Optional[PaddingMask] - """Optional, the floating padding mask over sequences (-inf means masked element) - *Shape:* :math:`(N,S)`, where :math:`N` is the batch size, - :math:`S` is the sequence length. + encoded_seqs_layout: BatchLayout + """The batchlayout of the ``encoded_seqs``. Holds the information of sequence length, + optional padding and whether the batch is packed. """ class SonarEncoderModel(ABC, Module): """Abstract class for both speech and text SONAR encoder models""" - model_dim: int - - def __init__(self, model_dim: int) -> None: - """ - - :param model_dim: - The dimensionality of the model. - """ + def __init__(self) -> None: super().__init__() - self.model_dim = model_dim - @property def dtype(self): return next(self.parameters()).dtype @abstractmethod - def forward(self, batch: SequenceBatch) -> SonarEncoderOutput: - """ - :param batch: - The batch of sequences to process. - :returns: - SonarEncoderOutput - """ + def forward(self, seqs: Tensor, seqs_layout: BatchLayout) -> SonarEncoderOutput: ... diff --git a/sonar/models/laser2_text/__init__.py b/sonar/models/laser2_text/__init__.py index d375829..f7b4f28 100644 --- a/sonar/models/laser2_text/__init__.py +++ b/sonar/models/laser2_text/__init__.py @@ -4,20 +4,33 @@ # This source code is licensed under the license found in the # LICENSE file in the root directory of this source tree. +from types import NoneType + +from sonar.models.laser2_text.checkpoint import ( + _convert_laser2_checkpoint as _convert_laser2_checkpoint, +) +from sonar.models.laser2_text.config import LASER2_FAMILY as LASER2_FAMILY from sonar.models.laser2_text.config import Laser2Config as Laser2Config from sonar.models.laser2_text.config import ( - register_laser2_configs as register_laser2_configs, + _register_laser2_configs as _register_laser2_configs, ) -from sonar.models.laser2_text.handler import Laser2ModelHandler as Laser2ModelHandler -from sonar.models.laser2_text.handler import ( - Laser2TokenizerHandler as Laser2TokenizerHandler, +from sonar.models.laser2_text.factory import ( + _create_laser2_model as _create_laser2_model, ) from sonar.models.laser2_text.tokenizer import Laser2Tokenizer as Laser2Tokenizer +from sonar.models.laser2_text.tokenizer import ( + _load_laser2_tokenizer as _load_laser2_tokenizer, +) # isort: split +from fairseq2.data.tokenizers import TokenizerHubAccessor from fairseq2.models import ModelHubAccessor from sonar.nn.laser_lstm_encoder import LaserLstmEncoder -get_laser2_model_hub = ModelHubAccessor(LaserLstmEncoder, Laser2Config) +get_laser2_model_hub = ModelHubAccessor(LASER2_FAMILY, LaserLstmEncoder, Laser2Config) + +get_laser2_tokenizer_hub = TokenizerHubAccessor( + LASER2_FAMILY, Laser2Tokenizer, NoneType +) diff --git a/sonar/models/laser2_text/checkpoint.py b/sonar/models/laser2_text/checkpoint.py new file mode 100644 index 0000000..f8f3af1 --- /dev/null +++ b/sonar/models/laser2_text/checkpoint.py @@ -0,0 +1,20 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. +from typing import cast + +from sonar.models.laser2_text.config import Laser2Config + + +def _convert_laser2_checkpoint( + state_dict: dict[str, object], config: Laser2Config +) -> dict[str, object]: + # fairseq2 does not use a top-level "model" keyword anymore (v0.5+) + try: + state_dict = cast(dict[str, object], state_dict["model"]) + except KeyError: + pass + + return state_dict diff --git a/sonar/models/laser2_text/config.py b/sonar/models/laser2_text/config.py index e271a41..8b6aa6e 100644 --- a/sonar/models/laser2_text/config.py +++ b/sonar/models/laser2_text/config.py @@ -5,8 +5,12 @@ # LICENSE file in the root directory of this source tree. from dataclasses import dataclass +from typing import Final -from fairseq2.context import RuntimeContext +from fairseq2.runtime.config_registry import ConfigRegistrar +from fairseq2.runtime.dependency import DependencyContainer + +LASER2_FAMILY: Final = "lstm" @dataclass @@ -20,10 +24,8 @@ class Laser2Config: padding_value: float = 0.0 -def register_laser2_configs(context: RuntimeContext) -> None: - registry = context.get_config_registry(Laser2Config) - - arch = registry.decorator +def _register_laser2_configs(container: DependencyContainer) -> None: + arch = ConfigRegistrar(container, Laser2Config) @arch("laser2") def laser2() -> Laser2Config: diff --git a/sonar/models/laser2_text/factory.py b/sonar/models/laser2_text/factory.py new file mode 100644 index 0000000..f9ed917 --- /dev/null +++ b/sonar/models/laser2_text/factory.py @@ -0,0 +1,20 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +from sonar.models.laser2_text.config import Laser2Config +from sonar.nn import LaserLstmEncoder + + +def _create_laser2_model(config: Laser2Config) -> LaserLstmEncoder: + return LaserLstmEncoder( + num_embeddings=config.vocabulary_size, + padding_idx=config.pad_idx, + embed_dim=config.model_dim, + hidden_size=config.hidden_size, + num_layers=config.num_layers, + bidirectional=config.bidirectional, + padding_value=config.padding_value, + ) diff --git a/sonar/models/laser2_text/handler.py b/sonar/models/laser2_text/handler.py deleted file mode 100644 index ad6194f..0000000 --- a/sonar/models/laser2_text/handler.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the BSD-style license found in the -# LICENSE file in the root directory of this source tree. - -from pathlib import Path -from typing import cast, final - -from fairseq2.assets import AssetCard -from fairseq2.data.text.tokenizers import AbstractTextTokenizerHandler, TextTokenizer -from fairseq2.models import AbstractModelHandler -from torch.nn import Module -from typing_extensions import override - -from sonar.models.laser2_text.config import Laser2Config -from sonar.models.laser2_text.tokenizer import Laser2Tokenizer -from sonar.nn.laser_lstm_encoder import LaserLstmEncoder - - -@final -class Laser2ModelHandler(AbstractModelHandler): - @override - @property - def family(self) -> str: - return "lstm" - - @override - @property - def kls(self) -> type[Module]: - return LaserLstmEncoder - - @override - def _create_model(self, config: object) -> Module: - config = cast(Laser2Config, config) - - return LaserLstmEncoder( - num_embeddings=config.vocabulary_size, - padding_idx=config.pad_idx, - embed_dim=config.model_dim, - hidden_size=config.hidden_size, - num_layers=config.num_layers, - bidirectional=config.bidirectional, - padding_value=config.padding_value, - ) - - -@final -class Laser2TokenizerHandler(AbstractTextTokenizerHandler): - @override - @property - def family(self) -> str: - return "lstm" - - @override - def _load_tokenizer(self, path: Path, card: AssetCard) -> TextTokenizer: - return Laser2Tokenizer(path) diff --git a/sonar/models/laser2_text/tokenizer.py b/sonar/models/laser2_text/tokenizer.py index f7ba963..4198494 100644 --- a/sonar/models/laser2_text/tokenizer.py +++ b/sonar/models/laser2_text/tokenizer.py @@ -4,57 +4,60 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. +from __future__ import annotations + from pathlib import Path from typing import Optional, final import torch -from fairseq2.data.text.tokenizers import ( - AbstractTextTokenizer, - TextTokenDecoder, - TextTokenEncoder, +from fairseq2.data.tokenizers import ( + TokenDecoder, + TokenEncoder, + Tokenizer, + TokenizerModelError, + VocabularyInfo, ) -from fairseq2.data.text.tokenizers.sentencepiece import ( +from fairseq2.data.tokenizers.sentencepiece import ( SentencePieceDecoder, SentencePieceEncoder, SentencePieceModel, - vocab_info_from_sentencepiece, + get_sentencepiece_vocabulary_info, ) -from fairseq2.typing import Device, override +from fairseq2.device import Device +from fairseq2.error import OperationalError from torch import Tensor from typing_extensions import NoReturn @final -class Laser2Encoder(TextTokenEncoder): +class Laser2Encoder(TokenEncoder): def __init__(self, spm_encoder: SentencePieceEncoder) -> None: self.spm_encoder: SentencePieceEncoder = spm_encoder - @override def __call__(self, sentence: str) -> torch.Tensor: out = self.spm_encoder(sentence) return torch.where(out >= 3, out + 4, out) - @override def encode_as_tokens(self, text: str) -> NoReturn: raise RuntimeError("not implemented!") @property - @override def prefix_indices(self) -> Optional[Tensor]: return self.spm_encoder.prefix_indices @property - @override def suffix_indices(self) -> Optional[Tensor]: return self.spm_encoder.suffix_indices @final -class Laser2Tokenizer(AbstractTextTokenizer): +class Laser2Tokenizer(Tokenizer): """Represents the tokenizer used by S2T Transformer models.""" model: SentencePieceModel + _vocab_info: VocabularyInfo + # breaking styleguide to implement the vocab_info abstract property interface def __init__(self, path: Path) -> None: """ @@ -62,12 +65,8 @@ def __init__(self, path: Path) -> None: The pathname of the SentencePiece model file. """ self.model = SentencePieceModel(path, [""]) + self._vocab_info = get_sentencepiece_vocabulary_info(self.model) - vocab_info = vocab_info_from_sentencepiece(self.model) - - super().__init__(vocab_info) - - @override def create_encoder( self, *, @@ -86,12 +85,30 @@ def create_encoder( ) ) - @override def create_raw_encoder( self, *, device: Optional[Device] = None, pin_memory: bool = False - ) -> TextTokenEncoder: + ) -> TokenEncoder: return SentencePieceEncoder(self.model, device=device, pin_memory=pin_memory) - @override - def create_decoder(self) -> TextTokenDecoder: + def create_decoder(self, *, skip_special_tokens: bool = False) -> TokenDecoder: return SentencePieceDecoder(self.model) + + @property + def vocab_info(self) -> VocabularyInfo: + return self._vocab_info + + +def _load_laser2_tokenizer(path: Path, config: None = None) -> Tokenizer: + try: + model = Laser2Tokenizer(path) + except OSError as ex: + raise OperationalError( + f"A system error has occurred while reading the '{path}' tokenizer model. See the nested exception for details." + ) from ex + except RuntimeError as ex: + raise TokenizerModelError( + path, + f"The '{path}' tokenizer model cannot be loaded. See the nested exception for details.", # fmt: skip + ) from ex + + return model diff --git a/sonar/models/mutox/__init__.py b/sonar/models/mutox/__init__.py index fe91503..68acc7b 100644 --- a/sonar/models/mutox/__init__.py +++ b/sonar/models/mutox/__init__.py @@ -4,13 +4,18 @@ # This source code is licensed under the license found in the # LICENSE file in the root directory of this source tree. -from sonar.models.mutox.config import MutoxConfig, register_mutox_configs -from sonar.models.mutox.factory import create_mutox_model -from sonar.models.mutox.handler import MutoxModelHandler -from sonar.models.mutox.model import MutoxClassifier +from sonar.models.mutox.checkpoint import ( + _convert_mutox_checkpoint as _convert_mutox_checkpoint, +) +from sonar.models.mutox.config import MUTOX_FAMILY as MUTOX_FAMILY +from sonar.models.mutox.config import MutoxConfig as MutoxConfig +from sonar.models.mutox.config import _register_mutox_configs as _register_mutox_configs +from sonar.models.mutox.factory import _create_mutox_model as _create_mutox_model # isort: split from fairseq2.models import ModelHubAccessor -get_mutox_model_hub = ModelHubAccessor(MutoxClassifier, MutoxConfig) +from sonar.models.mutox.model import MutoxClassifier as MutoxClassifier + +get_mutox_model_hub = ModelHubAccessor(MUTOX_FAMILY, MutoxClassifier, MutoxConfig) diff --git a/sonar/models/mutox/checkpoint.py b/sonar/models/mutox/checkpoint.py new file mode 100644 index 0000000..984ce1c --- /dev/null +++ b/sonar/models/mutox/checkpoint.py @@ -0,0 +1,24 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. +from typing import cast + +from sonar.models.mutox.config import MutoxConfig + + +def _convert_mutox_checkpoint( + state_dict: dict[str, object], config: MutoxConfig +) -> dict[str, object]: + # fairseq2 does not use a top-level "model" keyword anymore (v0.5+) + try: + state_dict = cast(dict[str, object], state_dict["model"]) + except KeyError: + pass + + new_dict = {} + for key in state_dict: + if key.startswith("model_all."): + new_dict[key] = state_dict[key] + return new_dict diff --git a/sonar/models/mutox/config.py b/sonar/models/mutox/config.py index db51624..607a02f 100644 --- a/sonar/models/mutox/config.py +++ b/sonar/models/mutox/config.py @@ -5,8 +5,12 @@ # MIT_LICENSE file in the root directory of this source tree. from dataclasses import dataclass +from typing import Final -from fairseq2.context import RuntimeContext +from fairseq2.runtime.config_registry import ConfigRegistrar +from fairseq2.runtime.dependency import DependencyContainer + +MUTOX_FAMILY: Final = "mutox_classifier" @dataclass @@ -17,10 +21,8 @@ class MutoxConfig: input_size: int -def register_mutox_configs(context: RuntimeContext) -> None: - registry = context.get_config_registry(MutoxConfig) - - arch = registry.decorator +def _register_mutox_configs(container: DependencyContainer) -> None: + arch = ConfigRegistrar(container, MutoxConfig) @arch("mutox") def _base_mutox() -> MutoxConfig: diff --git a/sonar/models/mutox/factory.py b/sonar/models/mutox/factory.py index 3f2f3cd..2dc20ec 100644 --- a/sonar/models/mutox/factory.py +++ b/sonar/models/mutox/factory.py @@ -4,7 +4,6 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. -from dataclasses import asdict from torch import nn @@ -12,7 +11,7 @@ from sonar.models.mutox.model import MutoxClassifier -def create_mutox_model(config: MutoxConfig) -> MutoxClassifier: +def _create_mutox_model(config: MutoxConfig) -> MutoxClassifier: # TODO: refactor the model and the config to make this more flexible model_h1 = nn.Sequential( nn.Dropout(0.01), diff --git a/sonar/models/mutox/handler.py b/sonar/models/mutox/handler.py deleted file mode 100644 index dd95332..0000000 --- a/sonar/models/mutox/handler.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the BSD-style license found in the -# LICENSE file in the root directory of this source tree. - -from typing import cast, final - -from fairseq2.models import AbstractModelHandler -from torch.nn import Module -from typing_extensions import override - -from sonar.models.mutox.config import MutoxConfig -from sonar.models.mutox.factory import create_mutox_model -from sonar.models.mutox.model import MutoxClassifier - - -@final -class MutoxModelHandler(AbstractModelHandler): - @override - @property - def family(self) -> str: - return "mutox_classifier" - - @override - @property - def kls(self) -> type[Module]: - return MutoxClassifier - - @override - def _create_model(self, config: object) -> Module: - config = cast(MutoxConfig, config) - - return create_mutox_model(config) - - @override - def _convert_checkpoint( - self, checkpoint: dict[str, object], config: object - ) -> dict[str, object]: - new_dict = {} - for key in checkpoint: - if key.startswith("model_all."): - new_dict[key] = checkpoint[key] - return {"model": new_dict} diff --git a/sonar/models/mutox/loader.py b/sonar/models/mutox/loader.py index a432088..3ca75bc 100644 --- a/sonar/models/mutox/loader.py +++ b/sonar/models/mutox/loader.py @@ -4,8 +4,6 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. -import fairseq2 - from sonar.models.mutox import get_mutox_model_hub from sonar.models.mutox.model import MutoxClassifier @@ -13,9 +11,8 @@ def load_mutox_model(model_name: str, device=None, dtype=None) -> MutoxClassifier: """ This file exists purely for backward compatibility of the package interface! - Normally, the user is encouraged to call `setup_fairseq2` and `get_blaser_model_hub` on their own. + Normally, the user is encouraged to call `get_mutox_model_hub` on their own. """ - fairseq2.setup_fairseq2() model_hub = get_mutox_model_hub() - model = model_hub.load(model_name).to(device=device, dtype=dtype) + model = model_hub.load_model(model_name).to(device=device, dtype=dtype) return model diff --git a/sonar/models/sonar_speech/__init__.py b/sonar/models/sonar_speech/__init__.py index 8facd04..38de37a 100644 --- a/sonar/models/sonar_speech/__init__.py +++ b/sonar/models/sonar_speech/__init__.py @@ -4,26 +4,31 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. +from sonar.models.sonar_speech.checkpoint import ( + _convert_sonar_speech_checkpoint as _convert_sonar_speech_checkpoint, +) +from sonar.models.sonar_speech.config import SONAR_SPEECH_FAMILY as SONAR_SPEECH_FAMILY from sonar.models.sonar_speech.config import ( SonarSpeechEncoderConfig as SonarSpeechEncoderConfig, ) from sonar.models.sonar_speech.config import ( - register_sonar_speech_encoder_configs as register_sonar_speech_encoder_configs, + _register_sonar_speech_encoder_configs as _register_sonar_speech_encoder_configs, ) from sonar.models.sonar_speech.factory import ( SonarSpeechEncoderFactory as SonarSpeechEncoderFactory, ) -from sonar.models.sonar_speech.handler import ( - SonarSpeechEncoderHandler as SonarSpeechEncoderHandler, -) -from sonar.models.sonar_speech.model import ( - SonarSpeechEncoderModel as SonarSpeechEncoderModel, +from sonar.models.sonar_speech.factory import ( + _create_sonar_speech_encoder_model as _create_sonar_speech_encoder_model, ) # isort: split from fairseq2.models import ModelHubAccessor +from sonar.models.sonar_speech.model import ( + SonarSpeechEncoderModel as SonarSpeechEncoderModel, +) + get_sonar_speech_encoder_hub = ModelHubAccessor( - SonarSpeechEncoderModel, SonarSpeechEncoderConfig + SONAR_SPEECH_FAMILY, SonarSpeechEncoderModel, SonarSpeechEncoderConfig ) diff --git a/sonar/models/sonar_speech/checkpoint.py b/sonar/models/sonar_speech/checkpoint.py new file mode 100644 index 0000000..edfb452 --- /dev/null +++ b/sonar/models/sonar_speech/checkpoint.py @@ -0,0 +1,82 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Any, cast + +from fairseq2.models.utils.checkpoint import convert_fairseq_state_dict + +from sonar.models.sonar_speech.config import SonarSpeechEncoderConfig + + +def _convert_sonar_speech_checkpoint( + state_dict: dict[str, Any], config: SonarSpeechEncoderConfig +) -> dict[str, Any]: + # fairseq2 does not use a top-level "model" keyword anymore (v0.5+) + try: + state_dict = cast(dict[str, object], state_dict["model"]) + except KeyError: + pass + + # Check if we have a fairseq2 checkpoint. + if "encoder_frontend.model_dim_proj" in state_dict: + return state_dict + + # assuming pre fs2:v0.5 formatting with top-level "model" key + # state_dict = checkpoint["model"] + if "encoder.w2v_model.mask_emb" in state_dict: + del state_dict["encoder.w2v_model.mask_emb"] + + if "encoder.w2v_model.encoder.pos_conv.0.bias" in state_dict: + del state_dict["encoder.w2v_model.encoder.pos_conv.0.bias"] + del state_dict["encoder.w2v_model.encoder.pos_conv.0.weight_g"] + del state_dict["encoder.w2v_model.encoder.pos_conv.0.weight_v"] + + key_map = { + # fmt: off + # encoder + r"^encoder.w2v_model.layer_norm\.": r"encoder_frontend.post_extract_layer_norm.", + r"^encoder.w2v_model.post_extract_proj\.": r"encoder_frontend.model_dim_proj.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.conv_module\.batch_norm\.": r"encoder.layers.\1.conv.batch_norm.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.conv_module\.depthwise_conv\.": r"encoder.layers.\1.conv.depthwise_conv.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.conv_module\.layer_norm\.": r"encoder.layers.\1.conv_layer_norm.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.conv_module\.pointwise_conv1\.": r"encoder.layers.\1.conv.pointwise_conv1.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.conv_module\.pointwise_conv2\.": r"encoder.layers.\1.conv.pointwise_conv2.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.ffn(1|2)\.layer_norm\.": r"encoder.layers.\1.ffn\2_layer_norm.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.ffn(1|2)\.w_1\.": r"encoder.layers.\1.ffn\2.inner_proj.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.ffn(1|2)\.w_2\.": r"encoder.layers.\1.ffn\2.output_proj.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn_layer_norm\.": r"encoder.layers.\1.self_attn_layer_norm.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn\.linear_q\.": r"encoder.layers.\1.self_attn.q_proj.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn\.linear_k\.": r"encoder.layers.\1.self_attn.k_proj.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn\.linear_v\.": r"encoder.layers.\1.self_attn.v_proj.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn\.linear_out\.": r"encoder.layers.\1.self_attn.output_proj.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn\.linear_pos\.": r"encoder.layers.\1.self_attn.sdpa.r_proj.", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn\.pos_bias_u": r"encoder.layers.\1.self_attn.sdpa.u_bias", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn\.pos_bias_v": r"encoder.layers.\1.self_attn.sdpa.v_bias", + r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.final_layer_norm\.": r"encoder.layers.\1.layer_norm.", + r"^encoder.w2v_model.encoder\.layer_norm\.": r"encoder.layer_norm.", + r"^decoder\.embed_tokens\.": r"encoder_pooler.decoder_frontend.embed.", + r"^decoder\.layers\.([0-9]+)\.self_attn_layer_norm\.": r"encoder_pooler.decoder.layers.\1.self_attn_layer_norm.", + r"^decoder\.layers\.([0-9]+)\.self_attn\.out_proj\.": r"encoder_pooler.decoder.layers.\1.self_attn.output_proj.", + r"^decoder\.layers\.([0-9]+)\.self_attn\.": r"encoder_pooler.decoder.layers.\1.self_attn.", + r"^decoder\.layers\.([0-9]+)\.encoder_attn_layer_norm\.": r"encoder_pooler.decoder.layers.\1.encoder_decoder_attn_layer_norm.", + r"^decoder\.layers\.([0-9]+)\.encoder_attn\.out_proj\.": r"encoder_pooler.decoder.layers.\1.encoder_decoder_attn.output_proj.", + r"^decoder\.layers\.([0-9]+)\.encoder_attn\.": r"encoder_pooler.decoder.layers.\1.encoder_decoder_attn.", + r"^decoder\.layers\.([0-9]+)\.fc1\.": r"encoder_pooler.decoder.layers.\1.ffn.inner_proj.", + r"^decoder\.layers\.([0-9]+)\.fc2\.": r"encoder_pooler.decoder.layers.\1.ffn.output_proj.", + r"^decoder\.layers\.([0-9]+)\.final_layer_norm\.": r"encoder_pooler.decoder.layers.\1.ffn_layer_norm.", + r"^decoder\.embed_out": r"encoder_pooler.projection_out.weight", + # fmt: on + } + + # In normal circumstances, we should never encounter a `LayerNorm` when + # `use_conformer` is `True`. Unfortunately, the w2v-BERT pretraining in + # fairseq was accidentally run with a pre-LN encoder, and ended up with + # a redundant `LayerNorm` right after the Conformer blocks. We mitigate + # that issue here by moving that `LayerNorm` to the sonar block. + if config.w2v2_encoder_config.use_conformer: + key_map.update({r"^encoder.w2v_model.encoder\.layer_norm\.": r"layer_norm."}) + + return convert_fairseq_state_dict(state_dict, key_map) diff --git a/sonar/models/sonar_speech/config.py b/sonar/models/sonar_speech/config.py index 319d662..f2a1be5 100644 --- a/sonar/models/sonar_speech/config.py +++ b/sonar/models/sonar_speech/config.py @@ -5,12 +5,15 @@ # LICENSE file in the root directory of this source tree. from dataclasses import dataclass -from typing import Optional +from typing import Final, Optional -from fairseq2.context import RuntimeContext +from fairseq2.models.transformer import TransformerNormOrder from fairseq2.models.w2vbert import W2VBertConfig from fairseq2.models.wav2vec2 import Wav2Vec2EncoderConfig -from fairseq2.nn.transformer import TransformerNormOrder +from fairseq2.runtime.config_registry import ConfigRegistrar, get_config +from fairseq2.runtime.dependency import DependencyContainer, DependencyResolver + +SONAR_SPEECH_FAMILY: Final = "sonar_speech" @dataclass @@ -51,16 +54,12 @@ class SonarSpeechEncoderConfig: """The dropout probability in Transformer layers.""" -def register_sonar_speech_encoder_configs(context: RuntimeContext) -> None: - registry = context.get_config_registry(SonarSpeechEncoderConfig) - - arch = registry.decorator - - w2vbert_registry = context.get_config_registry(W2VBertConfig) +def _register_sonar_speech_encoder_configs(container: DependencyContainer) -> None: + arch = ConfigRegistrar(container, SonarSpeechEncoderConfig) - @arch("english") - def basic() -> SonarSpeechEncoderConfig: - w2vbert_config = w2vbert_registry.get("600m") + @arch("english", advanced=True) + def basic(resolver: DependencyResolver) -> SonarSpeechEncoderConfig: + w2vbert_config = get_config(resolver, W2VBertConfig, "600m") return SonarSpeechEncoderConfig( w2v2_encoder_config=w2vbert_config.w2v2_config.encoder_config, @@ -76,9 +75,9 @@ def basic() -> SonarSpeechEncoderConfig: dropout_p=0.1, ) - @arch("non_english") - def multilingual() -> SonarSpeechEncoderConfig: - w2vbert_config = w2vbert_registry.get("600m") + @arch("non_english", advanced=True) + def multilingual(resolver: DependencyResolver) -> SonarSpeechEncoderConfig: + w2vbert_config = get_config(resolver, W2VBertConfig, "600m") return SonarSpeechEncoderConfig( w2v2_encoder_config=w2vbert_config.w2v2_config.encoder_config, diff --git a/sonar/models/sonar_speech/factory.py b/sonar/models/sonar_speech/factory.py index 5592e76..e39c846 100644 --- a/sonar/models/sonar_speech/factory.py +++ b/sonar/models/sonar_speech/factory.py @@ -7,8 +7,19 @@ from typing import Optional from fairseq2.models.transformer import ( + FeedForwardNetwork, + IdentityBias, + MultiheadAttention, + StandardFeedForwardNetwork, + StandardMultiheadAttention, + StandardTransformerDecoder, + StandardTransformerDecoderLayer, + TransformerDecoder, + TransformerDecoderLayer, TransformerEmbeddingFrontend, + TransformerEncoder, TransformerFrontend, + create_default_sdpa, ) from fairseq2.models.wav2vec2 import Wav2Vec2EncoderFactory, Wav2Vec2Frontend from fairseq2.nn import ( @@ -18,27 +29,21 @@ PositionEncoder, SinusoidalPositionEncoder, StandardEmbedding, + StandardLayerNorm, init_scaled_embedding, ) -from fairseq2.nn.transformer import ( - FeedForwardNetwork, - MultiheadAttention, - StandardFeedForwardNetwork, - StandardMultiheadAttention, - StandardTransformerDecoder, - StandardTransformerDecoderLayer, - TransformerDecoder, - TransformerDecoderLayer, - TransformerEncoder, - create_default_sdpa, - create_standard_layer_norm, -) from sonar.models.sonar_speech.config import SonarSpeechEncoderConfig from sonar.models.sonar_speech.model import SonarSpeechEncoderModel from sonar.nn.encoder_pooler import AttentionEncoderOutputPooler, EncoderOutputPooler +def _create_sonar_speech_encoder_model( + config: SonarSpeechEncoderConfig, +) -> SonarSpeechEncoderModel: + return SonarSpeechEncoderFactory(config).create_model() + + class SonarSpeechEncoderFactory: config: SonarSpeechEncoderConfig @@ -80,6 +85,7 @@ def create_attention_pooler(self) -> EncoderOutputPooler: def create_decoder_frontend(self) -> TransformerFrontend: return TransformerEmbeddingFrontend( + self.config.model_dim, self.create_embedding(), self.create_pos_encoder(), dropout_p=self.config.dropout_p, @@ -94,7 +100,7 @@ def create_pos_encoder(self) -> PositionEncoder: def create_embedding(self) -> Embedding: return StandardEmbedding( num_embeddings=self.config.w2v2_encoder_config.model_dim, - embedding_dim=self.config.model_dim, + embed_dim=self.config.model_dim, pad_idx=self.config.pad_idx, init_fn=init_scaled_embedding, ) @@ -103,24 +109,24 @@ def create_decoder(self) -> TransformerDecoder: num_layers = self.config.num_decoder_layers layers = [self.create_decoder_layer() for _ in range(num_layers)] - return StandardTransformerDecoder( - layers, - norm_order=self.config.decoder_norm_order, - ) + return StandardTransformerDecoder(layers) def create_decoder_layer(self) -> TransformerDecoderLayer: num_heads = self.config.num_decoder_attn_heads return StandardTransformerDecoderLayer( - self.create_attention(num_heads), - self.create_attention(num_heads), - self.create_ffn(), + self_attn=self.create_attention(num_heads), + self_attn_layer_norm=self.create_layer_norm(), + encoder_decoder_attn=self.create_attention(num_heads), + encoder_decoder_attn_layer_norm=self.create_layer_norm(), + ffn=self.create_ffn(), + ffn_layer_norm=self.create_layer_norm(), dropout_p=self.config.dropout_p, norm_order=self.config.decoder_norm_order, ) def create_attention(self, num_heads: int) -> MultiheadAttention: - sdpa = create_default_sdpa(attn_dropout_p=self.config.dropout_p) + sdpa = create_default_sdpa(bias=IdentityBias(), dropout_p=self.config.dropout_p) return StandardMultiheadAttention( self.config.model_dim, @@ -133,16 +139,16 @@ def create_ffn(self) -> FeedForwardNetwork: self.config.model_dim, self.config.ffn_inner_dim, bias=True, - norm_order=self.config.decoder_norm_order, ) + def create_layer_norm(self) -> LayerNorm: + model_dim = self.config.model_dim + return StandardLayerNorm(model_dim, bias=True) + def create_w2v2_final_layer_norm(self) -> Optional[LayerNorm]: if not self.config.w2v2_encoder_config.use_conformer: return None - - return create_standard_layer_norm( - self.config.w2v2_encoder_config.model_dim, - ) + return StandardLayerNorm(self.config.w2v2_encoder_config.model_dim, bias=True) def create_projection_out(self) -> Linear: return Linear( diff --git a/sonar/models/sonar_speech/handler.py b/sonar/models/sonar_speech/handler.py deleted file mode 100644 index 977f101..0000000 --- a/sonar/models/sonar_speech/handler.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright (c) Meta Platforms, Inc. and affiliates. -# All rights reserved. -# -# This source code is licensed under the BSD-style license found in the -# LICENSE file in the root directory of this source tree. - -from typing import Any, cast, final - -from fairseq2.models import AbstractModelHandler -from fairseq2.models.utils.checkpoint import convert_fairseq_checkpoint -from torch.nn import Module -from typing_extensions import override - -from sonar.models.sonar_speech.config import SonarSpeechEncoderConfig -from sonar.models.sonar_speech.factory import SonarSpeechEncoderFactory -from sonar.models.sonar_speech.model import SonarSpeechEncoderModel - - -@final -class SonarSpeechEncoderHandler(AbstractModelHandler): - @override - @property - def family(self) -> str: - return "sonar_speech" - - @override - @property - def kls(self) -> type[Module]: - return SonarSpeechEncoderModel - - @override - def _create_model(self, config: object) -> Module: - config = cast(SonarSpeechEncoderConfig, config) - - return SonarSpeechEncoderFactory(config).create_model() - - @override - def _convert_checkpoint( - self, checkpoint: dict[str, object], config: object - ) -> dict[str, object]: - config = cast(SonarSpeechEncoderConfig, config) - - return convert_sonar_speech_checkpoint(checkpoint, config) - - -def convert_sonar_speech_checkpoint( - checkpoint: dict[str, Any], config: SonarSpeechEncoderConfig -) -> dict[str, Any]: - state_dict = checkpoint["model"] - - # Check if we have a fairseq2 checkpoint. - if "encoder_frontend.model_dim_proj" in state_dict: - return checkpoint - - if "encoder.w2v_model.mask_emb" in state_dict: - del state_dict["encoder.w2v_model.mask_emb"] - - if "encoder.w2v_model.encoder.pos_conv.0.bias" in state_dict: - del state_dict["encoder.w2v_model.encoder.pos_conv.0.bias"] - del state_dict["encoder.w2v_model.encoder.pos_conv.0.weight_g"] - del state_dict["encoder.w2v_model.encoder.pos_conv.0.weight_v"] - - key_map = { - # fmt: off - # encoder - r"^encoder.w2v_model.layer_norm\.": r"encoder_frontend.post_extract_layer_norm.", - r"^encoder.w2v_model.post_extract_proj\.": r"encoder_frontend.model_dim_proj.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.conv_module\.batch_norm\.": r"encoder.layers.\1.conv.batch_norm.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.conv_module\.depthwise_conv\.": r"encoder.layers.\1.conv.depthwise_conv.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.conv_module\.layer_norm\.": r"encoder.layers.\1.conv_layer_norm.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.conv_module\.pointwise_conv1\.": r"encoder.layers.\1.conv.pointwise_conv1.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.conv_module\.pointwise_conv2\.": r"encoder.layers.\1.conv.pointwise_conv2.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.ffn(1|2)\.layer_norm\.": r"encoder.layers.\1.ffn\2_layer_norm.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.ffn(1|2)\.w_1\.": r"encoder.layers.\1.ffn\2.inner_proj.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.ffn(1|2)\.w_2\.": r"encoder.layers.\1.ffn\2.output_proj.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn_layer_norm\.": r"encoder.layers.\1.self_attn_layer_norm.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn\.linear_q\.": r"encoder.layers.\1.self_attn.q_proj.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn\.linear_k\.": r"encoder.layers.\1.self_attn.k_proj.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn\.linear_v\.": r"encoder.layers.\1.self_attn.v_proj.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn\.linear_out\.": r"encoder.layers.\1.self_attn.output_proj.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn\.linear_pos\.": r"encoder.layers.\1.self_attn.sdpa.r_proj.", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn\.pos_bias_u": r"encoder.layers.\1.self_attn.sdpa.u_bias", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.self_attn\.pos_bias_v": r"encoder.layers.\1.self_attn.sdpa.v_bias", - r"^encoder.w2v_model.encoder\.layers\.([0-9]+)\.final_layer_norm\.": r"encoder.layers.\1.layer_norm.", - r"^encoder.w2v_model.encoder\.layer_norm\.": r"encoder.layer_norm.", - - r"^decoder\.embed_tokens\.": r"encoder_pooler.decoder_frontend.embed.", - r"^decoder\.layers\.([0-9]+)\.self_attn_layer_norm\.": r"encoder_pooler.decoder.layers.\1.self_attn_layer_norm.", - r"^decoder\.layers\.([0-9]+)\.self_attn\.out_proj\.": r"encoder_pooler.decoder.layers.\1.self_attn.output_proj.", - r"^decoder\.layers\.([0-9]+)\.self_attn\.": r"encoder_pooler.decoder.layers.\1.self_attn.", - r"^decoder\.layers\.([0-9]+)\.encoder_attn_layer_norm\.": r"encoder_pooler.decoder.layers.\1.encoder_decoder_attn_layer_norm.", - r"^decoder\.layers\.([0-9]+)\.encoder_attn\.out_proj\.": r"encoder_pooler.decoder.layers.\1.encoder_decoder_attn.output_proj.", - r"^decoder\.layers\.([0-9]+)\.encoder_attn\.": r"encoder_pooler.decoder.layers.\1.encoder_decoder_attn.", - r"^decoder\.layers\.([0-9]+)\.fc1\.": r"encoder_pooler.decoder.layers.\1.ffn.inner_proj.", - r"^decoder\.layers\.([0-9]+)\.fc2\.": r"encoder_pooler.decoder.layers.\1.ffn.output_proj.", - r"^decoder\.layers\.([0-9]+)\.final_layer_norm\.": r"encoder_pooler.decoder.layers.\1.ffn_layer_norm.", - - r"^decoder\.embed_out": r"encoder_pooler.projection_out.weight", - # fmt: on - } - - # In normal circumstances, we should never encounter a `LayerNorm` when - # `use_conformer` is `True`. Unfortunately, the w2v-BERT pretraining in - # fairseq was accidentally run with a pre-LN encoder, and ended up with - # a redundant `LayerNorm` right after the Conformer blocks. We mitigate - # that issue here by moving that `LayerNorm` to the sonar block. - if config.w2v2_encoder_config.use_conformer: - key_map.update({r"^encoder.w2v_model.encoder\.layer_norm\.": r"layer_norm."}) - - return convert_fairseq_checkpoint(checkpoint, key_map) diff --git a/sonar/models/sonar_speech/model.py b/sonar/models/sonar_speech/model.py index f3a4ea7..e22a5ee 100644 --- a/sonar/models/sonar_speech/model.py +++ b/sonar/models/sonar_speech/model.py @@ -4,15 +4,13 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. -from typing import Optional, Tuple +from typing import Optional -from fairseq2.models.sequence import SequenceBatch -from fairseq2.models.transformer import TransformerFrontend -from fairseq2.nn import LayerNorm -from fairseq2.nn.padding import PaddingMask -from fairseq2.nn.transformer import TransformerEncoder +from fairseq2.models.transformer import TransformerEncoder, TransformerFrontend +from fairseq2.nn import BatchLayout, LayerNorm from torch import Tensor from torch.nn import Dropout +from typing_extensions import override from sonar.models.encoder_model import SonarEncoderModel, SonarEncoderOutput from sonar.nn.encoder_pooler import EncoderOutputPooler @@ -20,7 +18,7 @@ class SonarSpeechEncoderModel(SonarEncoderModel): """Represents a SONAR speech encoder model as described in - # TODO add correct paper cite :cite:t`URL`.""" + :cite:t`https://doi.org/10.48550/arXiv.2308.11466`.""" encoder_frontend: TransformerFrontend encoder: TransformerEncoder @@ -48,7 +46,7 @@ def __init__( :param encoder_pooler: Encoder output pooler. """ - super().__init__(encoder.model_dim) + super().__init__() self.encoder_frontend = encoder_frontend self.encoder = encoder @@ -56,9 +54,10 @@ def __init__( self.layer_norm = layer_norm self.encoder_pooler = encoder_pooler - def forward(self, batch: SequenceBatch) -> SonarEncoderOutput: - seqs, padding_mask = self.encoder_frontend(batch.seqs, batch.padding_mask) - encoder_output, encoder_padding_mask = self.encoder(seqs, padding_mask) + @override + def forward(self, seqs: Tensor, seqs_layout: BatchLayout) -> SonarEncoderOutput: + seqs, seqs_layout = self.encoder_frontend(seqs, seqs_layout) + encoder_output = self.encoder(seqs, seqs_layout) # This is the workaround for the pre-LN issue of redundant LayerNorm. # We call here, to avoid fiddling with wav2vec2's model and config. @@ -66,21 +65,10 @@ def forward(self, batch: SequenceBatch) -> SonarEncoderOutput: encoder_output = self.layer_norm(encoder_output) encoder_output = self.final_dropout(encoder_output) - encoder_output_pooled = self.encoder_pooler( - encoder_output, encoder_padding_mask - ) + encoder_output_pooled = self.encoder_pooler(encoder_output, seqs_layout) return SonarEncoderOutput( encoded_seqs=encoder_output, sentence_embeddings=encoder_output_pooled, - padding_mask=padding_mask, - ) - - def encode( - self, seqs: Tensor, padding_mask: Optional[PaddingMask] - ) -> Tuple[Tensor, Optional[Tensor]]: - sonar_output_encoder = self.encoder(seqs, padding_mask) - return ( - sonar_output_encoder.sentence_embeddings.unsqueeze(1), - None, + encoded_seqs_layout=seqs_layout, ) diff --git a/sonar/models/sonar_text/__init__.py b/sonar/models/sonar_text/__init__.py index 5223983..c402af5 100644 --- a/sonar/models/sonar_text/__init__.py +++ b/sonar/models/sonar_text/__init__.py @@ -4,6 +4,20 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. +from fairseq2.models import ModelHubAccessor + +from sonar.models.sonar_text.checkpoint import ( + _convert_sonar_text_decoder_checkpoint as _convert_sonar_text_decoder_checkpoint, +) +from sonar.models.sonar_text.checkpoint import ( + _convert_sonar_text_encoder_checkpoint as _convert_sonar_text_encoder_checkpoint, +) +from sonar.models.sonar_text.config import ( + SONAR_TEXT_DECODER_FAMILY as SONAR_TEXT_DECODER_FAMILY, +) +from sonar.models.sonar_text.config import ( + SONAR_TEXT_ENCODER_FAMILY as SONAR_TEXT_ENCODER_FAMILY, +) from sonar.models.sonar_text.config import ( SonarTextDecoderConfig as SonarTextDecoderConfig, ) @@ -11,10 +25,10 @@ SonarTextEncoderConfig as SonarTextEncoderConfig, ) from sonar.models.sonar_text.config import ( - register_sonar_text_decoder_configs as register_sonar_text_decoder_configs, + _register_sonar_text_decoder_configs as _register_sonar_text_decoder_configs, ) from sonar.models.sonar_text.config import ( - register_sonar_text_encoder_configs as register_sonar_text_encoder_configs, + _register_sonar_text_encoder_configs as _register_sonar_text_encoder_configs, ) from sonar.models.sonar_text.factory import ( SonarTextDecoderFactory as SonarTextDecoderFactory, @@ -22,27 +36,23 @@ from sonar.models.sonar_text.factory import ( SonarTextEncoderFactory as SonarTextEncoderFactory, ) -from sonar.models.sonar_text.handler import ( - SonarTextDecoderHandler as SonarTextDecoderHandler, +from sonar.models.sonar_text.factory import ( + _create_sonar_text_decoder_model as _create_sonar_text_decoder_model, ) -from sonar.models.sonar_text.handler import ( - SonarTextEncoderHandler as SonarTextEncoderHandler, +from sonar.models.sonar_text.factory import ( + _create_sonar_text_encoder_model as _create_sonar_text_encoder_model, ) from sonar.models.sonar_text.model import ( SonarTextTransformerEncoderModel as SonarTextTransformerEncoderModel, ) - -# isort: split - -from fairseq2.models import ModelHubAccessor - from sonar.nn.conditional_decoder_model import ConditionalTransformerDecoderModel get_sonar_text_encoder_hub = ModelHubAccessor( - SonarTextTransformerEncoderModel, SonarTextEncoderConfig + SONAR_TEXT_ENCODER_FAMILY, SonarTextTransformerEncoderModel, SonarTextEncoderConfig ) - get_sonar_text_decoder_hub = ModelHubAccessor( - ConditionalTransformerDecoderModel, SonarTextDecoderConfig + SONAR_TEXT_DECODER_FAMILY, + ConditionalTransformerDecoderModel, + SonarTextDecoderConfig, ) diff --git a/sonar/models/sonar_text/handler.py b/sonar/models/sonar_text/checkpoint.py similarity index 59% rename from sonar/models/sonar_text/handler.py rename to sonar/models/sonar_text/checkpoint.py index 69a81f5..f4ad1aa 100644 --- a/sonar/models/sonar_text/handler.py +++ b/sonar/models/sonar_text/checkpoint.py @@ -4,60 +4,31 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. -from typing import Any, cast, final +from typing import Any, Dict, cast import torch -from fairseq2.models import AbstractModelHandler -from fairseq2.models.utils.checkpoint import convert_fairseq_checkpoint -from torch.nn import Module -from typing_extensions import override +from fairseq2.models.utils.checkpoint import convert_fairseq_state_dict from sonar.models.sonar_text.config import ( SonarTextDecoderConfig, SonarTextEncoderConfig, ) -from sonar.models.sonar_text.factory import ( - SonarTextDecoderFactory, - SonarTextEncoderFactory, -) -from sonar.models.sonar_text.model import SonarTextTransformerEncoderModel -from sonar.nn.conditional_decoder_model import ConditionalTransformerDecoderModel - - -@final -class SonarTextEncoderHandler(AbstractModelHandler): - @override - @property - def family(self) -> str: - return "transformer_encoder" - - @override - @property - def kls(self) -> type[Module]: - return SonarTextTransformerEncoderModel - @override - def _create_model(self, config: object) -> Module: - config = cast(SonarTextEncoderConfig, config) - - return SonarTextEncoderFactory(config).create_model() - - @override - def _convert_checkpoint( - self, checkpoint: dict[str, object], config: object - ) -> dict[str, object]: - return convert_sonar_text_encoder_checkpoint(checkpoint) +def _convert_sonar_text_encoder_checkpoint( + state_dict: Dict[str, Any], config: SonarTextEncoderConfig +) -> Dict[str, Any]: + # fairseq2 does not use a top-level "model" keyword anymore (v0.5+) + try: + state_dict = cast(dict[str, object], state_dict["model"]) + except KeyError: + pass -def convert_sonar_text_encoder_checkpoint(checkpoint: dict[str, Any]) -> dict[str, Any]: # Return directly if found fairseq2 attribute in state dict - if ( - "model" in checkpoint.keys() - and "encoder_frontend.embed.weight" in checkpoint["model"].keys() - ): - return checkpoint + if "encoder_frontend.embed.weight" in state_dict.keys(): + return state_dict - state_dict = checkpoint["state_dict"] + state_dict = state_dict["state_dict"] try: del state_dict["version"] @@ -81,9 +52,9 @@ def convert_sonar_text_encoder_checkpoint(checkpoint: dict[str, Any]) -> dict[st # fmt: on } - out_checkpoint = convert_fairseq_checkpoint(out_checkpoint, key_map) + out_checkpoint = convert_fairseq_state_dict(out_checkpoint, key_map) # type: ignore - embeds = checkpoint["embed_tokens"].weight + embeds = state_dict["embed_tokens"].weight # # The embedding positions of the control tokens do not match the # # SentencePiece model of the tokenizer. with torch.inference_mode(): @@ -94,47 +65,28 @@ def convert_sonar_text_encoder_checkpoint(checkpoint: dict[str, Any]) -> dict[st return out_checkpoint -@final -class SonarTextDecoderHandler(AbstractModelHandler): - @override - @property - def family(self) -> str: - return "transformer_decoder" - - @override - @property - def kls(self) -> type[Module]: - return ConditionalTransformerDecoderModel - - @override - def _create_model(self, config: object) -> Module: - config = cast(SonarTextDecoderConfig, config) - - return SonarTextDecoderFactory(config).create_model() - - @override - def _convert_checkpoint( - self, checkpoint: dict[str, object], config: object - ) -> dict[str, object]: - return convert_sonar_text_decoder_checkpoint(checkpoint) - +def _convert_sonar_text_decoder_checkpoint( + state_dict: dict[str, Any], config: SonarTextDecoderConfig +) -> dict[str, Any]: + # fairseq2 does not use a top-level "model" keyword anymore (v0.5+) + try: + state_dict = cast(dict[str, object], state_dict["model"]) + except KeyError: + pass -def convert_sonar_text_decoder_checkpoint(checkpoint: dict[str, Any]) -> dict[str, Any]: # Return directly if found fairseq2 attribute in state dict - if ( - "model" in checkpoint.keys() - and "decoder_frontend.embed.weight" in checkpoint["model"].keys() - ): - return checkpoint + if "decoder_frontend.embed.weight" in state_dict.keys(): + return state_dict - state_dict = checkpoint["state_dict"] + # assuming pre fs2:v0.5 formatting with top-level "model" key + state_dict = state_dict["state_dict"] try: del state_dict["version"] del state_dict["embed_positions._float_tensor"] except: pass - out_checkpoint = {"model": state_dict} + out_checkpoint = state_dict key_map = { r"layers\.([0-9]+)\.self_attn\.k_proj\.": r"decoder.layers.\1.self_attn.k_proj.", @@ -158,15 +110,15 @@ def convert_sonar_text_decoder_checkpoint(checkpoint: dict[str, Any]) -> dict[st r"layer_norm.": r"decoder.layer_norm.", } - out_checkpoint = convert_fairseq_checkpoint(out_checkpoint, key_map) + out_checkpoint = convert_fairseq_state_dict(out_checkpoint, key_map) out_checkpoint = cast(dict[str, Any], out_checkpoint) - embeds = out_checkpoint["model"]["decoder_frontend.embed.weight"] + embeds = out_checkpoint["decoder_frontend.embed.weight"] # # The embedding positions of the control tokens do not match the # # SentencePiece model of the tokenizer. with torch.inference_mode(): # (BOS, PAD, EOS, UNK) -> (PAD, UNK, BOS, EOS) embeds[[0, 1, 2, 3]] = embeds[[1, 3, 0, 2]] - out_checkpoint["model"]["decoder_frontend.embed.weight"] = embeds + out_checkpoint["decoder_frontend.embed.weight"] = embeds return out_checkpoint diff --git a/sonar/models/sonar_text/config.py b/sonar/models/sonar_text/config.py index 6a49f4a..aafdf45 100644 --- a/sonar/models/sonar_text/config.py +++ b/sonar/models/sonar_text/config.py @@ -5,10 +5,13 @@ # LICENSE file in the root directory of this source tree. from dataclasses import dataclass -from typing import Optional +from typing import Final, Optional -from fairseq2.context import RuntimeContext -from fairseq2.data import VocabularyInfo +from fairseq2.data.tokenizers import VocabularyInfo +from fairseq2.runtime.config_registry import ConfigRegistrar +from fairseq2.runtime.dependency import DependencyContainer + +SONAR_TEXT_ENCODER_FAMILY: Final = "transformer_encoder" @dataclass @@ -56,9 +59,6 @@ class SonarTextEncoderConfig: activation_fn: str = "ReLU" """ activation function to use in FeedForward network of Transformers; None corresponds to ReLu""" - layernorm_embedding: bool = False - """ If True, apply LayerNorm on sequence embeddings""" - no_scale_embedding: bool = False """if False, multiply sequence embeddings by sqrt(model_dim) before positional encoding""" @@ -84,10 +84,8 @@ class SonarTextEncoderConfig: """if True, do max_seq_len += pad_idx + 1 for retro-compatibgiility with fairseq trained models""" -def register_sonar_text_encoder_configs(context: RuntimeContext) -> None: - registry = context.get_config_registry(SonarTextEncoderConfig) - - arch = registry.decorator +def _register_sonar_text_encoder_configs(container: DependencyContainer) -> None: + arch = ConfigRegistrar(container, SonarTextEncoderConfig) @arch("basic") def basic() -> SonarTextEncoderConfig: @@ -104,7 +102,6 @@ def basic() -> SonarTextEncoderConfig: max_seq_len=512, pooling="mean", no_token_positional_embeddings=False, - layernorm_embedding=False, activation_fn="ReLU", normalize_before=False, num_encoder_layers=24, @@ -127,6 +124,9 @@ def small(vocab_size=32005, depth=6, hidden_dim=1024 * 4) -> SonarTextEncoderCon return config +SONAR_TEXT_DECODER_FAMILY: Final = "transformer_decoder" + + @dataclass class SonarTextDecoderConfig: """Holds the configuration of an SonarDecoder model.""" @@ -145,9 +145,6 @@ class SonarTextDecoderConfig: activation_fn: str """ activation function to use in FeedForward network of Transformers; None corresponds to ReLu""" - layernorm_embedding: bool - """ If True, apply LayerNorm on sequence embeddings""" - no_scale_embedding: bool """if False, multiply sequence embeddings by sqrt(model_dim) before positional encoding""" @@ -189,10 +186,8 @@ class SonarTextDecoderConfig: """The dimensionality of the input. If None, model_dim is used instead.""" -def register_sonar_text_decoder_configs(context: RuntimeContext) -> None: - registry = context.get_config_registry(SonarTextDecoderConfig) - - arch = registry.decorator +def _register_sonar_text_decoder_configs(container: DependencyContainer) -> None: + arch = ConfigRegistrar(container, SonarTextDecoderConfig) @arch("basic") def basic() -> SonarTextDecoderConfig: @@ -208,7 +203,6 @@ def basic() -> SonarTextDecoderConfig: attention_dropout_p=0.1, activation_dropout_p=0.1, no_token_positional_embeddings=False, - layernorm_embedding=False, activation_fn="ReLU", normalize_before=True, num_encoder_layers=24, @@ -244,7 +238,6 @@ def toy() -> SonarTextDecoderConfig: attention_dropout_p=0.1, activation_dropout_p=0.1, no_token_positional_embeddings=False, - layernorm_embedding=False, activation_fn="ReLU", normalize_before=True, num_encoder_layers=2, diff --git a/sonar/models/sonar_text/factory.py b/sonar/models/sonar_text/factory.py index 400f028..536c73d 100644 --- a/sonar/models/sonar_text/factory.py +++ b/sonar/models/sonar_text/factory.py @@ -8,21 +8,10 @@ import torch.nn from fairseq2.models.transformer import ( - TransformerEmbeddingFrontend, - TransformerFrontend, -) -from fairseq2.nn import ( - LearnedPositionEncoder, - Linear, - PositionEncoder, - SinusoidalPositionEncoder, - StandardEmbedding, - StandardLayerNorm, - TiedProjection, - init_scaled_embedding, -) -from fairseq2.nn.transformer import ( + AttentionBias, + CausalAttentionBias, FeedForwardNetwork, + IdentityBias, MultiheadAttention, StandardFeedForwardNetwork, StandardMultiheadAttention, @@ -32,10 +21,23 @@ StandardTransformerEncoderLayer, TransformerDecoder, TransformerDecoderLayer, + TransformerEmbeddingFrontend, TransformerEncoderLayer, + TransformerFrontend, TransformerNormOrder, create_default_sdpa, ) +from fairseq2.nn import ( + LayerNorm, + LearnedPositionEncoder, + Linear, + PositionEncoder, + SinusoidalPositionEncoder, + StandardEmbedding, + StandardLayerNorm, + TiedProjection, + init_scaled_embedding, +) from torch.nn import Parameter from sonar.models.sonar_text.config import ( @@ -47,6 +49,12 @@ from sonar.nn.encoder_pooler import AttentionEncoderOutputPooler, EncoderOutputPooler +def _create_sonar_text_encoder_model( + config: SonarTextEncoderConfig, +) -> SonarTextTransformerEncoderModel: + return SonarTextEncoderFactory(config).create_model() + + class SonarTextEncoderFactory: config: SonarTextEncoderConfig @@ -72,7 +80,7 @@ def embedding_dim(self) -> int: def create_model(self) -> SonarTextTransformerEncoderModel: embed = StandardEmbedding( num_embeddings=self.config.vocab_info.size, - embedding_dim=self.config.model_dim, + embed_dim=self.config.model_dim, pad_idx=self.config.vocab_info.pad_idx, init_fn=init_scaled_embedding, ) @@ -92,19 +100,17 @@ def create_model(self) -> SonarTextTransformerEncoderModel: ) embedding_frontend = TransformerEmbeddingFrontend( - embed, - pos_encoder, + model_dim=self.config.model_dim, + embed=embed, + pos_encoder=pos_encoder, no_scale=self.config.no_scale_embedding, - layer_norm=self.config.layernorm_embedding, dropout_p=self.config.emb_dropout_p, ) transformer_layers = [ self.create_encoder_layer() for _ in range(self.config.num_encoder_layers) ] - encoder = StandardTransformerEncoder( - transformer_layers, norm_order=self.transformer_normalize_order - ) + encoder = StandardTransformerEncoder(transformer_layers) pooling = getattr(Pooling, self.config.pooling.upper()) if pooling == Pooling.ATTENTION: pooler = self.create_attention_pooler() @@ -114,15 +120,18 @@ def create_model(self) -> SonarTextTransformerEncoderModel: return SonarTextTransformerEncoderModel( encoder_frontend=embedding_frontend, encoder=encoder, - layer_norm=StandardLayerNorm(self.config.model_dim, bias=True), + layer_norm=self.create_layer_norm(dim=self.config.model_dim), pooling=pooling, pooler=pooler, + max_source_seq_len=self.config.max_seq_len, ) def create_encoder_layer(self) -> TransformerEncoderLayer: return StandardTransformerEncoderLayer( self_attn=self.create_attention(), + self_attn_layer_norm=self.create_layer_norm(dim=self.config.model_dim), ffn=self.create_ffn(), + ffn_layer_norm=self.create_layer_norm(dim=self.config.model_dim), dropout_p=self.config.attention_dropout_p, norm_order=TransformerNormOrder.PRE, ) @@ -137,7 +146,9 @@ def create_attention( model_dim=model_dim or self.config.model_dim, kv_dim=kv_dim or self.config.model_dim, num_heads=num_heads or self.config.num_encoder_attn_heads, - sdpa=create_default_sdpa(attn_dropout_p=self.config.attention_dropout_p), + sdpa=create_default_sdpa( + bias=IdentityBias(), dropout_p=self.config.attention_dropout_p + ), ) def create_ffn( @@ -149,7 +160,6 @@ def create_ffn( bias=True, inner_activation=getattr(torch.nn, self.config.activation_fn)(), inner_dropout_p=self.config.activation_dropout_p, - norm_order=self.transformer_normalize_order, ) def create_attention_pooler(self) -> EncoderOutputPooler: @@ -160,12 +170,15 @@ def create_attention_pooler(self) -> EncoderOutputPooler: bos_idx=0, ) + def create_layer_norm(self, dim: int) -> LayerNorm: + return StandardLayerNorm(dim, bias=True) + # This method, and all methods below, refer only to the attention pooler building. # The "decoder" is used for pooling the encoder representations in a smarter way def create_decoder_frontend(self) -> TransformerFrontend: - embedding = StandardEmbedding( + embed = StandardEmbedding( num_embeddings=1, - embedding_dim=self.embedding_dim, + embed_dim=self.embedding_dim, pad_idx=0, init_fn=init_scaled_embedding, ) @@ -174,18 +187,26 @@ def create_decoder_frontend(self) -> TransformerFrontend: max_seq_len=1, ) return TransformerEmbeddingFrontend( - embed=embedding, + model_dim=self.config.model_dim, + embed=embed, pos_encoder=pos_encoder, dropout_p=self.config.emb_dropout_p, ) def create_decoder(self) -> TransformerDecoder: - num_layers = self.config.num_decoder_layers - layers = [self.create_decoder_layer() for _ in range(num_layers)] + if self.transformer_normalize_order == TransformerNormOrder.PRE: + layer_norm = self.create_layer_norm( + dim=self.config.embedding_dim or self.config.model_dim + ) + else: + layer_norm = None return StandardTransformerDecoder( - layers, - norm_order=self.transformer_normalize_order, + layers=[ + self.create_decoder_layer() + for _ in range(self.config.num_decoder_layers) + ], + layer_norm=layer_norm, ) def create_decoder_layer(self) -> TransformerDecoderLayer: @@ -198,15 +219,24 @@ def create_decoder_layer(self) -> TransformerDecoderLayer: model_dim=self.embedding_dim, kv_dim=self.embedding_dim, ), + self_attn_layer_norm=self.create_layer_norm( + dim=self.config.embedding_dim or self.config.model_dim + ), encoder_decoder_attn=self.create_attention( num_heads=num_heads, model_dim=self.embedding_dim, kv_dim=self.config.model_dim, ), + encoder_decoder_attn_layer_norm=self.create_layer_norm( + dim=self.config.embedding_dim or self.config.model_dim + ), ffn=self.create_ffn( model_dim=self.embedding_dim, inner_dim=self.config.decoder_ffn_inner_dim, ), + ffn_layer_norm=self.create_layer_norm( + dim=self.config.embedding_dim or self.config.model_dim + ), dropout_p=self.config.attention_dropout_p, norm_order=self.transformer_normalize_order, ) @@ -226,6 +256,12 @@ def create_projection_in(self) -> Linear: ) +def _create_sonar_text_decoder_model( + config: SonarTextDecoderConfig, +) -> ConditionalTransformerDecoderModel: + return SonarTextDecoderFactory(config).create_model() + + class SonarTextDecoderFactory: config: SonarTextDecoderConfig @@ -241,7 +277,7 @@ def __init__(self, config: SonarTextDecoderConfig) -> None: def create_decoder_frontend(self) -> TransformerFrontend: embed = StandardEmbedding( num_embeddings=self.config.vocab_info.size, - embedding_dim=self.config.model_dim, + embed_dim=self.config.model_dim, pad_idx=self.config.vocab_info.pad_idx, init_fn=init_scaled_embedding, ) @@ -251,34 +287,48 @@ def create_decoder_frontend(self) -> TransformerFrontend: _legacy_pad_idx=self.config.vocab_info.pad_idx, ) return TransformerEmbeddingFrontend( - embed, - pos_encoder, + model_dim=self.config.model_dim, + embed=embed, + pos_encoder=pos_encoder, no_scale=self.config.no_scale_embedding, - layer_norm=self.config.layernorm_embedding, dropout_p=self.config.emb_dropout_p, ) + def create_layer_norm(self, dim: int) -> LayerNorm: + return StandardLayerNorm(dim, bias=True) + def create_decoder_layer(self) -> TransformerDecoderLayer: - self_attn = self.create_attention(kv_dim=self.config.model_dim) + self_attn = self.create_attention( + bias=CausalAttentionBias(), kv_dim=self.config.model_dim + ) - encoder_decoder_attn = self.create_attention(kv_dim=self.config.input_dim) + encoder_decoder_attn = self.create_attention( + bias=IdentityBias(), kv_dim=self.config.input_dim + ) ffn = self.create_ffn() return StandardTransformerDecoderLayer( - self_attn, - encoder_decoder_attn, - ffn, + self_attn=self_attn, + self_attn_layer_norm=self.create_layer_norm(dim=self.config.model_dim), + encoder_decoder_attn=encoder_decoder_attn, + encoder_decoder_attn_layer_norm=self.create_layer_norm( + dim=self.config.model_dim + ), + ffn=ffn, + ffn_layer_norm=self.create_layer_norm(dim=self.config.model_dim), dropout_p=self.config.attention_dropout_p, norm_order=TransformerNormOrder.PRE, ) - def create_attention(self, kv_dim=None) -> MultiheadAttention: + def create_attention(self, bias: AttentionBias, kv_dim=None) -> MultiheadAttention: return StandardMultiheadAttention( self.config.model_dim, self.config.num_encoder_attn_heads, kv_dim=kv_dim or self.config.model_dim, - sdpa=create_default_sdpa(attn_dropout_p=self.config.attention_dropout_p), + sdpa=create_default_sdpa( + bias=bias, dropout_p=self.config.attention_dropout_p + ), ) def create_ffn(self) -> FeedForwardNetwork: @@ -288,16 +338,17 @@ def create_ffn(self) -> FeedForwardNetwork: bias=True, inner_activation=getattr(torch.nn, self.config.activation_fn)(), inner_dropout_p=self.config.activation_dropout_p, - norm_order=self.transformer_normalize_order, ) def create_decoder(self) -> TransformerDecoder: return StandardTransformerDecoder( - [ + layers=[ self.create_decoder_layer() for _ in range(self.config.num_decoder_layers) ], - norm_order=TransformerNormOrder.PRE, + layer_norm=self.create_layer_norm( + dim=self.config.model_dim + ), # equivalent to TransformerNormOrder.PRE for ConditionalTransformerDecoderModel: @@ -307,9 +358,8 @@ def create_model(self) -> ConditionalTransformerDecoderModel: final_proj = TiedProjection(weight=param, bias=None) return ConditionalTransformerDecoderModel( - decoder_frontend, - decoder, - final_proj, - self.config.max_seq_len, - self.config.vocab_info, + decoder_frontend=decoder_frontend, + decoder=decoder, + final_proj=final_proj, + max_target_seq_len=self.config.max_seq_len, ) diff --git a/sonar/models/sonar_text/model.py b/sonar/models/sonar_text/model.py index c875f24..dd3e7d4 100644 --- a/sonar/models/sonar_text/model.py +++ b/sonar/models/sonar_text/model.py @@ -8,13 +8,11 @@ from typing import Optional, final import torch -from fairseq2.models.sequence import SequenceBatch -from fairseq2.models.transformer import TransformerFrontend +from fairseq2.models.transformer import TransformerEncoder, TransformerFrontend from fairseq2.nn import LayerNorm -from fairseq2.nn.padding import PaddingMask, apply_padding_mask -from fairseq2.nn.transformer import TransformerEncoder -from fairseq2.typing import override +from fairseq2.nn.batch_layout import BatchLayout from torch import Tensor +from typing_extensions import override from sonar.models.encoder_model import SonarEncoderModel, SonarEncoderOutput from sonar.nn.encoder_pooler import EncoderOutputPooler @@ -36,6 +34,7 @@ def __init__( self, encoder_frontend: TransformerFrontend, encoder: TransformerEncoder, + max_source_seq_len: int, layer_norm: Optional[LayerNorm] = None, pooling: Pooling = Pooling.LAST, pooler: Optional[EncoderOutputPooler] = None, @@ -45,21 +44,23 @@ def __init__( The encoder frontend. :param encoder: The encoder. + :param max_source_seq_len: + The maximum sequence length the encoder can ingest. :param layer_norm: optional LayerNorm that is applied on encoder output """ - super().__init__(encoder.model_dim) - if encoder_frontend.model_dim != encoder.model_dim: - raise ValueError( - f"`model_dim` of `encoder_frontend` and `model_dim` of `encoder` must be equal, but are {encoder_frontend.model_dim} and {encoder.model_dim} instead." - ) - if ( - layer_norm is not None - and layer_norm.normalized_shape[0] != encoder.model_dim - ): - raise ValueError( - f"`model_dim` of `encoder` and `normalized_shape` of `layer_norm` must be equal, but are {encoder_frontend.model_dim} and {layer_norm.normalized_shape} instead." - ) + super().__init__() + # if encoder_frontend.model_dim != encoder.model_dim: + # raise ValueError( + # f"`model_dim` of `encoder_frontend` and `model_dim` of `encoder` must be equal, but are {encoder_frontend.model_dim} and {encoder.model_dim} instead." + # ) + # if ( + # layer_norm is not None + # and layer_norm.normalized_shape[0] != encoder.model_dim + # ): + # raise ValueError( + # f"`model_dim` of `encoder` and `normalized_shape` of `layer_norm` must be equal, but are {encoder_frontend.model_dim} and {layer_norm.normalized_shape} instead." + # ) self.encoder_frontend = encoder_frontend self.encoder = encoder self.layer_norm = layer_norm @@ -67,7 +68,7 @@ def __init__( self.pooler = pooler def pool( - self, seqs: Tensor, padding_mask: Optional[PaddingMask], pooling: Pooling + self, seqs: Tensor, seqs_layout: BatchLayout | None, pooling: Pooling ) -> Tensor: """Apply determininstic or trainable pooling""" if pooling == Pooling.ATTENTION: @@ -75,17 +76,17 @@ def pool( self.pooler is not None ), "Cannot use trainable pooling without a pooler in the model" sentence_embedding = self.pooler( - encoder_output=seqs, encoder_padding_mask=padding_mask + encoder_output=seqs, encoder_output_layout=seqs_layout ) else: sentence_embedding = self.static_pooling( - seqs=seqs, padding_mask=padding_mask, pooling=pooling + seqs=seqs, seqs_layout=seqs_layout, pooling=pooling ) return sentence_embedding @staticmethod def static_pooling( - seqs: Tensor, padding_mask: Optional[PaddingMask], pooling: Pooling + seqs: Tensor, seqs_layout: BatchLayout | None, pooling: Pooling ) -> Tensor: """Deterministic pooling along sequence dimension to get a sentence representation. In the future, some SONAR text encoders may have a trainable pooler instead. @@ -97,27 +98,32 @@ def static_pooling( Returns: Tensor: bs x model_dim """ + if pooling == Pooling.LAST: - if padding_mask is None: + if seqs_layout is None or (seqs_layout and not seqs_layout.padded): sentence_embedding = seqs[:, -1] else: - seq_lens = padding_mask.seq_lens + seq_lens = seqs_layout.seq_lens_pt sentence_embedding = seqs[ [torch.arange(seq_lens.shape[0]), (seq_lens - 1).clip_(0)] ] elif pooling == Pooling.MAX: - seqs = apply_padding_mask(seqs, padding_mask, pad_value=-torch.inf) + seqs = SonarTextTransformerEncoderModel.replace_padded_values( + seqs, seqs_layout, pad_value=-torch.inf + ) sentence_embedding = seqs.max(dim=1).values elif pooling == Pooling.MEAN: - seqs = apply_padding_mask(seqs, padding_mask, pad_value=0) + seqs = SonarTextTransformerEncoderModel.replace_padded_values( + seqs, seqs_layout, pad_value=0 + ) sentence_embedding = seqs.sum(dim=1) - if padding_mask is None: + if seqs_layout is None or not seqs_layout.padded: weights = 1.0 / (seqs.size(1) + 1e-7) sentence_embedding = sentence_embedding * weights else: weights = 1.0 / ( - padding_mask.seq_lens.to(sentence_embedding.dtype) + 1e-7 + seqs_layout.seq_lens_pt.to(sentence_embedding.dtype) + 1e-7 ) sentence_embedding = torch.einsum( "i...,i->i...", sentence_embedding, weights @@ -127,17 +133,50 @@ def static_pooling( return sentence_embedding + @staticmethod + def replace_padded_values( + seqs: Tensor, + seqs_layout: BatchLayout | None, + pad_value: int | float | Tensor = 0, + ) -> Tensor: + """Replace the padded values in ``seqs`` with `pad_value`. + + :param seqs: + The sequences to mask. *Shape:* :math:`(N,S,*)` or :math:`(B,*)` for packed, + where :math:`N` is the batch size, :math:`S` is the sequence length, and + :math:`*` is any number of sequence-specific dimensions including none. + :param seqs_layout: + The batch layout to apply. If None or not padded, returns seqs unchanged. + :param pad_value: + The value for padded positions. + + :returns: + The input sequences with mask applied. *Shape:* Same as ``seqs``. + """ + if seqs_layout is None or not seqs_layout.padded: + return seqs + + # True for valid positions, False for padding + mask = seqs_layout.position_indices >= 0 + + # Handle broadcasting for higher-dimensional tensors + for _ in range(seqs.ndim - mask.ndim): + mask = mask.unsqueeze(-1) + + return seqs.where(mask, pad_value) + @override - def forward(self, batch: SequenceBatch) -> SonarEncoderOutput: - embed_seqs, padding_mask = self.encoder_frontend(batch.seqs, batch.padding_mask) + def forward(self, seqs: Tensor, seqs_layout: BatchLayout) -> SonarEncoderOutput: + embed_seqs, embed_seqs_layout = self.encoder_frontend(seqs, seqs_layout) - encoded_seqs, _ = self.encoder(embed_seqs, padding_mask) + encoded_seqs = self.encoder(embed_seqs, embed_seqs_layout) + # encoded_seqs_layout = BatchLayout.of(encoded_seqs) if self.layer_norm is not None: encoded_seqs = self.layer_norm(encoded_seqs) - sentence_embeddings = self.pool(encoded_seqs, padding_mask, self.pooling) + sentence_embeddings = self.pool(encoded_seqs, embed_seqs_layout, self.pooling) return SonarEncoderOutput( encoded_seqs=encoded_seqs, sentence_embeddings=sentence_embeddings, - padding_mask=padding_mask, + encoded_seqs_layout=embed_seqs_layout, ) diff --git a/sonar/models/sonar_translation/__init__.py b/sonar/models/sonar_translation/__init__.py index b19bf20..61999c9 100644 --- a/sonar/models/sonar_translation/__init__.py +++ b/sonar/models/sonar_translation/__init__.py @@ -4,6 +4,7 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. + from sonar.models.sonar_translation.factory import ( create_sonar_speech_to_text_model as create_sonar_speech_to_text_model, ) diff --git a/sonar/models/sonar_translation/factory.py b/sonar/models/sonar_translation/factory.py index 697402d..f03b90e 100644 --- a/sonar/models/sonar_translation/factory.py +++ b/sonar/models/sonar_translation/factory.py @@ -6,7 +6,8 @@ from typing import Optional -from fairseq2.typing import DataType, Device +from fairseq2.data_type import DataType +from fairseq2.device import Device from sonar.models.sonar_speech import ( SonarSpeechEncoderConfig, diff --git a/sonar/models/sonar_translation/model.py b/sonar/models/sonar_translation/model.py index a9ebb92..4196549 100644 --- a/sonar/models/sonar_translation/model.py +++ b/sonar/models/sonar_translation/model.py @@ -4,11 +4,11 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. -from typing import Optional, Tuple, final +from typing import final -from fairseq2.models.encoder_decoder import EncoderDecoderModel -from fairseq2.models.sequence import SequenceBatch, SequenceModelOutput -from fairseq2.nn.padding import PaddingMask +from fairseq2.models.seq2seq import Seq2SeqModel +from fairseq2.models.transformer.model import _TransformerModelState +from fairseq2.nn import BatchLayout, IncrementalStateBag from torch import Tensor from sonar.models.encoder_model import SonarEncoderModel, SonarEncoderOutput @@ -16,11 +16,20 @@ @final -class SonarEncoderDecoderModel(EncoderDecoderModel): - """Sonar translation model. +class SonarEncoderDecoderModel(Seq2SeqModel): + """Sonar translation model supporting two distinct usage patterns: - This is a generic model that can be used for speech any combination of speech,text - translation by combining Speech/Text Encoder/Decoder components. + 1. Sequence(Speech/Text)-to-Text (S2T): Real encoder transforms token sequences to sentence embeddings + 2. Embedding-to-Text (E2T): DummyEncoder passes pre-computed embeddings through + + Both patterns must produce identical encoder outputs for consistent decoder behavior. + The encode() method ensures compatibility by reshaping 2D sentence embeddings + [batch, embed_dim] to 3D [batch, 1, embed_dim] to match decoder expectations. + + Note (cirquit): This class is subclass of Seq2Seq but does not completely fit its mold, but is the closest we have to the previously + deprecated EncoderDecoderModel implementation ( None: - super().__init__( - encoder.model_dim, decoder.max_target_seq_len, decoder.target_vocab_info - ) - if encoder.model_dim != decoder.model_dim: - raise ValueError( - f"`model_dim` of `encoder` and `model_dim` of `decoder` must be equal, but are {encoder.model_dim} and {decoder.model_dim} instead." - ) + super().__init__(0, decoder.max_target_seq_len) # see note self.encoder = encoder self.decoder = decoder @@ -45,51 +48,93 @@ def __init__( def dtype(self): return next(self.parameters()).dtype - def encode( - self, seqs: Tensor, padding_mask: Optional[PaddingMask] - ) -> Tuple[Tensor, Optional[PaddingMask]]: - batch = SequenceBatch(seqs, padding_mask) - sonar_output_encoder = self.encoder(batch) - return (sonar_output_encoder.sentence_embeddings.unsqueeze(1), None) + def encode(self, seqs: Tensor, seqs_layout: BatchLayout) -> Tensor: + """Convert input sequences to decoder-ready embeddings. + + Transforms variable inputs (tokens or embeddings) to standardized output format: + - Input: [batch, seq_len] tokens or [batch, embed_dim] embeddings + - Output: [batch, 1, embed_dim] embeddings with sequence dimension + + The unsqueeze(1) operation creates a sequence dimension that the decoder + interprets as a single timestep, ensuring consistent behavior across pipelines. + """ + encoder_output = self.encoder(seqs, seqs_layout) + return encoder_output.sentence_embeddings.unsqueeze(1) def decode( self, seqs: Tensor, - padding_mask: Optional[PaddingMask], + seqs_layout: BatchLayout, encoder_output: Tensor, - encoder_padding_mask: Optional[PaddingMask], + encoder_output_layout: BatchLayout, state_bag=None, - ) -> Tuple[Tensor, Optional[PaddingMask]]: - seqs, padding_mask = self.decoder.decoder_frontend( - seqs, padding_mask, state_bag=state_bag + ) -> Tensor: + return self.decoder.decode( # type: ignore[no-any-return] + seqs, + seqs_layout, + encoder_output, + encoder_output_layout, + state_bag=state_bag, ) - return self.decoder.decoder( # type: ignore[no-any-return] - seqs, - padding_mask, + def project(self, decoder_output: Tensor) -> Tensor: + return self.decoder.project(decoder_output) + + # TODO: figure out how typing should work with overload + def forward( # type: ignore + self, + source_seqs: Tensor, + source_seqs_layout: BatchLayout, + target_seqs: Tensor, + target_seqs_layout: BatchLayout, + *, + state_bag: IncrementalStateBag | None = None, + ) -> Tensor: + # Incremental decoding needs to be handled on a model-level since fs2:v0.5 + if not self.training and state_bag is not None: + state = state_bag.maybe_get_state(self, _TransformerModelState) + else: + state = None + + if state is None: + encoder_output = self.encode(source_seqs, source_seqs_layout) + encoder_output_layout = BatchLayout.of(encoder_output) + + if not self.training and state_bag is not None: + state = _TransformerModelState(encoder_output, encoder_output_layout) + + state_bag.set_state(self, state) + else: + encoder_output = state.encoder_output + + encoder_output_layout = state.encoder_output_layout + + del source_seqs + + decoder_output = self.decode( + target_seqs, + target_seqs_layout, encoder_output, - encoder_padding_mask, + encoder_output_layout, state_bag=state_bag, ) - def project( - self, decoder_output: Tensor, decoder_padding_mask: Optional[PaddingMask] - ) -> SequenceModelOutput: - return self.decoder.project(decoder_output, decoder_padding_mask) + del target_seqs + + return self.project(decoder_output) class DummyEncoderModel(SonarEncoderModel): - """Abstract class for both speech and text SONAR encoder models which does not modify its inputs.""" + """Passthrough encoder enabling architecture reuse for pre-computed embeddings. - def forward(self, batch: SequenceBatch) -> SonarEncoderOutput: - """ - :param batch: - The batch of sequences to process. - :returns: - SonarEncoderOutput - """ + Allows SonarEncoderDecoderModel to handle embedding-to-text generation + without architectural changes. Returns input embeddings unchanged, relying + on the parent encode() method for proper shape formatting for `sentence_embeddings`. + """ + + def forward(self, seqs: Tensor, seqs_layout: BatchLayout) -> SonarEncoderOutput: return SonarEncoderOutput( - encoded_seqs=batch.seqs, - sentence_embeddings=batch.seqs, # reduce in dim 1 - padding_mask=batch.padding_mask, + encoded_seqs=seqs, + sentence_embeddings=seqs, # see SonarEncoderDecoderModel note on the shape dimension expectation + encoded_seqs_layout=seqs_layout, ) diff --git a/sonar/nn/__init__.py b/sonar/nn/__init__.py index fff2a45..4c74665 100644 --- a/sonar/nn/__init__.py +++ b/sonar/nn/__init__.py @@ -3,3 +3,13 @@ # # This source code is licensed under the license found in the # LICENSE file in the root directory of this source tree. + +from sonar.nn.conditional_decoder_model import ( + ConditionalTransformerDecoderModel as ConditionalTransformerDecoderModel, +) +from sonar.nn.encoder_pooler import ( + AttentionEncoderOutputPooler as AttentionEncoderOutputPooler, +) +from sonar.nn.encoder_pooler import EncoderOutputPooler as EncoderOutputPooler +from sonar.nn.laser_lstm_encoder import LaserLstmEncoder as LaserLstmEncoder +from sonar.nn.sequence import SequenceModelOutput as SequenceModelOutput diff --git a/sonar/nn/conditional_decoder_model.py b/sonar/nn/conditional_decoder_model.py index d26fa6e..0c492ae 100644 --- a/sonar/nn/conditional_decoder_model.py +++ b/sonar/nn/conditional_decoder_model.py @@ -8,27 +8,30 @@ Fairseq2 does not have a suitable model, because: - fairseq2.models.transformer.model.TransformerModel imperatively includes a transformer encoder. - fairseq2.models.decoder.DecoderModel does not expect any additional inputs. -ConditionalTransformerDecoderModel inherits from EncoderDecoderModel, so it is a sibling class to TransformerModel. +ConditionalTransformerDecoderModel inherits from Seq2SeqModel, so it is a sibling class to TransformerModel. + +After fs2:v0.5 upgrade: +ConditionalTransformerDecoderModel inherited from EncoderDecoderModel (removed from fs2) and is replaced by Seq2Seq. +This is unconventional as a Seq2Seq model holds both encoder and decoder, while this is only the decoder implementation. +A custom solution might be required (similar to the encoder in sonar/models/encoder_model.py). """ -from typing import Optional, Tuple +from typing import Optional -from fairseq2.data import VocabularyInfo -from fairseq2.models.encoder_decoder import EncoderDecoderModel -from fairseq2.models.sequence import SequenceModelOutput -from fairseq2.models.transformer import TransformerFrontend -from fairseq2.nn import IncrementalStateBag, Projection -from fairseq2.nn.padding import PaddingMask -from fairseq2.nn.transformer import TransformerDecoder +import torch +from fairseq2.models.seq2seq import Seq2SeqModel +from fairseq2.models.transformer import TransformerDecoder, TransformerFrontend +from fairseq2.nn import BatchLayout, IncrementalStateBag, Projection from torch import Tensor -class ConditionalTransformerDecoderModel(EncoderDecoderModel): +class ConditionalTransformerDecoderModel(Seq2SeqModel): """Represents a Transformer-based decoder model conditional on the inputs from the encoder.""" decoder_frontend: TransformerFrontend decoder: TransformerDecoder final_proj: Projection + post_sentemb_proj: Projection | None def __init__( self, @@ -36,7 +39,8 @@ def __init__( decoder: TransformerDecoder, final_proj: Projection, max_target_seq_len: int, - target_vocab_info: VocabularyInfo, + normalize_emb: bool = False, + post_sentemb_proj: Projection | None = None, ) -> None: """ :param decoder_frontend: @@ -47,48 +51,81 @@ def __init__( The projection to apply to decoder outputs. :param max_target_seq_len: The maximum length of sequences produced by the model. - :param target_vocab_info: - The vocabulary information of sequences produced by the model. + :param normalize_emb: + Whether to normalize the embedding before passing it to the decoder. + :param post_sentemb_proj: + The projection to apply to the sentence embedding. """ - super().__init__(decoder.model_dim, max_target_seq_len, target_vocab_info) - + super().__init__(max_source_seq_len=0, max_target_seq_len=max_target_seq_len) + # NOTE: max_source_seq_len = 0 is a workaround due to Seq2Seq requiring *both* an encoder/decoder model and this is the wrong subclass self.decoder_frontend = decoder_frontend self.decoder = decoder - + self.post_sentemb_proj = post_sentemb_proj + self.normalize_emb = normalize_emb self.final_proj = final_proj - def encode( - self, seqs: Tensor, padding_mask: Optional[PaddingMask] - ) -> Tuple[Tensor, Optional[PaddingMask]]: + def encode(self, seqs: Tensor, seqs_layout: BatchLayout) -> Tensor: """The encoding just returns the inputs as is.""" - return seqs, padding_mask + if self.normalize_emb: + if seqs.dtype != torch.float32: + original_dtype = seqs.dtype + norm = torch.norm(seqs.float(), dim=-1, keepdim=True) + norm = torch.clamp(norm, min=1e-6) + seqs = seqs / norm.to(original_dtype) + else: + seqs = seqs / seqs.norm(dim=-1, keepdim=True) + return seqs def decode( self, seqs: Tensor, - padding_mask: Optional[PaddingMask], + seqs_layout: BatchLayout, encoder_output: Tensor, - encoder_padding_mask: Optional[PaddingMask], + encoder_output_layout: BatchLayout, *, state_bag: Optional[IncrementalStateBag] = None, - ) -> Tuple[Tensor, Optional[PaddingMask]]: + ) -> Tensor: """Decoding is exactly the same as with fairseq2 TransformerModel""" - seqs, padding_mask = self.decoder_frontend( - seqs, padding_mask, state_bag=state_bag + seqs, seqs_layout = self.decoder_frontend( + seqs, seqs_layout, state_bag=state_bag ) + if self.post_sentemb_proj is not None: + encoder_output = self.post_sentemb_proj(encoder_output) + return self.decoder( # type: ignore[no-any-return] seqs, - padding_mask, + seqs_layout, encoder_output, - encoder_padding_mask, + encoder_output_layout, state_bag=state_bag, ) - def project( - self, decoder_output: Tensor, decoder_padding_mask: Optional[PaddingMask] - ) -> SequenceModelOutput: + def project(self, decoder_output: Tensor) -> Tensor: """Projection is exactly the same as with fairseq2 TransformerModel""" - logits = self.final_proj(decoder_output) + return self.final_proj(decoder_output) + + def forward( # type: ignore + self, + source_seqs: Tensor, + source_seqs_layout: BatchLayout, + target_seqs: Tensor, + target_seqs_layout: BatchLayout, + *, + state_bag: IncrementalStateBag | None = None, + ) -> Tensor: + """Reference implementation from fs2:v0.4.3 EncoderDecoderModel using BatchLayout + The decoder frontend is not used here, c.f. https://github.com/facebookresearch/fairseq2/blob/v0.4.3/src/fairseq2/models/encoder_decoder.py#L42 + + Reasoning behind the API change from Seq2SeqBatch to more flat types to help torch.compile to trace + """ + encoder_output = self.encode(source_seqs, source_seqs_layout) + + decoder_output = self.decode( + target_seqs, + target_seqs_layout, + encoder_output, + source_seqs_layout, # encoder does not change padding if it existed and needs to be forwarded + ) - return SequenceModelOutput(logits, pad_idx=self.target_vocab_info.pad_idx) + return self.project(decoder_output) diff --git a/sonar/nn/encoder_pooler.py b/sonar/nn/encoder_pooler.py index e7c5e6e..b6c662d 100644 --- a/sonar/nn/encoder_pooler.py +++ b/sonar/nn/encoder_pooler.py @@ -5,16 +5,15 @@ # LICENSE file in the root directory of this source tree. from abc import abstractmethod -from typing import Optional import torch -from fairseq2.models.transformer import TransformerFrontend +from fairseq2.device import Device +from fairseq2.models.transformer import TransformerDecoder, TransformerFrontend from fairseq2.nn import Linear -from fairseq2.nn.padding import PaddingMask -from fairseq2.nn.transformer import TransformerDecoder -from fairseq2.typing import Device, override +from fairseq2.nn.batch_layout import BatchLayout from torch import Tensor from torch.nn import Module +from typing_extensions import override class EncoderOutputPooler(Module): @@ -22,9 +21,7 @@ class EncoderOutputPooler(Module): @abstractmethod def __call__( - self, - encoder_output: Tensor, - encoder_padding_mask: Optional[PaddingMask], + self, encoder_output: Tensor, encoder_output_layout: BatchLayout | None ) -> Tensor: """Apply pooling on encoder_output @@ -33,10 +30,6 @@ def __call__( :math:`(N,S_{enc},M)`, where :math:`N` is the batch size, :math:`S_{enc}` is the encoder output sequence length, and :math:`M` is the dimensionality of the model. - :param encoder_padding_mask: - The float padding mask of ``encoder_output``. *Shape:* - :math:`(N,S_{enc})`, where :math:`N` is the batch size and - :math:`S_{enc}` is the encoder output sequence length. :returns: The pooler output. *Shape:* :math:`(N,M)`, where :math:`N` is the @@ -68,16 +61,17 @@ def __init__( @override def __call__( - self, - encoder_output: Tensor, - encoder_padding_mask: Optional[PaddingMask], + self, encoder_output: Tensor, encoder_output_layout: BatchLayout | None ) -> Tensor: seqs = self._get_pooling_tokens(encoder_output.shape[0], encoder_output.device) + seqs_layout = BatchLayout.of(seqs) + if encoder_output_layout is None: + encoder_output_layout = BatchLayout.of(encoder_output) - seqs, padding_mask = self.decoder_frontend(seqs, None) + seqs, seqs_layout = self.decoder_frontend(seqs, seqs_layout) - decoder_out, _ = self.decoder( - seqs, padding_mask, encoder_output, encoder_padding_mask + decoder_out = self.decoder( + seqs, seqs_layout, encoder_output, encoder_output_layout ) return self.projection_out(decoder_out).squeeze(1) diff --git a/sonar/nn/sequence.py b/sonar/nn/sequence.py new file mode 100644 index 0000000..7930ebb --- /dev/null +++ b/sonar/nn/sequence.py @@ -0,0 +1,87 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. + +""" +This class is added to keep functionality identical from fairseq2:v0.4.3. Upgrade at the time fairseq2:v0.5. +The loss calculation has been moved to the forward pass for more fusion potential adding a bit of performance. +""" + +from __future__ import annotations + +from dataclasses import dataclass + +import torch +from torch import Tensor +from torch.nn.functional import log_softmax, nll_loss + + +@dataclass +class SequenceModelOutput: + """Holds the output of a sequence model.""" + + logits: Tensor + """The logits for next-step prediction. *Shape:* :math:`(N,S,T)`, where + :math:`N` is the batch size, :math:`S` is the sequence length, and :math:`T` + is the size of the vocabulary.""" + + pad_idx: int | None + """The index of the PAD symbols in the vocabulary.""" + + def compute_loss( + self, + targets: Tensor, + *, + loss_mask: Tensor | None = None, + ignore_prefix_size: int = 0, + label_smoothing: float = 0.0, + ) -> Tensor: + """Compute the NLL (negative log-likelihood) loss. + + :param targets: + The target indices. *Shape:* :math:`(N,S)`, where :math:`N` is the + batch size and :math:`S` is the sequence length. + :param loss_mask: + The loss mask that specifies the elements in ``targets`` that should + be used in the loss computation. All non-masked elements will be + ignored. *Shape:* Same as ``targets``. + :param ignore_prefix_size: + The number of steps from the beginning of the sequence that should + be ignored in the loss computation. + :param label_smoothing: + The amount of label smoothing to apply while computing the loss. + + :returns: + A scalar tensor representing the summed NLL loss. + """ + if ignore_prefix_size > 0: + logits = self.logits[:, ignore_prefix_size:, :] + else: + logits = self.logits + + if ignore_prefix_size > 0: + targets = targets[:, ignore_prefix_size:] + + # For numerical stability run in single precision. + # (N, S, T) + lprobs = log_softmax(logits, dim=-1, dtype=torch.float32) + + # sum: (), none: (N, S) + loss = nll_loss( + input=lprobs, + target=targets, + ignore_index=-100 if self.pad_idx is None else self.pad_idx, + reduction="sum" if loss_mask is None else "none", + ) + # TODO: support label_smoothing (nll_loss no longer supports it) + + if loss_mask is None: + return loss + + if ignore_prefix_size > 0: + loss_mask = loss_mask[:, ignore_prefix_size:] + + # () + return (loss * loss_mask).sum() diff --git a/tests/conftest.py b/tests/conftest.py index d33389e..3b9ad73 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -4,9 +4,9 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. -from fairseq2 import setup_fairseq2 +from fairseq2 import init_fairseq2 from pytest import Session def pytest_sessionstart(session: Session) -> None: - setup_fairseq2() + init_fairseq2() diff --git a/tests/integration_tests/data/audio_files/README.md b/tests/integration_tests/data/audio_files/README.md index a6f3f95..ed36241 100644 --- a/tests/integration_tests/data/audio_files/README.md +++ b/tests/integration_tests/data/audio_files/README.md @@ -11,4 +11,4 @@ You can access the FLEURS paper at https://arxiv.org/abs/2205.12446. Please cite url = {https://arxiv.org/abs/2205.12446}, year = {2022}, } -``` \ No newline at end of file +``` diff --git a/tests/integration_tests/test_blaser.py b/tests/integration_tests/test_blaser.py index 9694ee3..a40a124 100644 --- a/tests/integration_tests/test_blaser.py +++ b/tests/integration_tests/test_blaser.py @@ -13,7 +13,7 @@ def test_blaser2_ref(): """Compare predictions of a specific reference-based model with hardcoded expected values""" model_hub = get_blaser_model_hub() - blaser = model_hub.load("blaser_2_0_ref") + blaser = model_hub.load_model("blaser_2_0_ref") blaser.eval() emb = torch.zeros([1, 1024]) + 1 / 32 pred = blaser(src=emb, mt=emb, ref=emb).item() @@ -29,7 +29,7 @@ def test_blaser2_ref(): def test_blaser2_qe(): """Compare predictions of a specific referenceless model with hardcoded expected values""" model_hub = get_blaser_model_hub() - blaser = model_hub.load("blaser_2_0_qe") + blaser = model_hub.load_model("blaser_2_0_qe") blaser.eval() emb = torch.zeros([1, 1024]) + 1 / 32 pred = blaser(src=emb, mt=emb).item() diff --git a/tests/integration_tests/test_laser2_text.py b/tests/integration_tests/test_laser2_text.py index 6abc630..e83d8db 100644 --- a/tests/integration_tests/test_laser2_text.py +++ b/tests/integration_tests/test_laser2_text.py @@ -8,13 +8,12 @@ from pathlib import Path import torch -from fairseq2.data import Collater +from fairseq2.data.data_pipeline import Collater from fairseq2.data.text import read_text -from fairseq2.data.text.tokenizers import get_text_tokenizer_hub +from fairseq2.data.tokenizers import load_tokenizer +from fairseq2.models import load_model from torch.testing import assert_close -from sonar.models.laser2_text import get_laser2_model_hub - device = torch.device("cpu") sentences = [ @@ -26,13 +25,11 @@ def test_load_laser2_text() -> None: - model_hub = get_laser2_model_hub() - model = model_hub.load("laser2_text_encoder", device=device) + model = load_model("laser2_text_encoder", device=device) model.eval() - tokenizer_hub = get_text_tokenizer_hub() - tokenizer = tokenizer_hub.load("laser2_text_encoder") + tokenizer = load_tokenizer("laser2_text_encoder") encoder = tokenizer.create_encoder() @@ -49,7 +46,7 @@ def test_load_laser2_text() -> None: tokenized_sentences = next(iter(pipeline)) embed_sentences = model( - tokenized_sentences["seqs"], tokenized_sentences["seq_lens"] + tokenized_sentences["seqs"], torch.Tensor(tokenized_sentences["seq_lens"]) ) embed_sentences_norm = torch.nn.functional.normalize(embed_sentences) actual_sim = torch.matmul(embed_sentences_norm, embed_sentences_norm.T) diff --git a/tests/integration_tests/test_mutox.py b/tests/integration_tests/test_mutox.py index 9b98d16..9b85f79 100644 --- a/tests/integration_tests/test_mutox.py +++ b/tests/integration_tests/test_mutox.py @@ -49,7 +49,7 @@ def test_sonar_mutox_classifier_integration(input_texts, source_lang, expected_o ) hub = get_mutox_model_hub() - classifier = hub.load("sonar_mutox", device=device, dtype=dtype).eval() + classifier = hub.load_model("sonar_mutox", device=device, dtype=dtype).eval() with torch.inference_mode(): embeddings = t2vec_model.predict(input_texts, source_lang=source_lang) @@ -111,7 +111,7 @@ def test_sonar_mutox_classifier_probability_integration( ) hub = get_mutox_model_hub() - classifier = hub.load("sonar_mutox", device=device, dtype=dtype).eval() + classifier = hub.load_model("sonar_mutox", device=device, dtype=dtype).eval() for text, lang, expected_prob in zip( input_texts, [source_lang] * len(input_texts), expected_probabilities diff --git a/tests/integration_tests/test_sonar_speech_encoder.py b/tests/integration_tests/test_sonar_speech_encoder.py index 21324b0..23eae9b 100644 --- a/tests/integration_tests/test_sonar_speech_encoder.py +++ b/tests/integration_tests/test_sonar_speech_encoder.py @@ -7,7 +7,7 @@ from pathlib import Path import torch -from fairseq2.data.text.tokenizers import get_text_tokenizer_hub +from fairseq2.models.nllb.hub import get_nllb_tokenizer_hub from torch.testing import assert_close from sonar.inference_pipelines import ( @@ -25,14 +25,15 @@ class TestSonarTextClass: encoder_hub = get_sonar_speech_encoder_hub() - encoder = encoder_hub.load("sonar_speech_encoder_eng", device=DEVICE) + encoder = encoder_hub.load_model("sonar_speech_encoder_eng", device=DEVICE) encoder.eval() - - tokenizer_hub = get_text_tokenizer_hub() - tokenizer = tokenizer_hub.load("text_sonar_basic_encoder") + # from sonar import setup_logging_here + # setup_logging_here() + tokenizer_hub = get_nllb_tokenizer_hub() + tokenizer = tokenizer_hub.load_tokenizer("text_sonar_basic_encoder") decoder_hub = get_sonar_text_decoder_hub() - decoder = decoder_hub.load("text_sonar_basic_decoder", device=DEVICE) + decoder = decoder_hub.load_model("text_sonar_basic_decoder", device=DEVICE) decoder.eval() params = SpeechInferenceParams( diff --git a/tests/integration_tests/test_text_sonar.py b/tests/integration_tests/test_text_sonar.py index 016440b..6fe3e2e 100644 --- a/tests/integration_tests/test_text_sonar.py +++ b/tests/integration_tests/test_text_sonar.py @@ -8,7 +8,7 @@ import pytest import torch -from fairseq2.models.sequence import SequenceBatch +from fairseq2.nn import BatchLayout from torch.testing import assert_close # type: ignore from sonar.inference_pipelines.text import ( @@ -28,7 +28,7 @@ class TestSonarTextClass: text2text = TextToTextModelPipeline( "text_sonar_basic_encoder", "text_sonar_basic_decoder", - "text_sonar_basic_encoder", + "text_sonar_basic_encoder", # name of the tokenizer ) vec2text = EmbeddingToTextModelPipeline( "text_sonar_basic_decoder", # name of the decoder @@ -60,45 +60,51 @@ def test_encode_long_text(self) -> None: @torch.inference_mode() def test_text_decoder_sonar(self) -> None: - eng_tokenizer_encoder = self.text2text.tokenizer.create_encoder(lang="eng_Latn") + eng_tokenizer_encoder = self.text2text.decoder_tokenizer.create_encoder( + lang="eng_Latn" + ) tokenized_seq = eng_tokenizer_encoder(self.eng_sentences[0]).unsqueeze(0) - batch = SequenceBatch(tokenized_seq, None) - encoded_vec = self.text2text.model.encoder(batch) + tokenized_seq_layout = BatchLayout.of(tokenized_seq) + encoded_vec = self.text2text.model.encoder(tokenized_seq, tokenized_seq_layout) decoder = self.text2text.model.decoder dummy_prev_output_tokens = torch.Tensor([[3, 333]]).int() - seqs, padding_mask = decoder.decoder_frontend( - dummy_prev_output_tokens, padding_mask=None + dummy_prev_output_layout = BatchLayout.of(dummy_prev_output_tokens) + seqs, seqs_layout = decoder.decoder_frontend( + dummy_prev_output_tokens, dummy_prev_output_layout ) - - decoder_output, decoder_padding_mask = decoder.decoder( + encoder_output = encoded_vec.sentence_embeddings.unsqueeze(1) + encoder_output_layout = BatchLayout.of(encoder_output) + decoder_output = decoder.decoder( seqs, - padding_mask, - encoder_output=encoded_vec.sentence_embeddings.unsqueeze(1), + seqs_layout, + encoder_output=encoder_output, + encoder_output_layout=encoder_output_layout, ) - decoder_output = decoder.project(decoder_output, decoder_padding_mask) - out = decoder_output.logits + + decoder_output = decoder.project(decoder_output) + assert_close( - out[0, 0, :4], + decoder_output[0, 0, :4], torch.Tensor([-1.4572, -2.7325, -1.0546, 0.7818]), rtol=1e-4, atol=1e-4, ) assert_close( - out[0, 0, -3:], + decoder_output[0, 0, -3:], torch.Tensor([0.8982, 0.4996, -0.1487]), rtol=1e-4, atol=1e-4, ) assert_close( - out[0, 1, :4], + decoder_output[0, 1, :4], torch.Tensor([2.4092, 6.9624, 3.6308, 9.4825]), rtol=1e-4, atol=1e-4, ) assert_close( - out[0, 1, -4:], + decoder_output[0, 1, -4:], torch.Tensor([3.8826, 3.8777, 3.2820, 3.3275]), rtol=1e-4, atol=1e-4, diff --git a/tests/unit_tests/test_blaser_inference.py b/tests/unit_tests/test_blaser_inference.py index e1e52e0..5c8ca9d 100644 --- a/tests/unit_tests/test_blaser_inference.py +++ b/tests/unit_tests/test_blaser_inference.py @@ -8,7 +8,7 @@ import torch from torch.testing import assert_close -from sonar.models.blaser import BlaserConfig, create_blaser_model +from sonar.models.blaser import BlaserConfig, _create_blaser_model @pytest.mark.parametrize("embedding_dim", [32, 1024]) @@ -16,7 +16,7 @@ def test_blaser_qe(embedding_dim, batch_size): """Testing that a BLASER-QE model can be created and runs""" config = BlaserConfig(input_form="QE", embedding_dim=embedding_dim) - blaser = create_blaser_model(config).eval() + blaser = _create_blaser_model(config).eval() embedding = torch.zeros([batch_size, embedding_dim]) # test that the forward method produces an expected shape @@ -33,7 +33,7 @@ def test_blaser_qe(embedding_dim, batch_size): def test_blaser_ref(embedding_dim, batch_size): """Testing that a model can be created and that forward returns a right shape""" config = BlaserConfig(input_form="COMET", embedding_dim=embedding_dim) - blaser = create_blaser_model(config) + blaser = _create_blaser_model(config).eval() embedding = torch.zeros([batch_size, embedding_dim]) # test that the forward method produces an expected shape @@ -50,7 +50,7 @@ def test_blaser_ref(embedding_dim, batch_size): def test_input_form(input_form, embedding_dim): """Testing that BLASER inputs are processed correctlyb""" config = BlaserConfig(input_form=input_form, embedding_dim=embedding_dim) - blaser = create_blaser_model(config) + blaser = _create_blaser_model(config).eval() # the input vectors are arbitrary; we are checking only how they are concatenated src = torch.arange(0, embedding_dim).unsqueeze(0) / embedding_dim mt = torch.cos(src) diff --git a/tests/unit_tests/test_low_dimension_text_models.py b/tests/unit_tests/test_low_dimension_text_models.py index e2d0e23..356b764 100644 --- a/tests/unit_tests/test_low_dimension_text_models.py +++ b/tests/unit_tests/test_low_dimension_text_models.py @@ -5,9 +5,9 @@ # LICENSE file in the root directory of this source tree. import torch -from fairseq2.context import get_runtime_context -from fairseq2.models.seq2seq import Seq2SeqBatch -from fairseq2.models.sequence import SequenceBatch +from fairseq2.nn import BatchLayout +from fairseq2.runtime.config_registry import get_config +from fairseq2.runtime.dependency import get_dependency_resolver from sonar.models.sonar_text import ( SonarTextDecoderConfig, @@ -19,14 +19,12 @@ def test_low_dim_encoder(): """Test that an encoder with a hidden dimension lower than the embedding dimension can be created and called.""" - context = get_runtime_context() - - config_registry = context.get_config_registry(SonarTextEncoderConfig) + resolver = get_dependency_resolver() + cfg = get_config(resolver, SonarTextEncoderConfig, "basic") embed_dim = 256 batch_size = 3 - cfg = config_registry.get("basic") cfg.model_dim = 32 cfg.embedding_dim = embed_dim cfg.num_encoder_layers = 5 @@ -35,39 +33,34 @@ def test_low_dim_encoder(): model = SonarTextEncoderFactory(cfg).create_model() tokens = torch.tensor([[0, 1, 2, 3, 4]] * batch_size) - batch = SequenceBatch( - seqs=tokens, - padding_mask=None, - ) + tokens_layout = BatchLayout.of(tokens) with torch.inference_mode(): - output = model(batch) + output = model(tokens, tokens_layout) print(output.sentence_embeddings.shape) assert output.sentence_embeddings.shape == (batch_size, embed_dim) def test_low_dim_decoder(): """Test that a decoder with a hidden dimension lower than the embedding dimension can be created and called.""" - context = get_runtime_context() + resolver = get_dependency_resolver() - config_registry = context.get_config_registry(SonarTextDecoderConfig) + cfg = get_config(resolver, SonarTextDecoderConfig, "toy") embed_dim = 256 batch_size = 3 - cfg = config_registry.get("toy") cfg.model_dim = 32 cfg.input_dim = embed_dim model = SonarTextDecoderFactory(cfg).create_model() embeds = torch.rand([batch_size, 1, embed_dim]) prefix = torch.tensor([[0, 1, 2, 3, 4]] * batch_size) - batch = Seq2SeqBatch( - source_seqs=embeds, - source_padding_mask=None, - target_seqs=prefix, - target_padding_mask=None, - ) with torch.inference_mode(): - output = model(batch) + output = model( + source_seqs=embeds, + source_seqs_layout=BatchLayout.of(embeds), + target_seqs=prefix, + target_seqs_layout=BatchLayout.of(prefix), + ) - assert output.logits.shape == (batch_size, 5, cfg.vocab_info.size) + assert output.shape == (batch_size, 5, cfg.vocab_info.size) diff --git a/tests/unit_tests/test_mutox.py b/tests/unit_tests/test_mutox.py index b135376..1cb3949 100644 --- a/tests/unit_tests/test_mutox.py +++ b/tests/unit_tests/test_mutox.py @@ -13,8 +13,8 @@ from sonar.models.mutox import ( MutoxClassifier, MutoxConfig, - MutoxModelHandler, - create_mutox_model, + _convert_mutox_checkpoint, + _create_mutox_model, ) # Builder tests @@ -26,7 +26,7 @@ def test_mutox_classifier_builder(input_size, device, dtype): """Test MutoxClassifierBuilder initializes a model with correct configuration and dtype.""" config = MutoxConfig(input_size=input_size) - model = create_mutox_model(config).to(device=device, dtype=dtype) + model = _create_mutox_model(config).to(device=device, dtype=dtype) # Check if model layers are correctly initialized with shapes assert isinstance(model, nn.Module), "Model should be an instance of nn.Module" @@ -43,7 +43,7 @@ def test_mutox_classifier_builder(input_size, device, dtype): def test_create_mutox_model(input_size): """Test create_mutox_model function to confirm it creates a model with the specified config.""" config = MutoxConfig(input_size=input_size) - model = create_mutox_model(config).to(device=torch.device("cpu")) + model = _create_mutox_model(config).to(device=torch.device("cpu")) # Check if the created model has the expected structure and behavior test_input = torch.zeros((3, input_size)) @@ -114,14 +114,9 @@ def test_convert_mutox_checkpoint(): "non_model_key": torch.tensor([3.0]), } config = MutoxConfig(input_size=1024) - converted: Dict[str, torch.Tensor] = MutoxModelHandler._convert_checkpoint(None, checkpoint, config) # type: ignore + converted: Dict[str, torch.Tensor] = _convert_mutox_checkpoint(checkpoint, config) # type: ignore # Verify only 'model_all.' keys are retained in the converted dictionary - assert "model" in converted, "Converted checkpoint should contain a 'model' key" - assert ( - "model_all.layer1.weight" in converted["model"] - ), "Expected 'model_all.layer1.weight'" - assert ( - "model_all.layer1.bias" in converted["model"] - ), "Expected 'model_all.layer1.bias'" - assert "non_model_key" not in converted["model"], "Unexpected 'non_model_key'" + assert "model_all.layer1.weight" in converted, "Expected 'model_all.layer1.weight'" + assert "model_all.layer1.bias" in converted, "Expected 'model_all.layer1.bias'" + assert "non_model_key" not in converted, "Unexpected 'non_model_key'" diff --git a/tests/unit_tests/test_sonar_pooling.py b/tests/unit_tests/test_sonar_pooling.py index 873318e..6fbef39 100644 --- a/tests/unit_tests/test_sonar_pooling.py +++ b/tests/unit_tests/test_sonar_pooling.py @@ -5,7 +5,7 @@ # LICENSE file in the root directory of this source tree. import torch -from fairseq2.nn.padding import PaddingMask +from fairseq2.nn.batch_layout import BatchLayout from torch.testing import assert_close # type: ignore from sonar.models.sonar_text.model import Pooling, SonarTextTransformerEncoderModel @@ -14,41 +14,44 @@ def test_pooling_max() -> None: - padding_mask = PaddingMask(torch.tensor([2, 1]), batch_seq_len=3) + # padding_mask = PaddingMask(torch.tensor([2, 1]), batch_seq_len=3) seqs = torch.Tensor( [[[7, 2], [3, 4], [10, 20]], [[-1, -2], [100, 1000], [-10, -20]]] ) + seqs_layout = BatchLayout.of(seqs, seq_lens=[2, 1]) expected = torch.Tensor([[7.0, 4.0], [-1.0, -2.0]]) - actual = pooling_method(seqs, padding_mask, Pooling.MAX) + actual = pooling_method(seqs, seqs_layout, Pooling.MAX) assert_close(expected, actual) - actual_extra = pooling_method(seqs.unsqueeze(3), padding_mask, Pooling.MAX) + actual_extra = pooling_method(seqs.unsqueeze(3), seqs_layout, Pooling.MAX) assert_close(expected.unsqueeze(2), actual_extra) def test_pooling_mean() -> None: - padding_mask = PaddingMask(torch.tensor([2, 1]), batch_seq_len=3) + # padding_mask = PaddingMask(torch.tensor([2, 1]), batch_seq_len=3) seqs = torch.Tensor( [[[7, 2], [3, 4], [10, 20]], [[-1, -2], [100, 1000], [-10, -20]]] ) + seqs_layout = BatchLayout.of(seqs, seq_lens=[2, 1]) expected = torch.Tensor([[5.0, 3.0], [-1.0, -2.0]]) - actual = pooling_method(seqs, padding_mask, Pooling.MEAN) + actual = pooling_method(seqs, seqs_layout, Pooling.MEAN) assert_close(expected, actual) - actual_extra = pooling_method(seqs.unsqueeze(3), padding_mask, Pooling.MEAN) + actual_extra = pooling_method(seqs.unsqueeze(3), seqs_layout, Pooling.MEAN) assert_close(expected.unsqueeze(2), actual_extra) def test_pooling_last() -> None: - padding_mask = PaddingMask(torch.tensor([2, 1]), batch_seq_len=3) + # padding_mask = PaddingMask(torch.tensor([2, 1]), batch_seq_len=3) seqs = torch.Tensor( [[[7, 2], [3, 4], [10, 20]], [[-1, -2], [100, 1000], [-10, -20]]] ) + seqs_layout = BatchLayout.of(seqs, seq_lens=[2, 1]) expected = torch.Tensor([[3.0, 4.0], [-1.0, -2.0]]) - actual = pooling_method(seqs, padding_mask, Pooling.LAST) + actual = pooling_method(seqs, seqs_layout, Pooling.LAST) assert_close(expected, actual) - actual_extra = pooling_method(seqs.unsqueeze(3), padding_mask, Pooling.LAST) + actual_extra = pooling_method(seqs.unsqueeze(3), seqs_layout, Pooling.LAST) assert_close(expected.unsqueeze(2), actual_extra) diff --git a/tests/unit_tests/test_tied_weights.py b/tests/unit_tests/test_tied_weights.py index c768b87..d01c6e4 100644 --- a/tests/unit_tests/test_tied_weights.py +++ b/tests/unit_tests/test_tied_weights.py @@ -8,10 +8,17 @@ from pathlib import Path import torch -from fairseq2.assets import AssetCard, InProcAssetMetadataLoader, StandardAssetStore -from fairseq2.context import get_runtime_context +from fairseq2.assets import ( + AssetCard, + StandardAssetStore, + get_asset_store, + load_in_memory_asset_metadata, +) +from fairseq2.runtime.config_registry import get_config +from fairseq2.runtime.dependency import get_dependency_resolver from sonar.models.sonar_text import ( + SONAR_TEXT_DECODER_FAMILY, SonarTextDecoderConfig, SonarTextDecoderFactory, get_sonar_text_decoder_hub, @@ -32,21 +39,19 @@ def create_model_card( "model_arch": model_arch, "checkpoint": "file://" + checkpoint_path.as_posix(), } - metadata_loader = InProcAssetMetadataLoader([model_card_info]) - asset_store.metadata_providers.append(metadata_loader.load()) + metadata_provider = load_in_memory_asset_metadata("memory", [model_card_info]) + asset_store._metadata_providers.append(metadata_provider) return asset_store.retrieve_card(model_name) def test_tied_weight(): """Testing that the decoder input and ouput embeddings are tied after creating the model and after loading""" - context = get_runtime_context() - - config_registry = context.get_config_registry(SonarTextDecoderConfig) - config = config_registry.get("toy") + resolver = get_dependency_resolver() + config = get_config(resolver, SonarTextDecoderConfig, "toy") model = SonarTextDecoderFactory(config).create_model() - assert model.decoder_frontend.embed.weight is model.final_proj.weight + assert model.decoder_frontend.embed.weight is model.final_proj.weight # type: ignore # counting the parameters total_params = sum(p.numel() for p in model.parameters()) @@ -64,15 +69,16 @@ def test_tied_weight(): # now load the model using a standard loader, based on a card card = create_model_card( - context.asset_store, + get_asset_store(), # type: ignore checkpoint_path=filename, - model_type="transformer_decoder", + model_type=SONAR_TEXT_DECODER_FAMILY, model_arch="toy", ) + print(card) decoder_hub = get_sonar_text_decoder_hub() - model_new = decoder_hub.load(card) + model_new = decoder_hub.load_model(card) # test that the newly loaded model has the same weight tying as the original one total_params_new = sum(p.numel() for p in model_new.parameters()) assert total_params_new == total_params - assert model_new.decoder_frontend.embed.weight is model_new.final_proj.weight + assert model_new.decoder_frontend.embed.weight is model_new.final_proj.weight # type: ignore From 81f033dd8a854157af7f75fef6cf5ab500d14a55 Mon Sep 17 00:00:00 2001 From: David Dale Date: Fri, 10 Oct 2025 09:33:20 +0000 Subject: [PATCH 2/6] mypy; extend readme --- README.md | 12 ++++++++++++ sonar/inference_pipelines/text.py | 12 ++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 62fbbf7..aa999e4 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,14 @@ pip install --upgrade pip pip install -e . ``` +### Versions +Unfortunately, SONAR code is very much tied to fairseq2 code, and thus only specific version are compatible with each other: +- `sonar-space~=0.5.0` (the current version) requires `fairseq2>=0.5.0` +- `sonar-space~=0.4.0` required `fairseq2~=0.4.0` +- `sonar-space~=0.2.0` required `fairseq2~=0.2.0` + +In the future, when the `fairseq2` interface stabilizes, we hope to keep the version dependencies less loosely coupled. + ## Usage fairseq2 will automatically download models into your `$TORCH_HOME/hub` directory upon using the commands below. @@ -237,6 +245,10 @@ See more complete demo notebooks : * [sonar speech2text and other data pipeline examples](examples/inference_pipelines.ipynb) * [sonar bilingual document alignment with sonar text similarity](examples/bilingual_document.ipynb) +### Troubleshooting + +- In case of errors like `fairseq2.assets.card.AssetCardError: Model checkpoint of the blaser_2_0_qe asset card cannot be loaded`, try removing the fairseq2 assets cache (located in `~/.cache/fairseq2`); it might be that some of the downloaded model checkpoints are invalid. + ## Supported languages and download links The SONAR text encoder & decoder supports 200 languages. SONAR speech encoders support 37 languages. diff --git a/sonar/inference_pipelines/text.py b/sonar/inference_pipelines/text.py index 3fba2e5..0bb5124 100644 --- a/sonar/inference_pipelines/text.py +++ b/sonar/inference_pipelines/text.py @@ -127,13 +127,13 @@ def predict( model_max_seq_len = cast( int | None, ( - self.model.decoder.decoder_frontend.pos_encoder.max_seq_len + self.model.decoder.decoder_frontend.pos_encoder.max_seq_len # type: ignore if self.model.decoder.decoder_frontend.pos_encoder is not None else self.model.decoder.decoder.layers[ 0 ].self_attn.pos_encoder.max_seq_len ), - ) # type: ignore[union-attr] + ) if model_max_seq_len is None: model_max_seq_len = generator_kwargs.get("max_seq_len", model_max_seq_len) @@ -239,11 +239,11 @@ def predict( model_max_len = cast( int | None, ( - self.model.encoder_frontend.pos_encoder.max_seq_len - if self.model.encoder_frontend.pos_encoder is not None - else self.model.encoder.layers[0].self_attn.pos_encoder.max_seq_len + self.model.encoder_frontend.pos_encoder.max_seq_len # type: ignore + if self.model.encoder_frontend.pos_encoder is not None # type: ignore + else self.model.encoder.layers[0].self_attn.pos_encoder.max_seq_len # type: ignore ), - ) # type: ignore + ) if max_seq_len is None: max_seq_len = model_max_len if max_seq_len is not None and model_max_len is not None: From fad0f352640c00070f8eb53a3ea2d3d52aeef253 Mon Sep 17 00:00:00 2001 From: David Dale Date: Fri, 10 Oct 2025 10:15:56 +0000 Subject: [PATCH 3/6] remove sonar_langs.jpg again --- materials/sonar_langs.jpg | Bin 282643 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 materials/sonar_langs.jpg diff --git a/materials/sonar_langs.jpg b/materials/sonar_langs.jpg deleted file mode 100644 index bbf9cadcebb25c361d8e1f04b7aa19d6172a6e2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282643 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%0ADL;Wi=skYeEKE3kUMeK*a)sLiH* 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