前言:前段时间在 GitCode 中注意到 Notebook 功能可以直接进行大模型开发,于是抱着试试看效果的心态,决定尝试在云端环境部署一次 Meta-Llama-3-8B-Instruct 模型。整个过程比预期顺利得多,但也遇到了一些容易踩坑的问题,因此整理成了本文,希望作为一份从零开始就能照着做的完整部署教程。

本文会带你完成以下工作:

● 环境检查

● 使用 ModelScope 高速下载模型

● 适配 Ascend NPU 的推理代码编写

● 模型推理与性能监控

● 常见错误说明与解决方法

● 整体部署经验总结

如果你以前没有在 NPU 环境部署大模型,也没使用过 GitCode Notebook,不用担心,这篇文章就是面向 第一次接触的开发者 所写,全程按步骤执行即可成功复现。

1. 环境准备

Llama 3 发布后成为最活跃的开源模型之一,其推理性能也足够支持 Notebook 环境中的各类实验。本次部署使用的是 GitCode 提供的云端 Notebook 服务,特点是开箱即可使用,适合零基础用户快速上机测试大模型。

● 运行平台:GitCode 云端 Notebook

● 算力规格:NPU Basic(NPU 卡,32vCPU,64GB 内存)

● 基础镜像:Ubuntu 22.04 + Python 3.11 + CANN 8.2(建议使用 CANN 8.0 及以上版本,以获得更完善的算子支持和性能表现)

完成以上步骤后我们就已经进入NoteBook里面了,先别急着操作,我们打开终端输入指令来看看,进入 Notebook 之后,可以先在 Terminal 中执行:

npu-smi info

可以看到环境已经准备就绪,可以开始后面的重头戏了!!!

2. 依赖安装与模型下载

2.1 依赖的安装

针对 HuggingFace 下载链路不稳定、速度慢的问题,我们选用 ModelScope(魔搭社区)提供的 Python SDK 完成模型文件的高速下载,保障了部署流程的高效推进。这个安装过程非常快,大家输入之后就能马上安装成功

pip install transformers accelerate modelscope

2.2 模型的下载

依赖安装完成后我们就可以着手下载模型了,关于模型的下载,我们只需要打开Untitled.ipynb在里面输入代码执行即可

模型下载代码:

from modelscope import snapshot_download
 
# 指定下载目录为当前文件夹下的 models 目录
print("正在从 ModelScope 下载 Meta-Llama-3-8B-Instruct...")
model_dir = snapshot_download('LLM-Research/Meta-Llama-3-8B-Instruct', cache_dir='./models')
 
print(f"模型已下载至: {model_dir}")

耐心等待几分钟,当 Notebook 输出模型路径,即代表下载已经完成。在等待几分钟后弹出以下提示代表模型已经安装完成

3. 性能测试与NPU负载查看

3.1 性能测试

为了确认模型是否能够正常推理,可以首先运行一个简单的推理代码进行测试。推理成功后再观察 NPU 的资源利用情况。我最开始先用了一个简单的测试用例看看能不能正常运行,结果是好的,他能推理测试成功

3.2 ****NPU负载查看

同时,我们打开最初看到的那个表格发现他的表现非常的惊艳!性能非常完美,输入以下指令可查看到具体负载情况

watch -n 1 npu-smi info

在 Notebook 环境下,某些指标可能受容器透传影响,例如:

● Memory-Usage(显存占用)可能会显示异常或为 0

这并非模型未加载,而是容器读取机制的限制。

真正具有参考价值的是:

● HBM-Usage(高带宽内存实时占用)

● AICore 利用率(推理计算核心是否满载)

如果推理过程中 AICore 利用率明显提升,则说明模型推理已成功执行。

为验证昇腾 Atlas 800T 的计算核心被充分且完全调用,需重点关注 NPU 核心负载指标:在云端容器环境下,Memory-Usage 指标可能因透传机制问题显示为 0(无参考价值),此时应优先以 HBM-Usage(高带宽内存占用)和 AICore 利用率作为算力满载的核心判断依据。

4. 核心代码实战

下面给出一个可以直接用于多轮聊天的推理示例,并加入了 NPU 使用时必须设置的线程限制,避免 OpenBLAS 报错。

import os
import torch
import torch_npu  # 激活 NPU 后端
from transformers import AutoTokenizer, AutoModelForCausalLM
import time
 
# ========== 线程限制 + NPU 环境优化(必加,避免线程报错) ==========
os.environ["OPENBLAS_DISABLE"] = "1"
os.environ["OPENBLAS_NUM_THREADS"] = "1"
os.environ["OMP_NUM_THREADS"] = "1"
 
# --- 基础配置 ---
MODEL_PATH = "./models/LLM-Research/Meta-Llama-3-8B-Instruct" 
DEVICE = "npu:0"
 
def simple_chat():
    print(f"[*] 加载模型到 {DEVICE} 中...\n")
    
    # 1. 加载Tokenizer(极简配置,修复基础警告)
    tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True)
    if tokenizer.pad_token_id is None:
        tokenizer.pad_token_id = tokenizer.eos_token_id
 
    # 2. 加载模型(NPU适配)
    model = AutoModelForCausalLM.from_pretrained(
        MODEL_PATH,
        torch_dtype=torch.float16,
        device_map=DEVICE,
        trust_remote_code=True
    )
    model.config.pad_token_id = tokenizer.pad_token_id
 
    # 3. 多轮对话逻辑(简单交互)
    print("===== Llama 3 简单对话测试(输入 '退出' 结束)=====\n")
    # 初始化对话历史
    chat_history = []
    
    while True:
        # 输入用户问题
        user_input = input("你:")
        if user_input.strip() == "退出":
            print("Llama 3:再见啦!")
            break
        
        # 构建对话模板
        chat_history.append({"role": "user", "content": user_input})
        # 生成输入(极简版,避免维度错误)
        input_text = tokenizer.apply_chat_template(
            chat_history,
            add_generation_prompt=True,
            tokenize=False  # 先不编码,避免tensor维度问题
        )
        # 编码为模型可识别的格式
        inputs = tokenizer([input_text], return_tensors="pt").to(DEVICE)
        
        # 模型生成回复
        start_time = time.time()
        outputs = model.generate(
            **inputs,
            max_new_tokens=200,  # 短回复,速度快
            temperature=0.8,     # 回复更自然
            pad_token_id=tokenizer.pad_token_id,
            eos_token_id=tokenizer.eos_token_id
        )
        end_time = time.time()
        
        # 解码并打印回复
        response = tokenizer.decode(outputs[0][len(inputs["input_ids"][0]):], skip_special_tokens=True)
        print(f"Llama 3:{response} (耗时:{end_time - start_time:.2f}秒)\n")
        
        # 更新对话历史
        chat_history.append({"role": "assistant", "content": response})
    
    # 释放NPU显存
    torch.npu.empty_cache()
 
if __name__ == "__main__":
    simple_chat()

最终,模型成功完成多轮自然对话交互,回复内容准确、逻辑清晰、无乱码,涵盖日常寒暄、昇腾 NPU 概念解答等场景。整个推理过程流畅无卡顿,验证了 Llama 3-8B + Atlas 800T 组合在对话类场景下的可用性。

说明:本测试在耗时指标的测算环节,暂未启用任何加速引擎进行优化,因此当前呈现的性能数据并非该硬件平台与模型组合下的最优表现,后续可通过集成加速引擎进一步挖掘系统算力潜力。

5. 常见问题与解决方法

问题 1:模型下载异常、速度慢或中断

原因:HuggingFace 下载链路不稳定,无法高效获取模型文件,需切换至 ModelScope(魔搭社区)Python SDK 完成模型高速下载,规避网络卡顿,中断风险。

解决方法:我最开始部署的时候就没管这么多,结果刚开始就遇到了问题困扰了很久,最后切换到魔搭社区

问题 2:****底层库线程资源冲突问题

$ python test.py
OpenBLAS blas_thread_init: pthread_create failed for thread 50 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1048576 current, 1048576 max
OpenBLAS blas_thread_init: pthread_create failed for thread 51 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1048576 current, 1048576 max
OpenBLAS blas_thread_init: pthread_create failed for thread 52 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1048576 current, 1048576 max
OpenBLAS blas_thread_init: pthread_create failed for thread 53 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1048576 current, 1048576 max
OpenBLAS blas_thread_init: pthread_create failed for thread 54 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1048576 current, 1048576 max
OpenBLAS blas_thread_init: pthread_create failed for thread 55 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1048576 current, 1048576 max
OpenBLAS blas_thread_init: pthread_create failed for thread 56 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1048576 current, 1048576 max
OpenBLAS blas_thread_init: pthread_create failed for thread 57 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1048576 current, 1048576 max
OpenBLAS blas_thread_init: pthread_create failed for thread 58 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1048576 current, 1048576 max
OpenBLAS blas_thread_init: pthread_create failed for thread 59 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1048576 current, 1048576 max
OpenBLAS blas_thread_init: pthread_create failed for thread 60 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1048576 current, 1048576 max
OpenBLAS blas_thread_init: pthread_create failed for thread 61 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1048576 current, 1048576 max
OpenBLAS blas_thread_init: pthread_create failed for thread 62 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1048576 current, 1048576 max
OpenBLAS blas_thread_init: pthread_create failed for thread 63 of 64: Resource temporarily unavailable
OpenBLAS blas_thread_init: RLIMIT_NPROC 1048576 current, 1048576 max
Segmentation fault

原因:OpenBLAS 尝试创建 64 个线程时触发「Resource temporarily unavailable」错误,最终导致 Segmentation fault 段错误;根因是云端容器环境下 RLIMIT_NPROC 显示上限与实际可用线程数不匹配,且 OpenBLAS 线程初始化早于代码内环境变量限制,常规的代码内线程配置无法生效。

解决方法:这个问题应该是我最初部署的时候,没注意那么多,同时启动了多个资源,导致最后在测试的时候无法成功的创建那么多线程测试,最后重新安装部署之后就没问题了

6. 实战部署总结

6.1 实战感想

这次部署 Llama 3-8B,不只是把模型跑起来这么简单,更像是完整体验了一次“从零开始上手大模型”。整个过程让我对现在的算力生态有了更真实的感受。下面是我几个比较深的体会,也分享给第一次尝试的朋友。

性能够快、够稳,实际表现比预期好****:推理跑起来后,我一直盯着监控看。AICore 利用率直接冲到 100%,没有掉速,也没有卡顿。这说明算力是真的跑满了,不是摆样子的那种。

尤其在 FP16 精度下:

● 显存更省

● 速度更快

● 整体表现特别稳定

如果你是用来做内部问答、知识库、本地推理服务,这样的性能已经很够用了,完全不是以前那种凑合的那种级别。

最值得我称赞的一点就是好用,报错少,以前在一些平台上跑开源模型,动不动就要改一堆代码:算子不支持、接口不对、运行报错……真的很容易把人搞崩溃。但这次体验最大的感觉比以前强了不知道多少

整个迁移几乎就是:

● 装个 torch_npu

● 把设备名改成 “npu”

● 然后就能直接跑了

不用大改代码,不用折腾半天。

简单来说就是:“原本能跑 GPU,现在也能直接跑 NPU”。

对小白来说,这个体验太友好了。

6.2 部署方案总结

经过完整验证,Llama 3-8B 在 Atlas 800T Notebook 环境中可以顺利完成端到端部署。整体体验足够流畅,且不需要复杂的适配性修改。

1. 环境选型:优先选用 CANN 8.0 及以上版本,可获得更完善的算子支持和更优的推理性能;

2. 代码适配:仅需导入 torch_npu 并将设备指定为 npu:0,即可实现 PyTorch 代码向昇腾 NPU 的平滑迁移,无需大规模重构;

3. 监控核心:云端容器环境下,AICore 利用率相比显存指标(Memory-Usage)更能反映 NPU 真实负载状态(显存指标易因透传问题显示异常)。

进阶资源指引:若需尝试更大参数规模的模型(如 718B MoE 架构的 openPangu),或申请更多昇腾算力资源,可通过 AtomGit 社区获取官方支持:

● 算力资源申请链接:https://ai.gitcode.com/ascend-tribe/openPangu-Ultra-MoE-718B-V1.1?source_module=search_result_model

声明:本文基于开源社区模型 Llama 3-8B,采用 PyTorch 原生适配方式完成部署与推理测试。本测试未启用加速引擎,当前性能非最优表现。测试结果仅用于验证功能可用性及 NPU 算力调用效果,不代表该硬件平台或模型的最终性能上限。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐