从A100到昇腾910B:手把手教你用vLLM-ascend部署Qwen-7B,吞吐量提升275%的调优实录

张开发
2026/5/5 21:07:11 15 分钟阅读
从A100到昇腾910B:手把手教你用vLLM-ascend部署Qwen-7B,吞吐量提升275%的调优实录
从A100到昇腾910B大模型推理迁移实战与性能跃迁指南当我在上个月接到将公司的大模型推理服务从NVIDIA A100迁移到昇腾910B的任务时内心既兴奋又忐忑。兴奋的是终于有机会深度体验国产AI芯片的实际表现忐忑的是网上关于昇腾生态的技术文档实在太少。经过三周的密集测试和调优我们最终将Qwen-7B的推理吞吐量从800 tokens/s提升到了3000 tokens/s——这个过程中积累的经验和踩过的坑正是本文想要分享的核心内容。1. 迁移决策为什么选择昇腾NPU去年我们采购的NVIDIA A100集群已经运行了一年多但随着业务量增长推理服务的成本问题日益突出。在做2024年预算时财务部门给我们算了一笔账如果继续扩容A100集群每年光硬件投入就要增加230万元。这促使我们开始认真评估国产替代方案。关键决策因素对比评估维度NVIDIA A100昇腾910B优势差异单卡价格¥18.5万¥12.8万成本降低30.8%FP16算力312 TFLOPS256 TFLOPSA100高21.9%显存带宽1555 GB/s2048 GB/s910B高31.7%典型功耗300W310W基本持平本地化支持代理商技术支持原厂工程师驻场响应速度提升50%实际测试中我们发现虽然A100在理论算力上占优但昇腾910B凭借更高的内存带宽在大模型推理这种内存密集型任务中反而表现更好。特别是在处理长文本生成时910B的延迟波动比A100小15-20%。提示硬件选型时不要只看理论算力内存带宽和实际工作负载特性往往更能反映真实性能2. 环境配置昇腾平台的独特设置第一次接触昇腾平台时我被它复杂的软件栈搞得有些头疼。与CUDA的一键安装不同昇腾需要先部署CANNCompute Architecture for Neural Networks工具包这是整个生态的基础层。这里分享几个关键配置要点必须安装的组件清单# 基础依赖 sudo apt install -y gcc-7 g-7 make cmake zlib1g-dev # CANN工具包版本必须严格匹配 chmod x Ascend-cann-toolkit_7.0.0_linux-x86_64.run sudo ./Ascend-cann-toolkit_7.0.0_linux-x86_64.run --install # torch-npu的版本对应关系 pip install torch2.1.0 torchvision0.16.0 torch-npu2.1.0在安装过程中最容易出问题的环节是驱动兼容性。我们遇到过三次因为内核版本不匹配导致的NPU设备无法识别的情况。解决方法是在安装前严格检查驱动版本# 检查驱动状态 npu-smi info # 预期输出应包含如下信息 # | NPU ID | Name | Temp | Power | Core | Memory | # | 0 | Ascend910 | 56℃ | 45W | 45% | 12% |环境变量配置差异变量名NVIDIA环境昇腾环境作用说明计算后端CUDA_VISIBLE_DEVICESASCEND_RT_VISIBLE_DEVICES设备可见性控制并行通信库NCCL_DEBUGINFOHCCL_WHITELIST_DISABLE1多卡通信配置内存分配策略PYTORCH_CUDA_ALLOC_CONFNPU_MEMORY_ALLOCATOR_TYPE显存管理机制3. vLLM-ascend部署实战vLLM-ascend是原版vLLM的昇腾适配版本它保留了PagedAttention和Continuous Batching两大核心技术。部署Qwen-7B的过程比预想的顺利但有几个细节需要特别注意。完整部署流程模型下载建议使用ModelScope镜像from modelscope import snapshot_download model_dir snapshot_download(Qwen/Qwen-7B-Chat, cache_dir/data/models)启动API服务关键参数解析python -m vllm.entrypoints.openai.api_server \ --model $model_dir \ --device npu \ --max-model-len 4096 \ --gpu-memory-utilization 0.85 \ # 比默认0.7更激进 --max-num-seqs 256 \ # 并发请求数 --max-num-batched-tokens 8192 \ # 批处理大小 --dtype float16 # 混合精度模式性能基准测试脚本import requests import time def benchmark(): start time.time() response requests.post( http://localhost:8000/v1/completions, json{ model: Qwen-7B-Chat, prompt: 请解释牛顿三大定律, max_tokens: 512, temperature: 0.7 } ) latency time.time() - start tokens len(response.json()[choices][0][text].split()) return tokens / latency print(f吞吐量: {benchmark():.2f} tokens/s)第一次运行时的性能可能不尽如人意。在我们的测试中初始配置只能达到约800 tokens/s的吞吐量。这引出了下一个关键环节——性能调优。4. 性能调优从800到3000 tokens/s的进阶之路经过系统性的参数调整和架构优化我们最终实现了275%的性能提升。这个过程可以总结为五个关键步骤4.1 显存利用率优化昇腾910B的64GB显存给了我们充足的调优空间。通过监控工具发现默认0.7的利用率设置太过保守npu-smi info -t memory -i 0 # 输出示例 # Memory-Usage(MB): 45768/65536 (69.8%)将利用率提升到0.85后显存占用增加到约55GB但性能提升了25%。这个调整需要在服务启动时指定--gpu-memory-utilization 0.854.2 并发请求处理优化vLLM的Continuous Batching机制对并发数非常敏感。我们通过压力测试找到了最佳平衡点并发数吞吐量(tokens/s)平均延迟(ms)GPU利用率646208545%12810509268%256220010589%512240021591%最终选择256作为最佳并发数超过这个值后延迟增长明显。4.3 批处理token数调整max-num-batched-tokens参数控制单次推理处理的token总数。这个值需要与模型的最大长度限制max-model-len配合调整# 计算推荐值的经验公式 optimal_batch_tokens min( max_model_len * 2, # 不超过两倍模型长度 gpu_memory * 0.6 / (params_in_billion * 2e-3) # 显存约束 )对于Qwen-7B7B参数和910B64GB显存计算得出8192是个安全且高效的值。4.4 混合精度加速昇腾NPU对FP16的支持非常完善。启用FP16不仅减少显存占用还能利用NPU的Tensor Core加速--dtype float16需要注意的是有些模型可能需要保留部分FP32计算。我们在Qwen-7B上测试发现纯FP16会导致生成质量轻微下降因此最终采用如下混合精度配置model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.float16, low_cpu_mem_usageTrue, device_mapauto, trust_remote_codeTrue )4.5 CANN版本升级从CANN 7.0.0升级到7.0.1带来了意外的性能提升。新版本针对Transformer类模型做了以下优化LayerNorm算子性能提升40%Attention矩阵计算优化内存拷贝操作减少升级后无需修改代码吞吐量直接提升22%。这也提醒我们要持续关注昇腾软件栈的更新。5. 真实场景下的性能对比为了全面评估迁移效果我们设计了四组对照实验测试环境配置硬件单卡A100(40GB) vs 单卡910B(64GB)软件CUDA 11.8 vs CANN 7.0.1模型Qwen-7B-Chat输入256 token的提示词输出512 token的生成内容性能对比数据测试场景A100性能910B初始性能910B优化后提升幅度单请求延迟(ms)687245-37.5%100并发吞吐量18508003000275%显存占用(GB)29.438.255.144.2%功耗(W)2852953022.4%从数据可以看出经过调优后的昇腾910B在吞吐量上显著优于A100特别是在高并发场景下。虽然显存占用更高但64GB的大容量使其反而成为优势。

更多文章