在Nvidia Jetson ADX Orin中使用TensorRT-LLM运行llama3-8b

目录

  • 背景:
  • 步骤 1.获取模型权重
  • 第 2 步:准备
  • 第 3 步:构建 TensorRT-LLM 引擎

背景:

大型语言模型 (LLM) 推理的关键瓶颈在于 GPU 内存资源短缺。因此,各种加速框架主要强调减少峰值 GPU 内存使用提高 GPU 利用率。 这就是 Nvidia 的游戏规则改变者 TensorRT-LLM 发挥作用的地方。TensorRT-LLM 是一个开源库,可加速和优化 NVIDIA AI 平台上 LLM 的推理性能。TensorRT 为 NVIDIA GPU 上的推理提供了高度专业化的优化。请参阅 Github 存储库以获取更多示例和文档!

在本指南中,我将以 Llama-3-8B-Instruct 模型为例,演示如何在 NVIDIA Jetson AGX Orin 64GB 开发者套件上使用 TensorRT-LLM 部署 LLM 推理引擎。NVIDIA Jetson AGX Orin 开发者套件在基于 Arm 的 CPU 内核和基于 NVIDIA Ampere 架构的 GPU 之间具有统一的内存架构。系统具有 64 GB 的共享内存,由 CPU 和 GPU 共享。

Nvidia JetPack 6.1 是 JetPack 6 的最新生产版本。确保您的 Jetson AGX Orin 开发者套件已使用最新的 JetPack 6.1 进行刷新。

使用 apt show nvidia-jetpack 命令检查当前 jetpack 版本:

Package: nvidia-jetpack
Version: 6.1+b123
Priority: standard
Section: metapackages
Source: nvidia-jetpack (6.1)
Maintainer: NVIDIA Corporation
Installed-Size: 199 kB
Depends: nvidia-jetpack-runtime (= 6.1+b123), nvidia-jetpack-dev (= 6.1+b123)
Homepage: http://developer.nvidia.com/jetson
Download-Size: 29.3 kB
APT-Sources: https://repo.download.nvidia.com/jetson/common r36.4/main arm64 Packages
Description: NVIDIA Jetpack Meta Package

您可以使用预构建的 Docker 映像,因此您可以按照 Nvidia Jetson AI Lab 页面上的文档轻松入门:https://www.jetson-ai-lab.com/tensorrt_llm.html
在这里插入图片描述
为了增加 VRAM,我在 Jetson AGX Orin 上禁用了桌面 GUI。

步骤 1.获取模型权重

我们需要下载我们将使用的模型的权重,即 Meta-Llama-3-8B-Instruct。因此,请确保您已接受许可条款并生成相应的 HuggingFace 令牌以下载模型。
首先,您需要通过在终端中运行以下命令来设置 Git LFS:

sudo apt-get update && sudo apt-get -y install git-lfs

通过运行以下命令安装 Git LFS:

git lfs install

使用以下命令克隆 Llama-3-8B 模型存储库:

https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct

或者,您可以使用 Hugging Face CLI 下载模型。使用以下命令安装 CLI:

pip install -U "huggingface_hub[cli]"

使用 huggingface-cli login 命令验证您的 Hugging Face 帐户。输入您的 Hugging Face API 密钥。
使用以下命令下载 Llama-3-8B-Instruct 模型:

huggingface-cli download meta-llama/Llama-3-8B-Instruct --local-dir ./Llama-3-8B-Instruct

下载完成后,您可以使用以下命令验证下载文件夹的内容:

wangyh@ubuntu:/media/wangyh/My Passport/llama3-8b-instruct$ ls -l
total 15695249
-rwxrwxrwx 1 wangyh wangyh       9802  1月  6 09:36 added_tokens.yaml
-rwxrwxrwx 1 wangyh wangyh        654  1月  6 09:36 config.json
-rwxrwxrwx 1 wangyh wangyh        187  1月  6 09:36 generation_config.json
-rwxrwxrwx 1 wangyh wangyh    2183982  1月  6 09:36 llama3_8b.tiktoken
-rwxrwxrwx 1 wangyh wangyh 4976698672  1月  6 09:38 model-00001-of-00004.safetensors
-rwxrwxrwx 1 wangyh wangyh 4999802720  1月  6 09:40 model-00002-of-00004.safetensors
-rwxrwxrwx 1 wangyh wangyh 4915916176  1月  6 09:42 model-00003-of-00004.safetensors
-rwxrwxrwx 1 wangyh wangyh 1168138808  1月  6 09:42 model-00004-of-00004.safetensors
-rwxrwxrwx 1 wangyh wangyh      23950  1月  6 09:42 model.safetensors.index.json
drwxrwxrwx 1 wangyh wangyh          0  1月  6 09:42 original
-rwxrwxrwx 1 wangyh wangyh         73  1月  6 09:42 special_tokens_map.json
-rwxrwxrwx 1 wangyh wangyh      50977  1月  6 09:42 tokenizer_config.json
-rwxrwxrwx 1 wangyh wangyh    9085698  1月  6 09:42 tokenizer.json

第 2 步:准备

使用 venv 模块创建新的虚拟环境,以隔离您的项目依赖项。

python3 -m venv tensorrt-llm-env

激活新创建的虚拟环境

source tensorrt-llm-env/bin/activate

更新包并安装所需的包

sudo apt-get update
sudo apt-get install -y python3-pip libopenblas-dev ccache

下载 CuSparseLT 安装脚本:

wget https://raw.githubusercontent.com/pytorch/pytorch/9b424aac1d70f360479dd919d6b7933b5a9181ac/.ci/docker/common/install_cusparselt.sh

设置 CUDA 版本:通过运行以下命令将 CUDA 版本设置为 12.6:

export CUDA_VERSION=12.6

通过运行以下命令安装 CuSparseLT:

sudo -E bash ./install_cusparselt.sh

此过程可能需要一些时间才能完成。确保安装成功完成。
最后,使用 pip 安装 NumPy 版本 1.26.1:bash 复制代码

python3 -m pip install numpy=='1.26.1'

此步骤完成准备阶段,设置后续步骤所需的环境和依赖项。

第 3 步:构建 TensorRT-LLM 引擎

使用以下命令从 GitHub 克隆 TensorRT-LLM 存储库:

git clone https://github.com/NVIDIA/TensorRT-LLM.git
cd TensorRT-LLM
git checkout v0.12.0-jetson
git submodule update --init --recursive
git lfs pull

然后,执行以下命令,为 TensorRT-LLM 构建一个 wheel 文件:

sudo python3 scripts/build_wheel.py --clean --cuda_architectures 87 -DENABLE_MULTI_DEVICE=0 --build_type Release --benchmarks --use_ccache -DCMAKE_CUDA_COMPILER=/usr/local/cuda-12.6/bin/nvcc

此命令为 TensorRT-LLM 构建一个 wheel 文件。可能需要一些时间才能完成。
您将看到如下所示的输出:

Successfully built tensorrt_llm-0.12.0-cp310-cp310-linux_aarch64.whl

使用 pip 安装构建的 wheel 文件:

pip3 install build/tensorrt_llm-0.12.0-cp310-cp310-linux_aarch64.whl

预期输出:

Successfully installed tensorrt-llm-0.12.0

通过导入库并打印其版本来验证安装:

python3 -c "import tensorrt_llm; print(tensorrt_llm.__version__)"

【注】到这一步当在虚拟环境下面使用tensorrt_llm库的时候会报错没有找到“tensorrt_llm”,如下图所示:
在这里插入图片描述
提示缺少Python版本的tensorrt库,但是jetpack环境里面没有留下Python版tensorrt的安装包,这个时候有两种方法:

  1. 到网上下载jetson版本的TensorRT-10.3的.wheel文件,然后自己手动安装
  2. 将本地/usr路径下的tensorrt拷贝出来

这里我们选择第二种方法

cd ~/tensorrt-llm-env/lib/python3.10/site-packages
cp -r /usr/lib/python3.10/dist-packages/tensorrt* .

在这里插入图片描述
要在 GPU 上高效运行这些模型,我们必须将它们转换为 TensorRT-LLM 格式。然后,我们将使用 trtllm-build 命令行工具从 Hugging Face 检查点构建优化的 TensorRT 引擎。

HuggingFace 模型的转换可以通过一个命令完成:

python examples/llama/convert_checkpoint.py --model_dir /media/wangyh/My\ Passport/llama3-8b-instruct --output_dir /media/wangyh/My\ Passport/Llama-3.1-8B-Instruct-convert --dtype float16

您将看到如下所示的输出:

[TensorRT-LLM] TensorRT-LLM version: 0.12.0
0.12.0
230it [00:04, 50.42it/s]
Total time of converting checkpoints: 00:03:11

这应该会产生两个文件:模型配置 (config.json) 和权重 (rank0.safetensors)。接下来,我们构建模型引擎:

trtllm-build --checkpoint_dir /media/wangyh/My\ Passport/Llama-3.1-8B-Instruct-convert --gpt_attention_plugin float16 --gemm_plugin float16 --output_dir /media/wangyh/My\ Passport/Llama-3.1-8B

此命令使用转换后的检查点构建 TensorRT 引擎,并将结果存储在指定的目录中。
如果构建成功,您应该会看到以下输出:

[11/17/2024-16:26:23] [TRT-LLM] [I] Build phase peak memory: 32793.48 MB, children: 0.00 MB
[11/17/2024-16:26:23] [TRT-LLM] [I] Serializing engine to /home/jetson/Projects/tensorrtllm/Llama-3.1-8B-final/rank0.engine...
[11/17/2024-16:26:44] [TRT-LLM] [I] Engine serialized. Total time: 00:00:20
[11/17/2024-16:26:45] [TRT-LLM] [I] Total time of building all engines: 00:01:06

这应该会产生两个文件:模型配置 (config.json) 和权重 (rank0.engine)。
第 4 步:在 NVIDIA Jetson AGX Orin 64GB 开发者套件上运行推理
构建模型引擎后,您可以通过使用以下命令运行模型来测试它:

python examples/run.py --engine_dir /media/wangyh/My\ Passport/Llama-3.1-8B-Instruct-engine --max_output_len 100 --max_attention_window_size 1024 --tokenizer_dir /media/wangyh/My\ Passport/llama3-8b-instruct/ --input_text "Kazakhstan is" --gpu_weights_percent 70 --kv_cache_free_gpu_memory_fraction 0.1 --num_beams 1

如果模型成功运行,您应该会看到以下输出:
在这里插入图片描述
当令牌流式传输时,可以明显地注意到 TensorRT LLM 的性能。
然后我们可以在 OpenAI 兼容模式下对 TensorRT LLM 服务器进行 TensorRT LLM 服务器。运行以下命令:

python examples/apps/openai_server.py /media/wangyh/My\ Passport/Llama-3.1-8B-Instruct-engine --tokenizer /media/wangyh/My\ Passport/llama3-8b-instruct/ --host 0.0.0.0 --port 5001

使用 –host 选项,您可以允许外部连接。
您可以通过使用 curl 命令发送请求来测试模型的推理。

 curl http://localhost:5001/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "meta-llama/Llama-3.1-8B",
        "messages": [
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "Who won the world series in 2020?"}
        ]
    }'

如果响应成功,您应该会看到以下输出:

{"id":"chatcmpl-d2c4ab76cea845fa80374af3133d4ef4","object":"chat.completion","created":1736154766,"model":"meta-llama/Llama-3.1-8B","choices":[{"index":0,"message":{"role":"assistant","content":"The Los Angeles Dodgers won the World Series in 2020! They defeated the","tool_calls":[]},"logprobs":null,"finish_reason":null,"stop_reason":null}],"usage":{"prompt_tokens":32,"total_tokens":48,"completion_tokens":16}}

您可以使用类似于 OpenAI 的客户端函数来调用 TensorRT-LLM 服务。

from openai import OpenAI

openai_api_key = "EMPTY"
openai_api_base = "http://localhost:5001/v1"

client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)

chat_response = client.chat.completions.create(
    model="meta-llama/Llama-3.1-8B-Instruct",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Tell me a about Kazakhstan."},
    ]
)
print("Chat response:", chat_response)

如果响应如下,则部署成功。

(tensorrt-llm-env) wangyh@ubuntu:~/TensorRT-LLM$ python tensorrt_llm_orin_openai_request.py 
Chat response: ChatCompletion(id='chatcmpl-2123732b12b84b2f8145272da88bb0f7', choices=[Choice(finish_reason=None, index=0, logprobs=None, message=ChatCompletionMessage(content='Kazakhstan! A vast and fascinating country located in Central Asia, bordering', refusal=None, role='assistant', audio=None, function_call=None, tool_calls=[]), stop_reason=None)], created=1736154822, model='meta-llama/Llama-3.1-8B-Instruct', object='chat.completion', service_tier=None, system_fingerprint=None, usage=CompletionUsage(completion_tokens=16, prompt_tokens=28, total_tokens=44, completion_tokens_details=None, prompt_tokens_details=None))

创建 Streamlit Web 应用程序以与 TensorRT-LLM 服务交互

import streamlit as st
from openai import OpenAI

st.title("TensorRT-LLM Demo on the NVIDIA Jetson AGX Orin Developer Kit ")

client = OpenAI(base_url="http://localhost:5001/v1", api_key="None")

if "messages" not in st.session_state:
    st.session_state["messages"] = []

prompt = st.chat_input("Say something")
if prompt:
    st.session_state["messages"].append({"role": "user", "content": prompt})
    for message in st.session_state["messages"]:
        st.chat_message(message["role"]).write(message["content"])
    container = st.empty()
    chat_completion = client.chat.completions.create(
        stream=True,
        messages=st.session_state["messages"],
        model="ensemble", 
        max_tokens=512
    )
    response = ""
    for event in chat_completion:
        content = event.choices[0].delta.content
        if content:
            response += content
        container.chat_message("assistant").write(response)
    st.session_state["messages"].append({"role": "assistant", "content": response})

在这篇博文中,我的目标是演示如何在 NVIDIA Jetson AGX Orin 64GB 开发者套件上使用 TensorRT LLM 实现最先进的推理。我涵盖了从编译 LLM 到使用 Streamlit 在生产环境中部署模型的所有内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950359.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity Shader学习日记 part4 Shader 基础结构

其实在这一篇之前,应该还有一个关于坐标空间转换的内容,但是内容囤积的有些多,就先把Shader的基础结构先记录一下。 笔记主要记录在代码中,所以知识点主要是图和代码的展示。 Unity Shader分类 在Unity中,Shader的种…

特征点检测与匹配——MATLAB R2022b

特征点检测与匹配在计算机视觉中的作用至关重要,它为图像处理、物体识别、增强现实等领域提供了坚实的基础。 目录 Harris角点检测 SIFT(尺度不变特征变换) SURF(加速稳健特征) ORB(Oriented FAST and Rotated BRIEF) 总结 特征点检测与匹配是计算机视觉中的一项基…

Airflow:HttpSensor实现API驱动数据流程

数据管道工作流通常依赖于api来访问、获取和处理来自外部系统的数据。为了处理这些场景,Apache Airflow提供了HttpSensor,这是一个内置的Sensor,用于监视HTTP请求的状态,并在满足指定条件时触发后续任务。在这篇博文中&#xff0c…

图数据库 | 17、高可用分布式设计(上)

我们在前面的文章中,探索了多种可能的系统扩展方式,以及每种扩展方式的优劣。 本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能,以及孰优孰劣等进行评价。 在设计高性能、高可用图数据库的时候&#xf…

JAVA学习记录1

文章为个人学习记录,仅供参考,如有错误请指出。 什么是JAVA? JAVA是一种高级的编程语言,可以用于开发大部分场景的软件,但主要用于服务器的开发。 什么是JDK? 类似于python使用PyCharm来编写代码&#…

css中的部分文字特性

文章目录 一、writing-mode二、word-break三、word-spacing;四、white-space五、省略 总结归纳常见文字特性,后续补充 一、writing-mode 默认horizontal-tbwriting-mode: vertical-lr; 从第一排开始竖着排,到底部再换第二排,文字与文字之间从…

Android wifi常见问题及分析

参考 Android Network/WiFi 那些事儿 前言 本文将讨论几个有意思的网络问题,同时介绍 Android 上常见WiFi 问题的分析思路。 网络基础Q & A 一. 网络分层缘由 分层想必大家很熟悉,是否想过为何需要这样分层? 网上大多都是介绍每一层…

【C语言】_指针与数组

目录 1. 数组名的含义 1.1 数组名与数组首元素的地址的联系 1.3 数组名与首元素地址相异的情况 2. 使用指针访问数组 3. 一维数组传参的本质 3.1 代码示例1:函数体内计算sz(sz不作实参传递) 3.2 代码示例2:sz作为实参传递 3…

IDEA 字符串拼接符号“+”位于下一行的前面,而不是当前行的末尾

效果图 IDEA 默认效果是“历史效果”,经过修改后为“预期效果” 设置方式 在设置中找到Editor > Code Style > Java > Wrapping and Braces > Binary expressions > 勾选 Operation sign on next line 即可实现。具体设置如图。

牛客网刷题 ——C语言初阶(2分支和循环-for)——打印菱形

1. 题目描述 用C语言在屏幕上输出以下图案: 2. 思路 我是先上手,先把上半部分打印出来,然后慢慢再来分析,下面这是我先把整个上半部分打印出来,因为空格不方便看是几个,这里先用&代替空格了 然后这里…

C# 整型、浮点型 数值范围原理分析

总目录 前言 一、整型、浮点型 数值范围列表 二、什么是大小、范围 在上面的列表中,每个数据类型都有自己的Range (范围) 和 Size (大小)。 1. 范围 范围好理解,就是对应数据类型的数据范围,如 sbtyte 的数据范围是 -128~127,超…

安装vue脚手架出现的一系列问题

安装vue脚手架出现的一系列问题 前言使用 npm 安装 vue/cli2.权限问题及解决方法一:可以使用管理员权限进行安装。方法二:更改npm全局安装路径 前言 由于已有较长时间未进行 vue 项目开发,今日着手准备开发一个新的 vue 项目时,在…

Qt 5.14.2 学习记录 —— 칠 QWidget 常用控件(2)

文章目录 1、Window Frame2、windowTitle3、windowIcon4、qrc机制5、windowOpacity 1、Window Frame 在运行Qt程序后,除了用户做的界面,最上面还有一个框,这就是window frame框。对于界面的元素,它们的原点是Qt界面的左上角或win…

数据结构大作业——家谱管理系统(超详细!完整代码!)

目录 设计思路: 一、项目背景 二、功能分析 查询功能流程图: 管理功能流程图: 三、设计 四、实现 代码实现: 头文件 结构体 函数声明及定义 创建家谱树头结点 绘制家谱树(打印) 建立右兄弟…

springboot参数注解

在Spring Boot中,创建RESTful API时,通常会使用Spring MVC提供的注解来声明请求参数。以下是一些常用的注解及其用途: 1. RequestBody 用途:用于将HTTP请求的body部分绑定到方法参数上,通常用于接收JSON或XML格式的数…

uniapp实现在card卡片组件内为图片添加长按保存、识别二维码等功能

在原card组件的cover属性添加图片的话&#xff0c;无法在图片上面绑定 show-menu-by-longpress"true"属性&#xff0c;通过将图片自定义添加可使用该属性。 代码&#xff1a; <uni-card title"标题" padding"10px 0" :thumbnail"avata…

【Springer斯普林格出版,Ei稳定,往届快速见刊检索】第四届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2025)

第四届电子信息工程、大数据与计算机技术国际学术会议&#xff08;EIBDCT 2025&#xff09;将于2025年2月21-23日在中国青岛举行。该会议主要围绕电子信息工程、大数据、计算机技术等研究领域展开讨论。会议旨在为从事相关科研领域的专家学者、工程技术人员、技术研发人员提供一…

docker内外如何实现ROS通信

写在前面 在一台电脑上装有docker&#xff0c;docker内外均装有ROS系统&#xff0c;现在想要实现docker内外的ROS通信&#xff0c;怎么办呢&#xff1f; 首先&#xff0c;因为是同一台电脑的docker内外&#xff0c;所以IP本身是互通的&#xff0c;不需要在/etc/hosts中添加IP…

2025年01月07日Github流行趋势

项目名称&#xff1a;khoj 项目地址url&#xff1a;https://github.com/khoj-ai/khoj项目语言&#xff1a;Python历史star数&#xff1a;20105今日star数&#xff1a;363项目维护者&#xff1a;debanjum, sabaimran, MythicalCow, aam-at, shantanuSakpal项目简介&#xff1a;你…

web3与AI结合-Sahara AI 项目介绍

背景介绍 Sahara AI 于 2023 年创立&#xff0c;是一个 "区块链AI" 领域的项目。其项目愿景是&#xff0c;利用区块链和隐私技术将现有的 AI 商业模式去中心化&#xff0c;打造公平、透明、低门槛的 “协作 AI 经济” 体系&#xff0c;旨在重构新的利益分配机制以及…