LLaVA:GPT-4V(ision)?的開源替代品
譯文LLaVA(大型語言和視覺助理)(鏈接::https://llava-vl.github.io/)是一個很有前途的開源生成式人工智能模型,它復(fù)制了OpenAI GPT-4在圖像轉(zhuǎn)換方面的一些功能。用戶可以將圖像添加到LLaVA聊天對話中,允許討論這些圖像的內(nèi)容,也可以將其用作以視覺方式描述想法、上下文或情況的一種方式。
LLaVA最引人注目的特點是它能夠改進其他開源的解決方案,同時使用更簡單的模型架構(gòu)和數(shù)量級更少的訓(xùn)練數(shù)據(jù)。這些特性使LLaVA不僅訓(xùn)練更快、更便宜,而且更適合在消費類硬件上進行推理。
這篇文章旨在概述LLaVA的主要功能,更具體地說:
- 展示如何從Web界面進行實驗,以及如何將其安裝在您的計算機或筆記本電腦上。
- 解釋其主要技術(shù)特征。
- 舉例說明如何使用它進行編程,將使用Google Colab上的HuggingFace庫(Transformers和Gradio)構(gòu)建一個簡單的聊天機器人應(yīng)用程序。
在線使用LLaVA
如果您還沒有嘗試過,那么使用LLaVA最簡單的方法是轉(zhuǎn)到其作者提供的Web界面(https://llava.hliu.cc/)。下面的屏幕截圖展示了該界面的操作方式,用戶在給出冰箱內(nèi)容圖片的情況下,詢問該怎么吃。你可以使用界面中左側(cè)的小部件加載圖像,聊天界面允許以文本的形式提問和獲得答案。
LLaVA Web界面
在這個例子中,LLaVA能夠正確地識別冰箱中存在的成分,如藍莓、草莓、胡蘿卜、酸奶或牛奶,并提出了相關(guān)的想法,如水果沙拉、奶昔或蛋糕。
項目網(wǎng)站(https://llava-vl.github.io/)上還提供了與LLaVA對話的其他例子,這些例子表明LLaVA不僅能夠描述圖像,而且能夠根據(jù)圖像中的元素進行推斷和推理(使用圖片中的線索識別電影或人物,根據(jù)繪圖對網(wǎng)站進行編碼,解釋幽默的情況,等等)。
本地運行LLaVA
LLaVA也可以借助于Ollama(https://ollama.ai/)或Mozilla的“l(fā)lamafile”(https://github.com/Mozilla-Ocho/llamafile)安裝在本地機器上。這些工具可以在大多數(shù)僅使用CPU的消費級機器上運行,因為該模型只需要8GB的RAM和4GB的可用磁盤空間,甚至可以在Raspberry PI上成功運行。在圍繞Ollama項目開發(fā)的工具和界面中,一個值得注意的辦法是Ollama WebUI(https://github.com/ollama-webui/ollama-webui,如下圖所示),它再現(xiàn)了OpenAI ChatGPT用戶界面的外觀。
Ollama Web用戶界面——靈感來自O(shè)penAI ChatGPT
LLaVA主要功能概述
LLaVA由威斯康星大學(xué)麥迪遜分校、微軟研究所和哥倫比亞大學(xué)的研究人員共同設(shè)計而成,最近在NeurIPS 2023上展出。該項目的代碼和技術(shù)規(guī)范可以在其Github存儲庫(https://github.com/haotian-liu/LLaVA)中訪問,該存儲庫還提供了與助理交互的各種接口。
正如作者在論文摘要(https://arxiv.org/pdf/2310.03744.pdf)中總結(jié)的那樣:
“LLaVA在11個基準(zhǔn)測試中達到了最先進的水平。我們的最終13B檢查點僅使用了120萬個公開可用的數(shù)據(jù),并在單個8-A100級節(jié)點上在約1天內(nèi)完成了完整的訓(xùn)練。我們希望這能使最先進的LMM研究更容易訪問。有關(guān)研究代碼和模型都將以開源方式發(fā)布?!?/span>
此論文中以雷達圖的形式報告的基準(zhǔn)結(jié)果說明了它與其他最先進的模型相比的改進情況。
LLaVA基準(zhǔn)結(jié)果雷達圖(圖片來自論文https://arxiv.org/pdf/2304.08485.pdf)
內(nèi)部工作原理
LLaVA的數(shù)據(jù)處理工作流程在概念上很簡單。該模型本質(zhì)上是一個標(biāo)準(zhǔn)的因果語言模型,以語言指令(用戶文本提示)為輸入,并返回語言響應(yīng)。語言模型處理圖像的能力是由一個單獨的視覺編碼器模型所支持的,該模型將圖像轉(zhuǎn)換為語言標(biāo)記,這些標(biāo)記被“悄悄地”添加到用戶文本提示中(充當(dāng)一種軟提示)。LLaVA的整體實現(xiàn)流程如下圖所示:
LLaVA網(wǎng)絡(luò)架構(gòu)(圖片來自論文https://arxiv.org/pdf/2304.08485.pdf)
LLaVA的語言模型和視覺編碼器分別依賴于兩個參考模型,即Vicuna和CLIP。其中,Vicuna(https://lmsys.org/blog/2023-03-30-vicuna/)是一個基于LLaMA-2(由Meta設(shè)計)的預(yù)訓(xùn)練大型語言模型,具有與中等規(guī)模LLM競爭的性能(請參閱HuggingFace上的7B和13B版本的模型卡)。CLIP(https://openai.com/research/clip)是由OpenAI設(shè)計的圖像編碼器,使用對比語言圖像預(yù)訓(xùn)練(因此稱為“CLIP”)技術(shù)進行預(yù)訓(xùn)練,從而能夠在類似的嵌入空間中對圖像和文本進行編碼。LLaVA中使用的模型是視覺轉(zhuǎn)換器變體CLIP-ViT-L/14(請參閱HuggingFace上的模型卡:https://huggingface.co/openai/clip-vit-large-patch14)。
為了使視覺編碼器的尺寸與語言模型的尺寸相匹配,應(yīng)用了投影模塊(上圖中的W)。它實際上是原始LLaVA中的簡單線性投影,以及LLaVA 1.5中的兩層感知器。
訓(xùn)練過程
LLaVA的訓(xùn)練過程由兩個相對簡單的階段組成。
第一階段僅為了實現(xiàn)微調(diào)投影模塊W,此階段中視覺編碼器和LLM的權(quán)重保持凍結(jié)。這個階段使用來自CC3M概念字幕數(shù)據(jù)集(https://ai.google.com/research/ConceptualCaptions/)的約600k個圖像/字幕對的子集進行訓(xùn)練,有關(guān)內(nèi)容可在HuggingFace的存儲庫(https://huggingface.co/datasets/liuhaotian/LLaVA-Instruct-150K)上免費獲得。
在第二階段中,使用158K語言圖像指令的數(shù)據(jù)集,將投影模塊權(quán)重W與LLM權(quán)重一起微調(diào)(同時保持視覺編碼器的權(quán)重凍結(jié))。數(shù)據(jù)是使用GPT4生成的,具有對話示例、詳細(xì)描述和復(fù)雜推理的功能,可在HuggingFace的存儲庫(https://huggingface.co/datasets/liuhaotian/LLaVA-Instruct-150K)上免費獲得有關(guān)內(nèi)容。
整個訓(xùn)練大約需要一天的時間,使用八個A100 GPU。
LLaVA基礎(chǔ)編程
本部分相關(guān)代碼可通過Colab相關(guān)筆記本文件(https://colab.research.google.com/drive/1L28bJX14-Y5lJvswYwydsletYFMIxVH5)獲取。
LLaVA模型集成在Transformers庫中,可以使用標(biāo)準(zhǔn)管道對象加載。模型的7B和13B變體均可免費從LLaVA存儲庫空間上獲取,并且可以以4位和8位方式加載以節(jié)省GPU內(nèi)存。接下來,我們將說明如何使用可在帶有T4 TPU(15GB RAM GPU)的Colab上執(zhí)行的代碼加載和運行模型。
以下是用4位方式加載LLaVA 1.5的7B變體的代碼片段:
from transformers import pipeline, BitsAndBytesConfig
import torch
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.float16
)
model_id = "llava-hf/llava-1.5-7b-hf"
pipe = pipeline("image-to-text", model=model_id, model_kwargs={"quantization_config": quantization_config})
然后,讓我們加載此圖片:
我們使用了標(biāo)準(zhǔn)的PIL庫來加載圖片:
import requests
from PIL import Image
image_url = "https://cdn.pixabay.com/photo/2018/01/29/14/13/italy-3116211_960_720.jpg"
image = Image.open(requests.get(image_url, stream=True).raw)
image
最后,讓我們用圖像來查詢LLaVA模型,并提示要求描述圖片。
注意,提示的格式(https://huggingface.co/docs/transformers/model_doc/llava)如下:
“USER: <image>\n<prompt>\nASSISTANT:”
相關(guān)代碼如下:
prompt = "USER: <image>\nDescribe this picture\nASSISTANT:"
outputs = pipe(image, prompt=prompt, generate_kwargs={"max_new_tokens": 200})
print(outputs[0]['generated_text'])
返回了以下答案:
USER: Describe this picture
ASSISTANT: The image features a large, empty amphitheater with a stunning view of the ocean in the background. The amphitheater is surrounded by a lush green hillside, and a majestic mountain can be seen in the distance. The scene is serene and picturesque, with the sun shining brightly over the landscape.
創(chuàng)建LLaVA聊天機器人
最后,讓我們創(chuàng)建一個簡單的依賴于LLaVA模型的聊天機器人。我們將使用Gradio庫(https://www.gradio.app/),它提供了一種快速簡便的方法來創(chuàng)建機器學(xué)習(xí)Web界面。
接口的核心由一行代碼組成,該行包含一個圖像上傳組件(Gradio image對象)和一個聊天接口(Gradio ChatInterface對象:https://www.gradio.app/docs/chatinterface)。
import gradio as gr
with gr.Blocks() as demo:
with gr.Row():
image = gr.Image(type='pil', interactive=True)
gr.ChatInterface(
update_conversation, additional_inputs=[image]
)
聊天界面連接到函數(shù)update_conversation,該函數(shù)負(fù)責(zé)保存對話歷史記錄,并在用戶發(fā)送消息時調(diào)用LLaVA模型進行響應(yīng)。
def update_conversation(new_message, history, image):
if image is None:
return "Please upload an image first using the widget on the left"
conversation_starting_from_image = [[user, assistant] for [user, assistant] in history if not assistant.startswith('Please')]
prompt = "USER: <image>\n"
for i in range(len(history)):
prompt+=history[i][0]+'ASSISTANT: '+history[i][1]+"USER: "
prompt = prompt+new_message+'ASSISTANT: '
outputs = pipe(image, prompt=prompt, generate_kwargs={"max_new_tokens": 200, "do_sample" : True, "temperature" : 0.7})[0]['generated_text']
return outputs[len(prompt)-6:]
下面的代碼通過調(diào)用launch方法啟動接口。
demo.launch(debug=True)
幾秒鐘后,聊天機器人Web界面即將出現(xiàn):
祝賀您,您的LLaVA聊天機器人現(xiàn)已啟動并成功運行!
注:除非另有說明;否則,文中所有圖片均由作者本人提供。
參考文獻
- HuggingFace LLaVA model documentation(HuggingFace LLaVA參考文檔),https://huggingface.co/docs/transformers/model_doc/llava。
- Llava Hugging Face organization(Llava Hugging Face組織架構(gòu)),https://huggingface.co/llava-hf。
- Loading and running LLaVA with AutoPrecessor and LLaVAForConditionalGeneration: Colab notebook(使用AutoPrecessor和LLaVAForConditionalGeneration加載和運行LLaVA),https://colab.research.google.com/drive/1_q7cOB-jCu3RExrkhrgewBR0qKjZr-Sx。
- GPT-4V(ision) system card(GPT-4V(vision)系統(tǒng)卡),https://cdn.openai.com/papers/GPTV_System_Card.pdf。
- Understanding Visual Instruction Tuning(了解可視化指令微調(diào)),https://newsletter.artofsaience.com/p/understanding-visual-instruction。
譯者介紹
朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。
原文標(biāo)題:LLaVA: An open-source alternative to GPT-4V(ision),作者:Yann-A?l Le Borgne
鏈接:https://towardsdatascience.com/llava-an-open-source-alternative-to-gpt-4v-ision-b06f88ce8efa。