Finalize Sentence Transformers integration

#3
by tomaarsen HF staff - opened

Hello!

Thanks @Samoed for setting up this work.

Pull Request overview

  • Add modules.json to inform Sentence Transformers what modules to use
    • It points to the new MultiModalTransformer module, but also normal Pooling and Normalize modules
  • Configure the Pooling layer to use last token pooling
  • Add the Sentence Transformers usage to the README

Details

I've updated the usage compared to @Samoed 's suggestion: instead of always specifying both a type and a content, users can now specify a dictionary with text, image, or both. Still, as @intfloat mentioned, you cannot embed both image-text and pure text at the same time, but I think that's not a big problem. As before, just using "A cat and a dog" instead of {"text": "A cat and a dog"} also works, but in the README I want to inform users of {"text": "A cat and a dog"} so they (hopefully) understand how it can be expanded to also include an image in that embedding.

I want to share that I was unable to get 100% correspondance between Transformers and Sentence Transformers, annoyingly enough. The problem is somewhere in the processing or model forward, not the pooling or normalization, and the difference is quite small. For example, the mean and std of the model last hidden states are identical to at least 4 significant digits. The cosine similarity of the Image + Text -> Text README examples is [0.3965, 0.3105] for transformers and [0.3967, 0.3090] for Sentence Transformers. The Text -> Image examples has [0.4219, 0.3887] for transformers and [0.4250, 0.3896] for Sentence Transformers.

  • Tom Aarsen
tomaarsen changed pull request title from Finalize Sentence Transforemrs integration to Finalize Sentence Transformers integration
tomaarsen changed pull request status to open

Great! Can you also update custom_st file, because it seems that it would require to pass <|begin_of_text|> after an image. https://github.com/haon-chen/mmE5/issues/1#issuecomment-2678420039

I add it automatically if there is both an image and text: https://huggingface.co/intfloat/mmE5-mllama-11b-instruct/blob/refs%2Fpr%2F3/custom_st.py#L71-L72

Should <|begin_of_text|> always be included, even if there is only an image and no text?
And should it be included if there is no image, but only text?

Also, I remove spaces from the left of the text if there is no image, and I make sure there is 1 space of text between <|begin_of_text|> and the text if there is an image. Is that correct?

  • Tom Aarsen
Ready to merge
This branch is ready to get merged automatically.

Sign up or log in to comment