LLaVA:GPT-4V(ision)?的開(kāi)源替代品
譯文LLaVA(大型語(yǔ)言和視覺(jué)助理)(鏈接::https://llava-vl.github.io/)是一個(gè)很有前途的開(kāi)源生成式人工智能模型,它復(fù)制了OpenAI GPT-4在圖像轉(zhuǎn)換方面的一些功能。用戶(hù)可以將圖像添加到LLaVA聊天對(duì)話(huà)中,允許討論這些圖像的內(nèi)容,也可以將其用作以視覺(jué)方式描述想法、上下文或情況的一種方式。
LLaVA最引人注目的特點(diǎn)是它能夠改進(jìn)其他開(kāi)源的解決方案,同時(shí)使用更簡(jiǎn)單的模型架構(gòu)和數(shù)量級(jí)更少的訓(xùn)練數(shù)據(jù)。這些特性使LLaVA不僅訓(xùn)練更快、更便宜,而且更適合在消費(fèi)類(lèi)硬件上進(jìn)行推理。
這篇文章旨在概述LLaVA的主要功能,更具體地說(shuō):
- 展示如何從Web界面進(jìn)行實(shí)驗(yàn),以及如何將其安裝在您的計(jì)算機(jī)或筆記本電腦上。
- 解釋其主要技術(shù)特征。
- 舉例說(shuō)明如何使用它進(jìn)行編程,將使用Google Colab上的HuggingFace庫(kù)(Transformers和Gradio)構(gòu)建一個(gè)簡(jiǎn)單的聊天機(jī)器人應(yīng)用程序。
在線使用LLaVA
如果您還沒(méi)有嘗試過(guò),那么使用LLaVA最簡(jiǎn)單的方法是轉(zhuǎn)到其作者提供的Web界面(https://llava.hliu.cc/)。下面的屏幕截圖展示了該界面的操作方式,用戶(hù)在給出冰箱內(nèi)容圖片的情況下,詢(xún)問(wèn)該怎么吃。你可以使用界面中左側(cè)的小部件加載圖像,聊天界面允許以文本的形式提問(wèn)和獲得答案。
LLaVA Web界面
在這個(gè)例子中,LLaVA能夠正確地識(shí)別冰箱中存在的成分,如藍(lán)莓、草莓、胡蘿卜、酸奶或牛奶,并提出了相關(guān)的想法,如水果沙拉、奶昔或蛋糕。
項(xiàng)目網(wǎng)站(https://llava-vl.github.io/)上還提供了與LLaVA對(duì)話(huà)的其他例子,這些例子表明LLaVA不僅能夠描述圖像,而且能夠根據(jù)圖像中的元素進(jìn)行推斷和推理(使用圖片中的線索識(shí)別電影或人物,根據(jù)繪圖對(duì)網(wǎng)站進(jìn)行編碼,解釋幽默的情況,等等)。
本地運(yùn)行LLaVA
LLaVA也可以借助于Ollama(https://ollama.ai/)或Mozilla的“l(fā)lamafile”(https://github.com/Mozilla-Ocho/llamafile)安裝在本地機(jī)器上。這些工具可以在大多數(shù)僅使用CPU的消費(fèi)級(jí)機(jī)器上運(yùn)行,因?yàn)樵撃P椭恍枰?GB的RAM和4GB的可用磁盤(pán)空間,甚至可以在Raspberry PI上成功運(yùn)行。在圍繞Ollama項(xiàng)目開(kāi)發(fā)的工具和界面中,一個(gè)值得注意的辦法是Ollama WebUI(https://github.com/ollama-webui/ollama-webui,如下圖所示),它再現(xiàn)了OpenAI ChatGPT用戶(hù)界面的外觀。
Ollama Web用戶(hù)界面——靈感來(lái)自O(shè)penAI ChatGPT
LLaVA主要功能概述
LLaVA由威斯康星大學(xué)麥迪遜分校、微軟研究所和哥倫比亞大學(xué)的研究人員共同設(shè)計(jì)而成,最近在NeurIPS 2023上展出。該項(xiàng)目的代碼和技術(shù)規(guī)范可以在其Github存儲(chǔ)庫(kù)(https://github.com/haotian-liu/LLaVA)中訪問(wèn),該存儲(chǔ)庫(kù)還提供了與助理交互的各種接口。
正如作者在論文摘要(https://arxiv.org/pdf/2310.03744.pdf)中總結(jié)的那樣:
“LLaVA在11個(gè)基準(zhǔn)測(cè)試中達(dá)到了最先進(jìn)的水平。我們的最終13B檢查點(diǎn)僅使用了120萬(wàn)個(gè)公開(kāi)可用的數(shù)據(jù),并在單個(gè)8-A100級(jí)節(jié)點(diǎn)上在約1天內(nèi)完成了完整的訓(xùn)練。我們希望這能使最先進(jìn)的LMM研究更容易訪問(wèn)。有關(guān)研究代碼和模型都將以開(kāi)源方式發(fā)布?!?/span>
此論文中以雷達(dá)圖的形式報(bào)告的基準(zhǔn)結(jié)果說(shuō)明了它與其他最先進(jìn)的模型相比的改進(jìn)情況。
LLaVA基準(zhǔn)結(jié)果雷達(dá)圖(圖片來(lái)自論文https://arxiv.org/pdf/2304.08485.pdf)
內(nèi)部工作原理
LLaVA的數(shù)據(jù)處理工作流程在概念上很簡(jiǎn)單。該模型本質(zhì)上是一個(gè)標(biāo)準(zhǔn)的因果語(yǔ)言模型,以語(yǔ)言指令(用戶(hù)文本提示)為輸入,并返回語(yǔ)言響應(yīng)。語(yǔ)言模型處理圖像的能力是由一個(gè)單獨(dú)的視覺(jué)編碼器模型所支持的,該模型將圖像轉(zhuǎn)換為語(yǔ)言標(biāo)記,這些標(biāo)記被“悄悄地”添加到用戶(hù)文本提示中(充當(dāng)一種軟提示)。LLaVA的整體實(shí)現(xiàn)流程如下圖所示:
LLaVA網(wǎng)絡(luò)架構(gòu)(圖片來(lái)自論文https://arxiv.org/pdf/2304.08485.pdf)
LLaVA的語(yǔ)言模型和視覺(jué)編碼器分別依賴(lài)于兩個(gè)參考模型,即Vicuna和CLIP。其中,Vicuna(https://lmsys.org/blog/2023-03-30-vicuna/)是一個(gè)基于LLaMA-2(由Meta設(shè)計(jì))的預(yù)訓(xùn)練大型語(yǔ)言模型,具有與中等規(guī)模LLM競(jìng)爭(zhēng)的性能(請(qǐng)參閱HuggingFace上的7B和13B版本的模型卡)。CLIP(https://openai.com/research/clip)是由OpenAI設(shè)計(jì)的圖像編碼器,使用對(duì)比語(yǔ)言圖像預(yù)訓(xùn)練(因此稱(chēng)為“CLIP”)技術(shù)進(jìn)行預(yù)訓(xùn)練,從而能夠在類(lèi)似的嵌入空間中對(duì)圖像和文本進(jìn)行編碼。LLaVA中使用的模型是視覺(jué)轉(zhuǎn)換器變體CLIP-ViT-L/14(請(qǐng)參閱HuggingFace上的模型卡:https://huggingface.co/openai/clip-vit-large-patch14)。
為了使視覺(jué)編碼器的尺寸與語(yǔ)言模型的尺寸相匹配,應(yīng)用了投影模塊(上圖中的W)。它實(shí)際上是原始LLaVA中的簡(jiǎn)單線性投影,以及LLaVA 1.5中的兩層感知器。
訓(xùn)練過(guò)程
LLaVA的訓(xùn)練過(guò)程由兩個(gè)相對(duì)簡(jiǎn)單的階段組成。
第一階段僅為了實(shí)現(xiàn)微調(diào)投影模塊W,此階段中視覺(jué)編碼器和LLM的權(quán)重保持凍結(jié)。這個(gè)階段使用來(lái)自CC3M概念字幕數(shù)據(jù)集(https://ai.google.com/research/ConceptualCaptions/)的約600k個(gè)圖像/字幕對(duì)的子集進(jìn)行訓(xùn)練,有關(guān)內(nèi)容可在HuggingFace的存儲(chǔ)庫(kù)(https://huggingface.co/datasets/liuhaotian/LLaVA-Instruct-150K)上免費(fèi)獲得。
在第二階段中,使用158K語(yǔ)言圖像指令的數(shù)據(jù)集,將投影模塊權(quán)重W與LLM權(quán)重一起微調(diào)(同時(shí)保持視覺(jué)編碼器的權(quán)重凍結(jié))。數(shù)據(jù)是使用GPT4生成的,具有對(duì)話(huà)示例、詳細(xì)描述和復(fù)雜推理的功能,可在HuggingFace的存儲(chǔ)庫(kù)(https://huggingface.co/datasets/liuhaotian/LLaVA-Instruct-150K)上免費(fèi)獲得有關(guān)內(nèi)容。
整個(gè)訓(xùn)練大約需要一天的時(shí)間,使用八個(gè)A100 GPU。
LLaVA基礎(chǔ)編程
本部分相關(guān)代碼可通過(guò)Colab相關(guān)筆記本文件(https://colab.research.google.com/drive/1L28bJX14-Y5lJvswYwydsletYFMIxVH5)獲取。
LLaVA模型集成在Transformers庫(kù)中,可以使用標(biāo)準(zhǔn)管道對(duì)象加載。模型的7B和13B變體均可免費(fèi)從LLaVA存儲(chǔ)庫(kù)空間上獲取,并且可以以4位和8位方式加載以節(jié)省GPU內(nèi)存。接下來(lái),我們將說(shuō)明如何使用可在帶有T4 TPU(15GB RAM GPU)的Colab上執(zhí)行的代碼加載和運(yùn)行模型。
以下是用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庫(kù)來(lái)加載圖片:
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
最后,讓我們用圖像來(lái)查詢(xún)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聊天機(jī)器人
最后,讓我們創(chuàng)建一個(gè)簡(jiǎn)單的依賴(lài)于LLaVA模型的聊天機(jī)器人。我們將使用Gradio庫(kù)(https://www.gradio.app/),它提供了一種快速簡(jiǎn)便的方法來(lái)創(chuàng)建機(jī)器學(xué)習(xí)Web界面。
接口的核心由一行代碼組成,該行包含一個(gè)圖像上傳組件(Gradio image對(duì)象)和一個(gè)聊天接口(Gradio ChatInterface對(duì)象: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é)保存對(duì)話(huà)歷史記錄,并在用戶(hù)發(fā)送消息時(shí)調(diào)用LLaVA模型進(jìn)行響應(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:]
下面的代碼通過(guò)調(diào)用launch方法啟動(dòng)接口。
demo.launch(debug=True)
幾秒鐘后,聊天機(jī)器人Web界面即將出現(xiàn):
祝賀您,您的LLaVA聊天機(jī)器人現(xiàn)已啟動(dòng)并成功運(yùn)行!
注:除非另有說(shuō)明;否則,文中所有圖片均由作者本人提供。
參考文獻(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加載和運(yùn)行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專(zhuān)家博客、講師,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。
原文標(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。