一文学会,利用LLaMA 3.2打造能“识图断字”的个人AI助理

人工智能最直接也是最普及的应用之一肯定是聊天机器人,或者叫个人 AI 助理。尽管聊天机器人以各种形式存在了30年,但在过去两年中,这些个人AI助理才真正成为热门应用。它们已经从前沿技术范畴落地到生活的各个方面、社交场合和商业场景中。

虽然它们接入门槛低且易于使用,你打开个网页或 App 就能使用,但许多最好的聊天机器人都是闭源代码。这些平台有自己的好处,比如能上网搜东西、有个性化的用户资料来跟聊天机器人互动,还能用上现在最好的大语言模型。然而,开源社区的技术发展始终与这些闭源产品齐头并进,开源工具也有自己的优势,例如支持灵活的定制化、可微调和与其他技术进行集成。

在本文中,我们将介绍最新和最伟大的开源模型之一:LLaMA 3.2。 它拥有11B参数、计算机视觉算法,在低成本的同时,与GPT-4o mini和Claude 3 - Haiku在多种视觉指令调整基准上的性能相当。此外,它们的轻量级2B参数模型与SOTA边缘模型如PHI mini it和Gemma 2b的性能相当。我们将从这些模型的特殊之处开始介绍。**之后,我们将展示如何利用这个强大的开源模型创建个人 AI 助理聊天机器人。**这个个人AI助理可以帮助你处理从写作、编程到翻译的任何事情,并且能够像处理文本一样轻松地处理图像数据。

准备工作

为了跟随本文后半部分的教程,你需要有一定的Python编程经验,以及对深度学习的初步理解。同时我们在带领你一步步实践的同时,也默认你有一个性能足够的机器以及合适的 GPU,可以运行我们提供的代码。

如果你还没有合适的 GPU,我们建议你可以先通过云服务获取。毕竟GPU 云服务会比自己购买 GPU 更便宜,而且还能灵活配置。不用担心,我们会在教程中给你提供低成本获取 H100 GPU 的方法。

先了解一下 LLaMa 3.2 模型

LLaMA 3.2 模型套件包括四个主要模型:一个小巧的11B参数的视觉语言模型,一个更大的90B参数的视觉语言模型,还有两个轻量级的纯文本模型(分别为1B和3B参数)。前者能够分析和理解文字和图片信息,而后者则专注于处理文字内容。每个模型在其所属类别中都展现了顶级或接近顶级的表现。

img

图片:多模态模型效果

LLama 官方认为他们的模型与GPT-4o Mini和Claude 3 - Haiku等知名基础模型的性能相当。我们从上面的图表中可以看到,得到了广泛的视觉语言任务基准测试的支持,包括数学和解决问题的任务。特别有趣的地方在于11B模型似乎相对较强,因为它展示了在较低端的GPU甚至相对较差的硬件上也能运行这些高性能LLMs。这意味着我们可以期待这些模型在使用时,能有与顶级封闭源代码模型相近的性能。

img

图片:端侧模型效果

在第二个图表中,我们可以看到轻量级、仅文本模型与顶级竞争模型PHI Mini IT和Gemma 2b的报告比较。在所有基准测试中,轻量级模型的表现都优于或接近这些知名基础模型。这表明LLaMA 3.2模型可以在较弱的处理器上运行,甚至有可能在移动设备上生成文本。

正如我们所看到的,模型套件的两个类别都与同等规模的顶级模型的对比,甚至可以超越一些较为前沿的封闭的大语言模型。

LLaMA 3.2的优势和劣势

当我们讨论 LLaMA 3.2 的优点和缺点时,首先需要明白的是,尽管它不像很多闭源工具那样自带各种功能,但它可以以闭源模型无法实现的方式进行定制。比如,保存了用户信息和个人设置的用户档案、网络连接或搜索功能,以及为添加检索增强生成(RAG)等特性设计的低代码插件,这些都不会自动集成到 LLaMA 3.2 中,除非我们自己动手添加。

既然这样,让我们来看看 LLaMA 3.2 相对于其他现有模型的主要优势有哪些:

优势

  • 微调与LoRAs(低秩适应): 能够根据需求定制现有模型,这一直是开源模型的最大优势。通过这些技术,我们可以轻松地将已经开发得很出色的大型语言模型(LLMs)进一步专业化,无论是制作客户服务聊天机器人还是数学助手,可能性几乎是无穷无尽的。
  • 顶级性能: LLaMA 3.2 的表现与所有尺寸的最佳模型相当,包括那些强大的闭源模型。
  • 自定义集成: 像 LLaMA 3.2 这样的模型很容易集成到各种现有的应用程序中,无需构建或使用可能既昂贵又难用的API客户端。
  • 视觉语言分析: LLaMA 在理解和处理图像数据方面给我们留下了深刻印象。它可以完成从光学字符识别(OCR)、解释到目标检测等各种任务,尽管这些功能最终都会以文本形式输出。
  • 摘要和重写: 正如官方发布博客所展示的,这些模型在多种文本任务上表现出色,尤其在摘要和重写任务上更为突出。
  • 成本: LLaMA 3.2 不仅可以免费使用(非商业用途)和下载,而且是其类别中最高效的模型之一。即使是轻量级模型也可以在手持设备等性能较弱的处理器上运行。

不足

  • 达到顶尖表现: 尽管有了很大的进步,LLaMA 3.2 仍然没有达到像 Claude Sonnet 或 GPT-4 这样顶级 GPT 模型的水平。
  • 网络访问能力: 如果不做大量的开发工作,这些模型无法上网或学习新信息,除非有像 RAG 这样的技术来支持。这是当前许多顶级模型,如 Anthropic 的模型的一个重要优势。
  • 许可: 需要注意的是,与一些完全开源的模型不同,LLaMA 的模型只允许非商业用途。

现在我们了解了这个模型的优点所在,接下来就展示如何运行演示。这将帮助我们在创建个人助理工具的过程中深入了解模型。

在H100 GPU 服务器上启动LLaMA 3.2

对于这个演示,我们将借鉴HuggingFace Projects团队的工作。他们在网站上发布了一个真正完美的Gradio演示,使用LLaMA 3.2 11B视觉模型。在继续之前,请务必查看他们的之前做的演示。

为了调整应用,我们将使用最新发布的 DigitalOcean GPU 云服务器实例。如果你想跟着操作,建议按照我们往期写的教程创建一个新的带有 Jupyter Notebook 的 GPU 实例(详见aidroplet.cn)。我们将在 GPU 实例上运行的 Jupyter Notebook 中执行接下来要展示的代码,通过 Visual Studio Code 的 SSH 主机功能,在本地浏览器中访问。

当你的GPU 服务器启动并运行起来,Jupyter Notebook 也已经在运行,并且你能够在本地浏览器中访问到它之后,就可以继续下一步了。

LLaMA 3.2个人助理应用程序分解

HuggingFace的LLaMA 3.2应用程序本身就很出色。它让你可以与一个强大的聊天机器人聊天,能够与我们上传的任何图像互动。这本身就允许我们执行复杂的操作,如目标内容识别或目标检测甚至阅读。此外,由于它是用Gradio编写的,因此完全支持FastAPI,可以直接使用它创建的API端点与应用程序互动。

查看下面的代码块,其中包含了整个应用程序,为了节省空间做了一些小调整。


from transformers import MllamaForConditionalGeneration, AutoProcessor, TextIteratorStreamer
from PIL import Image
import requests
import torch
from threading import Thread
import gradio as gr
from gradio import FileData
import time
import spaces
ckpt = "meta-llama/Llama-3.2-11B-Vision-Instruct"
model = MllamaForConditionalGeneration.from_pretrained(ckpt,
    torch_dtype=torch.bfloat16).to("cuda")
processor = AutoProcessor.from_pretrained(ckpt)


@spaces.GPU
def bot_streaming(message, history, max_new_tokens=250):
    
    txt = message["text"]
    ext_buffer = f"{txt}"
    
    messages= [] 
    images = []
    

    for i, msg in enumerate(history): 
        if isinstance(msg[0], tuple):
            messages.append({"role": "user", "content": [{"type": "text", "text": history[i+1][0]}, {"type": "image"}]})
            messages.append({"role": "assistant", "content": [{"type": "text", "text": history[i+1][1]}]})
            images.append(Image.open(msg[0][0]).convert("RGB"))
        elif isinstance(history[i-1], tuple) and isinstance(msg[0], str):
            # messages are already handled
            pass
        elif isinstance(history[i-1][0], str) and isinstance(msg[0], str): # text only turn
            messages.append({"role": "user", "content": [{"type": "text", "text": msg[0]}]})
            messages.append({"role": "assistant", "content": [{"type": "text", "text": msg[1]}]})

    # add current message
    if len(message["files"]) == 1:
        
        if isinstance(message["files"][0], str): # examples
            image = Image.open(message["files"][0]).convert("RGB")
        else: # regular input
            image = Image.open(message["files"][0]["path"]).convert("RGB")
        images.append(image)
        messages.append({"role": "user", "content": [{"type": "text", "text": txt}, {"type": "image"}]})
    else:
        messages.append({"role": "user", "content": [{"type": "text", "text": txt}]})


    texts = processor.apply_chat_template(messages, add_generation_prompt=True)

    if images == []:
        inputs = processor(text=texts, return_tensors="pt").to("cuda")
    else:
        inputs = processor(text=texts, images=images, return_tensors="pt").to("cuda")
    streamer = TextIteratorStreamer(processor, skip_special_tokens=True, skip_prompt=True)

    generation_kwargs = dict(inputs, streamer=streamer, max_new_tokens=max_new_tokens)
    generated_text = ""
    
    thread = Thread(target=model.generate, kwargs=generation_kwargs)
    thread.start()
    buffer = ""
    
    for new_text in streamer:
        buffer += new_text
        generated_text_without_prompt = buffer
        time.sleep(0.01)
        yield buffer


demo = gr.ChatInterface(fn=bot_streaming, title="Multimodal Llama", 
      textbox=gr.MultimodalTextbox(), 
      additional_inputs = [gr.Slider(
              minimum=10,
              maximum=1024,
              value=250,
              step=10,
              label="Maximum number of new tokens to generate",
              
          )
        ],
      cache_examples=False,
      description="Try Multimodal Llama by Meta with transformers in this demo. Upload an image, and start chatting about it, or simply try one of the examples below. To learn more about Llama Vision, visit [our blog post](https://huggingface.co/blog/llama32). ",
      stop_btn="Stop Generation", 
      fill_height=True,
    multimodal=True)
        
demo.launch(debug=True)

实际上,上面展示的是一个非常简洁的工作流程。首先,脚本会将模型文件加载到 GPU 上。然后,它启动了一个 Gradio 应用程序,让我们可以通过网页浏览器与模型互动。如果我们按照之前提到的文章中的说明操作,可以将运行代码块后输出的 URL 复制到 VS Code 的简单浏览器地址栏中,然后在我们的浏览器中打开新的 Gradio 窗口。或者,你可以将 demo.launch() 函数中的 public 参数设置为 True,这样就可以生成一个公开访问的链接。

总的来说,当运行时,我们得到的结果如下:

img

这个交互式应用程序允许我们使用文本或图像数据输入与模型互动。在我们的实验中,我们发现这个过程在图像理解、OCR和目标识别方面非常稳健。我们尝试了各种不同类型的图像,并获得了非常好的结果,显示出模型在文本和视觉领域之间的深厚融合。

此外,该应用程序本身对于正常的LLM任务也相当有效。我们能够用它生成工作的Python代码,讲述故事大纲,甚至协助撰写这篇博客文章的一小部分!总的来说,这个应用程序非常多功能,我们将继续将其用于我们未来的LLM任务。

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

下面这些都是我当初辛苦整理和花钱购买的资料,现在我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

关于Llama 3.2模型的关键信息如下: - **发布日期与改进** Llama 3.2是在2024年9月份发布的版本,对原有的8B和70B Llama 3.1模型进行了增强,并新增了11B和90B多模态模型,赋予其视觉能力[^1]。 - **适用场景** 对于边缘设备和移动应用的任务,如个人信息管理或多语言知识检索,存在一款非常合适的选择——即3B文本模型,该模型不仅适合这些应用场景而且体积较小,便于部署在资源受限环境中[^2]。 - **特性亮点** - 视觉能力和推理性能 作为当前最强大的开源多模态模型之一,Llama 3.2 Vision展示了卓越的视觉理解和推理能力,在多种任务上表现出色,比如视觉推理与定位、文档问答及图像到文本搜索等。尤其值得注意的是,这种能力让Llama 3.2能够生成高质量的思维链条(CoT),从而显著提升了复杂问题解决时的表现。 - 开源性与定制化潜力 此系列模型是开源性质并且允许高度个性化配置;特别是针对那些寻求高性能但又希望保持灵活性的应用开发者而言尤为理想。除了常规的基础训练之外,还有经过特定领域指导调整过的变体可供选择,进一步提高了实际使用价值[^3]。 - 技术细节 - 基础结构与优化措施 基于先前版本成功的自回归语言模型(Transformer)架构,Llama 3.2继续沿用了这一设计思路,并通过引入监督微调(SFT)以及利用人类反馈驱动的学习机制(RLHF),来确保输出结果既符合预期又能体现人文关怀和社会责任感. ```python # 示例代码展示如何加载并初始化一个预训练后的Llama 3.2模型 from transformers import AutoModelForVisionQA, AutoProcessor model_name_or_path = "meta-llama/Llama-3.2-vision" processor = AutoProcessor.from_pretrained(model_name_or_path) model = AutoModelForVisionQA.from_pretrained(model_name_or_path) image_url = "https://example.com/image.jpg" text_query = "What's in this picture?" inputs = processor(image=image_url, text=text_query, return_tensors="pt") outputs = model.generate(**inputs) answer = processor.decode(outputs[0], skip_special_tokens=True) print(f"The answer to '{text_query}' is: {answer}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值