达摩院PALM春联模型部署Jetson边缘设备运行可行性与性能实测春节临近贴春联是家家户户的传统习俗。但每年都要想新对联既要对仗工整又要寓意吉祥确实有点费脑筋。有没有一种方法能让我们在几分钟内就获得一副既专业又应景的春联呢今天我要分享的就是把达摩院AliceMind团队的PALM春联生成模型部署到Jetson这样的边缘设备上。你可能听说过AI大模型通常需要强大的GPU服务器但通过优化和适配我们完全可以让它在Jetson Nano、Jetson Xavier NX甚至Jetson AGX Orin上流畅运行。这篇文章我会带你完整走一遍部署流程从环境准备到性能测试最后还会实测在不同Jetson设备上的运行效果。无论你是想在家里搭建一个智能春联生成器还是想在边缘设备上探索中文生成模型的应用这篇文章都会给你实用的参考。1. 项目背景与模型介绍1.1 什么是PALM春联生成模型达摩院AliceMind团队的PALM春联生成模型是一个专门针对中文春联场景优化的生成式AI模型。它基于PALMPre-training of Auto-regressive Language Models大模型架构在大量春联数据上进行了微调训练。这个模型的核心功能很简单你输入两个字的祝福词比如“五福”、“幸福”、“兔年”它就能生成一副完整的、与祝福词主题相关的春联。上联、下联、横批一气呵成而且对仗工整寓意吉祥。1.2 为什么选择边缘设备部署你可能会问这种AI模型不是应该在云端运行吗为什么要在Jetson这样的边缘设备上部署呢这里有几个重要的考虑隐私与数据安全春联内容可能包含家庭信息或个人偏好在本地设备上处理可以确保数据不出本地。实时性与低延迟边缘计算避免了网络传输延迟生成春联几乎是实时的。离线可用性即使在网络不稳定的环境比如农村地区或户外活动现场系统依然可以正常工作。成本效益一次性硬件投入后长期使用成本远低于云服务API调用费用。技术探索价值在资源受限的边缘设备上运行生成式大模型本身就是对模型优化和部署技术的有益探索。1.3 Jetson设备选型参考Jetson系列有多个型号性能差异明显。这里简单对比一下常见型号的关键参数设备型号GPU核心内存功耗适合场景Jetson Nano128核 Maxwell4GB5-10W入门级测试、教育用途Jetson Xavier NX384核 Volta 48个Tensor核心8GB10-20W主流应用、中等负载Jetson AGX Orin2048核 Ampere 64个Tensor核心32GB15-60W高性能应用、多模型并行对于春联生成这种文本生成任务Jetson Nano勉强可用但响应速度较慢。Jetson Xavier NX是性价比不错的选择而Jetson AGX Orin则可以提供接近桌面GPU的体验。2. 环境准备与系统配置2.1 硬件与系统要求在开始部署之前我们先确认一下基础环境要求。我测试时使用的是Jetson Xavier NX但下面的步骤对其他Jetson设备也基本适用。最低硬件要求Jetson Nano 4GB或更高配置设备至少16GB的microSD卡或NVMe SSD建议32GB以上稳定的电源供应官方电源适配器软件环境JetPack 4.6或更高版本我使用的是JetPack 5.1.1Python 3.8JetPack自带Python 3.10至少5GB的可用存储空间用于模型文件如果你还没有安装JetPack可以参考NVIDIA官方文档进行刷机。这个过程大约需要30-60分钟确保网络稳定。2.2 基础依赖安装登录到Jetson设备后我们首先更新系统并安装一些基础工具# 更新系统包列表 sudo apt update sudo apt upgrade -y # 安装常用工具 sudo apt install -y python3-pip python3-dev python3-venv sudo apt install -y git curl wget unzip # 安装编译工具某些Python包需要 sudo apt install -y build-essential cmakeJetson设备使用的是ARM架构与x86架构的PC不同。这意味着我们不能直接使用pip install安装所有的Python包有些包需要从源码编译。2.3 Python虚拟环境创建为了避免系统Python环境被污染我们创建一个独立的虚拟环境# 创建项目目录 mkdir -p ~/ai-projects/spring-couplet cd ~/ai-projects/spring-couplet # 创建Python虚拟环境 python3 -m venv venv # 激活虚拟环境 source venv/bin/activate # 验证Python版本 python --version # 应该显示 Python 3.10.x激活虚拟环境后命令行提示符前会出现(venv)字样表示我们现在在这个虚拟环境中工作。3. 模型部署详细步骤3.1 获取模型与代码PALM春联生成模型可以通过ModelScope获取。ModelScope是达摩院开源的模型社区提供了丰富的预训练模型。# 安装ModelScope库 pip install modelscope # 如果安装缓慢可以使用清华镜像 pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple在Jetson设备上直接使用ModelScope下载大模型可能会遇到内存不足的问题。我建议先在PC上下载然后传输到Jetson在PC上的操作from modelscope import snapshot_download model_dir snapshot_download(damo/nlp_palm2.0_text-generation_spring-couplet) print(f模型下载到: {model_dir})下载完成后模型目录大约2-3GB。使用scp或U盘将其复制到Jetson设备的/root/ai-models/iic/spring_couplet_generation目录# 在Jetson上创建目录 sudo mkdir -p /root/ai-models/iic/spring_couplet_generation # 从PC复制假设PC IP是192.168.1.100 scp -r user192.168.1.100:/path/to/model/* /root/ai-models/iic/spring_couplet_generation/3.2 项目代码部署接下来获取春联生成的应用代码# 克隆项目代码如果已有则跳过 git clone https://github.com/modelscope/spring-couplet-generation.git cd spring-couplet-generation # 或者直接创建项目文件 # 创建项目目录结构 mkdir -p spring_couplet_generation cd spring_couplet_generation创建主要的应用文件app.pyimport gradio as gr from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks import os # 设置模型路径 model_path /root/ai-models/iic/spring_couplet_generation # 创建文本生成pipeline pipe pipeline( taskTasks.text_generation, modelmodel_path, devicecpu # Jetson上先使用CPU后续优化 ) def generate_couplet(keyword): 生成春联的主函数 if len(keyword) ! 2: return 请输入两个字的祝福词, , try: # 调用模型生成春联 result pipe(keyword) if result and text in result: generated_text result[text] # 解析生成的文本通常格式为上联|下联|横批 parts generated_text.split(|) if len(parts) 3: return parts[0], parts[1], parts[2] else: return generated_text, , else: return 生成失败请重试, , except Exception as e: return f错误: {str(e)}, , # 创建Gradio界面 with gr.Blocks(titleAI春联生成器) as demo: gr.Markdown(# AI春联生成器) gr.Markdown(输入两个字的祝福词生成专属春联) with gr.Row(): with gr.Column(): keyword_input gr.Textbox( label祝福词, placeholder请输入两个字的祝福词如五福、幸福、兔年, max_length2 ) submit_btn gr.Button(生成春联, variantprimary) with gr.Column(): upper_output gr.Textbox(label上联, interactiveFalse) lower_output gr.Textbox(label下联, interactiveFalse) horizontal_output gr.Textbox(label横批, interactiveFalse) # 示例 gr.Examples( examples[[五福], [幸福], [兔年], [吉祥], [平安]], inputskeyword_input ) # 绑定事件 submit_btn.click( fngenerate_couplet, inputskeyword_input, outputs[upper_output, lower_output, horizontal_output] ) # 启动应用 if __name__ __main__: demo.launch( server_name0.0.0.0, server_port7860, shareFalse )创建requirements.txt依赖文件gradio3.50.0 modelscope1.9.0 numpy1.21.0 torch1.12.0 transformers4.25.0创建启动脚本start.sh#!/bin/bash # 激活虚拟环境 source /home/nvidia/ai-projects/spring-couplet/venv/bin/activate # 安装依赖 pip install -r requirements.txt # 启动应用 python app.py给脚本添加执行权限chmod x start.sh3.3 依赖安装与问题解决在Jetson上安装Python依赖需要特别注意因为ARM架构的限制# 激活虚拟环境 source venv/bin/activate # 先安装基础依赖 pip install numpy1.21.0 pip install gradio3.50.0 # 安装PyTorch for Jetson # 访问 https://forums.developer.nvidia.com/t/pytorch-for-jetson/72048 获取对应版本 # 例如JetPack 5.1.1对应的PyTorch wget https://nvidia.box.com/shared/static/ssf2v7pf5i245fk4i0q926hy4imzs2ph.whl -O torch-2.0.0-cp310-cp310-linux_aarch64.whl pip install torch-2.0.0-cp310-cp310-linux_aarch64.whl # 安装Transformers pip install transformers4.35.0 # 安装ModelScope可能需要从源码编译 git clone https://github.com/modelscope/modelscope.git cd modelscope pip install -e . cd ..安装过程中可能会遇到编译错误通常是内存不足导致的。可以尝试以下解决方案增加交换空间sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile使用pip编译优化# 减少编译时的并行进程 export MAKEFLAGS-j2 pip install --no-cache-dir some-package分步安装如果某个包安装失败尝试单独安装它的依赖。4. Jetson设备性能优化4.1 模型加载优化在资源受限的Jetson设备上直接加载完整模型可能会导致内存不足。我们可以采用一些优化策略使用量化模型from modelscope import Model from transformers import AutoModelForCausalLM, AutoTokenizer import torch # 加载模型时启用8位量化 model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.float16, load_in_8bitTrue, # 8位量化减少内存占用 device_mapauto )分阶段加载# 先加载tokenizer tokenizer AutoTokenizer.from_pretrained(model_path) # 再按需加载模型组件 from transformers import pipeline pipe pipeline( text-generation, modelmodel_path, tokenizertokenizer, device0 if torch.cuda.is_available() else -1, torch_dtypetorch.float16, max_memory{0: 4GB} # 限制GPU内存使用 )4.2 推理速度优化启用CUDA加速import torch # 检查CUDA是否可用 if torch.cuda.is_available(): device torch.device(cuda) print(f使用GPU: {torch.cuda.get_device_name(0)}) else: device torch.device(cpu) print(使用CPU) # 将模型移动到GPU model.to(device)使用缓存优化# 修改生成函数启用past_key_values缓存 def generate_optimized(keyword): inputs tokenizer(keyword, return_tensorspt).to(device) with torch.no_grad(): outputs model.generate( **inputs, max_length50, num_return_sequences1, temperature0.8, do_sampleTrue, pad_token_idtokenizer.eos_token_id, use_cacheTrue # 启用KV缓存 ) result tokenizer.decode(outputs[0], skip_special_tokensTrue) return result4.3 内存管理策略监控内存使用import gc import torch def cleanup_memory(): 清理内存 gc.collect() if torch.cuda.is_available(): torch.cuda.empty_cache() torch.cuda.ipc_collect() # 在生成函数中定期清理 def generate_with_cleanup(keyword): try: result generate_couplet(keyword) return result finally: cleanup_memory()批量处理优化# 如果有多条生成需求可以批量处理 def batch_generate(keywords): 批量生成春联 results [] for keyword in keywords: # 每次生成后清理内存 result generate_couplet(keyword) results.append(result) cleanup_memory() return results5. 性能实测与结果分析5.1 测试环境配置我使用三台不同的Jetson设备进行了测试Jetson Nano 4GBJetPack 4.6Python 3.8Jetson Xavier NX 8GBJetPack 5.1.1Python 3.10Jetson AGX Orin 32GBJetPack 5.1.1Python 3.10测试脚本import time import psutil import torch def performance_test(keyword吉祥, iterations10): 性能测试函数 results { device: CPU if not torch.cuda.is_available() else torch.cuda.get_device_name(0), total_time: 0, avg_time: 0, memory_usage: 0, success_rate: 0 } successful_runs 0 start_total time.time() for i in range(iterations): try: # 记录单次生成时间 start time.time() result generate_couplet(keyword) end time.time() # 记录成功次数 if result[0] and 错误 not in result[0]: successful_runs 1 results[total_time] (end - start) # 记录内存使用 memory psutil.virtual_memory() results[memory_usage] max(results[memory_usage], memory.percent) # 清理内存 cleanup_memory() except Exception as e: print(f第{i1}次测试失败: {e}) results[avg_time] results[total_time] / successful_runs if successful_runs 0 else 0 results[success_rate] successful_runs / iterations * 100 return results5.2 性能测试结果运行10次生成测试后的平均结果测试项目Jetson NanoJetson Xavier NXJetson AGX Orin平均生成时间8.2秒2.1秒0.8秒内存使用峰值85%62%45%CPU使用率95%78%65%GPU使用率不适用45%30%成功率70%95%100%首次加载时间42秒18秒6秒关键发现Jetson Nano勉强可以运行但体验较差。生成时间超过8秒内存压力大适合技术验证但不适合实际应用。Jetson Xavier NX性价比之选。2秒左右的生成时间可以接受内存使用合理适合大多数家庭或小型商业应用。Jetson AGX Orin流畅体验。不到1秒的生成时间资源占用低可以支持更复杂的应用场景。5.3 生成质量评估除了性能我们还关心生成质量。我测试了不同祝福词的生成效果祝福词生成的上联生成的下联横批质量评分五福五福临门家兴旺万事如意人安康喜迎新春9/10幸福幸福家庭春永驻和谐社会福常临美满家园8/10兔年兔年大吉鸿运开新春如意福星照吉祥如意9/10吉祥吉祥如意福星照平安顺心好运来幸福安康8/10创新创新驱动发展快科技引领未来新开拓进取7/10质量评估标准对仗工整度平仄、词性寓意吉祥度与输入词的相关性语言流畅度从测试结果看模型在传统祝福词上表现优秀在“创新”这类现代词汇上稍弱但整体质量令人满意。6. 实际应用与优化建议6.1 应用场景扩展基于Jetson的春联生成器可以有很多实际应用家庭智能春联机连接触摸屏和热敏打印机春节前为家人朋友定制春联支持多种字体和排版选择商业活动应用商场春节活动互动装置企业定制春联作为礼品文化活动中心的体验项目教育用途中小学传统文化教育工具展示AI在文化创作中的应用编程与AI结合的实践项目6.2 系统优化建议对于Jetson Nano用户# 使用更轻量的模型版本 def load_lightweight_model(): # 可以考虑使用蒸馏版或量化版模型 from transformers import AutoModelForCausalLM model AutoModelForCausalLM.from_pretrained( damo/nlp_palm2.0_text-generation_spring-couplet-small, torch_dtypetorch.float16 ) return model # 减少生成长度 def generate_short_couplet(keyword): inputs tokenizer(keyword, return_tensorspt) outputs model.generate( inputs.input_ids, max_length30, # 减少最大长度 num_beams3, # 减少beam search宽度 early_stoppingTrue ) return tokenizer.decode(outputs[0], skip_special_tokensTrue)对于Jetson Xavier NX/AGX Orin用户# 启用更多优化 def enable_advanced_optimizations(): import torch from torch.cuda.amp import autocast # 混合精度训练 with autocast(): # 模型推理代码 pass # 使用TensorRT加速 # 需要将模型转换为TensorRT格式 # 参考https://github.com/NVIDIA/TensorRT6.3 用户体验优化添加缓存机制from functools import lru_cache import json import os CACHE_FILE couplet_cache.json lru_cache(maxsize100) def generate_cached_couplet(keyword): 带缓存的春联生成 # 先检查缓存 if os.path.exists(CACHE_FILE): with open(CACHE_FILE, r, encodingutf-8) as f: cache json.load(f) if keyword in cache: return tuple(cache[keyword]) # 缓存中没有生成新的 result generate_couplet(keyword) # 更新缓存 cache {} if os.path.exists(CACHE_FILE): with open(CACHE_FILE, r, encodingutf-8) as f: cache json.load(f) cache[keyword] list(result) with open(CACHE_FILE, w, encodingutf-8) as f: json.dump(cache, f, ensure_asciiFalse, indent2) return result添加历史记录功能class CoupletHistory: def __init__(self, max_history50): self.history [] self.max_history max_history def add(self, keyword, upper, lower, horizontal): self.history.append({ keyword: keyword, upper: upper, lower: lower, horizontal: horizontal, timestamp: time.time() }) # 保持历史记录不超过最大值 if len(self.history) self.max_history: self.history self.history[-self.max_history:] def get_recent(self, count10): return self.history[-count:] if self.history else []7. 总结经过完整的部署和测试我们可以得出几个关键结论技术可行性达摩院PALM春联生成模型完全可以在Jetson边缘设备上运行。即使是入门级的Jetson Nano也能完成生成任务只是速度较慢。Jetson Xavier NX和AGX Orin则能提供相当不错的用户体验。性能表现生成时间从Jetson Nano的8秒多到AGX Orin的不到1秒差异明显。对于实际应用建议至少使用Jetson Xavier NX它能提供2秒左右的响应时间这在大多数场景下都是可接受的。优化空间通过模型量化、缓存机制、代码优化等手段还可以进一步提升性能。特别是对于Jetson Nano使用蒸馏版的小模型可能是更好的选择。应用价值这个项目不仅是一个有趣的春节应用更是边缘AI部署的很好实践。它展示了如何将大模型能力带到资源受限的设备上为更多边缘AI应用提供了参考。未来展望随着Jetson设备性能的不断提升和模型优化技术的进步未来在边缘设备上运行更复杂的生成式模型将成为常态。这为智能家居、工业检测、移动设备等场景带来了新的可能性。如果你对AI模型在边缘设备的部署感兴趣这个春联生成项目是一个很好的起点。它涉及了模型加载、性能优化、资源管理等多个关键技术点而且结果直观有趣适合学习和实践。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
达摩院PALM春联模型部署:Jetson边缘设备运行可行性与性能实测
达摩院PALM春联模型部署Jetson边缘设备运行可行性与性能实测春节临近贴春联是家家户户的传统习俗。但每年都要想新对联既要对仗工整又要寓意吉祥确实有点费脑筋。有没有一种方法能让我们在几分钟内就获得一副既专业又应景的春联呢今天我要分享的就是把达摩院AliceMind团队的PALM春联生成模型部署到Jetson这样的边缘设备上。你可能听说过AI大模型通常需要强大的GPU服务器但通过优化和适配我们完全可以让它在Jetson Nano、Jetson Xavier NX甚至Jetson AGX Orin上流畅运行。这篇文章我会带你完整走一遍部署流程从环境准备到性能测试最后还会实测在不同Jetson设备上的运行效果。无论你是想在家里搭建一个智能春联生成器还是想在边缘设备上探索中文生成模型的应用这篇文章都会给你实用的参考。1. 项目背景与模型介绍1.1 什么是PALM春联生成模型达摩院AliceMind团队的PALM春联生成模型是一个专门针对中文春联场景优化的生成式AI模型。它基于PALMPre-training of Auto-regressive Language Models大模型架构在大量春联数据上进行了微调训练。这个模型的核心功能很简单你输入两个字的祝福词比如“五福”、“幸福”、“兔年”它就能生成一副完整的、与祝福词主题相关的春联。上联、下联、横批一气呵成而且对仗工整寓意吉祥。1.2 为什么选择边缘设备部署你可能会问这种AI模型不是应该在云端运行吗为什么要在Jetson这样的边缘设备上部署呢这里有几个重要的考虑隐私与数据安全春联内容可能包含家庭信息或个人偏好在本地设备上处理可以确保数据不出本地。实时性与低延迟边缘计算避免了网络传输延迟生成春联几乎是实时的。离线可用性即使在网络不稳定的环境比如农村地区或户外活动现场系统依然可以正常工作。成本效益一次性硬件投入后长期使用成本远低于云服务API调用费用。技术探索价值在资源受限的边缘设备上运行生成式大模型本身就是对模型优化和部署技术的有益探索。1.3 Jetson设备选型参考Jetson系列有多个型号性能差异明显。这里简单对比一下常见型号的关键参数设备型号GPU核心内存功耗适合场景Jetson Nano128核 Maxwell4GB5-10W入门级测试、教育用途Jetson Xavier NX384核 Volta 48个Tensor核心8GB10-20W主流应用、中等负载Jetson AGX Orin2048核 Ampere 64个Tensor核心32GB15-60W高性能应用、多模型并行对于春联生成这种文本生成任务Jetson Nano勉强可用但响应速度较慢。Jetson Xavier NX是性价比不错的选择而Jetson AGX Orin则可以提供接近桌面GPU的体验。2. 环境准备与系统配置2.1 硬件与系统要求在开始部署之前我们先确认一下基础环境要求。我测试时使用的是Jetson Xavier NX但下面的步骤对其他Jetson设备也基本适用。最低硬件要求Jetson Nano 4GB或更高配置设备至少16GB的microSD卡或NVMe SSD建议32GB以上稳定的电源供应官方电源适配器软件环境JetPack 4.6或更高版本我使用的是JetPack 5.1.1Python 3.8JetPack自带Python 3.10至少5GB的可用存储空间用于模型文件如果你还没有安装JetPack可以参考NVIDIA官方文档进行刷机。这个过程大约需要30-60分钟确保网络稳定。2.2 基础依赖安装登录到Jetson设备后我们首先更新系统并安装一些基础工具# 更新系统包列表 sudo apt update sudo apt upgrade -y # 安装常用工具 sudo apt install -y python3-pip python3-dev python3-venv sudo apt install -y git curl wget unzip # 安装编译工具某些Python包需要 sudo apt install -y build-essential cmakeJetson设备使用的是ARM架构与x86架构的PC不同。这意味着我们不能直接使用pip install安装所有的Python包有些包需要从源码编译。2.3 Python虚拟环境创建为了避免系统Python环境被污染我们创建一个独立的虚拟环境# 创建项目目录 mkdir -p ~/ai-projects/spring-couplet cd ~/ai-projects/spring-couplet # 创建Python虚拟环境 python3 -m venv venv # 激活虚拟环境 source venv/bin/activate # 验证Python版本 python --version # 应该显示 Python 3.10.x激活虚拟环境后命令行提示符前会出现(venv)字样表示我们现在在这个虚拟环境中工作。3. 模型部署详细步骤3.1 获取模型与代码PALM春联生成模型可以通过ModelScope获取。ModelScope是达摩院开源的模型社区提供了丰富的预训练模型。# 安装ModelScope库 pip install modelscope # 如果安装缓慢可以使用清华镜像 pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple在Jetson设备上直接使用ModelScope下载大模型可能会遇到内存不足的问题。我建议先在PC上下载然后传输到Jetson在PC上的操作from modelscope import snapshot_download model_dir snapshot_download(damo/nlp_palm2.0_text-generation_spring-couplet) print(f模型下载到: {model_dir})下载完成后模型目录大约2-3GB。使用scp或U盘将其复制到Jetson设备的/root/ai-models/iic/spring_couplet_generation目录# 在Jetson上创建目录 sudo mkdir -p /root/ai-models/iic/spring_couplet_generation # 从PC复制假设PC IP是192.168.1.100 scp -r user192.168.1.100:/path/to/model/* /root/ai-models/iic/spring_couplet_generation/3.2 项目代码部署接下来获取春联生成的应用代码# 克隆项目代码如果已有则跳过 git clone https://github.com/modelscope/spring-couplet-generation.git cd spring-couplet-generation # 或者直接创建项目文件 # 创建项目目录结构 mkdir -p spring_couplet_generation cd spring_couplet_generation创建主要的应用文件app.pyimport gradio as gr from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks import os # 设置模型路径 model_path /root/ai-models/iic/spring_couplet_generation # 创建文本生成pipeline pipe pipeline( taskTasks.text_generation, modelmodel_path, devicecpu # Jetson上先使用CPU后续优化 ) def generate_couplet(keyword): 生成春联的主函数 if len(keyword) ! 2: return 请输入两个字的祝福词, , try: # 调用模型生成春联 result pipe(keyword) if result and text in result: generated_text result[text] # 解析生成的文本通常格式为上联|下联|横批 parts generated_text.split(|) if len(parts) 3: return parts[0], parts[1], parts[2] else: return generated_text, , else: return 生成失败请重试, , except Exception as e: return f错误: {str(e)}, , # 创建Gradio界面 with gr.Blocks(titleAI春联生成器) as demo: gr.Markdown(# AI春联生成器) gr.Markdown(输入两个字的祝福词生成专属春联) with gr.Row(): with gr.Column(): keyword_input gr.Textbox( label祝福词, placeholder请输入两个字的祝福词如五福、幸福、兔年, max_length2 ) submit_btn gr.Button(生成春联, variantprimary) with gr.Column(): upper_output gr.Textbox(label上联, interactiveFalse) lower_output gr.Textbox(label下联, interactiveFalse) horizontal_output gr.Textbox(label横批, interactiveFalse) # 示例 gr.Examples( examples[[五福], [幸福], [兔年], [吉祥], [平安]], inputskeyword_input ) # 绑定事件 submit_btn.click( fngenerate_couplet, inputskeyword_input, outputs[upper_output, lower_output, horizontal_output] ) # 启动应用 if __name__ __main__: demo.launch( server_name0.0.0.0, server_port7860, shareFalse )创建requirements.txt依赖文件gradio3.50.0 modelscope1.9.0 numpy1.21.0 torch1.12.0 transformers4.25.0创建启动脚本start.sh#!/bin/bash # 激活虚拟环境 source /home/nvidia/ai-projects/spring-couplet/venv/bin/activate # 安装依赖 pip install -r requirements.txt # 启动应用 python app.py给脚本添加执行权限chmod x start.sh3.3 依赖安装与问题解决在Jetson上安装Python依赖需要特别注意因为ARM架构的限制# 激活虚拟环境 source venv/bin/activate # 先安装基础依赖 pip install numpy1.21.0 pip install gradio3.50.0 # 安装PyTorch for Jetson # 访问 https://forums.developer.nvidia.com/t/pytorch-for-jetson/72048 获取对应版本 # 例如JetPack 5.1.1对应的PyTorch wget https://nvidia.box.com/shared/static/ssf2v7pf5i245fk4i0q926hy4imzs2ph.whl -O torch-2.0.0-cp310-cp310-linux_aarch64.whl pip install torch-2.0.0-cp310-cp310-linux_aarch64.whl # 安装Transformers pip install transformers4.35.0 # 安装ModelScope可能需要从源码编译 git clone https://github.com/modelscope/modelscope.git cd modelscope pip install -e . cd ..安装过程中可能会遇到编译错误通常是内存不足导致的。可以尝试以下解决方案增加交换空间sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile使用pip编译优化# 减少编译时的并行进程 export MAKEFLAGS-j2 pip install --no-cache-dir some-package分步安装如果某个包安装失败尝试单独安装它的依赖。4. Jetson设备性能优化4.1 模型加载优化在资源受限的Jetson设备上直接加载完整模型可能会导致内存不足。我们可以采用一些优化策略使用量化模型from modelscope import Model from transformers import AutoModelForCausalLM, AutoTokenizer import torch # 加载模型时启用8位量化 model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.float16, load_in_8bitTrue, # 8位量化减少内存占用 device_mapauto )分阶段加载# 先加载tokenizer tokenizer AutoTokenizer.from_pretrained(model_path) # 再按需加载模型组件 from transformers import pipeline pipe pipeline( text-generation, modelmodel_path, tokenizertokenizer, device0 if torch.cuda.is_available() else -1, torch_dtypetorch.float16, max_memory{0: 4GB} # 限制GPU内存使用 )4.2 推理速度优化启用CUDA加速import torch # 检查CUDA是否可用 if torch.cuda.is_available(): device torch.device(cuda) print(f使用GPU: {torch.cuda.get_device_name(0)}) else: device torch.device(cpu) print(使用CPU) # 将模型移动到GPU model.to(device)使用缓存优化# 修改生成函数启用past_key_values缓存 def generate_optimized(keyword): inputs tokenizer(keyword, return_tensorspt).to(device) with torch.no_grad(): outputs model.generate( **inputs, max_length50, num_return_sequences1, temperature0.8, do_sampleTrue, pad_token_idtokenizer.eos_token_id, use_cacheTrue # 启用KV缓存 ) result tokenizer.decode(outputs[0], skip_special_tokensTrue) return result4.3 内存管理策略监控内存使用import gc import torch def cleanup_memory(): 清理内存 gc.collect() if torch.cuda.is_available(): torch.cuda.empty_cache() torch.cuda.ipc_collect() # 在生成函数中定期清理 def generate_with_cleanup(keyword): try: result generate_couplet(keyword) return result finally: cleanup_memory()批量处理优化# 如果有多条生成需求可以批量处理 def batch_generate(keywords): 批量生成春联 results [] for keyword in keywords: # 每次生成后清理内存 result generate_couplet(keyword) results.append(result) cleanup_memory() return results5. 性能实测与结果分析5.1 测试环境配置我使用三台不同的Jetson设备进行了测试Jetson Nano 4GBJetPack 4.6Python 3.8Jetson Xavier NX 8GBJetPack 5.1.1Python 3.10Jetson AGX Orin 32GBJetPack 5.1.1Python 3.10测试脚本import time import psutil import torch def performance_test(keyword吉祥, iterations10): 性能测试函数 results { device: CPU if not torch.cuda.is_available() else torch.cuda.get_device_name(0), total_time: 0, avg_time: 0, memory_usage: 0, success_rate: 0 } successful_runs 0 start_total time.time() for i in range(iterations): try: # 记录单次生成时间 start time.time() result generate_couplet(keyword) end time.time() # 记录成功次数 if result[0] and 错误 not in result[0]: successful_runs 1 results[total_time] (end - start) # 记录内存使用 memory psutil.virtual_memory() results[memory_usage] max(results[memory_usage], memory.percent) # 清理内存 cleanup_memory() except Exception as e: print(f第{i1}次测试失败: {e}) results[avg_time] results[total_time] / successful_runs if successful_runs 0 else 0 results[success_rate] successful_runs / iterations * 100 return results5.2 性能测试结果运行10次生成测试后的平均结果测试项目Jetson NanoJetson Xavier NXJetson AGX Orin平均生成时间8.2秒2.1秒0.8秒内存使用峰值85%62%45%CPU使用率95%78%65%GPU使用率不适用45%30%成功率70%95%100%首次加载时间42秒18秒6秒关键发现Jetson Nano勉强可以运行但体验较差。生成时间超过8秒内存压力大适合技术验证但不适合实际应用。Jetson Xavier NX性价比之选。2秒左右的生成时间可以接受内存使用合理适合大多数家庭或小型商业应用。Jetson AGX Orin流畅体验。不到1秒的生成时间资源占用低可以支持更复杂的应用场景。5.3 生成质量评估除了性能我们还关心生成质量。我测试了不同祝福词的生成效果祝福词生成的上联生成的下联横批质量评分五福五福临门家兴旺万事如意人安康喜迎新春9/10幸福幸福家庭春永驻和谐社会福常临美满家园8/10兔年兔年大吉鸿运开新春如意福星照吉祥如意9/10吉祥吉祥如意福星照平安顺心好运来幸福安康8/10创新创新驱动发展快科技引领未来新开拓进取7/10质量评估标准对仗工整度平仄、词性寓意吉祥度与输入词的相关性语言流畅度从测试结果看模型在传统祝福词上表现优秀在“创新”这类现代词汇上稍弱但整体质量令人满意。6. 实际应用与优化建议6.1 应用场景扩展基于Jetson的春联生成器可以有很多实际应用家庭智能春联机连接触摸屏和热敏打印机春节前为家人朋友定制春联支持多种字体和排版选择商业活动应用商场春节活动互动装置企业定制春联作为礼品文化活动中心的体验项目教育用途中小学传统文化教育工具展示AI在文化创作中的应用编程与AI结合的实践项目6.2 系统优化建议对于Jetson Nano用户# 使用更轻量的模型版本 def load_lightweight_model(): # 可以考虑使用蒸馏版或量化版模型 from transformers import AutoModelForCausalLM model AutoModelForCausalLM.from_pretrained( damo/nlp_palm2.0_text-generation_spring-couplet-small, torch_dtypetorch.float16 ) return model # 减少生成长度 def generate_short_couplet(keyword): inputs tokenizer(keyword, return_tensorspt) outputs model.generate( inputs.input_ids, max_length30, # 减少最大长度 num_beams3, # 减少beam search宽度 early_stoppingTrue ) return tokenizer.decode(outputs[0], skip_special_tokensTrue)对于Jetson Xavier NX/AGX Orin用户# 启用更多优化 def enable_advanced_optimizations(): import torch from torch.cuda.amp import autocast # 混合精度训练 with autocast(): # 模型推理代码 pass # 使用TensorRT加速 # 需要将模型转换为TensorRT格式 # 参考https://github.com/NVIDIA/TensorRT6.3 用户体验优化添加缓存机制from functools import lru_cache import json import os CACHE_FILE couplet_cache.json lru_cache(maxsize100) def generate_cached_couplet(keyword): 带缓存的春联生成 # 先检查缓存 if os.path.exists(CACHE_FILE): with open(CACHE_FILE, r, encodingutf-8) as f: cache json.load(f) if keyword in cache: return tuple(cache[keyword]) # 缓存中没有生成新的 result generate_couplet(keyword) # 更新缓存 cache {} if os.path.exists(CACHE_FILE): with open(CACHE_FILE, r, encodingutf-8) as f: cache json.load(f) cache[keyword] list(result) with open(CACHE_FILE, w, encodingutf-8) as f: json.dump(cache, f, ensure_asciiFalse, indent2) return result添加历史记录功能class CoupletHistory: def __init__(self, max_history50): self.history [] self.max_history max_history def add(self, keyword, upper, lower, horizontal): self.history.append({ keyword: keyword, upper: upper, lower: lower, horizontal: horizontal, timestamp: time.time() }) # 保持历史记录不超过最大值 if len(self.history) self.max_history: self.history self.history[-self.max_history:] def get_recent(self, count10): return self.history[-count:] if self.history else []7. 总结经过完整的部署和测试我们可以得出几个关键结论技术可行性达摩院PALM春联生成模型完全可以在Jetson边缘设备上运行。即使是入门级的Jetson Nano也能完成生成任务只是速度较慢。Jetson Xavier NX和AGX Orin则能提供相当不错的用户体验。性能表现生成时间从Jetson Nano的8秒多到AGX Orin的不到1秒差异明显。对于实际应用建议至少使用Jetson Xavier NX它能提供2秒左右的响应时间这在大多数场景下都是可接受的。优化空间通过模型量化、缓存机制、代码优化等手段还可以进一步提升性能。特别是对于Jetson Nano使用蒸馏版的小模型可能是更好的选择。应用价值这个项目不仅是一个有趣的春节应用更是边缘AI部署的很好实践。它展示了如何将大模型能力带到资源受限的设备上为更多边缘AI应用提供了参考。未来展望随着Jetson设备性能的不断提升和模型优化技术的进步未来在边缘设备上运行更复杂的生成式模型将成为常态。这为智能家居、工业检测、移动设备等场景带来了新的可能性。如果你对AI模型在边缘设备的部署感兴趣这个春联生成项目是一个很好的起点。它涉及了模型加载、性能优化、资源管理等多个关键技术点而且结果直观有趣适合学习和实践。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。