免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

华为昇腾平台部署小红书dots3-note-preview大模型实战指南

华为昇腾平台部署小红书dots3-note-preview大模型实战指南 最近在探索国产AI芯片的应用生态时发现不少开发者对如何将开源大模型快速部署到华为昇腾Ascend平台上感到困惑尤其是在面对一些新兴的、社区活跃的模型时。恰好小红书开源的轻量级大模型dots3-note-preview因其在文本生成和对话任务上的优秀表现吸引了众多开发者的目光。本文将手把手带你完成dots3-note-preview模型在华为昇腾平台上的“0 Day”适配与部署实战从环境搭建、模型转换、推理验证到性能调优提供一套完整的闭环解决方案。无论你是想体验昇腾NPU的推理加速还是为你的应用寻找一个高效的本地化模型这篇文章都能提供直接的参考和可复现的代码。1. 背景与核心概念在开始实战之前我们有必要厘清几个关键概念这有助于理解我们接下来要做的每一步的意义。1.1 华为昇腾AscendAI处理器华为昇腾是华为公司推出的全栈全场景AI解决方案的核心其昇腾AI处理器NPU专为AI计算设计具备高算力、高能效比的特点。在AI模型推理和训练场景下相较于传统CPU/GPU昇腾NPU能提供显著的性能提升和能效优化。开发者需要通过昇腾AI软件栈如CANN来使用其计算能力。1.2 0 Day 适配在软件和硬件领域“0 Day”通常指在新硬件发布或新软件版本推出的当天就能提供相应的支持或适配。在这里“0 Day 适配小红书开源大模型”意指我们希望以最快的速度、最直接的方法将小红书最新开源的dots3-note-preview模型在昇腾平台上跑起来探索其兼容性与性能为社区提供一份即时的实践指南。1.3 小红书开源大模型 dots3-note-previewdots3-note-preview是小红书技术团队开源的一个轻量级大语言模型预览版。它通常基于类似LLaMA、ChatGLM等成熟架构进行优化在保持较强语言理解与生成能力的同时对模型体积和计算资源需求进行了控制非常适合在资源受限的边缘侧或特定加速硬件如昇腾NPU上进行部署和推理。1.4 为什么需要做适配主流的开源大模型如PyTorch或TensorFlow格式并不能直接在昇腾NPU上运行。我们需要通过昇腾AI软件栈提供的工具将模型转换成昇腾硬件能够识别的格式如OM模型并编写相应的推理代码。这个过程就是“适配”。成功的适配意味着我们能利用昇腾NPU的加速能力高效地运行这个开源模型。2. 环境准备与版本说明本次实战的环境基于华为云ModelArts或拥有一张昇腾310/910处理器的物理环境。我们将以昇腾310推理卡为例进行说明。2.1 基础环境要求操作系统Ubuntu 18.04/20.04 LTS (x86_64 或 ARM64)。本文以 Ubuntu 20.04 为例。昇腾驱动与固件需预先安装好对应昇腾310卡的驱动和固件包。Python: 3.7 或 3.8。推荐使用 3.8。CANN 工具套件这是连接上层AI框架和底层昇腾硬件的桥梁。我们需要安装CANN(Compute Architecture for Neural Networks) 和MindSpore或AscendCL接口。为了最简化流程我们使用MindSpore Lite的推理路径。假设已安装 CANN 6.0.RC1 及以上版本。2.2 关键软件版本以下版本是经过测试可用的组合请务必注意版本匹配这是后续步骤成功的基础。组件推荐版本说明CANN6.0.RC1昇腾AI计算语言提供基础算子库和运行时。MindSpore2.2.0华为全场景AI框架。我们主要使用其模型转换工具mindspore_lite。Python3.8.10编程语言环境。PyTorch1.11.0 (可选)用于初始加载和验证原始dots3-note-preview模型。dots3-note-preview最新 main 分支从小红书官方GitHub仓库获取。2.3 环境变量配置安装完成后需要设置环境变量使系统能够找到昇腾相关的库和工具。通常安装脚本会自动完成但建议检查并手动设置。# 假设 CANN 安装在 /usr/local/Ascend/ascend-toolkit/latest export ASCEND_HOME/usr/local/Ascend/ascend-toolkit/latest export PATH$ASCEND_HOME/bin:$ASCEND_HOME/compiler/ccec_compiler/bin:$PATH export LD_LIBRARY_PATH$ASCEND_HOME/lib64:$ASCEND_HOME/compiler/lib64:$LD_LIBRARY_PATH export PYTHONPATH$ASCEND_HOME/python/site-packages:$ASCEND_HOME/opp/op_impl/built-in/ai_core/tbe:$PYTHONPATH # 设置昇腾处理器型号和日志级别 export ASCEND_AICPU_PATH$ASCEND_HOME export ASCEND_OPP_PATH$ASCEND_HOME/opp export ASCEND_SLOG_PRINT_TO_STDOUT0 export ASCEND_GLOBAL_LOG_LEVEL33. 核心原理与适配流程拆解将PyTorch模型部署到昇腾NPU核心流程可以概括为模型获取 - 中间格式转换 - 昇腾格式转换 - 推理应用开发。3.1 模型转换路径PyTorch - ONNX - OM这是最通用和稳定的路径。PyTorch (.pth): 原始模型格式。ONNX (.onnx): 开放神经网络交换格式一个通用的模型中间表示。PyTorch提供了torch.onnx.export工具来完成转换。OM (.om): Offline Model昇腾硬件支持的离线模型格式。使用昇腾提供的atc(Ascend Tensor Compiler) 工具将ONNX模型转换为OM模型。3.2 适配工作的关键点算子支持并非所有PyTorch算子都能被CANN完美支持。转换过程中可能会遇到不支持的算子需要寻找替代方案或进行自定义算子开发本次适配的dots3-note-preview基于主流架构大部分算子已支持。动态Shape大语言模型通常需要处理可变长度的输入。在导出ONNX和转换OM时需要正确设置动态维度如batch_size,sequence_length。精度差异不同框架和硬件间的计算精度FP32, FP16, INT8可能带来微小的输出差异需要设定合理的误差容忍度。4. 完整实战从模型下载到昇腾推理4.1 步骤一获取dots3-note-preview模型首先从小红书的官方仓库克隆代码并下载模型权重。这里假设模型托管在Hugging Face或类似的平台。# 1. 克隆仓库 (假设仓库地址请以实际开源地址为准) git clone https://github.com/redbookai/dots3-note-preview.git cd dots3-note-preview # 2. 安装Python依赖 (参考仓库的requirements.txt) pip install -r requirements.txt # 3. 下载模型权重文件 # 通常仓库会提供下载脚本或说明例如使用 transformers 库加载 # 这里演示通过 transformers 下载模型ID需替换为实际ID python -c from transformers import AutoModelForCausalLM; model AutoModelForCausalLM.from_pretrained(redbookai/dots3-note-preview-7b, trust_remote_codeTrue)执行后模型权重会保存在~/.cache/huggingface/hub目录下。4.2 步骤二将PyTorch模型导出为ONNX格式我们需要编写一个脚本使用PyTorch的ONNX导出功能。关键是要定义一个正确的输入样例dummy_input并指定动态轴。# export_to_onnx.py import torch from transformers import AutoModelForCausalLM, AutoTokenizer # 加载模型和分词器 model_name redbookai/dots3-note-preview-7b # 请替换为实际模型ID tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(model_name, trust_remote_codeTrue) model.eval() # 切换到评估模式 # 准备一个示例输入 prompt 你好请介绍一下你自己。 inputs tokenizer(prompt, return_tensorspt) input_ids inputs[input_ids] attention_mask inputs[attention_mask] # 创建动态输入的示例batch_size 和 sequence_length 是动态的 batch_size 1 seq_length input_ids.shape[1] dummy_input (input_ids, attention_mask) # 导出模型为ONNX onnx_model_path dots3_note_preview.onnx torch.onnx.export( model, dummy_input, onnx_model_path, input_names[input_ids, attention_mask], output_names[logits], dynamic_axes{ input_ids: {0: batch_size, 1: sequence_length}, attention_mask: {0: batch_size, 1: sequence_length}, logits: {0: batch_size, 1: sequence_length} }, opset_version14, # 使用较高的opset版本以获得更好的算子支持 do_constant_foldingTrue, ) print(fModel has been exported to {onnx_model_path})运行此脚本python export_to_onnx.py。如果成功将生成dots3_note_preview.onnx文件。4.3 步骤三使用ATC工具将ONNX转换为OM模型这是适配昇腾硬件的核心步骤。我们需要使用CANN中的atc工具。# 设置环境变量确保 atc 命令可用 source $ASCEND_HOME/set_env.sh # 使用 atc 命令进行模型转换 atc --model./dots3_note_preview.onnx \ --framework5 \ # 5 代表 ONNX --output./dots3_note_preview \ # 输出OM模型文件名不带后缀 --input_formatND \ --input_shapeinput_ids:1,-1;attention_mask:1,-1 \ # 动态Shape-1表示可变维度 --dynamic_dims1,16;1,32;1,64;1,128;1,256 \ # 为动态维度指定一些常见值用于优化 --loginfo \ --soc_versionAscend310 \ # 根据你的硬件选择如 Ascend310, Ascend910等 --precision_modeallow_fp32_to_fp16 \ # 允许混合精度提升性能 --op_select_implmodehigh_precision参数解释--input_shape: 定义了输入张量的形状。-1表示该维度是动态的。--dynamic_dims: 为动态维度提供一系列具体的值工具会针对这些尺寸进行编译优化。--soc_version:必须与你的实际硬件型号匹配。--precision_mode:allow_fp32_to_fp16允许将FP32算子转为FP16执行在精度损失可接受范围内大幅提升性能。转换成功后会生成dots3_note_preview.om文件。4.4 步骤四编写昇腾推理代码使用MindSpore Lite现在我们有了昇腾可执行的OM模型。接下来使用MindSpore Lite的Python API编写推理代码。# ascend_infer.py import numpy as np from transformers import AutoTokenizer import mindspore_lite as mslite # 1. 加载OM模型 model_path ./dots3_note_preview.om context mslite.Context() context.target [ascend] context.ascend.device_id 0 # 指定设备ID context.ascend.precision_mode preferred_fp16 # 与转换时精度模式对应 model mslite.Model() model.build_from_file(model_path, mslite.ModelType.MINDIR_LITE, context) # 2. 准备输入数据 tokenizer AutoTokenizer.from_pretrained(redbookai/dots3-note-preview-7b, trust_remote_codeTrue) prompt 人工智能的未来是什么 inputs tokenizer(prompt, return_tensorsnp) input_ids inputs[input_ids].astype(np.int32) attention_mask inputs[attention_mask].astype(np.int32) # 3. 执行推理 inputs [mslite.Tensor(input_ids), mslite.Tensor(attention_mask)] outputs model.predict(inputs) # 4. 处理输出 # 输出是一个Tensor列表第一个通常是logits logits outputs[0].get_data_to_numpy() # 获取预测的下一个token ID (贪婪解码) next_token_id np.argmax(logits[0, -1, :]) # 将token ID解码为文本 next_token tokenizer.decode([next_token_id]) print(fInput: {prompt}) print(fNext predicted token: {next_token}) # 5. 进行完整的文本生成循环 def generate_text(model, tokenizer, prompt, max_length50): input_ids_np tokenizer(prompt, return_tensorsnp)[input_ids].astype(np.int32) attention_mask_np np.ones_like(input_ids_np, dtypenp.int32) for _ in range(max_length): inputs_ms [mslite.Tensor(input_ids_np), mslite.Tensor(attention_mask_np)] outputs_ms model.predict(inputs_ms) logits_np outputs_ms[0].get_data_to_numpy() next_id np.argmax(logits_np[0, -1, :]) if next_id tokenizer.eos_token_id: break # 将新token添加到输入中 new_input_id np.array([[next_id]], dtypenp.int32) input_ids_np np.concatenate([input_ids_np, new_input_id], axis1) attention_mask_np np.ones_like(input_ids_np, dtypenp.int32) generated_text tokenizer.decode(input_ids_np[0]) return generated_text full_result generate_text(model, tokenizer, prompt, max_length100) print(f\nGenerated text:\n{full_result})4.5 步骤五运行与验证在配置好环境的环境中运行推理脚本。# 确保已设置好ASCEND环境变量 source $ASCEND_HOME/set_env.sh python ascend_infer.py如果一切顺利你将看到模型根据你的提示词生成的文本。这表明dots3-note-preview模型已经在华为昇腾310上成功运行。5. 常见问题与排查思路在适配过程中你可能会遇到以下问题。这里提供一个排查清单。问题现象可能原因排查步骤与解决方案atc转换失败报错算子不支持1. ONNX opset版本过高或过低。2. 模型中包含CANN不支持的算子。1. 尝试调整torch.onnx.export中的opset_version(如 11, 13, 14)。2. 查看ATC错误日志定位不支持的算子名称。去昇腾社区查找该算子的替代方案或自定义算子实现。转换成功但推理结果异常NaN或乱码1. 动态Shape设置错误导致模型编译优化出错。2. 混合精度FP16导致某些计算下溢或溢出。1. 检查atc命令中的--input_shape和--dynamic_dims确保与模型预期输入匹配。可以先用固定Shape (--input_shapeinput_ids:1,16;attention_mask:1,16) 测试。2. 尝试将--precision_mode改为force_fp32或must_keep_origin_dtype排除精度问题。推理时报错aclError1. 昇腾驱动或CANN环境未正确安装或配置。2. 设备内存不足。3. OM模型与当前CANN版本或soc_version不兼容。1. 运行npu-smi info检查设备状态。重新执行source set_env.sh。2. 检查模型是否过大。尝试减小batch_size或sequence_length。3. 确认生成OM模型时使用的--soc_version与当前运行环境一致。MindSpore Lite加载模型失败1. OM模型文件路径错误或损坏。2. MindSpore Lite版本与CANN版本不匹配。1. 检查文件路径和权限。重新执行ATC转换。2. 确保安装的MindSpore Lite版本与CANN版本兼容。生成的文本质量差不符合预期1. 模型转换过程中权重或结构信息丢失。2. 推理代码中的预处理tokenizer或后处理解码与训练时不符。1. 在PyTorch环境下用相同输入运行原始模型对比中间层输出或最终logits定位转换误差大的环节。2. 严格使用模型原配的tokenizer并确保generate函数中的参数如temperature,top_p与原始模型推理设置一致。6. 最佳实践与工程建议成功运行只是第一步要将模型应用于生产还需考虑以下工程化因素6.1 性能优化使用AOE调优ATC工具链中的AOEAscend Optimization Engine可以对算子进行自动调优进一步提升性能。在ATC命令后追加--auto_tune_modeRL,GA参数。批处理Batch Inference在--input_shape中设置合适的batch_size如4,8可以显著提高NPU的利用率和吞吐量。需要修改推理代码以支持批量输入。模型量化对于追求极致性能的场景可以考虑使用CANN的量化工具将FP32/FP16模型转换为INT8模型大幅降低延迟和内存占用但可能会轻微损失精度。6.2 部署与服务化封装为推理服务不要将裸的推理脚本直接暴露。建议使用轻量级Web框架如FastAPI将模型封装成HTTP API服务便于管理和调用。from fastapi import FastAPI app FastAPI() # ... 初始化模型和tokenizer ... app.post(/predict) async def predict(request: PredictRequest): # ... 调用上面的推理逻辑 ... return PredictResponse(textgenerated_text)健康检查与监控在服务中添加健康检查端点并集成监控如Prometheus跟踪请求延迟、成功率和NPU使用率。6.3 资源与稳定性内存管理大模型消耗大量内存。务必监控NPU的HBMHigh Bandwidth Memory使用情况避免因内存溢出导致服务崩溃。可以考虑实现动态批处理或请求队列。错误恢复在推理代码中加入异常捕获和重试机制特别是对于设备侧可能发生的临时错误如aclError。版本管理严格管理ONNX、OM模型文件以及对应代码的版本确保回滚能力。6.4 持续集成/持续部署CI/CD对于需要频繁更新模型的场景可以构建自动化流水线代码仓库更新触发。自动拉取最新模型权重。执行export_to_onnx.py和atc转换命令。对生成的OM模型进行简单的冒烟测试如输入固定prompt检查输出是否合理。将新的OM模型部署到测试/生产环境。完成dots3-note-preview在华为昇腾平台上的适配你不仅获得了一个能在国产高性能AI硬件上运行的对话模型更掌握了一套将主流开源PyTorch模型迁移到昇腾生态的标准方法论。这套方法同样适用于其他类似架构的LLM。后续的探索方向可以放在更深入的性能剖析使用Profiling工具、多卡并行推理以及与其他昇腾生态工具如MindSpore的深度结合上。
返回列表