本地構(gòu)建Llama 3.2-Vision多模態(tài)LLM聊天應(yīng)用實(shí)戰(zhàn) 原創(chuàng)
本文將以實(shí)戰(zhàn)案例探討如何在類似聊天的模式下從本地構(gòu)建Llama3.2-Vision模型,并在Colab筆記本上探索其多模態(tài)技能。
簡介
視覺功能與大型語言模型(LLM)的集成正在通過多模態(tài)LLM(MLLM)徹底改變計算機(jī)視覺領(lǐng)域。這些模型結(jié)合了文本和視覺輸入,在圖像理解和推理方面表現(xiàn)出令人印象深刻的能力。雖然這些模型以前只能通過API訪問,但是最近發(fā)布的一些開源項(xiàng)目已經(jīng)支持在本地執(zhí)行,這使得它們對生產(chǎn)環(huán)境中一線應(yīng)用更具吸引力。
在本文中,我們將學(xué)習(xí)如何使用開源Llama3.2-Vision模型與我們提供的圖像聊天,其間你會驚嘆于該模型的OCR、圖像理解和推理能力。示例工程的所有代碼都將方便地提供在一個Colab筆記本文件中。
Llama 3.2-Vision模型
背景
Llama是“大型語言模型MetaAI”的縮寫,是Meta公司開發(fā)的一系列高級大語言模型。他們的產(chǎn)品Llama 3.2推出了先進(jìn)的視覺功能。視覺變體有兩種大?。?1B和90B參數(shù),可在邊緣設(shè)備上進(jìn)行推理。Llama 3.2具有高達(dá)128k個標(biāo)記的上下文窗口,支持高達(dá)1120x1120像素的高分辨率圖像,可以處理復(fù)雜的視覺和文本信息。
架構(gòu)
Llama系列模型是僅使用解碼器的轉(zhuǎn)換器。Llama3.2-Vision模型建立在預(yù)訓(xùn)練的Llama 3.1純文本模型之上。它采用標(biāo)準(zhǔn)的密集自回歸轉(zhuǎn)換器架構(gòu),與其前身Llama和Llama 2并無太大差異。
為了支持視覺任務(wù),Llama 3.2使用預(yù)訓(xùn)練的視覺編碼器(ViT-H/14)提取圖像表示向量,并使用視覺適配器將這些表示集成到凍結(jié)語言模型中。適配器由一系列交叉注意層組成,允許模型專注于與正在處理的文本相對應(yīng)的圖像的特定部分(參考文獻(xiàn)【1】)。
適配器基于“文本-圖像”對進(jìn)行訓(xùn)練,以使圖像表示與語言表示對齊。在適配器訓(xùn)練期間,圖像編碼器的參數(shù)會更新,而語言模型參數(shù)保持凍結(jié)以保留現(xiàn)有的語言能力。
Llama 3.2-Vision模型架構(gòu):視覺模塊(綠色)集成到固定語言模型(粉紅色)中
這種設(shè)計使Llama 3.2在多模態(tài)任務(wù)中表現(xiàn)出色,同時保持其強(qiáng)大的純文本性能。生成的模型在需要圖像和語言理解的任務(wù)中展示了令人印象深刻的能力,并允許用戶與他們的視覺輸入進(jìn)行交互式交流。
編碼實(shí)戰(zhàn)
有了對Llama 3.2架構(gòu)的基本了解后,讓我們深入研究其實(shí)際實(shí)現(xiàn)。但首先,我們需要做一些準(zhǔn)備工作。
準(zhǔn)備
在Google Colab上運(yùn)行Llama3.2—Vision11B之前,我們需要做一些準(zhǔn)備:
1.GPU設(shè)置
- 建議使用至少具有22GB VRAM的高端GPU進(jìn)行高效推理(參考文獻(xiàn)【2】)。
- 對于Google Colab用戶來說:需要導(dǎo)航至“運(yùn)行時”>“更改運(yùn)行時類型”>“A100 GPU”。請注意,高端GPU可能不適用于免費(fèi)的Colab用戶。
2. 模型權(quán)限
請求訪問Llama 3.2模型在鏈接https://www.llama.com/llama-downloads/處提供。
3.HuggingFace設(shè)置
如果你還沒有Hugging Face賬戶,請在鏈接??https://huggingface.co/join處創(chuàng)建一個。??
如果你沒有Hugging Face賬戶,請在鏈接https://huggingface.co/join處生成訪問令牌。
對于Google Colab用戶,請在谷歌Colab Secrets中將Hugging Face令牌設(shè)置為名為“HF_TOKEN”的秘密環(huán)境變量。
4.安裝所需的庫
加載模型
設(shè)置環(huán)境并獲得必要的權(quán)限后,我們將使用Hugging Face轉(zhuǎn)換庫來實(shí)例化模型及其相關(guān)的處理器。處理器負(fù)責(zé)為模型準(zhǔn)備輸入并格式化其輸出。
model_id = "meta-llama/Llama-3.2-11B-Vision-Instruct"
model = MllamaForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto")
processor = AutoProcessor.from_pretrained(model_id)
預(yù)期的聊天模板
聊天模板通過存儲“用戶”(我們)和“助手”(AI模型)之間的交流,通過對話歷史記錄來維護(hù)上下文。對話歷史記錄的結(jié)構(gòu)為一個稱為消息的字典列表,其中每個字典代表一個對話輪次,包括用戶和模型響應(yīng)。用戶輪次可以包括圖像文本或純文本輸入,其中{"type": "image"}表示圖像輸入。
例如,經(jīng)過幾次聊天迭代后,消息列表可能如下所示:
messages = [
{"role": "user", "content": [{"type": "image"}, {"type": "text", "text": prompt1}]},
{"role": "assistant", "content": [{"type": "text", "text": generated_texts1}]},
{"role": "user", "content": [{"type": "text", "text": prompt2}]},
{"role": "assistant", "content": [{"type": "text", "text": generated_texts2}]},
{"role": "user", "content": [{"type": "text", "text": prompt3}]},
{"role": "assistant", "content": [{"type": "text", "text": generated_texts3}]}
]
此消息列表隨后會傳遞給apply_chat_template()方法,以便將對話轉(zhuǎn)換為模型期望格式的單個可標(biāo)記字符串。
主函數(shù)
在本教程中,我提供了一個chat_with_mllm函數(shù),該函數(shù)可實(shí)現(xiàn)與Llama 3.2 MLLM的動態(tài)對話。此函數(shù)能夠處理圖像加載、預(yù)處理圖像和文本輸入、生成模型響應(yīng)并管理對話歷史記錄以啟用聊天模式交互。
def chat_with_mllm (model, processor, prompt, images_path=[],do_sample=False, temperature=0.1, show_image=False, max_new_tokens=512, messages=[], images=[]):
# 確保列表形式:
if not isinstance(images_path, list):
images_path = [images_path]
#加載圖像
if len (images)==0 and len (images_path)>0:
for image_path in tqdm (images_path):
image = load_image(image_path)
images.append (image)
if show_image:
display ( image )
#如果開始了一個關(guān)于一個圖像的新的對話
if len (messages)==0:
messages = [{"role": "user", "content": [{"type": "image"}, {"type": "text", "text": prompt}]}]
# 如果繼續(xù)對圖像進(jìn)行對話
else:
messages.append ({"role": "user", "content": [{"type": "text", "text": prompt}]})
# 處理輸入數(shù)據(jù)
text = processor.apply_chat_template(messages, add_generation_prompt=True)
inputs = processor(images=images, text=text, return_tensors="pt", ).to(model.device)
生成相應(yīng)
generation_args = {"max_new_tokens": max_new_tokens, "do_sample": True}
if do_sample:
generation_args["temperature"] = temperature
generate_ids = model.generate(**inputs,**generation_args)
generate_ids = generate_ids[:, inputs['input_ids'].shape[1]:-1]
generated_texts = processor.decode(generate_ids[0], clean_up_tokenization_spaces=False)
# 附加該模型對對話歷史記錄的響應(yīng)
messages.append ({"role": "assistant", "content": [ {"type": "text", "text": generated_texts}]})
return generated_texts, messages, images
與Llama聊天
蝴蝶圖像示例
在我們的第一個示例中,我們將與Llama3.2進(jìn)行聊天,討論一張孵化蝴蝶的圖像。由于Llama3.2-Vision在使用圖像時不支持使用系統(tǒng)提示進(jìn)行提示,因此我們將直接在用戶提示中附加說明,以指導(dǎo)模型的響應(yīng)。通過設(shè)置do_sample=True和temperature=0.2,我們可以在保持響應(yīng)一致性的同時實(shí)現(xiàn)輕微的隨機(jī)性。對于固定答案,你可以設(shè)置do_sample==False。保存聊天歷史記錄的messages參數(shù)最初為空,如images參數(shù)中所示:
instructions = "Respond concisely in one sentence."
prompt = instructions + "Describe the image."
response, messages,images= chat_with_mllm ( model, processor, prompt,
images_path=[img_path],
do_sample=True,
temperature=0.2,
show_image=True,
messages=[],
images=[])
# 輸出:"The image depicts a butterfly emerging from its chrysalis,
# with a row of chrysalises hanging from a branch above it."
圖片來自Pixabay(https://www.pexels.com/photo/brown-and-white-swallowtail-butterfly-under-white-green-and-brown-cocoon-in-shallow-focus-lens-63643/)。
我們可以看到,輸出準(zhǔn)確而簡潔,表明模型有效地理解了圖像。
對于下一次聊天迭代,我們將傳遞一個新提示以及聊天歷史記錄和圖像文件。新提示旨在評估Llama3.2的推理能力:
prompt = instructions + "What would happen to the chrysalis in the near future?"
response, messages, images= chat_with_mllm ( model, processor, prompt,
images_path=[img_path,],
do_sample=True,
temperature=0.2,
show_image=False,
messages=messages,
images=images)
# 輸出: "The chrysalis will eventually hatch into a butterfly."
我們在提供的Colab筆記本中繼續(xù)此聊天,并得到了以下對話:
對話通過準(zhǔn)確描述場景,突出了模型的圖像理解能力。它還展示了它的推理能力,通過邏輯地連接信息來正確推斷蛹會發(fā)生什么,并解釋為什么有些蛹是棕色的,而有些蛹是綠色的。
模因圖像示例
在這個例子中,我將向模型展示我自己創(chuàng)建的模因,以評估Llama的OCR能力并確定它是否理解我的幽默感。
instructions = "You are a computer vision engineer with sense of humor."
prompt = instructions + "Can you explain this meme to me?"
response, messages,images= chat_with_mllm ( model, processor, prompt,
images_path=[img_path,],
do_sample=True,
temperature=0.5,
show_image=True,
messages=[],
images=[])
這是輸入模因:
作者制作的表情包。原始熊圖像由??Hans-Jurgen Mager??制作。
這是模型的回應(yīng):
我們可以看到,該模型展示了出色的OCR能力,并理解了圖像中文本的含義。至于它的幽默感——你覺得怎么樣,它明白了嗎?你明白了嗎?也許我也應(yīng)該努力培養(yǎng)我的幽默感!
結(jié)束語
在本文中,我們學(xué)習(xí)了如何在本地構(gòu)建Llama3.2-Vision模型并管理聊天式交互的對話歷史記錄,從而增強(qiáng)用戶參與度。我們探索了Llama 3.2的零樣本能力,并領(lǐng)悟了其場景理解、推理和OCR技能。
我們還可以將其他一些高級技術(shù)應(yīng)用于Llama 3.2,例如對獨(dú)特數(shù)據(jù)進(jìn)行微調(diào),或使用檢索增強(qiáng)生成(RAG)來進(jìn)行預(yù)測并減少幻覺。
總體而言,本文帶領(lǐng)你深入了解了快速發(fā)展的多模態(tài)LLM領(lǐng)域及其在各種應(yīng)用中的強(qiáng)大功能。
參考文獻(xiàn)
【0】本文示例項(xiàng)目在Colab Notebook地址:??https://gist.github.com/Lihi-Gur-Arie/0e87500813c29bb4c4a6a990795c3aaa??
【1】Llama 3模型介紹地址:https://arxiv.org/pdf/2407.21783
【2】Llama 3.2 11B Vision模型要求:https://llamaimodel.com/requirements-3-2/
譯者介紹
朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計算機(jī)教師,自由編程界老兵一枚。
原文標(biāo)題:??Chat with Your Images Using Llama 3.2-Vision Multimodal LLMs??,作者:Lihi Gur Arie
