模型概述
模型特點
模型能力
使用案例
🚀 IDEFICS
IDEFICS模型名稱如何發音?觀看Youtube教程
IDEFICS(Image-aware Decoder Enhanced à la Flamingo with Interleaved Cross-attentionS)是對Flamingo的開源復刻版本,Flamingo是Deepmind開發的閉源視覺語言模型。與GPT - 4類似,這個多模態模型可以接受任意的圖像和文本輸入序列,並生成文本輸出。IDEFICS完全基於公開可用的數據和模型構建。
該模型可以回答關於圖像的問題、描述視覺內容、根據多張圖像創作故事,或者在沒有視覺輸入的情況下單純作為語言模型使用。
在各種圖像 - 文本基準測試中,包括視覺問答(開放式和多項選擇)、圖像描述和圖像分類,使用上下文少樣本學習進行評估時,IDEFICS的表現與原始閉源模型相當。它有兩個版本:一個是800億參數的大版本,另一個是90億參數的版本。
我們還在有監督微調數據集和指令微調數據集的混合數據集上對基礎模型進行了微調,這不僅提升了下游任務的性能,還讓模型在對話場景中更易用:idefics - 80b - instruct和idefics - 9b - instruct。由於這些微調後的模型性能更優,我們建議優先使用它們。
瞭解我們在訓練IDEFICS時遇到的一些技術挑戰,請點擊此處。
試用演示!
🚀 快速開始
基礎模型
import torch
from transformers import IdeficsForVisionText2Text, AutoProcessor
device = "cuda" if torch.cuda.is_available() else "cpu"
checkpoint = "HuggingFaceM4/idefics-9b"
model = IdeficsForVisionText2Text.from_pretrained(checkpoint, torch_dtype=torch.bfloat16).to(device)
processor = AutoProcessor.from_pretrained(checkpoint)
# 我們向模型輸入任意的文本字符串和圖像序列。圖像可以是URL或PIL圖像。
prompts = [
[
"https://upload.wikimedia.org/wikipedia/commons/8/86/Id%C3%A9fix.JPG",
"In this picture from Asterix and Obelix, we can see"
],
]
# --批量模式
inputs = processor(prompts, return_tensors="pt").to(device)
# --單樣本模式
# inputs = processor(prompts[0], return_tensors="pt").to(device)
# 生成參數
bad_words_ids = processor.tokenizer(["<image>", "<fake_token_around_image>"], add_special_tokens=False).input_ids
generated_ids = model.generate(**inputs, bad_words_ids=bad_words_ids, max_length=100)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)
for i, t in enumerate(generated_text):
print(f"{i}:\n{t}\n")
指令模型
import torch
from transformers import IdeficsForVisionText2Text, AutoProcessor
device = "cuda" if torch.cuda.is_available() else "cpu"
checkpoint = "HuggingFaceM4/idefics-9b-instruct"
model = IdeficsForVisionText2Text.from_pretrained(checkpoint, torch_dtype=torch.bfloat16).to(device)
processor = AutoProcessor.from_pretrained(checkpoint)
# 我們向模型輸入任意的文本字符串和圖像序列。圖像可以是URL或PIL圖像。
prompts = [
[
"User: What is in this image?",
"https://upload.wikimedia.org/wikipedia/commons/8/86/Id%C3%A9fix.JPG",
"<end_of_utterance>",
"\nAssistant: This picture depicts Idefix, the dog of Obelix in Asterix and Obelix. Idefix is running on the ground.<end_of_utterance>",
"\nUser:",
"https://static.wikia.nocookie.net/asterix/images/2/25/R22b.gif/revision/latest?cb=20110815073052",
"And who is that?<end_of_utterance>",
"\nAssistant:",
],
]
# --批量模式
inputs = processor(prompts, add_end_of_utterance_token=False, return_tensors="pt").to(device)
# --單樣本模式
# inputs = processor(prompts[0], return_tensors="pt").to(device)
# 生成參數
exit_condition = processor.tokenizer("<end_of_utterance>", add_special_tokens=False).input_ids
bad_words_ids = processor.tokenizer(["<image>", "<fake_token_around_image>"], add_special_tokens=False).input_ids
generated_ids = model.generate(**inputs, eos_token_id=exit_condition, bad_words_ids=bad_words_ids, max_length=100)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)
for i, t in enumerate(generated_text):
print(f"{i}:\n{t}\n")
文本生成推理
from text_generation import Client
API_TOKEN = "<YOUR_API_TOKEN>"
API_URL = "https://api-inference.huggingface.co/models/HuggingFaceM4/idefics-80b-instruct"
DECODING_STRATEGY = "Greedy"
QUERY = "User: What is in this image?<end_of_utterance>\nAssistant:"
client = Client(
base_url=API_URL,
headers={"x-use-cache": "0", "Authorization": f"Bearer {API_TOKEN}"},
)
generation_args = {
"max_new_tokens": 256,
"repetition_penalty": 1.0,
"stop_sequences": ["<end_of_utterance>", "\nUser:"],
}
if DECODING_STRATEGY == "Greedy":
generation_args["do_sample"] = False
elif DECODING_STRATEGY == "Top P Sampling":
generation_args["temperature"] = 1.
generation_args["do_sample"] = True
generation_args["top_p"] = 0.95
generated_text = client.generate(prompt=QUERY, **generation_args)
print(generated_text)
✨ 主要特性
- 多模態處理:能夠接受任意的圖像和文本輸入序列,並生成文本輸出,可用於圖像問答、內容描述、故事創作等任務。
- 開源復刻:是對閉源視覺語言模型Flamingo的開源復刻,基於公開數據和模型構建。
- 少樣本學習能力:在各種圖像 - 文本基準測試中,使用上下文少樣本學習進行評估時,表現與原始閉源模型相當。
- 多版本可選:有800億參數和90億參數兩個版本,還提供了經過指令微調的版本,提升了下游任務性能和對話易用性。
📦 安裝指南
文檔未提供具體安裝步驟,可參考相關資源進行安裝和使用。
💻 使用示例
基礎用法
import torch
from transformers import IdeficsForVisionText2Text, AutoProcessor
device = "cuda" if torch.cuda.is_available() else "cpu"
checkpoint = "HuggingFaceM4/idefics-9b"
model = IdeficsForVisionText2Text.from_pretrained(checkpoint, torch_dtype=torch.bfloat16).to(device)
processor = AutoProcessor.from_pretrained(checkpoint)
# 我們向模型輸入任意的文本字符串和圖像序列。圖像可以是URL或PIL圖像。
prompts = [
[
"https://upload.wikimedia.org/wikipedia/commons/8/86/Id%C3%A9fix.JPG",
"In this picture from Asterix and Obelix, we can see"
],
]
# --批量模式
inputs = processor(prompts, return_tensors="pt").to(device)
# --單樣本模式
# inputs = processor(prompts[0], return_tensors="pt").to(device)
# 生成參數
bad_words_ids = processor.tokenizer(["<image>", "<fake_token_around_image>"], add_special_tokens=False).input_ids
generated_ids = model.generate(**inputs, bad_words_ids=bad_words_ids, max_length=100)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)
for i, t in enumerate(generated_text):
print(f"{i}:\n{t}\n")
高級用法
import torch
from transformers import IdeficsForVisionText2Text, AutoProcessor
device = "cuda" if torch.cuda.is_available() else "cpu"
checkpoint = "HuggingFaceM4/idefics-9b-instruct"
model = IdeficsForVisionText2Text.from_pretrained(checkpoint, torch_dtype=torch.bfloat16).to(device)
processor = AutoProcessor.from_pretrained(checkpoint)
# 我們向模型輸入任意的文本字符串和圖像序列。圖像可以是URL或PIL圖像。
prompts = [
[
"User: What is in this image?",
"https://upload.wikimedia.org/wikipedia/commons/8/86/Id%C3%A9fix.JPG",
"<end_of_utterance>",
"\nAssistant: This picture depicts Idefix, the dog of Obelix in Asterix and Obelix. Idefix is running on the ground.<end_of_utterance>",
"\nUser:",
"https://static.wikia.nocookie.net/asterix/images/2/25/R22b.gif/revision/latest?cb=20110815073052",
"And who is that?<end_of_utterance>",
"\nAssistant:",
],
]
# --批量模式
inputs = processor(prompts, add_end_of_utterance_token=False, return_tensors="pt").to(device)
# --單樣本模式
# inputs = processor(prompts[0], return_tensors="pt").to(device)
# 生成參數
exit_condition = processor.tokenizer("<end_of_utterance>", add_special_tokens=False).input_ids
bad_words_ids = processor.tokenizer(["<image>", "<fake_token_around_image>"], add_special_tokens=False).input_ids
generated_ids = model.generate(**inputs, eos_token_id=exit_condition, bad_words_ids=bad_words_ids, max_length=100)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)
for i, t in enumerate(generated_text):
print(f"{i}:\n{t}\n")
📚 詳細文檔
模型詳情
IDEFICS是一個大型多模態英文模型,它接受交錯的圖像和文本序列作為輸入,並生成文本輸出。該模型展現出強大的上下文少樣本學習能力,與閉源模型表現相當,這使得IDEFICS成為在自定義數據上微調多模態模型的可靠起點。
IDEFICS基於兩個單模態的開源預訓練模型構建,以連接圖像和文本兩種模態。新初始化的Transformer塊形式的參數彌合了視覺編碼器和語言模型之間的差距。該模型在圖像 - 文本對和非結構化多模態網頁文檔的混合數據上進行訓練。
IDEFICS - instruct是在有監督微調數據集和指令微調數據集上進一步訓練IDEFICS得到的模型。這顯著提高了下游任務的性能(使idefics - 9b - instruct在90億參數規模下成為一個非常強大的模型),同時讓模型更適合進行對話。
用途
- 推理任務:可用於多模態(圖像 + 文本)任務的推理,輸入由文本查詢/指令和一張或多張圖像組成,但不支持圖像生成。
- 微調:可以在自定義數據上對基礎模型進行微調,以滿足特定用例的需求。需要注意的是,經過指令微調的模型在遵循用戶指令方面表現更好,因此在開箱即用的情況下應優先使用。
訓練詳情
IDEFICS
訓練過程緊密遵循Flamingo的訓練步驟。通過初始化新的Transformer塊,將兩個開源預訓練模型(laion/CLIP - ViT - H - 14 - laion2B - s32B - b79K和huggyllama/llama - 65b)結合起來。在訓練新初始化的參數時,預訓練的主幹模型保持凍結。
訓練數據混合了公開可用的英文數據:
數據源 | 數據類型 | 源數據中的標記數量 | 源數據中的圖像數量 | 訓練輪數 | 標記數量的有效比例 |
---|---|---|---|---|---|
OBELICS | 非結構化多模態網頁文檔 | 1149億 | 3.53億 | 1 | 73.85% |
Wikipedia | 非結構化多模態網頁文檔 | 319.2億 | 3900萬 | 3 | 6.15% |
LAION | 圖像 - 文本對 | 299億 | 112億 | 1 | 17.18% |
PMD | 圖像 - 文本對 | 16億 | 7000萬 | 3 | 2.82% |
IDEFICS - instruct
從基礎的IDEFICS模型開始,通過解凍所有參數(視覺編碼器、語言模型、交叉注意力)對模型進行微調。微調數據混合了以下英文數據集:
數據源 | 數據描述 | 唯一樣本數量 | 採樣比例 |
---|---|---|---|
M3IT | 帶提示的圖像 - 文本學術數據集 | 150萬 | 7.7% |
LRV - Instruction | 圖像/問題/答案三元組 | 15.5萬 | 1.7% |
LLaVA - Instruction | 基於圖像的問答對話 | 15.8萬 | 5.9% |
LLaVAR - Instruction | 基於包含文本圖像的問答對話 | 1.55萬 | 6.3% |
SVIT | 圖像/問題/答案三元組 | 320萬 | 11.4% |
General Scene Difference + Spot - the - Diff | 描述相關或相似圖像差異的文本對 | 15.8萬 | 2.1% |
UltraChat | 多輪純文本對話 | 150萬 | 29.1% |
評估
IDEFICS
由於沒有在視頻 - 文本數據集上訓練IDEFICS(與Flamingo不同),因此未在視頻基準測試上進行評估。將該模型與原始的Flamingo和另一個開源復刻版本OpenFlamingo進行了比較。
在VQAv2、TextVQA、OKVQA、VizWiz、Visual Dialogue、Coco、Flickr30k和HatefulMemes的驗證集上進行了檢查點選擇。為IDEFICS - 9B選擇了第65000步的檢查點,為IDEFICS選擇了第37500步的檢查點。使用上下文少樣本學習對模型進行評估,其中提示實例從支持集中隨機選擇,不使用任何形式的集成。遵循Flamingo的方法,為了報告開放式0樣本結果,使用了一個包含下游任務兩個示例的提示,但移除了相應的圖像,在不提供任務額外完整樣本的情況下向模型暗示預期格式。唯一的例外是WinoGround,在預測樣本前不添加任何示例。除非另有說明,否則使用開放式VQA準確率評估視覺問答變體。
IDEFICS instruct
與基礎的IDEFICS模型類似,進行了檢查點選擇以停止訓練。由於M3IT的訓練集中包含了一些我們正在評估的基準測試,因此使用MMBench作為保留的驗證基準進行檢查點選擇。為IDEFICS - 80b - instruct選擇了第3000步的檢查點,為IDEFICS - 9b - instruct選擇了第8000步的檢查點。
技術規格
硬件
IDEFICS模型在AWS SageMaker集群上進行訓練,該集群配備8x80GB A100 GPU節點和EFA網絡。
- IDEFICS - 80B在64個節點(512個GPU)上訓練約28天。
- IDEFICS - 80b - instruct在48個節點(384個GPU)上對基礎模型進行了約3天的微調。
軟件
訓練軟件基於HuggingFace Transformers + Accelerate構建,使用DeepSpeed ZeRO - 3進行訓練,使用WebDataset進行數據加載。
環境影響
區分了IDEFICS創建的三個階段,並分別報告了每個階段的碳排放:
- 初步實驗:碳排放16714千克CO2eq。
- IDEFICS - 9b預訓練:碳排放5160千克CO2eq。
- IDEFICS - 9b - instruct微調:碳排放1032千克CO2eq。
- IDEFICS - 80b預訓練:碳排放39498千克CO2eq。
- IDEFICS - 80b - instruct微調:碳排放3174千克CO2eq。
整個IDEFICS項目的總碳足跡估計為65.57噸CO2eq,根據美國環境保護署的數據,這大約相當於一輛普通汽油動力汽車行駛168092英里或8.3個家庭一年的能源使用量。
偏差、風險和侷限性
偏差和侷限性
作為語言模型的衍生模型,IDEFICS可能會生成包含令人不安和有害刻板印象的文本,涉及受保護特徵、身份特徵以及敏感、社會和職業群體。此外,IDEFICS可能會生成事實錯誤的文本,不應依賴它來生成事實準確的信息。
偏差評估
主要對模型的指令微調變體(90億和800億參數版本)進行了偏差評估,進行了兩種主要形式的偏差評估:[紅隊測試](https://huggingface.co/blog/red - teaming)和跨性別和種族軸對模型生成結果的系統評估。
其他侷限性
- 醫療診斷問題:模型在被要求進行醫療診斷時可能會提供相關結果,但我們強烈建議用戶在沒有適當調整和評估的情況下,不要將模型用於醫療應用。
- 不適當內容:儘管對訓練數據進行了過濾,但仍發現一小部分內容不適合所有受眾,包括色情內容和暴力槍擊報告,這些內容在OBELICS數據部分較為普遍,因此模型可能會生成類似的文本。
濫用和超出適用範圍的使用
超出適用範圍的使用
在高風險場景中使用該模型超出了其適用範圍。該模型並非為關鍵決策或對個人生計或福祉有重大影響的用途而設計。模型輸出的內容看似事實準確,但可能並不正確。超出適用範圍的使用包括:
- 用於評估或評分個人,如就業、教育或信用評估。
- 用於關鍵自動決策、生成事實內容、創建可靠摘要或生成必須準確的預測。
濫用
故意使用該模型進行傷害、侵犯人權或其他惡意活動屬於對該模型的濫用,包括:
- 垃圾郵件生成。
- 虛假信息和影響操作。
- 詆譭和誹謗。
- 騷擾和虐待。
- 欺騙。
- 未經同意的模仿和假冒。
- 未經同意的監視。
🔧 技術細節
模型架構
IDEFICS基於兩個單模態的開源預訓練模型構建,通過新初始化的Transformer塊連接視覺編碼器和語言模型。在訓練過程中,預訓練的主幹模型保持凍結,只訓練新初始化的參數。
訓練數據處理
- 多模態網頁文檔:將對應於文本段落和圖像順序的序列輸入模型。
- 圖像 - 文本對:將圖像與其描述組合成訓練序列。圖像通過視覺編碼器進行編碼,視覺隱藏狀態通過Transformer Perceiver塊進行池化,然後通過交叉注意力塊融合到文本序列中。
訓練優化
- 層歸一化:遵循Dehghani等人(2023)的方法,對Perceiver和交叉注意力塊的投影查詢和鍵應用層歸一化,提高了訓練穩定性。
- 訓練目標:標準的下一個標記預測。
超參數和訓練參數
IDEFICS
參數 | IDEFICS - 80b | IDEFICS - 9b | |
---|---|---|---|
Perceiver Resampler | 層數 | 6 | 6 |
潛在數量 | 64 | 64 | |
頭數 | 16 | 16 | |
重採樣器頭維度 | 96 | 96 | |
模型 | 語言模型主幹 | Llama - 65b | Llama - 7b |
視覺模型主幹 | laion/CLIP - ViT - H - 14 - laion2B - s32B - b79K | laion/CLIP - ViT - H - 14 - laion2B - s32B - b79K | |
跨層間隔 | 4 | 4 | |
訓練 | 序列長度 | 1024 | 1024 |
有效批量大小(標記數量) | 367萬 | 131萬 | |
最大訓練步數 | 20萬 | 20萬 | |
權重衰減 | 0.1 | 0.1 | |
優化器 | Adam(0.9, 0.999) | Adam(0.9, 0.999) | |
梯度裁剪 | 1.0 | 1.0 | |
Z - loss權重 | 1e - 3 | 1e - 3 | |
學習率 | 初始最大值 | 5e - 5 | 1e - 5 |
初始最終值 | 3e - 5 | 6e - 6 | |
衰減調度 | 線性 | 線性 | |
線性熱身步數 | 2000 | 2000 | |
大規模優化 | 梯度檢查點 | 是 | 是 |
精度 | 混合精度bf16 | 混合精度bf16 | |
ZeRO優化 | 階段3 | 階段3 |
IDEFICS - instruct
參數 | IDEFICS - 80b - instruct | IDEFICS - 9b - instruct | |
---|---|---|---|
訓練 | 序列長度 | 2048 | 2048 |
有效批量大小(標記數量) | 61.3萬 | 20.5萬 | |
最大訓練步數 | 2.2萬 | 2.2萬 | |
權重衰減 | 0.1 | 0.1 | |
優化器 | Adam(0.9, 0.999) | Adam(0.9, 0.999) | |
梯度裁剪 | 1.0 | 1.0 | |
Z - loss權重 | 0. | 0. | |
學習率 | 初始最大值 | 3e - 6 | 1e - 5 |
初始最終值 | 3.6e - 7 | 1.2e - 6 | |
衰減調度 | 線性 | 線性 | |
線性熱身步數 | 1000 | 1000 | |
大規模優化 | 梯度檢查點 | 是 | 是 |
精度 | 混合精度bf16 | 混合精度bf16 | |
ZeRO優化 | 階段3 | 階段3 |
📄 許可證
該模型基於兩個預訓練模型構建:laion/CLIP - ViT - H - 14 - laion2B - s32B - b79K和huggyllama/llama - 65b。第一個模型根據MIT許可證發佈,而第二個模型根據特定的非商業許可證發佈,專注於研究目的。因此,用戶應通過直接申請Meta的表單來遵守該許可證。
連接兩個預訓練模型的新初始化參數是我們訓練得到的,這些參數不基於構成複合模型的兩個基礎凍結模型。我們根據MIT許可證發佈這些額外訓練的權重。
📖 引用
@misc{laurencon2023obelics,
title={OBELICS: An Open Web-Scale Filtered Dataset of Interleaved Image-Text Documents},
author={Hugo Laurençon and Lucile Saulnier and Léo Tronchon and Stas Bekman and Amanpreet Singh and Anton Lozhkov and Thomas Wang and Siddharth Karamcheti and Alexander M. Rush and Douwe Kiela and Matthieu Cord and Victor Sanh},
year={2023},
eprint={2306.16527},
archivePrefix={arXiv},
primaryClass={cs.IR}
}
👥 模型構建者、卡片作者和貢獻者
核心團隊(*)在Hugging Face的這些貢獻者的多方面支持下開展工作:
Stas Bekman*, Léo Tronchon*, Hugo Laurençon*, Lucile Saulnier*, Amanpreet Singh*, Anton Lozhkov, Thomas Wang, Siddharth Karamcheti, Daniel Van Strien, Giada Pistilli, Yacine Jernite, Sasha Luccioni, Ezi Ozoani, Younes Belkada, Sylvain Gugger, Amy E. Roberts, Lysandre Debut, Arthur Zucker, Nicolas Patry, Lewis Tunstall, Zach Mueller, Sourab Mangrulkar, Chunte Lee, Yuvraj Sharma, Dawood Khan, Abubakar Abid, Ali Abid, Freddy Boulton, Omar Sanseviero, Carlos Muñoz Ferrandis, Guillaume Salou, Guillaume Legendre, Quentin Lhoest, Douwe Kiela, Alexander M. Rush, Matthieu Cord, Julien Chaumond, Thomas Wolf, Victor Sanh*
📞 模型卡片聯繫
請在社區標籤下開啟討論!








