好奇这张照片是在哪里拍摄的?问 LLaVA!(图片来自Pixabay的Guy Rey-Bellet)。
LLaVA(L arge L anguage 和V isual A ssistant 的缩写)是一种很有前途的开源生成式人工智能模型,它复制了 OpenAI GPT-4 在图像对话方面的一些功能。用户可以将图像添加到 LLaVA 聊天对话中,这样就可以讨论这些图像的内容,也可以用它们来以视觉方式描述想法、背景或情况。
LLaVA 最引人注目的特点是它能够在使用更简单的模型架构和更少的训练数据的同时改进其他开源解决方案。这些特性使 LLaVA 不仅训练速度更快、成本更低,而且更适合在消费级硬件上进行推理。
这篇文章概述了 LLaVA,更具体地说旨在
- 展示如何从 Web 界面试用它,以及如何将它安装在您的计算机或笔记本电脑上
- 解释其主要技术特点
- 说明如何使用它进行编程,以在 Google Colab 上使用 HuggingFace 库( Transformers和Gradio )构建的简单聊天机器人应用程序为例。
在线使用 LLaVA
如果您还没有尝试过,使用 LLaVA 最简单的方法是访问其作者提供的Web 界面。下面的屏幕截图说明了界面的运行方式,用户可以根据冰箱内容的图片询问该做什么饭菜。可以使用左侧的小部件加载图像,聊天界面允许提问并以文本形式获得答案。
LLaVA Web 界面
在这个例子中,LLaVA 正确识别了冰箱里的食材,例如蓝莓、草莓、胡萝卜、酸奶或牛奶,并提出了相关的建议,例如水果沙拉、冰沙或蛋糕。
项目网站上给出了与 LLaVA 对话的其他示例,说明 LLaVA 不仅能够描述图像,还能够根据图像中的元素进行推断和推理(使用图片中的线索识别电影或人物、根据图画编码网站、解释幽默情景等)。
在本地运行 LLaVA
LLaVA 还可以使用Ollama或 Mozilla 的“ llamafile ”安装在本地机器上。这些工具可以在大多数仅配备 CPU 的消费级机器上运行,因为该模型只需要 8GB 的 RAM 和 4GB 的可用磁盘空间,甚至被证明可以在 Raspberry PI 上成功运行。在围绕 Ollama 项目开发的工具和界面中,一个值得注意的举措是Ollama-WebUI(如下图所示),它再现了 OpenAI ChatGPT 用户界面的外观和感觉。
Ollama Web 用户界面——受OpenAI ChatGPT启发
LLaVA 主要功能简要概述
LLaVA 由威斯康星大学麦迪逊分校、微软研究院和哥伦比亚大学的研究人员设计,最近在 NeurIPS 2023 上展出。该项目的代码和技术规范可以在其Github 存储库中访问,它还提供了与助手交互的各种界面。
正如作者在论文摘要中总结的那样:
[LLava] 在 11 个基准测试中取得了最佳成绩。我们最终的 13B 检查点仅使用 1.2M 公开数据,并在单个 8-A100 节点上约 1 天内完成完整训练。我们希望这可以让最先进的 LMM 研究更容易获得。代码和模型将公开。
基准测试结果(如下面的雷达图所示)说明了与其他最先进模型相比的改进。
LLaVA 基准测试结果雷达图(图片来自论文)
内部工作原理
LLaVA 的数据处理工作流程在概念上很简单。该模型本质上是一个标准的因果语言模型,将语言指令(用户文本提示)作为输入,并返回语言响应。语言模型处理图像的能力是由一个单独的视觉编码器模型实现的,该模型将图像转换为语言标记,这些标记会悄悄地添加到用户文本提示中(充当一种软提示)。LLaVA 流程如下所示。
LLaVA 网络架构(图片来自论文)
LLaVA 的语言模型和视觉编码器依赖于两个参考模型,分别为 Vicuna 和 CLIP。Vicuna是一个基于 LLaMA-2(由 Meta 设计)的预训练大型语言模型,其性能与中型 LLM 相当(请参阅HuggingFace 上7B和13B版本的模型卡)。CLIP是一个由 OpenAI 设计的图像编码器,经过预训练,可使用对比语言图像预训练在类似的嵌入空间中对图像和文本进行编码(因此称为“CLIP”)。LLaVA 中使用的模型是视觉转换器变体 CLIP-ViT-L/14(请参阅 HuggingFace 上的模型卡)。
为了使视觉编码器的尺寸与语言模型的尺寸相匹配,应用了一个投影模块(上图中的W )。在原始LLaVA中它是一个简单的线性投影,而在LLaVA 1.5中它是一个两层感知器。
训练过程
LLaVA 的训练过程包括两个相对简单的阶段。
第一阶段仅旨在调整投影模块W,视觉编码器和 LLM 的权重保持不变。训练使用CC3M 概念字幕数据集中约 600k 个图像/字幕对的子集进行,可在此存储库中的HuggingFace 上获取。
在第二阶段,使用 158K 语言图像指令跟踪数据集对投影模块权重W与 LLM 权重进行微调(同时保持视觉编码器的权重不变)。该数据是使用 GPT4 生成的,包含对话示例、详细描述和复杂推理,可在 HuggingFace 的此存储库中找到。
整个训练使用八个 A100 GPU,大约需要一天时间。
使用 LLaVA 进行编程:如何开始
代码可在Colab 相关笔记本上找到。
LLaVA 模型集成在 Transformers 库中,可以使用标准管道对象加载。模型的 7B 和 13B 变体可在LLaVA 😊 Hub 空间上使用,并且可以以 4 位和 8 位加载以节省 GPU 内存。我们在下面说明如何使用可以在具有 T4 TPU(15GB RAM GPU)的 Colab 上执行的代码加载和运行模型。
下面是以 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})
然后让我们加载这张图片
我们使用标准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 模型,并要求描述图片。
注意:提示的格式如下
“用户:<图像>\n<提示>\n助手:”
prompt = "USER: <image>\nDescribe this picture\nASSISTANT:" outputs = pipe(image, prompt=prompt, generate_kwargs={"max_new_tokens": 200}) print(outputs[0]['generated_text'])
返回以下答案:
用户:描述一下这张照片助理:图片中是一座空旷的大露天剧场,背景是壮丽的海景。露天剧场周围是郁郁葱葱的绿色山坡,远处是一座雄伟的山脉。景色宁静而美丽,阳光明媚,大地熠熠生辉。
LLaVA 聊天机器人
最后,让我们创建一个依赖于 LLaVA 模型的简单聊天机器人。我们将使用Gradio 库,它提供了一种快速简便的方法来创建机器学习 Web 界面。
界面的核心由一行图像上传器(一个 Gradio Image 对象)和一个聊天界面(一个 Gradio 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] )
聊天界面连接到函数update_conversation,该函数负责保存对话历史记录,并在用户发送消息时调用 LLaVA 模型进行响应。
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:]
调用launch方法启动接口。
demo.launch(debug=True)
几秒钟后,聊天机器人 Web 界面将出现:
恭喜,您的 LLaVA 聊天机器人现已启动并运行!
欢迎前往我们的公众号,资讯
创作不易,觉得不错的话,点个赞吧!!!