一文说明如何在NVIDIA Jetson上玩转大模型应用

2023-11-13 20:38:33 浏览数 (2)

非常兴奋能在这里与您分享一些关于将最新的生成式AI和大模型LLM引入边缘计算的惊人进展。

自从引入了Transformer,然后在2020年NVIDIA 推出了Ampere GPU以来,我们都意识到了模型的规模和智能水平迅速增长,几乎接近人类水平。在相对短的时间内,这是一次巨大的飞跃,事情似乎真的加速了,特别是随着像llama和llama2这样的基础模型的开源化。有一个庞大的社区,研究人员、开发者、艺术家、爱好者,他们都在日夜努力工作。这非常令人兴奋,创新的速度几乎难以跟上。有一个广阔的世界等待我们去探索,不仅仅是LLM,还有视觉语言模型、多模态和零样本视觉Transformer,这些都对计算机视觉产生了巨大的影响。感谢每个在某种方式上为这个领域做出贡献的人。许多人已经为此付出了多年甚至几十年的时间,多亏了他们,AI的未来似乎突然降临。现在是时候抓住这一时刻,将这一切带到世界上,发挥一些积极的作用了。

自然而然,由于这些巨大模型对计算和内存的极大需求,将它们运行在消费级硬件上充满了挑战。可以理解的是,在部署LM和生成式AI方面,对于在本地、甚至是在现场和嵌入式设备上的工作,关注相对较少。然而,在面对一切的情况下,有越来越多的人正在做这件事。向我们本地的Lama和我们Stable diffusion致敬。在边缘计算方面,Jetson平台非常适合,因为它具有高达64GB的统一内存,搭载了Jetson AGX Orin模组,具备2048个CUDA核,以及275TOPS性能,而且体积小,功耗效率高。为什么费心这么做呢?为什么不直接在云端完成所有操作呢?原因与一直以来的边缘计算相同,包括延迟、带宽、隐私、安全和可用性。在这里显示的其他应用的基础上,最有影响力的领域之一是人机交互,即自然对话并使机器人自主完成任务的能力。正如我们所看到的,特别是在涉及实时音频和视觉的情况下,以及任何关乎安全性的情况下,您确实需要关注延迟。此外,了解如何在本地运行这些东西,同时保留所有数据,似乎也是一种不错的选择。幸运的是,有一个大规模的计算堆栈可以供您开放地使用。

我们已经在JetPack 6.0上努力工作了一段时间,这是我们对Jets平台软件架构进行的最大升级,现在它以上游Linux内核和可选择的操作系统分发为基础。我们将CUDA的版本与底层LTBSP解耦,这样您就可以自由安装不同版本的CUDA、cuDNN和TensorRT。我们为许多机器学习框架提供了优化的构建和容器,如PyTorch和TensorFlow,现在还包括所有的LLM和VIT库。可以从TAO、NGC和HuggingFace下载预训练模型,这些模型在JetPack上运行时性能非凡,还可以与Jetson等边缘设备一起使用。我们正在将更多Metropolis的组件和服务带到Jetson上,通过DeepStream进行视频分析。我们刚刚发布了Isaac ROS 2.0,其中包括高度优化的视觉模块,包括SLAM和ROS节点之间的零拷贝传输,用于自主机器人。JetPack 6.0将在本月晚些时候发布,支持Jetson和其他设备,并且未来应该更容易进行升级。

我们今天将向您展示如何运行。首先是我们的开放词汇视觉Transformers,如Clip LIT和SAM,它们可以使用自然语言检测和分割几乎任何您询问它们的东西。然后是LLM,接着是BLM视觉,语言模型,多模态代理和矢量数据库,为它们提供Long-term memory和与实时数据接地的能力。最后,通过流媒体语音识别和合成将所有这些内容连接在一起。我们将在Jetson开发板上运行所有这些。

因此,我们已经使用TensorRT对几个关键的VIT进行了优化,以在Jetson上提供实时性能。这些VIT在准确性、零样本和开放词汇方面都有所提高,意味着它们可以通过自然语言表达上下文进行提示,并且仅限于预训练的一定数量的对象类别。 Clip是一个基础的多模态文本和图像嵌入,它允许您在它们被编码后轻松比较两者,并且可以轻松预测最相似的匹配项。例如,您可以提供一张图像和一组复杂的标签,它会告诉您在不需要在对象类别上进行进一步训练的情况下,哪些标签在上下文上最相似,这意味着它是零样本的。它已被广泛采用作为更复杂的VIT和视觉语言模型中的编码器或骨干,并生成用于相似性、搜索和矢量数据库的嵌入。 同样,OWL-VIT和Sam或分割任何物体也在使用Clip。OWL-VIT用于检测,而Sam用于分割。然后,在这里,Efficient VIT是一个经过优化的VIT骨干,可应用于其中任何一个并提供进一步的加速。再次强调,这些都是使用TensorRT,并且在JetPack 5中已经可用,当然也将在JetPack 6中提供。

这个演示展示了 OWL VIT 的功能。所以你可以看到你可以输入你想要检测的内容,并且如果它找到它们就会开始生成那些边界框。以前,您必须在训练数据集上捕获自己的数据集、注释、训练、用SSD或 yolo 等模型,并且其中的对象类数量有限。嗯,您知道,OWLVI T 基于CLIP,其中包含大量图像和不同的对象,因此您可以在这里查询几乎任何内容。这是一个真正的游戏规则改变者,无需为您想要执行的每个最后检测场景训练自己的模型。这是一项非常令人印象深刻的技术,能够在 jetson 上实时部署,在 AGX Orin 上每秒达到 95 帧

所以,在GitHub上可以找到在实时运行OWL VIT所需的所有代码。这个项目被称为NanoOWL项目。嗯,因为我们使用了tensorRT A对原始的OWL-VIT模型进行了优化,这是我们将其从每秒0.9帧提高到95帧的方法,而且有各种不同的骨干网络,你可以运行不同变体的OWL-VIT,具有更高的准确性、更低的准确性、更高的性能和更低的性能。它还有一个非常简单的Python API,你只需输入你的图像和文本提示,它就会输出边界框及其分类。目标检测仍然是迄今为止最流行的计算机视觉算法,而这个项目可以彻底改变这一点

因此,这个分割的类似物被称为SAM或segment anything 模型,它的工作原理非常类似,基本上你只需提供一些控制点,比如点击图像中要分割的不同部分,它就会自动为你分割所有这些不同的斑点,不管它们是什么。过去,你必须手动创建一个分割数据集,对其进行模型训练。而且那些分割数据集非常耗费资源,啊,但现在你知道你可以点击任何亮点,它就能为你分割。当你将它与另一个项目TAM(或track anything)结合起来,它可以在视频中为你分割任何东西。我们还为此提供了Jetson上的容器,你可以立即使用。

接下来我们讲解大语言模型,这里是LLM性能表,是运行在Jetson AGX Orin上。

下面是个演示:

Llamaspeak是一款交互式聊天应用程序,利用实时的NVIDIA Riva ASR/TTS,让你能够与在本地运行的LLM进行口头交流。它目前作为jetson-containers的一部分提供。这个运行在Jetson AGX Orin上的。

因此,显然,作为边缘设备,大多数基于Jetson的嵌入式系统都连接有摄像头或其他视觉传感器,因此社区中的每个人都对像Llama、mini GPT-4以及许多新出现的多模态嵌入模型非常感兴趣。它们的工作原理基本上是使用像CLIP这样的嵌入模型,将文本和图像组合到一个共同的嵌入空间中,在这个语境下,概念是非常相似的。因此,如果有一张狗的图片和一个“狗”字,它们在多维嵌入空间中的位置非常相似。也就是说,它们传达给LLM相同的思想或情感。然后,在完成这个嵌入之后,在LIava的情况下,它实际上使用了之前提到的相同的CLIP和VIT编码器。有一个小的投影层,将CLIP嵌入的维度映射到Llama嵌入的维度,然后他们还对Llama模型进行微调,以更好地理解这些组合的嵌入。我们发现,如果使用使用336*336分辨率而不是二224*224的较大的CLIP模型,它能够提取出更小的细节,甚至重新提取图像中的文本。还有很多其他的图像嵌入方法,比如ImageBind,它结合了比仅有图像和文本更多的信息,可以处理音频、惯性测量单元、点云等各种模态。基本上我们正在使LLM具备所有不同的感知方式,使它能够综合地理解世界观和感知世界模型,以便更好地理解事物,而不仅仅通过文本来做到这一点。所以你可以看到,LIava模型的性能非常类似于基础Llama模型。实际上,它具有相同的模型架构,只是稍微慢一点。

最新发布的LLaVA1.5模型可能有些人已经看到了,它具有一些非常令人兴奋的新功能,其中包括输出受限json格式的能力。所以你基本上可以告诉它 检测某些对象, 以json的形式给我,这样你就能以编程方式解析它并实际进行操作。而对于VIT,你需要用具体的东西来提示,比如我想检测一个脸,或者一个手之类的。在这个例子中,你可以直接告诉它检测所有东西,它会输出所有对象的边界框或者你试图做的任何事情。这对于制作在实时嵌入式系统中部署的闭环可视化非常有用,例如智能交通路口、人行道监视器、盲人助手设备,或者婴儿床监视器,或者任何一个你想从中提取信息而不必训练自己的模型的开放性问题。除了像自主导航这样的功能,还可以查询它,比如,这条路径去哪里?我的路上有障碍吗?这些障碍是动态的吗?类似这样的各种问题,这真的非常令人兴奋。另一个要指出的重点是,整个LLaVA1.5模型相对于其之前的版本来说是一个巨大的改进,但它仍然只是在A 100 GPU上进行了一天的训练,所以如果你收集自己的数据集,实际上你有可能自己为自己的应用程序微调其中一个

看一下支持这些演示的一些示例代码,基本上是我在MLC和AWQ周围放置的一个轻量级包装器,因为在其他一些LLM库中这些并不受支持。除了所有的多模态嵌入管理之类的东西,我们将会谈论到,它还有一个非常简单的文本生成API。基本上,你加载模型,如果尚未完成,它会为你量化。你创建这个聊天历史堆栈,然后你可以附加文本提示或图像。它会自动为你执行嵌入,根据输入的数据类型,然后生成一系列输出标记。所以我们在这里做的一切都是为了实时流处理,这样你可以尽快将数据呈现给用户。然后你基本上只需将机器人的响应输出到聊天中。现在,如果你想自己进行聊天管理对话,你完全可以这样做。你可以将文本字符串传递给模型生成函数。你应该意识到的是,当你保持一个连贯的堆栈时,聊天历史记录的效果最好,因为这样你就不必回去并不断地重新生成聊天中的每个标记。例如,我们知道Llama2模型的最大标记长度为4096,但如果你每次生成完整的4096长度的聊天,那将花费很长时间。相反,你可以将缓存保留在所谓的KV缓存中,如果你在请求之间这样做,那么整个聊天的状态就会保持。你可以同时运行多个聊天,但强烈建议保持聊天堆栈的流动,而不是来回移动并每次都从头开始整合。

这是因为LLM文本生成有两个阶段。首先是解码,也称为预填充,它接受你的输入上下文并基本上对其中的每个标记执行前向传递。这个阶段比生成阶段要快得多,但当你处理完整的4096个标记时,时间还是会叠加起来的。所以你可以看到,如果我们在完整的4096标记长度的聊天中运行llama-70B,它将花费40秒来预填充整个聊天,在它开始响应之前就完成了。但如果你只是预填充最新的输入,你会发现,你知道,一小部分时间,通常是聊天中出现的省略号,或者像“代理正在输入”这样的提示。它实际上正在预填充你的输入,然后才能开始生成。这就是为什么在请求之间管理KV缓存实际上非常重要,以保持非常一致的聊天流程

因此,在请求之间管理KV缓存实际上非常关键,以保持非常一致的聊天流程。同样,这里是令牌生成速度的一览,以及它随输入长度变化的情况。一旦你的输入长度增加到更高的标记长度,生成速度也会略微减少,因此这也是需要考虑的一个因素。

所以显然,所有这些中的一个重要关注点是memory利用需求,以及与令牌生成速度一起,这真的让每个人都非常倾向于量化方法。所以我们谈到的很多像llama c 和其他autoGPTQ XLIama这样的LM API都有许多不同的量化方法。你可以从两位到八位之间选择,但大多数时间都在四位以下。你开始看到性能的下降,但在AQ4A16量化中,我真的没有看到任何输出的差异,这真的很好,因为它将llama-70b的memory使用从130GB降低到32GB,这样更容易部署在Jetson等较小的设备上。你可以在8GB的板上运行Lama2--7b,或者在16GB的板上运行Lama2-13b。

我们可以看到这里有一整套不同的Jetson模块,您可以部署每个模块,而每个模块都恰好具有适合其memory容量的典型模型大小。因此,您基本上可以根据您的应用程序需要的智能级别以及性能和其他交换需求(如嵌入式系统的大小、重量、功耗和成本)进行混搭,并选择适合您部署的jetson模块。

所以在几张幻灯片之前,我展示了一些基本上是用于使用LLM进行文本生成的低级API的代码。一旦你开始变得更加复杂,添加诸如ASR、TTS和检索增强生成等功能,所有这些插件都变得非常复杂,如果你只是在制作一个定制的应用程序,你绝对可以自己编写所有这些代码,比如用一个Python应用程序。事实上,llama speak演示的第一个版本就是这样的,但最终当您开始迭代并创建不同版本时,比如我想要一个多模态的版本,或者我想要做一个闭环视觉代理,你会在其中有很多样板代码。所以我在文本生成的基础上写了一个稍微更高级的API函数,您可以在其中实现所有这些不同的插件,它非常轻量级,延迟非常低,它的目的不是让你更难而是更容易,而且不会牺牲一秒钟的生成速度。通过这个API,您可以非常容易地将所有这些不同的文本和图像处理方法链接在一起,并与其他API一起使用。这只是管道定义看起来的两个基本示例,它可以是一个完全定向的开放式多输入,多输出图,其中可以进行一些相当复杂的设置。

另一个很酷的方面是这种方法使得内联插件成为可能,或者说让LLM能够动态变化。它怎么知道现在是什么时间,或者执行互联网搜索查询,或者知道天气如何,或者执行像左转或右转这样的动作,所有这些核心平台功能都可以在系统提示中定义,并向LLM解释API。当需要时,它可以动态地执行。这是在检索增强生成的基础上进行的,我们将在一会儿讨论,因为它不仅仅根据用户先前的输入进行检索,而且在生成输出的同时可以执行检索,并将其插入到正在进行的输出中。这是一个很好的好处,你知道,保持对API的较低级别访问,而不是为了一切都回到云端,因为你需要能够停止令牌生成,运行插件并将其插入到输出中,然后继续输出。除了执行诸如令牌修复或实施防护和引导功能之类的操作之外,所有这些对令牌生成的粒度级别的访问都是非常好的,这样您可以在需要时停止它,然后完全异步地重新启动它,以防止破坏所有低延迟的流水线。这只是一个基本示例,当我尝试看它是否能够生成时,这只是使用llama two seven b并利用其内置的协同生成功能,这对它来说是基础的。我建议使用json格式,即使它更冗长并产生更多的令牌,特别是如果函数有多个参数,因为json允许保持参数的顺序,这样就不会混淆它们。如果您的参数不是很多或者只是像这里显示的示例那样非常简单,您可以简单地编写一个简单的Python脚本,也可以使用其他开源框架,如Lang chain和hugging face agents以及Microsoft jarvis等,它们也可以做同样的事情。它们可能不太适用于低延迟和低开销,这就是我为什么去做这个的原因,但与此同时,它们也可以做类似的事情。实际上,hugging face agents API直接具有L M generate的Python代码,然后在一个受限制的沙盒解释器中运行。所以它能够直接与Python API进行交互,这真的很酷,而且在这种情况下并不难做到。你知道,我更喜欢保持json或文本,并手动解析它并调用插件,所以它并没有完全访问python。

我多次提到过检索增强生成,这在企业应用中非常重要,其中您希望索引大量文档或PDF,并能够让LLM对其进行查询。请记住,上下文长度最多为4096个标记,虽然有很多旋转嵌入编码可达到16k或32k,甚至更多,但总是有限制的,您可能有数十万页的文档需要进行查询。当我们开始谈论多模态时,您可能有数千或数百万个图像和视频的大型数据库,您希望对其进行索引,但不可能全部包含在上下文中。所以基本上你搜索用户的输入查询并在你的矢量数据库中进行查询。对此使用的技术与LLM和VIT编码非常相似。实际上,Clip嵌入在我接下来会展示给你的演示中使用。但它基本上使用相似性搜索来确定数据库中哪些对象与您的查询最接近,这是多模态嵌入空间的一个非常相似的概念。有一些非常快速的库,比如faiss和rapids rap,它们能够索引数十亿条记录并根据您的查询快速检索它们。这些是非常好的库,我在Jetson使用它们来进行多模态图像的操作。

搜索向量数据库,我基本上制作了这个演示来验证Clip transformer 编码器的能力,并仅仅是为了能够理解在将其集成到语言模型之前,我实际上可以查询什么,以进行检索和增强生成。因此,你可以在这里看到,你不仅可以用文本进行清除,还可以进行图像搜索。而且这是相当先进的图像搜索,完全是实时的。在这里,我正在使用Jetson进行实时刷新,这是在MS Coco数据集上索引的,包含了约27.5万张图像,整个过程大约花了我想是五到六个小时。但实际的检索搜索只需要大约十到二十毫秒的时间,这意味着它不会给你的语言模型生成流程增加延迟,这非常重要,因为我们不希望在用户查询和响应之间有超过几秒钟的延迟,特别是在语音互动的情况下。

在检索和增强生成的搜索中,这取决于你的数据库中有多少项,有些数据库可能会变得非常庞大,尤其是在企业文档等情况下。在边缘设备上,我认为规模会较小,因为设备上的可用空间有限。你可以在这里看到,对于大多数人的应用程序,这只需要几毫秒的时间,我还在这里分别列出了不同的嵌入维度。因此,一些高端的嵌入,如图像绑定,使用每个图像或文本作为一个包含1024个元素的向量,描述在Clip的多维嵌入空间中。Clip Large则使用768个元素。那是在这里演示的。所以这在规模上很好。我认为在嵌入设备上很少会达到1000万条记录,但是如果你知道你正在进行大量数据聚合,有30个高清摄像头流正在传输,这是完全可能的。而且,仍然只需要大约五分之一秒或更短的时间来完成所有这些,这是完全合理的。

所以与Riva一起协调,以展示我如何制作这些文本到语音的演示。Riva是英伟达提供的一个出色的开放式 SDK,它集成了我们训练的最先进音频transformers以及tensorRT加速。而且它是完全流式的。它支持流式语音识别(ASR)和文字转语音(TTS),你可以在Jetson AGX Orin上实时进行18个ASR流或57个TTS流,但在边缘设备上很少有人会做那么多流,除非你有多麦克风设备或者设置了类似的东西。但这意味着当你只进行一个流时,你只会占用不到 GPU 的 10%,这非常好,因为这意味着我们的LLM标记生成速率只会下降不到 10%,因为LLM会完全占用GPU。

Riva有许多不同的ASR和TTS模型,它还支持神经机器翻译,我看到一些人用它做了一些很酷的演示,你可以在不同语言之间进行实时翻译,结果表明,许多LLM(如LIama)都是用英语训练的。虽然也有一些多语言的LLM,但如果你使用的是以英语为基础训练的LLM,但又想用其他语言交流,你可以在流水线中使用神经机器翻译,从而在LLM和TTS之间进行翻译。

Riva还有一个很酷的功能,就是TTS的SSML表达式,因此你可以加快或减慢速度、改变音调、添加表情符号、笑声或各种有趣的元素,使声音听起来更逼真。总体而言,它在本地设备上的效果非常好。到目前为止,我展示给你的所有演示都不依赖于任何云计算或离板计算。一旦下载容器或构建应用程序,你可以完全脱机运行这些演示。

这里是基本上交互式口头聊天管理的管道块图。事实证明,在实时聊天中有很多细微之处,主要是能够打断语言模型的野蛮行为。我们了解这些元素,它们喜欢说话,它们会不停地说下去,你可以指示它们在输出中非常简明扼要。但总的来说,它们喜欢唠叨一点,重要的是在视频中能够在它们上面说话,并且让语言模型在你不想查询它的时候要么继续,要么在你提出另一个问题时停止。 我发现实现这一点的最佳方法是使用多线程异步模型,其中有一堆队列,所有东西都进入这些队列并得到处理。你需要有能力基于发生的事情来中断和清除这些队列。例如,河流自动语音识别(ASR)会输出称为部分转录的内容。当你说话时,这些在视频中会出现小气泡,因为它不断重新定义并形成你所认为的内容,但当你到达句子末尾时,它会执行称为最终转录的操作。这最终的转录是实际提交给语言模型的内容,但如果部分转录开始出现并且你说了超过几个词,它会暂停语言模型。如果在一两秒内没有获取到更多的转录,语言模型可以继续说话。如果最终转录确实变为最终状态,那么你知道以前的语言模型响应被取消了,并且放入了一个新的响应,这是重要的,因为然后你不希望它继续花时间生成旧的响应,当你已经在回答下一个问题时。

总结

所以事实证明这里有很多微妙之处,我们尽量以尽可能少的启发式方法来实现它,因为这只会导致特殊情况,而且总的来说,与这些模型进行交流是非常愉快和有趣的。我真的鼓励你进入Jetson AI Lab(https://www.jetson-ai-lab.com/) ,下载这些容器,开始尝试不同的模型,发现它们的个性,然后构建你自己的应用程序。我认为在不久的将来,我们将在真实世界的嵌入式系统和机器人上看到它们,所以让我们一起做吧。

关于此次研讨会的Q&A

1.这是使用 RIVA ASR 和 STT 吗?

答: 是的,正在本地运行。实际听起来音质更好/更清晰。

2.在水果和价格演示中,模型如何理解图片中的内容?

答:它是通过对来自互联网的数万亿个标记进行训练的,并结合了 Llama LLM 和 CLIP 视觉编码器的强大功能。

3.是否有计划创建Jetson的更新版本,以实现更统一的内存和更强大的APU?我想要一台更强大的推理机器。

答:NVIDIA Jetson AGX Orin 64GB开发套件提供64GB的统一内存。虽然目前没有关于Jetson平台的更多内存的官方公告,但NVIDIA继续评估增加内存容量的需求,以支持快速发展的AI模型。

4.你经常提到Orin,与较旧的Jetson(如Jetson Xavier)兼容性如何?在使用Xavier而不是Orin时需要注意的重要事项有哪些?

答:许多应用程序和容器应该可以在Xavier一代的Jetson上运行,只要满足内存要求即可。

更多:

Jetson Voice :Jetson Nano到AGX Xavier,智能语音处理无处不在

0 人点赞