LLaMA 3.2 1B模型部署到RK3588香橙派5plus开发板上的完整指南

大家好!在9月25日,Meta发布了LLaMA 3.2模型,其中包括了专为边缘设备设计的1B和3B小参数模型。我最近在参加一个人工智能类的学科竞赛,因此决定尝试在边缘设备上部署LLaMA 3.2 1B模型。我选择的是RK3588芯片,使用的是香橙派5plus开发板,配备了16G的运行内存,处理速度非常快。最终成功部署,回答速度和质量都相当不错。以下是我的部署过程,希望对大家有所帮助。

目录

系统下载与烧录

模型下载

环境配置

代码实现

精度与量化

总结


更详细视频可以在b站查看,链接放在评论区吧

 

系统下载与烧录


首先,我下载了Ubuntu系统。由于官方版本烧录失败,我选择了第三方的系统镜像。

香橙派5plus从ssd启动Ubuntu_香橙派5plus镜像-CSDN博客

烧录软件我使用了balenaEtcher   https://etcher.balena.io/#download-etcher,大家也可以选择其他烧录软件Orange Pi 5 Plus - Wiki-Orange Pi。烧录完成后,将卡插入开发板,进行初始化设置,包括选择语言和设置密码。

模型下载


系统安装好后,我创建了一个项目文件夹来存放模型和代码。我选择了Huggingface的镜像网站HF-mirror来下载LLaMA 3.2的instruct版本模型Models - Hugging Face。这里需要注意的是,我最初下载错了模型,下载了base版本,导致模型无法正确回复问题。后来发现是模型下载错误,并且注意力掩码没有设置。大家在下载时一定要注意这些问题。

# 下载git,克隆模型 

sudo apt update
sudo apt install git
sudo apt install curl
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt install git-lfs
git lfs install
git clone https://hf-mirror.com/unsloth/Llama-3.2-1B-Instruct

环境配置


在开发板上配置环境与普通电脑有所不同,因为开发板使用的是ARM64系统。我们需要下载pip,并创建虚拟环境。

# 创建虚拟环境

python3 -m venv llama

 # 激活虚拟环境

source llama/bin/activate

 也可以去下载anaconda,参考这个链接超详细Ubuntu安装Anaconda步骤+Anconda常用命令_ubuntu 安装anaconda-CSDN博客

我使用的是Python 3.12版本。接下来,我们需要下载PyTorch和transformer库。由于直接使用pip下载PyTorch较慢,我选择了从网页下载后离线安装。这里需要注意的是,要确保版本对应。arm64下安装pytorch,torchvision,torchaudio以及它们之间的版本对应关系_torch-1.11.0对应的torchaudio版本-CSDN博客

#  下载PyTorch

pip install /home/YourName/Downloads/torch-2.4.1-cp312-cp312-manylinux2014_aarch64.whl
pip install /home/YourName/Downloads/torchvision-0.19.1-cp312-cp312-manylinux2014_aarch64.whl

# 下载transformer

pip install transformers -i https://pypi.tuna.tsinghua.edu.cn/simple

代码实现

创建一个新文件 

touch llama-chat.py


代码部分主要包括导入模型、分词器、设置参数和多轮聊天的设计。在测试时,我遇到了注意力掩码未设置的问题,这会影响模型对输入内容的理解。此外,我还发现了束搜索的问题,当设置参数为1时,启用束搜索是无效的。因此,我将修改num_beams参数设置,以测试束搜索和贪心搜索的效果区别。 

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

def load_model_and_tokenizer(model_directory):
    """
    从本地目录加载模型和分词器。
    """
    tokenizer = AutoTokenizer.from_pretrained(model_directory)
    model = AutoModelForCausalLM.from_pretrained(model_directory)
    # model.half()
    return model, tokenizer

def generate_text(model, tokenizer, prompt, max_new_tokens):
    """
    使用提供的模型和分词器生成文本。
    """
    # 编码输入提示
    inputs = tokenizer(prompt, return_tensors='pt', padding=True, truncation=True)
    input_ids = inputs['input_ids']
    attention_mask = inputs['attention_mask']


    # 生成文本
    output = model.generate(
        input_ids=input_ids,
        attention_mask=attention_mask,
        max_new_tokens=max_new_tokens,
        pad_token_id=tokenizer.eos_token_id,
        no_repeat_ngram_size=2,
        repetition_penalty=1.5,
        top_k=50,
        top_p=0.95,
        temperature=1.0,
        do_sample=True,
        num_return_sequences=1,
        num_beams=2,  # 设置 num_beams > 1
        early_stopping=True
    )

    # 解码生成的文本
    generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
    return generated_text

def chat_with_model(model, tokenizer, max_new_tokens):
    """
    与模型进行聊天对话。
    """
    print("Chat with the model! Type 'exit' to end the conversation.")
    prompt = "You are an Intelligent Traffic Rules Q&A Assistant, and when user ask you questions, you will provide me with traffic knowledge.Next, user will ask you questions, please answer them.\n"
    
    once_input = input("User:")
    
    if once_input.lower() == 'exit':
        print("Assistant: Goodbye! Stay safe on the roads!")
        exit()
        
    input_to_model = prompt + "\nUser:" + once_input + "\nAssistant"
    
    response = generate_text(model, tokenizer, input_to_model, max_new_tokens)

    while True:
        print(response)
        user_input = input("User: ")
        if user_input.lower() == 'exit':
            print("Assistant: Goodbye! Stay safe on the roads!")
            break
        input_to_model = response + "\n"+ "\nUser:" + user_input +"\nAssistant"
        # 更新对话历史
        # 生成模型的回答
        response = generate_text(model, tokenizer, input_to_model, max_new_tokens)

def main():
    # model_directory = "/home/zhineng/llama3.2-1B/Llama-3.2-1B"  # 替换为你的本地模型目录
    # model_directory = "/home/zhineng/llama3.2-1B/Llama-3.2-1B-FP8"
    model_directory = "/home/zhineng/llama3.2-1B/Llama-3.2-1B-Instruct"
    max_new_tokens = 100  # 生成新 token 的最大数量

    # 加载模型和分词器
    model, tokenizer = load_model_and_tokenizer(model_directory)

    # 确保模型处于评估模式
    model.eval()

    # 开始聊天对话
    chat_with_model(model, tokenizer, max_new_tokens)

if __name__ == "__main__":
    main()

 # 运行推理代码

python3 llama-chat.py

精度与量化


我测试了fp32精度和fp16精度模型的生成速度和质量。结果显示,虽然生成内容相同,但fp16的速度要快得多。未来,我还计划进行8bit量化。

贪心搜索 

束搜索 

总结


通过这次部署,我学到了很多关于边缘设备部署大型模型的知识。这个过程不仅记录了我的学习过程,也为其他想要部署的同学提供了参考。如果你有任何问题,欢迎在评论区交流指正。下一个视频,我可能会记录在树莓派上的部署过程或者使用NPU进行神经网络加速,敬请期待!

### 将云端训练好的模型部署到嵌入式开发板上的方法 #### 一、理解模型部署的概念 在软件工程领域,部署是指将开发完成的程序投入实际使用的流程[^1]。对于深度学习模型而言,这一过程涉及使经过训练的模型能够在目标硬件设备上高效运行。然而,相较于传统软件部署,深度学习模型部署面临更多挑战,例如复杂的环境配置需求以及对计算资源的高度依赖。 #### 二、针对嵌入式开发板的具体部署方案 以NVIDIA Jetson TX1为例,其支持Linux操作系统并专为深度学习应用而设计[^3]。以下是实现云端训练模型向此类开发板迁移的关键步骤: - **模型导出与转换** 训练完成后需将模型保存为适合目标平台加载的形式。例如,在PyTorch中可利用`torch.onnx.export()`函数将其转化为ONNX格式文件以便跨框架兼容;而在TensorFlow里则可通过SavedModel API创建序列化版本。 ```python import torch dummy_input = torch.randn(1, 3, 224, 224) model = MyTrainedModel() torch.onnx.export(model, dummy_input, "model.onnx", verbose=True) ``` - **适配目标架构特性** 嵌入式系统往往具备独特的处理器结构(如ARM Cortex系列),因此可能需要重新编译某些库或者调整算法参数来适应有限内存空间和较低功耗条件下的性能表现。此外,部分专用芯片还提供了定制API简化操作接口定义。 - **优化推理速度** 考虑到实时性要求较高的场景下延迟敏感度较高,故应对原始网络结构做适当精简处理诸如剪枝(pruning)、量化(quantization)等技术手段降低浮点运算次数从而提升执行效率同时减少能耗开销。 - **集成至整体解决方案之中** 完成上述准备工作之后还需考虑与其他组件协同工作的能力比如数据采集模块的数据预处理逻辑对接收自传感器输入信号进行必要的变换使其符合预期规格最后形成完整的软硬一体产品形态推向市场服务于最终客户群体。 #### 示例代码片段展示如何准备适用于K210开发板模型文件[^2] ```bash tar -zxvf trained_model.tar.gz ls # 输出应包含类似以下条目列表: # checkpoint.pth # config.json # labels.txt ``` 以上命令展示了从服务器获取已打包好的成果集解压后的目录组成情况供后续进一步分析使用前确认无误后再继续推进项目进度安排直至达成既定目标为止。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值