本地部署 Llama-3-EvoVLM-JP-v2

embedded/2024/9/18 12:53:28/ 标签: llama, EvoVLM, VLM, 人工智能

本地部署 Llama-3-VLM.html" title=EvoVLM>EvoVLM-JP-v2

  • 0. 引言
  • 1. 关于 Llama-3-VLM.html" title=EvoVLM>EvoVLM-JP-v2
  • 2. 本地部署
    • 2-0. 克隆代码
    • 2-1. 安装依赖模块
    • 2-2. 创建 Web UI
    • 2-3.启动 Web UI
    • 2-4. 访问 Web UI

0. 引言

Sakana AI 提出了一种称为进化模型合并的方法,并使用该方法创建大规模语言模型(LLM )、视觉语言模型(VLM)和图像生成模型,他们创建了具有各种功能的合并模型。这次,他们发布了一个新的日本 VLM,Llama-3-VLM.html" title=EvoVLM>EvoVLM-JP-v2,它利用进化模型合并来实现多个图像的问答。此外,为了评估构建的模型,他们还将发布一个数据集:日语多图像视觉问答(JA-Multi-Image-VQA),以评估用日语回答有关多个图像的问题的能力。

VLM.html" title=EvoVLM>EvoVLMJPv2_8">1. 关于 Llama-3-VLM.html" title=EvoVLM>EvoVLM-JP-v2

VLM研究LLM它是发展最快的领域之一。最近,VLM的研究不断取得进展,不仅提高了单图像描绘和问答的性能,而且还具备处理视频和多图像的能力。另一方面,这种新型的VLM主要是在英语国家开发的,在非英语国家仍然基本上不存在。日语也是如此;虽然已经开发了几种日语VLM,但这种类型的尖端VLM仍然不多。因此,Sakana AI 使用进化模型融合来创建这种新型的英语 VLM 和日语 VLM。他们认为通过合并这些LLM,他们可以快速构建一个尖端的日本 VLM

在构建新的VLM时,底层模型是开源模型。LLM其中,他们选择了Llama-3,它具有高性能,并且各种额外训练的模型都是公开的。有几种使用 Llama-3 创建的高性能 VLM,但Mantis-8B-SigLIP-Llama-3是一种前所未有的 VLM,可以将输入图像放置在我选择的输入文本中的任何位置。高性能日语培训,帮助学生获得日语能力。LLM他们使用Llama-3-ELYZA-JP-8B 。首先,通过合并这两个模型,他们成功构建了“可以处理多个图像的日本 VLM”。此外,他们还添加了一个名为Bunny-v1.1-Llama-3-8B-V的高性能英文VLM来增强图像渲染能力。LLM这些部件也被添加到合并中。

2. 本地部署

2-0. 克隆代码

git clone https://huggingface.co/spaces/SakanaAI/Llama-3-VLM.html" title=EvoVLM>EvoVLM-JP-v2; cd Llama-3-VLM.html" title=EvoVLM>EvoVLM-JP-v2

2-1. 安装依赖模块

pip install git+https://github.com/TIGER-AI-Lab/Mantis.git

2-2. 创建 Web UI

# webui.py
import gradio as gr
import time
import subprocessimport torchfrom models.mllava import (MLlavaProcessor,LlavaForConditionalGeneration,prepare_inputs,
)
from models.conversation import Conversation, SeparatorStyle
from transformers import TextIteratorStreamer
from transformers.utils import is_flash_attn_2_available
from threading import Threaddevice = "cuda" if torch.cuda.is_available() else "cpu"
IMAGE_TOKEN = "<image>"
generation_kwargs = {"max_new_tokens": 1024,"num_beams": 1,"do_sample": False,"no_repeat_ngram_size": 3,
}if not is_flash_attn_2_available():subprocess.run('pip install flash-attn --no-build-isolation', env={'FLASH_ATTENTION_SKIP_CUDA_BUILD': "TRUE"},shell=True)processor = MLlavaProcessor.from_pretrained("TIGER-Lab/Mantis-8B-siglip-llama3")
processor.tokenizer.pad_token = processor.tokenizer.eos_tokenmodel = LlavaForConditionalGeneration.from_pretrained("SakanaAI/Llama-3-VLM.html" title=EvoVLM>EvoVLM-JP-v2",torch_dtype=torch.float16,attn_implementation="flash_attention_2",device_map=device,
).eval()# Set the system prompt
conv_template = Conversation(system="<|start_header_id|>system<|end_header_id|>\n\nあなたは誠実で優秀な日本人のアシスタントです。特に指示が無い場合は、常に日本語で回答してください。",roles=("user", "assistant"),messages=(),offset=0,sep_style=SeparatorStyle.LLAMA_3,sep="<|eot_id|>",
)def get_chat_messages(history):chat_history = []user_role = conv_template.roles[0]assistant_role = conv_template.roles[1]for i, message in enumerate(history):if isinstance(message[0], str):chat_history.append({"role": user_role, "text": message[0]})if i != len(history) - 1:assert message[1], "The bot message is not provided, internal error"chat_history.append({"role": assistant_role, "text": message[1]})else:assert not message[1], "the bot message internal error, get: {}".format(message[1])chat_history.append({"role": assistant_role, "text": ""})return chat_historydef get_chat_images(history):images = []for message in history:if isinstance(message[0], tuple):images.extend(message[0])return imagesdef add_message(history, message):return history, gr.MultimodalTextbox(interactive=False)def bot(history, message):images = message["files"] if message["files"] else Nonetext = message["text"].strip()if not text:raise gr.Error("You must enter a message!")num_image_tokens = text.count(IMAGE_TOKEN)# modify textif images and num_image_tokens < len(images):if num_image_tokens != 0:gr.Warning("The number of images uploaded is more than the number of <image> placeholders in the text. Will automatically prepend <image> to the text.")# prefix image tokenstext = IMAGE_TOKEN * (len(images) - num_image_tokens) + textif images and num_image_tokens > len(images):raise gr.Error("The number of images uploaded is less than the number of <image> placeholders in the text!")current_messages = []if images:current_messages += [[(image,), None] for image in images]if text:current_messages += [[text, None]]current_history = history + current_messages# chat_messages = get_chat_messages(current_history)# chat_images = get_chat_images(current_history)chat_messages = get_chat_messages(current_messages)chat_images = get_chat_images(current_messages)# Generate!inputs = prepare_inputs(None, chat_images, model, processor, history=chat_messages, **generation_kwargs)streamer = TextIteratorStreamer(processor, skip_prompt=True, skip_special_tokens=True)inputs["streamer"] = streamerthread = Thread(target=model.generate, kwargs=inputs)thread.start()buffer = ""for new_text in streamer:buffer += new_texttime.sleep(0.01)# yield buffercurrent_history[-1] = (current_history[-1][0], buffer)yield current_historyexamples = [{"text": "1番目と2番目の画像に写っている動物の違いは何ですか?簡潔に説明してください。","files": ["./examples/image_0.jpg", "./examples/image_1.jpg"],},{"text": "2枚の写真について、簡単にそれぞれ説明してください。","files": ["./examples/image_2.jpg", "./examples/image_3.jpg"],},
]with gr.Blocks(fill_height=True) as demo:chatbot = gr.Chatbot(elem_id="chatbot",bubble_full_width=False,scale=1,)chat_input = gr.MultimodalTextbox(interactive=True,file_types=["image"],placeholder="Enter message or upload images. Please use <image> to indicate the position of uploaded images",show_label=True,render=True,)examples = gr.Examples(examples, [chat_input], [])chat_msg = chat_input.submit(add_message, [chatbot, chat_input], [chatbot, chat_input])bot_msg = chat_msg.then(bot, [chatbot, chat_input], chatbot, api_name="bot_response")bot_msg.then(lambda: gr.MultimodalTextbox(value=None, interactive=True), None, [chat_input])demo.queue().launch()

2-3.启动 Web UI

python webui.py

2-4. 访问 Web UI

使用浏览器打开 http://localhost:7860,

在这里插入图片描述
完结!


http://www.ppmy.cn/embedded/92813.html

相关文章

Kotlin 和 Java区别

Kotlin 和 Java 是两种主要用于 Android 开发的编程语言&#xff0c;它们之间有一些关键的区别&#xff1a; 1. 语法简洁性&#xff1a; Kotlin&#xff1a;具有更简洁的语法&#xff0c;减少了冗余代码。例如&#xff0c;Kotlin 支持类型推断&#xff0c;避免了大量的样板…

【vue3】【elementPlus】【国际化】

1.如需从0-1开始&#xff0c;请参考 https://blog.csdn.net/Timeguys/article/details/140995569 2.使用 vue-i18n 模块&#xff1a; npm i vue-i18n3.在 src 目录下创建 locales 目录&#xff0c;里面创建文件&#xff1a;en.js、zh-cn.js、index.js 语言js文件&#xff1a;…

【C++】STL | list (链表)详解及重要函数的实现

目录 前言 总代码 ListNode类框架的建立 (成员与模板) list类的框架 普通构造 与 empty_init&#xff08;适合不同类型构造函数的小函数&#xff09; list的迭代器 引子 operator、operator--&#xff08;前置与后置&#xff09; operator 与 operator! operator* 与 …

观测云产品更新 | 异常追踪、用户访问监测、链路、监控等

观测云更新 新增功能 用户访问监测 新增【热图】。以视觉方式呈现访客与网站的互动情况&#xff0c;获取页面元素的点击数据和点击位置&#xff0c;了解用户的关注点。 应用性能监测 链路新增【安装引导】页面。 监控 新增检测类型&#xff1a;【区间检测 V2】&#xff0c…

Starrocks解析json数组

json数据 [{"spec": "70g/支","unit": "支","skuId": "1707823848651276346","amount": 6,"weight": 70,"spuName": "伊利 甄稀 苦咖啡味雪糕 流心冰淇淋 70g/支",&quo…

【Python】requests获取网络响应的时候,遇到url超过最大重试次数的解决方法

我们在使用requests连接网址后&#xff0c;获取网络响应的时候&#xff0c;有时候可能会遇到这样的问题&#xff1a; 问题&#xff1a; Maxretries exceeded with url: /tags-%E9%A1%B9%E7%9B%AE-5.html(Caused by SSLError(SSLEOFError(8,‘EOFoccurred in violation of prot…

JavaScript 浅拷贝深拷贝

浅拷贝 浅拷贝是指创建一个新对象&#xff0c;这个对象有着原始对象属性值的一份精确拷贝。换句话说&#xff0c;拷贝过程中&#xff0c;只复制了对象的第一层属性&#xff0c;而不是递归复制整个对象及其嵌套对象。 Object.assign() let original { a: 1, b: { c: 2 } }; …

Stable Diffusion绘画 | 图生图-涂鸦重绘

涂鸦重绘的整体参数配置&#xff0c;与局部重绘基本一致&#xff0c;仅多了一个蒙版透明度的参数。 都是对局部区域进行重新绘制&#xff0c;但它不仅能识别蒙版的区域&#xff0c;同时还能识别画笔颜色。 例如&#xff0c;对图片中的人物脸部&#xff0c;使用蓝色的画笔&…

react案例1:todoList

案例效果&#xff1a; 一、App组件和header输入框的交互&#xff1a; 需求&#xff1a;header输入框中输入活动项&#xff0c;回车之后添加在app组件的state状态中 实现&#xff1a;1、通过在App父组件中添加一个事件&#xff0c;子组件中可以通过this.props.a的方法触发&am…

php 中 (0 == ‘abc‘) 为真

https://andi.cn/page/621653.html

算法力扣刷题记录 六十九【动态规划基础及509. 斐波那契数】

前言 调整一下做题顺序&#xff0c;多个章节同步进行&#xff0c;穿插练习。可以在各章节的专栏中找同一类。 记录 六十九【动态规划基础】。 一、动态规划理论基础学习 参考学习链接 二、509. 斐波那契数 2.1 题目阅读 斐波那契数 &#xff08;通常用 F(n) 表示&#x…

4G工业路由器赋能智能停车场远程监控管理

随着城市化进程的加快和汽车保有量的不断增加&#xff0c;城市停车问题艰巨。传统停车场管理模式存在诸多弊端&#xff0c;如停车位信息不透明、寻找停车位耗时长、停车管理效率低下等。为了有效解决这些问题&#xff0c;提升城市停车管理水平&#xff0c;结合物联网技术4G工业…

末日期权暴涨的条件是什么?

末日期权一般是指期权合约快到期的一周或者最后三天&#xff0c;当然最后一天就是末日期权的疯狂。我们可能经常听到期权市场某一天突然合约可能暴涨几百倍甚至上千倍&#xff0c;或暴跌几百&#xff0c;这就是期权的末日轮效应&#xff0c;今天我们就来聊一下末日期权暴涨的条…

usb 线内部结构

最近发现需要用到usb3.0 的调试线&#xff0c;和常规的usb3.0 线还不一样&#xff0c;特别是用来调试OS 和驱动&#xff0c;特别将usb 这部分的插口和线的知识整理下。 usb 接插件 总结 usb3.0 线 typec 内部 usb 线对应插口的编号 usb3.0 调试线 参考 https://www.…

Cesium初探2

话不多说&#xff0c;咱们来看如何使用Cesium开始项目 Vue3ViteCesium 使用pnpm创建项目 pnpm create vite my_cesium安装项目依赖 pnpm install安装Cesium包 pnpm install -g cesium1.99 vite-plugin-cesium 修改vite.config.js文件 import{ defineConfig } from vite …

【C++ 面试 - 基础题】每日 3 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

拯救PyCharm:击退IDE内存泄漏的策略

拯救PyCharm&#xff1a;击退IDE内存泄漏的策略 PyCharm&#xff0c;作为一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;在处理大型项目或长时间开发过程中&#xff0c;可能会遇到内存泄漏的问题&#xff0c;导致IDE运行缓慢甚至崩溃。本文将提供一系列解…

单 元 测 试

单元测试是软件开发中的一种测试方法,它专注于对软件中的最小可测试单元(通常是单个函数或方法)进行验证。这种测试方法的目的是确保每个这样的单元都能独立地按照预期工作。 下面是单元测试的一些关键特点: 隔离性: 单元测试通常在一个与系统其他部分隔离的环境中运行,…

9. Kubernetes与Docker入门

Kubernetes&#xff08;简称 K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它提供了强大的功能&#xff0c;包括服务发现、负载均衡、自动化部署、容器编排以及高可用性等&#xff0c;使得应用的管理变得更加高效和可靠。本…

《剑指offer》题目 C++详细题解

LCR 121.寻找目标值 - 二维数组 核心考点&#xff1a;数组相关&#xff0c;特性观察&#xff0c;时间复杂度的把握 正常的查找过程&#xff0c;本质就是排除的过程&#xff0c;如果使用两个for循环进行查找&#xff0c;本质是一次排除一个&#xff0c;效率比较低&#xff0c;而…