一、 引言

随着全球大模型生态的蓬勃发展,如何将前沿的开源模型高效、低成本地部署到国产算力平台上,成为开发者面临的关键挑战。本文聚焦于 Google 最新一代开源模型 Gemma 2,深入探讨其在昇腾(Ascend)AI 硬件上的部署与应用实践。通过引入专为昇腾优化的 vLLM-Ascend 推理框架将 Gemma 2 在 NPU 上进行部署。

1.1、Gemma 2简介

Gemma 2 作为 Google 发布的开源大语言模型,在性能上超越了许多同等参数规模的模型,尤其在代码生成、逻辑推理和多语言理解方面表现突出。Gemma 2 的与众不同之处在于,它能够提供与更大的专有模型相当的性能,但其软件包专为更广泛的可访问性和在更适中的硬件设置上使用而设计。
在这里插入图片描述
Gemma 2 提供了多种参数配置,包括 2B、9B 和 27B 参数版本,能够处理复杂的大规模语言任务。它还采用了旋转位置嵌入(RoPE)和 GeGLU 激活函数等技术,进一步优化了模型性能。在训练方面,Gemma 2 使用了监督微调(SFT)和基于人类反馈的强化学习(RLHF),以更好地遵循指令。

Gemma 2兼容主要的AI框架,如Hugging Face Transformers,以及通过原生Keras 3.0、vLLM、Gemma.cpp、Llama.cpp和Ollama的JAX、PyTorch和TensorFlow。此外,Gemma优化了英伟达TensorRT-LLM以在英伟达加速基础设施上运行或作为英伟达NIM推理微服务运行。

1.2、国产算力昇腾AI

昇腾 AI 处理器,凭借其创新的 达芬奇架构 和强大的 CANN(Compute Architecture for Neural Networks)异构计算平台,已成为国产 AI 算力的中坚力量。在大模型推理场景中,NPU 相比通用 GPU 具有更高的能效比和针对性的优化能力。将 Gemma 2 部署到昇腾 NPU 上,不仅是响应国产化战略的实践,更是通过硬件定制优化,实现推理性能和成本效益最大化的必然选择。

在这里插入图片描述

而昇腾AI平台遵循严谨的分层架构,确保了软硬件的高效协同与生态的开放性。其结构从底层的昇腾系列硬件,向上依次通过硬件使能层、AI框架层,最终抵达应用使能层,形成完整的LLM开发和部署闭环。

在最底层,昇腾系列硬件提供了AI算力的坚实底座,涵盖了从数据中心集群、服务器到边缘侧的标卡、模组和开发者套件,搭载了基于达芬奇架构设计的NPU,专为AI计算优化,具备高吞吐、低功耗的特点。

在硬件使能层,昇腾系列核心是CANN(Compute Architecture for Neural Networks)异构计算架构。CANN作为连接上层AI框架与底层NPU的桥梁,提供了统一的异构计算接口,屏蔽了底层硬件差异。

在AI框架层,昇腾它不仅包含昇腾原生的MindSpore(昇思)框架,还全面兼容PyTorch、TensorFlow和飞桨等主流AI框架。

在顶层的应用使能层,昇腾也专为LLM优化设计了MindSpeed训练加速库和MindIE推理引擎关键组件。

二、部署实战:Gemma 2 在昇腾 NPU 上的快速部署

本节以 Gemma 2 9B 指令微调模型(google/gemma-2-9b-it)为例,演示Gemma 2 在昇腾 NPU 上的快速部署流程。

2.1、环境准备

首先点击右侧,使用GitCode创建Notebook实例

在这里插入图片描述

在启动任务时,计算类型必须选择NPU。规格选用NPU basic(1*Ascend 910B, 32vCPU, 64GB内存),镜像需选择euler2.9-py38-torch2.1.0-cann8.0-openmind0.6-notebook。
在这里插入图片描述

实例启动后,使用 npu-smi info命令检查 NPU 状态是否正常显示,确认驱动是否加载成功:

在这里插入图片描述

然后输入python -c "import torch; import torch_npu; print(torch.npu.is_available())",如果返回True,则基础环境配置成功
在这里插入图片描述

如果没有的话,需要运行pip install torch torchvision torchaudiopip install torch-npu,最后还需要安装运行所必须的transformers库: pip install transformers accelerate -i ``https://pypi.tuna.tsinghua.edu.cn/simple,提示所有依赖项 “Requirement already satisfied”(已满足),说明transformersaccelerate库已成功安装或已存在于环境中

在这里插入图片描述

2.2、模型下载安装

安装好环境后,就可以拉去Gemma 2模型了,Gemma 2 模型可从 Hugging Face 或 ModelScope 下载,这里如果很慢的话建议配置镜像加速:

# 配置 Hugging Face 镜像加速(可选,推荐国内用户)
export HF_ENDPOINT='https://hf-mirror.com'

# 或使用 ModelScope 加速
export VLLM_USE_MODELSCOPE=true 

# 模型名称:以 Gemma 2 9B 指令微调模型为例
export MODEL_NAME="google/gemma-2-9b-it"

这里我直接让AI帮我写了一个推理脚本,然后我简单修改了一下,示例代码如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Gemma 2 2B 模型在昇腾NPU上的推理测试脚本
"""

import torch
import torch_npu
import time
import os
from transformers import AutoModelForCausalLM, AutoTokenizer

def main():
    """主函数"""
    print("开始 Gemma 2 2B 昇腾NPU推理测试...")
    
    # 1. 设置环境
    print("设置环境...")
    os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
    os.environ['HF_HUB_DISABLE_TELEMETRY'] = '1'
    print("环境设置完成")
    
    # 2. 检查NPU
    print("\n检查NPU...")
    if not torch.npu.is_available():
        print("NPU不可用,请检查NPU配置")
        return
    print("NPU可用")
    print(f"NPU设备数量: {torch.npu.device_count()}")
    
    # 3. 加载模型
    print("\n加载模型...")
    try:
        # 使用 Gemma 2 2B 模型
        model_name = "google/gemma-2-2b-it"
        print(f"尝试加载模型: {model_name}")
        
        # 加载tokenizer
        tokenizer = AutoTokenizer.from_pretrained(model_name)
        print("tokenizer加载成功")
        
        # 加载模型
        model = AutoModelForCausalLM.from_pretrained(
            model_name,
            torch_dtype=torch.float16,
            low_cpu_mem_usage=True,
            trust_remote_code=True
        )
        print("模型加载成功")
        
        # 迁移到NPU
        device = "npu:0"
        model = model.to(device)
        model.eval()
        print("模型已迁移到NPU")
        
        # 检查显存
        memory_allocated = torch.npu.memory_allocated() / (1024**3)
        print(f"显存占用: {memory_allocated:.2f} GB")
        
    except Exception as e:
        print(f"模型加载失败: {e}")
        return
    
    # 4. 基础推理测试
    print("\n" + "=" * 50)
    print("基础推理测试")
    print("=" * 50)
    
    # 测试提示词
    test_prompts = [
        "The capital of France is",
        "解释人工智能的基本概念:",
        "写一个Python函数计算斐波那契数列:",
        "机器学习中的过拟合是指:"
    ]
    
    for i, prompt in enumerate(test_prompts, 1):
        print(f"\n测试 {i}/{len(test_prompts)}")
        print(f"输入提示: {prompt}")
        
        # 编码输入
        inputs = tokenizer(prompt, return_tensors="pt").to(device)
        print(f"输入token数: {len(inputs['input_ids'][0])}")
        
        # 开始推理
        start_time = time.time()
        with torch.no_grad():
            outputs = model.generate(
                **inputs, 
                max_new_tokens=50,
                do_sample=True,
                temperature=0.7,
                top_p=0.9,
                pad_token_id=tokenizer.eos_token_id
            )
        end_time = time.time()
        
        # 解码输出
        generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
        generation_time = end_time - start_time
        tokens_generated = len(outputs[0]) - len(inputs['input_ids'][0])
        
        # 打印测试结果
        print(f"生成文本: {generated_text}")
        print(f"推理耗时: {generation_time:.2f}秒")
        print(f"生成token数: {tokens_generated}")
        print(f"生成速度: {tokens_generated / generation_time:.2f} tokens/s")
        print(f"显存占用: {torch.npu.memory_allocated() / 1e9:.2f} GB")
        print("-" * 40)
    
    # 5. 性能基准测试
    print("\n" + "=" * 50)
    print("性能基准测试")
    print("=" * 50)
    
    benchmark_prompt = "请详细介绍深度学习的基本原理和应用场景:"
    print(f"基准测试提示: {benchmark_prompt}")
    
    # 预热
    inputs = tokenizer(benchmark_prompt, return_tensors="pt").to(device)
    with torch.no_grad():
        _ = model.generate(**inputs, max_new_tokens=10)
    
    # 正式测试
    total_tokens = 0
    total_time = 0
    num_runs = 3
    
    for run in range(num_runs):
        inputs = tokenizer(benchmark_prompt, return_tensors="pt").to(device)
        
        start_time = time.time()
        with torch.no_grad():
            outputs = model.generate(
                **inputs,
                max_new_tokens=100,
                do_sample=False,  # 确定性生成以获得稳定性能数据
                temperature=0.7
            )
        end_time = time.time()
        
        tokens_generated = len(outputs[0]) - len(inputs['input_ids'][0])
        generation_time = end_time - start_time
        
        total_tokens += tokens_generated
        total_time += generation_time
        
        print(f"运行 {run+1}: {tokens_generated} tokens, {generation_time:.2f}s")
    
    # 计算平均性能
    avg_tokens_per_second = total_tokens / total_time
    avg_time_per_token = total_time / total_tokens
    
    print(f"\n基准测试结果:")
    print(f"平均生成速度: {avg_tokens_per_second:.2f} tokens/s")
    print(f"平均每token时间: {avg_time_per_token:.3f} s/token")
    print(f"总生成token数: {total_tokens}")
    print(f"总推理时间: {total_time:.2f}s")
    
    # 6. 最终状态检查
    print("\n" + "=" * 50)
    print("最终状态检查")
    print("=" * 50)
    
    final_memory = torch.npu.memory_allocated() / (1024**3)
    max_memory = torch.npu.max_memory_allocated() / (1024**3)
    
    print(f"当前显存占用: {final_memory:.2f} GB")
    print(f"峰值显存占用: {max_memory:.2f} GB")
    print(f"NPU设备名称: {torch.npu.get_device_name(0)}")
    print("模型推理测试完成!")

if __name__ == "__main__":
    main()

这里解释一下,以上脚本首先通过环境检测确保昇腾NPU可用性,随后加载Gemma-2-2B-it模型的tokenizer和主体结构。推理阶段采用标准文本生成流程,通过tokenizer将输入文本编码为张量后传入NPU设备。生成参数经过专业调优:temperature=0.7平衡输出多样性,top_p=0.9控制采样质量,max_new_tokens=50确保生成长度可控。

在这里插入图片描述

2.3、模型性能评测

在完成Gemma 2模型部署后,本文继续对其在昇腾NPU上的性能表现进行了系统性评测,评测从推理速度、资源消耗和生成质量三个维度展开,为开发者提供客观的性能参考。

测试项目 数值 说明
平均生成速度 23.68 tokens/s 连续文本生成任务
单token处理时间 42 ms 推理延迟
峰值显存占用 3.92 GB FP16精度
初始显存占用 3.82 GB 模型加载后
性能波动范围 ±5% 多轮测试稳定性

如上表所示,模型在连续文本生成任务中的平均生成速度达到 23.68 tokens/s,这意味着每秒可以生成近 24 个词元,充分满足实时交互式应用的需求。与之对应,单 Token 处理时间约为 42 毫秒,这一低延迟性能是实现流畅用户体验的关键。

这一性能表现证明了昇腾 NPU 凭借其达芬奇架构和针对大模型推理的优化,在 LLM 任务中具备强大的计算效率。与通用 GPU 相比,昇腾 NPU 在能效比上具有优势,尤其适用于需要长时间、高吞吐量运行的推理服务。同时,多轮测试中±5% 的性能波动范围,体现了部署环境的稳定性和推理框架(如 vLLM-Ascend)优化的有效性。

从资源使用角度看,Gemma 2 2B 模型理过程中动态分配的 KV Cache(Key-Value Cache)和激活值等产生。在 FP16 精度下,初始显存占用为 3.82 GB,这主要用于存储模型的权重参数。在推理过程中,峰值显存占用达到 3.92 GB。

  • 初始占用 (3.82 GB):模型权重、KV Cache 预留空间、推理引擎运行时环境等。
  • 增量占用 (0.10 GB):主要由推理过程中动态分配的 KV Cache(Key-Value Cache)和激活值等产生。

最后,本次实践还写代码设计了一些场景,并进行了实测:

在这里插入图片描述

在知识问答任务中,模型对"The capital of France is"的提示生成了准确完整的回答,仅用1.24秒就输出了包含28个token的正确答案,展现了高效的事实检索能力。

在概念解释任务方面,面对"解释人工智能的基本概念"的复杂提示,模型在2.17秒内生成52个token,输出内容结构清晰、定义准确,体现了良好的知识组织能力。

在代码生成任务中,模型针对Python斐波那契数列的编程需求,在1.89秒内输出了42个token的正确代码实现,展示了实用性。

三、昇腾AI高性能推理框架实测对比与选型

虽然基于 PyTorch/Hugging Face 的原生部署方式能够实现模型在昇腾 NPU 上的功能验证和基础性能测试,但其性能(23.68 tokens/s)与专为高并发、低延迟设计的推理框架相比,仍有显著差距。为了充分发挥昇腾 NPU 的算力潜力,本实践还以昇腾生态下主流的 vLLM-AscendSGLang 框架,通过实测数据对比,全面评估它们在昇腾 NPU 上的性能表现。

3.1 核心性能指标实测对比

3.1.1 吞吐量对比(req/s)

吞吐量是衡量框架并发处理能力的核心指标。实测结果显示,SGLang 在不同负载场景下,吞吐量均显著优于 vllm-ascend。

模型 负载场景 并发数 SGLang (req/s) vllm-ascend (req/s) 性能差距 (SGLang vs vllm-ascend)
Gemma 2 9B (4bit) 短文本(128→256) 32 155.8 129.8 +20.0%
长文本(1024→512) 16 38.2 31.5 +21.3%

关键结论: 针对 Gemma 2 9B 模型,SGLang 的吞吐量全面领先 vllm-ascend,性能差距稳定在 20%-21.3% 之间。在单卡高并发场景下,SGLang 的优势尤为突出,能够提供更高的服务容量。

3.1.2 显存占用对比(GB)

显存占用决定了单卡可部署的模型规模和并发量。

模型 量化策略 框架 静态显存(模型权重) 动态显存(KV Cache) 峰值显存占用
Gemma 2 9B 4bit AWQ SGLang 4.5 GB 动态分配(最大 1.0GB) 5.5 GB
vllm-ascend 4.6 GB 动态分配(最大 1.4GB) 6.0 GB

关键结论: SGLang 的峰值显存占用略低于 vllm-ascend,差距约 8%。这对于 9B 这样的小模型虽然不明显,但体现了 SGLang 在 KV Cache 管理上的精细化优化,能更有效地利用 NPU 显存资源。

3.2 性能差异根源分析与选型建议

3.2.1 性能差异根源分析

框架 性能优势/特点 核心技术/优化
SGLang 极致性能:吞吐量、延迟、显存全面领先 昇腾 NPU 深度适配:算子级优化,采用昇腾自定义 MatMul、Softmax 算子。动态调度机制:支持请求级动态批处理和 KV Cache 复用。
vllm-ascend 兼容性强、性能稳定 PagedAttention 机制:继承 vLLM 核心优势,有效管理 KV Cache。生态兼容:基于 vLLM 原生架构适配昇腾,支持更多模型格式。

SGLang 的性能优势主要来源于其对昇腾 NPU 指令集的算子级深度优化和更先进的动态调度机制,使其在高并发和复杂场景下能更高效地利用 NPU 算力。vllm-ascend 则以其更强的兼容性稳定的性能(尤其在低并发场景)占据一席之地。

3.2 性能差异根源分析与选型建议

3.2.1 性能差异根源分析

框架 性能优势/特点 核心技术/优化
SGLang 极致性能:吞吐量、延迟、显存全面领先 昇腾 NPU 深度适配:算子级优化,采用昇腾自定义 MatMul、Softmax 算子。动态调度机制:支持请求级动态批处理和 KV Cache 复用。
vllm-ascend 兼容性强、性能稳定 PagedAttention 机制:继承 vLLM 核心优势,有效管理 KV Cache。生态兼容:基于 vLLM 原生架构适配昇腾,支持更多模型格式。

SGLang 的性能优势主要来源于其对昇腾 NPU 指令集的算子级深度优化和更先进的动态调度机制,使其在高并发和复杂场景下能更高效地利用 NPU 算力。vllm-ascend 则以其更强的兼容性稳定的性能(尤其在低并发场景)占据一席之地。

3.2.2 部署选型建议

基于上述实测对比,开发者在昇腾平台上选择推理框架时,应根据具体的业务需求进行权衡:

场景类型 优先选择框架 理由
大规模高并发部署 SGLang 追求极致吞吐量和低延迟,SGLang 的性能优势可显著降低硬件成本。
实时交互场景 SGLang 对 P95/P99 延迟敏感,SGLang 的低延迟特性可提升用户体验。
显存资源紧张场景 SGLang 单卡部署大参数模型时,SGLang 的显存优化可提升并发量。
多模型兼容场景 vllm-ascend 需要部署多种格式、多种架构的模型,vllm-ascend 的兼容性更优。
中小规模部署/快速验证 vllm-ascend 低并发场景下性能满足需求,且部署流程更简单,社区支持更成熟。

四、总结

通过昇腾 AI 的达芬奇架构和 CANN 异构计算平台,Gemma 2 在昇腾 NPU 上实现了显著的性能提升,展现了昇腾 AI 在国产算力支持大模型方面的强大能力。

通过本次Gemma 2的部署实践,可以发现,昇腾AI所做的 “达芬奇架构NPU + CANN异构计算平台 + AI框架与推理引擎” 的全栈式优化,有效屏蔽了硬件复杂性,使得Gemma 2这类主流模型能够无缝迁移并高效运行在昇腾NPU上,实现了接近理论峰值算力的性能输出。而且昇腾平台不仅原生支持MindSpore框架,更通过CANN和适配层,全面兼容 PyTorch、TensorFlow 等主流生态。从环境配置、驱动检查到模型推理的整个流程,昇腾平台展现了出色的稳定性。

未来,昇腾AI有望成为连接全球顶尖开源模型与国产算力基础的核心枢纽。我们将看到更多如Llama、Mistral等优秀模型在昇腾平台上得到官方或社区的优化支持,形成一个繁荣的、基于国产硬件的模型生态系统,彻底打破算力壁垒。 随着CANN的迭代、专用推理引擎(如MindIE)的增强以及模型量化、编译优化等技术的深入应用,昇腾AI在大模型上的推理性能与能效比仍有巨大提升空间,未来有望持续刷新性能纪录,引领国产AI算力迈向新高度。

展望未来,昇腾AI必将在蓬勃发展的全球AI生态中扮演愈发关键的角色,为各行各业的智能化升级构筑坚实、高效、自主可控的算力基石。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐