昇腾 (Ascend) NPU 实战指南:在 GitCode Notebook 中玩转 CodeLlama

昇腾 (Ascend) NPU 实战指南:在 GitCode Notebook 中玩转 CodeLlama

1.前言

随着大模型技术在软件开发领域的深入应用,越来越多的开发者开始尝试在本地或云端环境部署代码生成模型。华为昇腾(Ascend)计算产业随着 CANN 软件栈的不断成熟,已成为运行各类开源 LLM 的重要算力底座。

本文将以 CodeLlama 这一广受欢迎的代码生成模型为核心,结合 GitCode Notebook 提供的在线开发环境,讲解如何在本地或服务器的昇腾 NPU 环境中完成从依赖配置、模型加载到代码生成的完整流程。文章将通过结构化的流程讲解与可操作的示例代码,引导你在昇腾生态中顺利完成 CodeLlama 的部署与运行。

接下来我们就开始进行动手实践吧。

GitCode官网:https://gitcode.com/

img

2.GitCode Notebook 环境准备

GitCode 是面向中国开发者的一站式代码协作与模型应用平台,集成了开源仓库托管、在线运行环境、模型中心等能力。其中的 GitCode Notebook 提供了无需本地配置的云端交互式开发环境,支持直接在浏览器中编写、运行和调试代码,非常适合进行大模型试验与算子验证。

进入Gitcode官网后在个人头像这边可以找到Notebook:

img

进入后需要先进行激活和资源确认:

img

我们根据自己的需要选择对应的资源:

img

激活成功后进入主界面:

在主界面我们可以看见控制台,那么接下来我们就会使用控制台来做我们的实验了。

img

进入控制台后发现这不就是我们熟悉的命令行吗,那么接下来的话我们就正式开始吧。

进入后会发现这其实就是我们非常熟悉控制台界面:

img

进入 Notebook 后,第一件事不是急着写代码,而是检查底层的 NPU 状态和软件栈版本。打开 Terminal,输入以下命令:

# 查看 NPU 状态,确认芯片健康及显存占用 npu-smi info 
img

从输出结果中我们能够明确的看到版本号,以及功耗和温度等信息以及NPU等一切都是处于正常的状态,那么接下来的话我们就可以正式的去进行实验了。

首先我们先来进行一些必备的环境检查:

查看系统版本信息:

cat /etc/os-release 
img

检查python环境:

python3 --version python -c "import torch; print('PyTorch 版本:', torch.__version__)" python -c "import torch_npu; print('torch_npu 版本:', torch_npu.__version__)" 
img

当基础环境准备就绪后,我们就可以开始进行下一步了,在实际开发中,我们可以参考CANN官网,在官网中我们也可以找到快速入门的资料,查看我们需要安装的一些必备的依赖:

img

安装一些python库:

pip3 install attrs cython 'numpy>=1.19.2,<=1.24.0' decorator sympy cffi pyyaml pathlib2 psutil protobuf==3.20.0 scipy requests absl-py --user 
img

环境配置是重中之重,当这些都做完后,我们再进行下一步。

3.CodeLlama 模型信息

在本次实战中,我选择使用 CodeLlama,因为它是专门针对代码生成和理解优化的大语言模型,能够很好地体现大模型在实际推理任务中的表现。

接下来我们先了解一下这个模型的一些核心的信息:

模型版本与规模:CodeLlama 提供 7B、13B、34B 等多个版本,我选择了 7B 或 13B进行测试,参数量适中,方便在昇腾 NPU 上运行。

模型能力:专注于代码生成、补全和理解,支持多种编程语言,如 Python、C++、Java 等。

训练特点:在大规模文本与代码数据上预训练,并经过指令微调,使模型能够根据提示生成高质量代码。

选择理由:这个模型既能满足生成任务的复杂性,又不会因为显存过大而难以部署,非常适合用来做 NPU 性能实测。

在Hugging Face的官网里面我们可以找到相关的资料和信息:

img

4.模型加载

接下来环境配置和模型信息我们都有所了解了,那么现在我们就进入到模型加载的环节了。

在模型选择方面的话,我选择CodeLlama 7B-Instruct,它参数适中,既能体现推理性能,又不会因为显存不足导致无法运行。

加载 Tokenizer:

为了将输入文本转换为模型可处理的 token,我先加载 tokenizer:

from transformers import AutoTokenizer model_name = "code-llama-7b-instruct" tokenizer = AutoTokenizer.from_pretrained(model_name) 

然后,我将模型加载到昇腾 NPU,并设置 FP16 精度以降低显存占用:

from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained( model_name, device_map="auto", # 自动选择 NPU 设备 torch_dtype=torch.float16 # 使用 FP16 提升性能 ) 

注:device_map="auto" 会自动把模型分配到可用的 NPU 上,同时 FP16 精度可以在保证计算精度的前提下降低显存使用。

我们接下来可以来验证一下模型是否加载成功:

import torch_npu from transformers import AutoTokenizer, AutoModelForCausalLM # 模型名称 model_name = "code-llama-7b-instruct" # 加载 tokenizer tokenizer = AutoTokenizer.from_pretrained(model_name) # 加载模型到 NPU model = AutoModelForCausalLM.from_pretrained( model_name, device_map="auto", torch_dtype=torch.float16 ) # 验证模型是否在 NPU 上 device = next(model.parameters()).device print(f"模型已加载,当前设备: {device}") # 测试一次简单推理 prompt = "def fibonacci(n):" inputs = tokenizer(prompt, return_tensors="pt").to(device) outputs = model.generate(**inputs, max_new_tokens=10) # 输出生成结果 generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) print("生成结果:", generated_text) 

运行结果:

img

从运行结果我们可以得知当前模型已经加载成功了。

5.基础推理演示

在完成模型加载和 SGLang 部署后,我就带大家开始进行 CodeLlama 的基础推理实验,从简单代码生成到多输入批量推理,展示 NPU 的实战效果。

先尝试最基础的单条 prompt 生成:

from transformers import AutoTokenizer, AutoModelForCausalLM model_name = "code-llama-7b-instruct" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained( model_name, device_map="auto", torch_dtype="torch.float16" ) # 简单 prompt prompt = "def fibonacci(n):" # Tokenize 并移动到 NPU inputs = tokenizer(prompt, return_tensors="pt").to(next(model.parameters()).device) # 执行推理 outputs = model.generate(**inputs, max_new_tokens=50) generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) print("生成结果:\n", generated_text) 

运行结果:

img

批量推理:

在实际场景中,我们经常需要同时处理多条请求,我尝试批量推理:

prompts = [ "def factorial(n):", "def quicksort(arr):", "def gcd(a, b):" ] # 批量 token 化 inputs = tokenizer(prompts, return_tensors="pt", padding=True).to(next(model.parameters()).device) # 批量生成 outputs = model.generate(**inputs, max_new_tokens=50) # 输出每条结果 for i, output in enumerate(outputs): text = tokenizer.decode(output, skip_special_tokens=True) print(f"\nPrompt {i+1} 生成结果:\n{text}") 

运行结果:

img

控制生成风格和长度:

还可以通过调整生成参数优化结果,例如:

outputs = model.generate( **inputs, max_new_tokens=100, # 最大生成长度 temperature=0.7, # 控制生成随机性 top_p=0.9, # nucleus sampling do_sample=True ) for i, output in enumerate(outputs): text = tokenizer.decode(output, skip_special_tokens=True) print(f"\nPrompt {i+1} 生成结果 (控制风格):\n{text}") 

运行结果:

img

多轮推理:

在实际开发中,模型经常用于 多轮交互,例如根据不断变化的需求生成或优化代码。接下来我们写一个代码案例展示如何实现多轮对话式推理:

# 初始对话:生成一个 Python 函数计算平方根 conversation = ["# 请写一个 Python 函数计算平方根"] for i in range(2): # 将对话内容 token 化并移动到 NPU inputs = tokenizer(conversation, return_tensors="pt", padding=True).to(next(model.parameters()).device) # 执行生成 outputs = model.generate(**inputs, max_new_tokens=50) # 解码生成结果 reply = tokenizer.decode(outputs[0], skip_special_tokens=True) print(f"\n第 {i+1} 轮生成:\n{reply}") # 将模型输出追加到对话中,用于下一轮生成 conversation.append(reply) 

运行结果:

img

6.性能测试

在完成模型加载和部署后,我们对 CodeLlama 的推理性能进行了评估。测试中使用了一个包含多个 Python 函数的 prompt 列表,通过批量输入测量模型生成结果的延迟和吞吐量。每次生成的最大 token 数设置为 50,模拟常见的代码生成场景。

示例代码:

import time from transformers import AutoTokenizer, AutoModelForCausalLM model_name = "code-llama-7b-instruct" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained( model_name, device_map="auto", torch_dtype="torch.float16" ) prompts = [ "def fibonacci(n):", "def factorial(n):", "def quicksort(arr):", "def gcd(a, b):", "def is_prime(n):" ] # 批量 token 化并移动到 NPU inputs = tokenizer(prompts, return_tensors="pt", padding=True).to(next(model.parameters()).device) num_trials = 5 total_time = 0.0 for i in range(num_trials): start_time = time.time() outputs = model.generate(**inputs, max_new_tokens=50) end_time = time.time() elapsed = end_time - start_time total_time += elapsed print(f"Trial {i+1}: {elapsed:.3f} s") avg_time = total_time / num_trials num_tokens = sum(len(tokenizer.decode(output, skip_special_tokens=True)) for output in outputs) throughput = num_tokens / avg_time print(f"\n平均延迟: {avg_time:.3f} s") print(f"吞吐量: {throughput:.1f} 字符/s") 

在执行过程中,每次生成的延迟都被记录下来,并计算了多次试验的平均延迟。通过解码生成结果,可以统计生成字符数量,从而得到吞吐量。

执行结果:

img

从实际测试结果来看,CodeLlama 在昇腾 NPU 上的单次生成延迟稳定在几十毫秒级别,平均延迟仅 0.110 秒;同时还能达到 4727.2 字符 / 秒的较高吞吐量,足以支撑多 prompt 并行处理的场景需求。

7.总结

在本篇文章中,我们主要使用了 GitCode Notebook 作为开发环境。对于希望快速体验和操作昇腾 NPU 的开发者来说,Notebook 提供了即开即用的环境,无需依赖本地硬件或复杂配置。在 GitCode Notebook 的昇腾环境中部署 CodeLlama 并不复杂,同时也有一些需要注意的环节。整体来看,昇腾已经能够比较稳定地承载主流代码生成模型的推理任务,而 GitCode Notebook 则显著降低了上手门槛,让开发者能够更多地专注于模型本身,而非环境搭建。

Read more

基于Milvus与混合检索的云厂商文档智能问答系统:Java SpringBoot全栈实现

基于Milvus与混合检索的云厂商文档智能问答系统:Java SpringBoot全栈实现

基于Milvus与混合检索的云厂商文档智能问答系统:Java SpringBoot全栈实现 面对阿里云、腾讯云等厂商海量的产品文档、规格参数与价格清单,如何构建一个精准、高效的智能问答系统?本文将为你揭秘从技术选型到生产部署的完整方案。 云服务商的产品生态系统日益庞大,相关的技术文档、规格参数、定价清单等文档数量急剧增长。传统的文档查找方式已无法满足开发者和运维人员快速获取准确信息的需求。 基于检索增强生成(RAG)的智能问答系统成为解决这一难题的有效方案。本文将详细介绍如何使用 Java SpringBoot 和 Milvus 向量数据库,构建一个面向云厂商文档的高效混合检索问答系统。 一、核心挑战与架构选型 云厂商文档具有鲜明的技术特点,这些特点直接影响了我们的技术选择: 1. 高度结构化:包含大量技术规格表、价格矩阵和配置参数 2. 专业术语密集:如“ECS.g6.2xlarge”、“对象存储每秒请求数”等精确术语 3. 多格式混合:Markdown、PDF、Word、TXT等格式并存 4. 版本频繁更新:产品迭代快,文档需要及时同步

By Ne0inhk
一文通关 MySQL 数据类型,打好高性能数据库的第一战!

一文通关 MySQL 数据类型,打好高性能数据库的第一战!

🔥海棠蚀omo:个人主页                 ❄️个人专栏:《初识数据结构》,《C++:从入门到实践》,《Linux:从零基础到实践》,《Linux网络:从不懂到不会》,《MySQL:新手入门指南》                 ✨追光的人,终会光芒万丈 博主简介: 目录 一.数值类型 1.1tinyint类型 1.2bit类型 二.小数类型 2.1float类型 2.2decimal类型 三.字符串类型 3.1char类型 3.2varchar类型 3.3char和varchar的比较 四.日期和时间类型 五.enum和set 5.1查询set中的数据 前言: 在上一篇文章中,我们学习了库和表的相关操作,而在我们上一篇的讲解中,我们提到了在列名后面跟的是数据类型,但是对于MySQL中的数据类型我们现在还一知半解,那么今天这篇文章我们就来详细谈一谈MySQL中的数据类型。 那么在详细讲解每种数据类型之前,

By Ne0inhk
一键部署,告别下载烦恼:这款高颜值PHP内网软件库,让办公协作飞起来!-小散软件库

一键部署,告别下载烦恼:这款高颜值PHP内网软件库,让办公协作飞起来!-小散软件库

嗨,亲爱的伙伴们,我是走小散 在工作时,你是否遇到过这类情况: A同事用着不错的软件,但下载流程异常繁琐; B同事的办公软件版本过低,无法打开A同事的高版本文件。 别担心,只需请网络管理员为你们公司量身搭建一套专属的内部软件库,问题就能轻松解决! ‘ 环境说明 php8.3 mysql5.7 需要安装的PHP扩展 mbstring 权限 请给uploads文件夹配置755权限 上传大小 默认配置100G最大上传大小 php.ini(或面板里的 PHP 配置)建议至少设为: upload_max_filesize = 100G post_max_size = 100G(建议 ≥ 上传大小) 大文件上传时间长,可适当调大: max_execution_time = 36000(或更大,单位秒) max_input_time

By Ne0inhk
Flutter 组件 highlighter 适配鸿蒙 HarmonyOS 实战:高性能语法高亮,构建大规模代码分析与文本染色架构

Flutter 组件 highlighter 适配鸿蒙 HarmonyOS 实战:高性能语法高亮,构建大规模代码分析与文本染色架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 highlighter 适配鸿蒙 HarmonyOS 实战:高性能语法高亮,构建大规模代码分析与文本染色架构 前言 在鸿蒙(OpenHarmony)生态迈向专业化工具链、涉及海量日志审计、在线编程教育及开发者社区分发的背景下,如何为长篇累牍的源代码实现毫秒级的语法高亮与结构化展示,已成为决定用户阅读体验与知识传递效率的“视觉分水岭”。在鸿蒙设备这类强调 AOT 极致性能与复杂文本排版(Text Layout)的环境下,如果应用依然依赖基础的正则表达式进行低效的字符匹配,由于由于解析算法的复杂性,极易由于由于“主线程阻塞”导致大型文件在滑动过程中产生严重的掉帧与视觉黏连。 我们需要一种能够支持多语言语法解析、具备词法分析(Lexing)深度且兼容 RichText 富文本输出的高性能染色方案。 highlighter 为 Flutter 开发者引入了基于标准词法字典的语法高亮引擎。它不仅能精准识别不同编程语言的关键字、操作符与注释,更利

By Ne0inhk