視覺多語言:mcdse-2b 模型介紹
今天,我將介紹一種新的實驗性多語言嵌入模型,用於靈活的視覺文件檢索。mcdse-2b-v1 (🤗) 基於 MrLight/dse-qwen2-2b-mrl-v1 訓練,並使用 DSE 方法。
這個模型允許您嵌入頁面/幻燈片截圖,並使用自然語言進行查詢。無論是表格、圖表、示意圖、影像還是文字,mcdse-2b-v1 都能將所有內容編碼成一個單一的嵌入向量,從而無需傳統的 OCR、文件佈局分析、閱讀順序檢測、分塊、表格/公式提取等操作。
在 🇮🇹 義大利語、🇪🇸 西班牙語、🇬🇧 英語、🇫🇷 法語和 🇩🇪 德語上表現出色.
套娃表示學習:嵌入可以高效地從 1536 維縮放到 256 維。您可以將大小減少 6 倍,同時仍保持 95% 的嵌入質量。
二值化表現卓越:768 維二值向量保留了 1536 維浮點向量 99% 的檢索質量。使用二值向量,您可以在 10GB 空間中編碼 1 億個多語言頁面。
快速 vLLM 推理:在 vLLM 上執行推理,並高效地大規模提供嵌入服務,可用於生產環境。檢視部署瞭解更多資訊。
我的基準測試並非完美無缺,因此我鼓勵您在自己的資料上測試模型。這是一個早期版本,還有很大的改進空間。儘管如此,結果仍突顯了強大的多語言檢索器,它能出色地適應各種記憶體/速度要求。
訓練
mcdse-2b 基於 MrLight/dse-qwen2-2b-mrl-v1 使用低秩介面卡 (LoRA) 在多語言文件語料庫上進行訓練。我使用 8xRTX3090 顯示卡,採用 DSE 方法,並使用以下引數進行了訓練:
- 紀元 = 1
- 預熱比例 = 0.1
- 學習率 = 1e-5
- 最佳化器 = adamw_torch
- 排程 = 線性
- 總批次大小 = 16
- LoRA
- Alpha = 64
- R = 16
- Dropout = 0.1
- DoRA = True
資料集
該資料集包含從公共網際網路自動抓取的 24K PDF 頁面。從每個文件中提取隨機頁面,轉換為壓縮 JPEG 影像,並過濾以去除空白頁和重複項。最終的頁面截圖是獨一無二的,涵蓋了廣泛的主題。
我使用 gemini-flash-1.5-002 根據每張圖片生成查詢。Gemini 被指示生成三種類型的查詢:
- 一個寬泛的主題查詢:總結文件的整體主題。
- 一個具體的詳細問題:捕捉內容中的細微差別。
- 一個視覺查詢:側重於圖表、圖形、影像或簽名等視覺元素。
整個訓練和評估資料集僅花費 2 歐元生成(感謝 Gemini Flash!)
然後,每張影像根據其文字密度進行 0 到 2 的分類。我使用了在 DocLayNet 上微調的 omoured YOLOv10n 模型,用於檢測圖形與文字等區域。根據這些比例,我啟發式地計算文字密度。我計劃使用這種分類來提高模型在文字密集文件上的效能。
- 0 = 僅視覺元素
- 1 = 視覺元素和文字混合
- 2 = 僅文字
評估和訓練資料集尚未釋出。我非常願意開源它們,但我仍然不確定如何在不違反任何許可(如果有的話)的情況下正確地做到這一點。如果您知道如何幫助我,請聯絡我!
訓練執行
模型按以下順序依次訓練每種語言:
- 法語:6k 樣本
- 西班牙語:6k 樣本
- 義大利語:6k 樣本
- 德語:6k 樣本
這個順序是根據基礎模型在這些語言中的檢索效能確定的,第一個是表現最好的。我的直覺是,鑑於資料集較小,從更強的語言開始可能有助於平衡模型在整體上的改進。
在達到這個最終檢查點之前,我進行了多次執行,以測試各種策略並驗證我的一些直覺。
語言順序: 我交換了最後兩種語言的順序,發現最後訓練德語可以使其在評估中的效能提高 1.7%,同時保持其他語言相似的分數。
模型初始化: 我使用每種語言的 10k mmarco 對初始化模型。這導致所有語言的效能更差,特別是低維嵌入。例如,使用 512 維嵌入的法語 NDCG@5 在使用 mmarco 訓練時下降了 2%。
不同的影像調整演算法: 我開發了一個自定義調整函式(
custom_resize
),它在將影像縮放到min_pixels
和max_pixels
範圍內時嚴格保留影像的寬高比。所有評估都使用 qwen_vl_utils 中的標準調整函式。使用自定義調整函式訓練的模型優於標準方法,NDCG@5 平均提高了 +1.7%(1536 維)。探索使用此custom_resize
函式訓練 ColQwen 模型會很有趣。調整函式 平均 英語 義大利語 西班牙語 法語 德語 qwen2_vl_utils 80.8 80.2 80.5 79.6 81 82.6 自定義調整 82.2 80.8 81.2 80.7 84.5 83.8 +1.7% +0.7% +0.9% +1.4% +4.0% +1.4%
評估
由於公開可用的多語言文件影像檢索資料集有限,該模型已使用自定義資料集進行評估。此評估資料集專門設計用於基準測試模型在各種語言中的效能。
此評估資料集是使用與訓練資料集相同的方法和流程建立的。但是,文件主題通常不同,並且訓練和評估資料集之間沒有共享影像,以避免任何評估汙染。NDCG 分數是透過對每種語言的 1K 文件索引執行 100 個唯一查詢來計算的。
套娃表示學習
此模型使用套娃表示學習(MRL)進行訓練,維度分別為:1536、1024、768、512、384、256。訓練過程中使用的損失函式經過校準,以跟蹤所有這些維度上的效能,從而使模型能夠預先載入最重要的識別資訊。這有效地允許您根據自己的規模和預算縮小嵌入維度。
每個維度的平均 NDCG@5。有趣的是,該模型在英語方面顯示出改進,儘管該語言未包含在訓練集中。該模型在 256 維度上效能提高了 6%,並且在所有維度上平均整體提高了 4%。評估使用 FAISS 的 IndexFlatL2 進行。
NDCG@5(浮點數)
平均分 | 英語 | 義大利語 | 西班牙語 | 法語 | 德語 | |
---|---|---|---|---|---|---|
1536 維度 | ||||||
dse-qwen2-2b-mrl-v1 | 79.5 | 79.2 | 80.2 | 77.9 | 80.6 | 79.6 |
mcdse-2b-v1 | 82.2 | 80.8 | 81.2 | 80.7 | 84.5 | 83.8 |
+3.28% | +1.98% | +1.23% | +3.47% | +4.62% | +5.01% | |
1024 維度 | ||||||
dse-qwen2-2b-mrl-v1 | 78.3 | 78.8 | 78.5 | 76.5 | 80 | 77.5 |
mcdse-2b-v1 | 81.7 | 80 | 80.2 | 80.1 | 84 | 84.3 |
+4.23% | +1.75% | +2.12% | +4.49% | +4.76% | +8.07% | |
768 維度 | ||||||
dse-qwen2-2b-mrl-v1 | 77.8 | 78.4 | 78.3 | 75.6 | 80.8 | 75.9 |
mcdse-2b-v1 | 81.1 | 79.6 | 79.9 | 79.2 | 83.3 | 83.3 |
+4.02% | +1.51% | +2.00% | +4.55% | +3.00% | +8.88% | |
512 維度 | ||||||
dse-qwen2-2b-mrl-v1 | 76.2 | 77.6 | 75.9 | 73.1 | 79.2 | 75.2 |
mcdse-2b-v1 | 79.3 | 78.5 | 79.1 | 75.8 | 81.4 | 81.7 |
+3.91% | +1.15% | +4.05% | +3.56% | +2.70% | +7.96% | |
384 維度 | ||||||
dse-qwen2-2b-mrl-v1 | 75.7 | 76.2 | 75.5 | 74.6 | 78.4 | 74 |
mcdse-2b-v1 | 78.8 | 77.5 | 78.5 | 76.1 | 80.4 | 81.4 |
+3.86% | +1.68% | +3.82% | +1.97% | +2.49% | +9.09% | |
256 維度 | ||||||
dse-qwen2-2b-mrl-v1 | 73.5 | 74.5 | 73.6 | 70.6 | 74.8 | 73.8 |
mcdse-2b-v1 | 78.1 | 78.5 | 77.6 | 76.2 | 80.1 | 77.9 |
+5.89% | +5.10% | +5.15% | +7.35% | +6.62% | +5.26% |
二值嵌入
mcdse-2b-v1 在二值化方面表現明顯更好,尤其是在較低維度上。該模型在 256 維度上提高了 23%,整體平均提高了 13%。評估使用 FAISS 的 IndexBinaryFlat 進行。但是,為什麼二值嵌入更優呢?
NDCG@5 | 1 億個嵌入所需的記憶體 | |
---|---|---|
dse-qwen2-2b-mrl-v1 (float16) | 79.5 | 286 GB |
mcdse-2b-v1 (二進位制) | 80.6 | 18 GB |
此表顯示,mcdse-2b-v1 的二進位制嵌入比基礎模型的 1536 維浮點向量效能高出 1%,同時記憶體消耗減少了 16 倍。除了這些優勢,二進位制嵌入還可以透過漢明距離進行 40 倍的快速搜尋,因為比較兩個二進位制向量只需 2 個 CPU 週期(異或、位計數)。
NDCG@5(二進位制)
平均分 | 英語 | 義大利語 | 西班牙語 | 法語 | 德語 | |
---|---|---|---|---|---|---|
1536 維度 | ||||||
dse-qwen2-2b-mrl-v1 | 75.0 | 75.8 | 75.4 | 72.4 | 78.1 | 73.2 |
mcdse-2b-v1 | 80.6 | 79.5 | 76.9 | 81.9 | 83.7 | 80.8 |
+6.93% | +4.65% | +1.95% | +11.60% | +6.69% | +9.41% | |
1024 維度 | ||||||
dse-qwen2-2b-mrl-v1 | 72.2 | 74.8 | 71 | 70.8 | 74.6 | 69.6 |
mcdse-2b-v1 | 79.3 | 78.4 | 75.4 | 80.8 | 82.6 | 79.5 |
+9.05% | +4.59% | +5.84% | +12.38% | +9.69% | +12.45% | |
768 維度 | ||||||
dse-qwen2-2b-mrl-v1 | 70.1 | 71.7 | 69.3 | 69.8 | 73.7 | 65.9 |
mcdse-2b-v1 | 78.8 | 77.1 | 75.4 | 80 | 83 | 78.5 |
+11.07% | +7.00% | +8.09% | +12.75% | +11.20% | +16.05% | |
512 維度 | ||||||
dse-qwen2-2b-mrl-v1 | 66.5 | 70 | 65.4 | 63.7 | 70.2 | 63 |
mcdse-2b-v1 | 76.6 | 74.8 | 74.2 | 77.7 | 80.9 | 75.3 |
+13.21% | +6.42% | +11.86% | +18.02% | +13.23% | +16.33% | |
384 維度 | ||||||
dse-qwen2-2b-mrl-v1 | 61.1 | 62.7 | 58.5 | 58.6 | 65.1 | 60.8 |
mcdse-2b-v1 | 74.3 | 74.5 | 71.4 | 77.2 | 75.2 | 73 |
+17.67% | +15.84% | +18.07% | +24.09% | +13.43% | +16.71% | |
256 維度 | ||||||
dse-qwen2-2b-mrl-v1 | 54.3 | 59 | 56.5 | 53.6 | 53 | 49.6 |
mcdse-2b-v1 | 70.9 | 72.6 | 66.4 | 73.5 | 72.6 | 69.2 |
+23.31% | +18.73% | +14.91% | +27.07% | +27.00% | +28.32% |
ShiftProject
vidore/shiftproject_test 資料集是 ViDoRe 基準測試的一部分。它包含來自 Shift Project 關於環境的法語查詢和文件。查詢是使用 Claude-3 Sonnet 在與生成 vidore/colpali_train_set 抓取文件查詢相同的法語翻譯提示下生成的。
ShiftProject (NDCG@5) | |
---|---|
dse-qwen2-2b-mrl-v1 | 80.8 |
mcdse-2b-v1 | 78.6 |
-2.80% |
這是 ShiftProject 資料集上的 NDCG@5,使用 1536 浮點維度,最多評估 960 個影像補丁。
我原以為 mcdse-2b-v1 的分數會高於基礎模型,結果卻低了 3%。基礎模型是在 colpali 訓練集上訓練的,我曾以為它可能對“Claude-3 Sonnet 風格”的查詢過度優化了。為了調查這一點,我使用 gemini-1.5-flash-002 和我的提示重新生成了 ShiftProject 資料集查詢。
ShiftProject_Gemini (NDCG@5) | |
---|---|
dse-qwen2-2b-mrl-v1 | 67 |
mcdse-2b-v1 | 70.8 |
+5.37% |
分數變化很大,但在這種情況下,mcdse-2b-v1 提高了 5%。這些結果傾向於表明兩種可能的原因:
- 基礎模型對“Claude-3 Sonnet 風格”的查詢過度最佳化
- 我的模型對“gemini-1.5-flash-002 風格”的查詢過度最佳化
在這兩種情況下,我相信 mcdse-2b-v1 透過理解更廣泛的查詢分佈,減輕了這些過度最佳化。
我生成的 Gemini 查詢有兩種格式:問題和查詢。colpali_train_set 生成的查詢只有問題。我還測試了只使用 Gemini 查詢和只使用 Gemini 問題的兩種模型。
ShiftProject_GeminiQuestions (NDCG@5) | ShiftProject_GeminiQueries (NDCG@5) | |
---|---|---|
dse-qwen2-2b-mrl-v1 | 74.8 | 58.6 |
mcdse-2b-v1 | 69.5 | 63.5 |
-7.63% | +7.72% |
基礎模型在 Gemini 問題上表現好 7%,在 Gemini 查詢上表現差 7%。查詢和問題之間的平均分數幾乎相同(66.7 和 66.5)。這表明我的模型已經緩解了之前提到的過度最佳化,並且通常能夠更好地理解更廣泛的查詢。在更多多語言資料上進行訓練可能會提高這個平均值,並最終提高 ShiftProject 上的效能。
Cohere Embed v3 影像
我使用最近釋出的 cohere embed-multilingual-v3.0 多模態 嵌入模型對較小版本的英語資料集進行了一些初步(且倉促)測試。該模型取得了 71 的 NDCG@5 分數,而 mcdse-2b-v1 的分數約為 84。我正在為該模型進行更全面的評估。
部署
在 HuggingFace Transformers 上,您可以使用 RTX3090 顯示卡以 32 的批處理大小(35TFLOPS)編碼約 3 張圖片/秒。像 RTX 4000 Ada 這樣的更常見的推理端 GPU 大致能提供相同的吞吐量。
vLLM
vLLM 官方僅支援 Qwen2VL 用於生成,我添加了一個新的模型類 Qwen2VLForEmbeddingGeneration
來支援嵌入任務。在 vLLM 上執行推理應該比 HuggingFace Transformers 快約 5 倍。
下載新的模型類
git clone https://github.com/marplex/mcdse && cd mcdse
下載 mcdse-2b-v1 用於本地推理
from huggingface_hub import snapshot_download
snapshot_download(repo_id="marco/mcdse-2b-v1", local_dir="/path/to/model/mcdse-2b-v1")
編輯 config.json
將 Qwen2VLForConditionalGeneration
替換為 Qwen2VLForEmbeddingGeneration
sed -i -e 's/Qwen2VLForConditionalGeneration/Qwen2VLForEmbeddingGeneration/g' /path/to/model/mcdse-2b-v1/config.json
檢查 vllm/main.py
進行本地推理
#vllm/main.py
from qwen2_vl_dse import Qwen2VLForEmbeddingGeneration, get_query_prompt, get_document_prompt
from vllm import ModelRegistry, LLM
from PIL import Image
ModelRegistry.register_model("Qwen2VLForEmbeddingGeneration", Qwen2VLForEmbeddingGeneration)
llm = LLM(
model="/path/to/model/mcdse-2b-v1",
limit_mm_per_prompt={
"image": 1
}
)
# Encode queries
query_prompt, image = get_query_prompt("Quali erano le passività totali al 31 dicembre 2017?")
outputs = llm.encode({"prompt": query_prompt, "multi_modal_data": {"image": [image]}})
outputs[0].outputs.embedding #1536 dimensional embedding
# Encode documents
dummy_document_image = Image.new('RGB', (256, 256))
document_prompt, image = get_document_prompt(dummy_document_image)
outputs = llm.encode({"prompt": document_prompt, "multi_modal_data": {"image": [image]}})
outputs[0].outputs.embedding #1536 dimensional embedding
結論
這是我第一次訓練模型,雖然充滿挑戰,但也樂趣無窮。如果沒有 HuggingFace 團隊和貢獻者的出色工作,我不可能做到這一點。我還要感謝 Manuel Faysse、Tony Wu 以及整個 Vidore 團隊在 ColPali 上的工作,感謝 Xueguang Ma 在 Tevatron 程式碼庫上的所有工作以及訓練了一個非常強大的基礎模型。我還受到了 Benjamin Clavié 及其令人印象深刻的模型公告的啟發。
我希望這個模型對您的檢索和 RAG 管道有用。正如開頭所述,我的基準測試遠非完美,實際場景中的結果可能會有所不同。我鼓勵您在自己的用例中進行測試。總的來說,視覺檢索的一個顯著優勢是,您可以透過簡單地嵌入頁面來拋棄複雜的索引管道。這就是未來!