东方智慧AI 算力
AI算力 · 昇腾部署课件 G1

昇腾部署第 G1 课:企业私有化部署——数据不出内网,从哪几层下手

2026-10-05

系列定位:A–D 讲「每个零件怎么装」,E 讲「出错怎么查」,F 讲「把零件串成场景」, G 讲「装完之后,企业要的那几件事」。 G1 是 G 层第一课,讲私有化部署;私有知识库(RAG)与合规部分另开课程与文章。


第一段 章前定位

这课不教你什么:

  • 不教合规。等保、数据分级、审计留存这些属于制度与法规层面,将来单独成文,本课不涉及。
  • 不教具体的加固参数。官方明确说加固措施要「根据自身业务」定,本课给的是清单和判断依据,不是照抄的配置。
  • 不重复已学内容。离线安装包怎么装(B4)、容器怎么跑(B5)、服务怎么起(D1–D5)都讲过了,本课只讲它们和"私有化"的关系。

这课要教你什么:

「私有化」不是一个开关,是三件事。 第一件:部署位置(装在没有外网的机器上); 第二件:数据流向(训练数据、推理请求、日志都别出去); 第三件:资产保护(模型权重和知识库被拿走也用不了)。

大部分人的私有化只做了第一件,然后就以为做完了。


第二段 学习目标

学完这课,你应该能回答下面五个问题(能答上来就是学会了):

  1. 「私有化」在技术上具体指哪三件事?各自的验收标准是什么?
  2. 一台没有外网的服务器,装昇腾全栈要靠哪几个零件?分别用已学的哪一课?
  3. 昇腾在 CANN 层提供了哪些安全能力?(这是本课的核心,也是网上查不到的部分)
  4. 想在一台机器上给不同部门/项目组做资源隔离,官方给的手段是什么?有哪两种模式、区别在哪?
  5. 怎么证明数据真的没出内网?(不是"我觉得",而是可验证的)

第三段 全景:「私有化」的三件事

                    ┌──────────────────────────────────────────┐

│ ① 部署位置 —— 装在哪 │ │ 无外网 / 内网 / 单机还是集群 │ │ 验收:断网后能不能装完、能不能跑起来 │

                    └──────────────────────────────────────────┘
                                        ↓
                    ┌──────────────────────────────────────────┐

│ ② 数据流向 —— 数据去哪了 │ │ 训练数据 / 推理请求 / 日志 / 遥测 │ │ 验收:抓包 + 出站白名单,能说清每一路 │

                    └──────────────────────────────────────────┘
                                        ↓
                    ┌──────────────────────────────────────────┐

│ ③ 资产保护 —— 东西被拿走会怎样 │ │ 模型权重 / 提示词 / 知识库 │ │ 验收:拷走文件后能不能直接用 │

                    └──────────────────────────────────────────┘

⚠️ 三件事是递进的,但很多人只做了 ①。

  • 只做 ①:机器在内网,但模型文件是明文、磁盘可拷、多租户无隔离 —— 内鬼照样能拿走。
  • 只做 ①②:数据不出去,但模型资产没有保护 —— 服务器退役、硬盘报废、运维人员拷一份,都是风险点。
  • 三件都做:才叫真正意义上的私有化。

第四段 【如果我来做】一条真实的执行路径

这一节是本课的核心。 前三段讲的是"私有化是什么",这一节讲的是:如果现在把这件事交给我,我从哪里开始、按什么顺序做、每一步凭什么判断。

4.0 先记住一句话:顺序错了会返工

私有化是一个有先后顺序的工程,不是"买台机器装上就完了"。 最容易犯的错是顺序颠倒 —— 比如:

  • 先把安全策略做完了,才发现装不上(缺离线包)→ 前面白做;
  • 先把模型部署好了,才发现操作系统版本不支持虚拟化 → 要重装系统;
  • 先配了多租户,才发现业务只需要一台独占 → 过度设计,白折腾。

所以我的顺序是:摸底 → 定档 → 备料 → 装 → 隔离 → 保护 → 收口 → 出证据。


4.1 第 0 步:先摸底(不装任何东西,只查)

目的:在你动手之前,把三个事实搞清楚 —— 有几张卡、能不能上网、系统是什么版本。

命令 ls /dev/davinci*

含义:列出系统里的昇腾芯片设备节点 拆解:ls(列出)+ /dev/davinci(通配符,匹配所有 davinci 开头的设备) 用法:ls /dev/davinci0 期望:打印出设备节点路径,如 /dev/davinci0 不过会怎样: · 报 "No such file or directory" → 驱动没装或没被系统识别(回 A1) · 出来一串 /dev/davinci0 ... davinci7 → 说明有多张卡 ⭐ 记住这一点*:设备节点编号的尾数就是这个芯片的【物理 ID(phy_id)】 —— 后面建 vNPU 算 vnpu_id 取值范围时要用它。

命令 npu-smi info -l

含义:列出所有 NPU 设备(-l 是 list) 用法:npu-smi info -l 期望:列出 NPU ID 和各 NPU 的总算力等信息 不过会怎样:无输出 → 驱动/权限问题 ⭐ 这里查出来的【NPU ID 就是设备 id】—— 后面所有命令里的 -i 参数填的就是它。

命令 npu-smi info -m

含义:查看芯片映射信息(-m 查芯片 ID 与芯片逻辑 ID 的对应关系) 用法:npu-smi info -m 期望:一张表,列出 NPU ID / Chip ID / Chip Logic ID 不过会怎样:同上 ⭐ 这里查出来的【Chip ID 就是芯片 id】—— 后面命令里的 -c 参数填的就是它。

命令 curl -s --max-time 5 https://www.hiascend.com && echo "有外网" || echo "无外网/被拦"

含义:测本机能不能访问公网 拆解:-s(静默)--max-time 5(最多等 5 秒,超时就放弃) && 前面成功才执行后面 || 前面失败才执行后面 用法:直接执行 期望:私有化环境应打印"无外网/被拦" 不过会怎样:打印"有外网" → 这台机器还能出去,私有化还没开始做 摸底结论表(我会这样填):

查到什么 说明什么 影响后面哪一步
有几张卡、几个设备 ID 能不能做多租户切分 第 4 步
能否上外网 要不要走离线安装 第 2、3 步
操作系统版本和 CPU 架构 能不能支持虚拟化实例 第 4 步(这是不可返工的一项)

⚠️ 摸底阶段最后一件必查的事:操作系统版本是否支持虚拟化实例功能。 官方明确要求:查看对应产品的驱动固件安装指南中「算力分组场景下的安装 > 安装前必读」章节, 了解支持虚拟化实例功能的操作系统版本。

为什么这条要放在"装机之前":如果系统版本不支持,就得重装系统 —— 装完 CANN、配完环境再发现,全部要重来。


4.2 第 1 步:定"私有化档位"(先想清楚,再动手)

不是所有客户都需要全套。先定档,再决定做哪些。

档位 做什么 适合什么场景 大致工作量
一档 部署位置:内网、无外网 单人/单项目,数据不外泄是唯一要求 小
二档 一档 + 数据流向收口:出站白名单、日志本地化 有合规要求,但没有多部门共用 中
三档 二档 + 资产保护 + 多租户隔离 多个部门/项目组共用一个算力池;模型是核心资产 大

我会问客户的三个问题(顺序不能反):

  1. 这台机器给几个人/几个组用? —— 决定要不要做多租户(第三档)
  2. 模型和提示词是不是你们的命根子? —— 决定要不要做混淆(第三档)
  3. 有没有审计或合规上的人来查过你们? —— 决定第二档要做到多细

⚠️ 别默认上第三档。多租户和混淆都有代价(管理复杂度、性能开销、排障难度), 单人自用的场景做这些是浪费。先定档,再动手。


4.3 第 2 步:在外网机器上"预演"一遍,把清单列出来(⭐ 最关键的一步经验)

为什么必须这么做:

离线环境里最难的从来不是"装",是"漏了什么"。 在线装的时候,缺依赖系统会自己下载; 离线装的时候,缺什么就是一条报错 —— 而且是装到一半才报。

所以我的做法是:先在另一台能上网的同版本机器上,把整条链路完整装一遍, 然后把"装完之后多出来了什么"记录下来,照着这份清单备料。

在外网机器上装完后,我会跑这几条来生成清单:

命令 find /usr/local/Ascend -maxdepth 2 -type d

含义:列出 Ascend 安装目录下两层以内的所有目录 拆解:find(查找)+ 目录 + -maxdepth 2(最多往下两层)+ -type d(只要目录) 用法:见上 期望:打印出安装后的目录结构 不过会怎样:目录不存在 → 装到别处了,用 echo $ASCEND_HOME_PATH 查实际路径 ⭐ 这份输出就是"我要搬进内网的目录结构"的骨架。

命令 pip3 list --format=freeze

含义:把所有已装的 Python 包按「包名==版本」的格式列出来 拆解:pip3 list(列包)+ --format=freeze(输出成 requirements 那种格式) 用法:见上 期望:每行一个 包名==版本 不过会怎样:包太多不好看 → 后面加 > requirements_frozen.txt 存成文件 ⭐ 这份清单是回内网后【逐条核对】的依据 —— 缺哪个一眼看出来。

命令 npu-smi info

不过会怎样:命令不存在 → 驱动没装("驱动包 = 驱动 & npu-smi 工具包"); 有输出但列不出卡 → 权限或硬件问题(回 A1/A2)

含义:查设备信息(A1 讲过) 用法:见上 期望:每张卡的型号、温度、显存、进程 ⭐ 记录下【显卡型号】,因为后面选驱动包、固件包、甚至选虚拟化模板都和型号有关。 备料清单(我会按这五类准备):

类别 具体是什么 从哪来
驱动包 Ascend-hdk-<型号>-npu-driver_x.x.x_linux-{arch}.run A1 讲过包名规则
固件包 Ascend-hdk-<型号>-npu-firmware_x.x.x.x.X.run 同上
CANN Toolkit 包 + ops 包(注意 ops 包按产品型号分发,B2 讲过) 昇腾社区下载页
框架 TorchNPU 相关 wheel(PyTorch 要用 +cpu 版,C1 讲过) 同上
Python 依赖 上面 pip3 list --format=freeze 那份清单 外网机器导出的

⚠️ 内网还要准备"源":如果内网要 pip install,得先搭好内网源(B4 讲过离线安装方式)。


4.4 第 3 步:搬进去、装起来(命令逐一)

命令 cd <软件包所在目录>

含义:切换到软件包所在目录(cd = change directory) 用法:见上 期望:提示符前的路径变了 不过会怎样:报 "No such file or directory" → 路径打错了

命令 chmod u+x <安装包>

含义:给安装包加"属主可执行"权限 拆解:chmod(改权限)+ u(属主 user)+ +x(加执行) 用法:chmod u+x Ascend-hdk-<型号>-npu-driver_x.x.x_linux-{arch}.run 期望:无输出(Linux 惯例:成功即沉默) 不过会怎样:不加就 ./ 执行会报 Permission denied

命令 ./<安装包> --check

含义:只校验不安装,检查包完整性和一致性 用法:./Ascend-hdk-<型号>-npu-driver_x.x.x_linux-{arch}.run --check 期望:校验通过 不过会怎样:校验不过就重新获取安装包 —— 离线搬运(U 盘/跳板机)最容易搬坏,这一步必做

命令 ./<安装包> --full [--install-path=<路径>]

含义:完整安装(--full 是完整安装模式;--install-path 指定装到哪) 用法:./<驱动包名>.run --full --install-path=/usr/local/Ascend 期望:出现安装进度,最后提示成功 不过会怎样:常见是磁盘不够、权限不足(要 root)、架构不匹配(x86 包装到 ARM 机器上)

⭐ 非 root 用户要特别加的一个参数:--install-for-all 为什么:官方明确说 —— 为了让非 root 用户能够使用驱动,安装 npu-driver 要添加 --install-for-all 选项。 不加会怎样:非 root 用户用不了驱动 —— 而生产环境又不该用 root 跑服务,两头一夹就卡住了。 用法:./<驱动包名>.run --full --install-for-all 装完立刻验(别攒着一起验): 命令 npu-smi info

判据:每张卡的 Health 为 OK 不过会怎样:命令不存在 → 驱动没装上(说明"驱动包 = 驱动 & npu-smi 工具包"这件事,A1 讲过) 装完 CANN 之后(B1 讲过路径,这里只做提醒): 命令 source /usr/local/Ascend/ascend-toolkit/set_env.sh 期望:无输出(成功即沉默);执行后 echo $ASCEND_HOME_PATH 应打印出 CANN 路径 不过会怎样:报 No such file or directory → 路径不对(root 与非 root 路径不同,见上面的注意); echo $ASCEND_HOME_PATH 仍为空 → 脚本里设的变量名和你以为的不一样,直接看脚本内容

含义:加载 CANN 环境变量(source 在当前终端执行,变量会留在当前窗口) ⚠️ 注意路径:root 是 /usr/local/Ascend/cann/set_env.sh,非 root 是 ${HOME}/Ascend/cann/set_env.sh —— 本课用的是 ascend-toolkit 那个路径,两条路都可能存在,按实际安装为准


4.5 第 4 步:做多租户隔离(这一节全是可照抄的命令)

前提两条(官方):

  1. 确认操作系统版本支持虚拟化实例功能(见 4.1 摸底);
  2. 完成昇腾 NPU 驱动固件安装 —— 官方原话:「驱动安装后,用户就能使用虚拟化实例功能」。

官方还说明了一点:在物理机和虚拟机使用 npu-smi 创建 vNPU 的命令基本相同, 其中只有 Atlas 推理系列产品支持在虚拟机创建 vNPU。

① 设置虚拟化模式

npu-smi set -t vnpu-mode -d mode
参数 取值 官方说明
mode 0 虚拟化实例功能容器模式
mode 1 虚拟化实例功能虚拟机模式(当前版本不支持)

⭐ 所以实际能用的只有 -d 0(容器模式)。

② 查设备 ID 和芯片 ID(前面查过,这里对应到参数上)

npu-smi info -l      # 查出的 NPU ID = 命令里的 -i
npu-smi info -m      # 查出的 Chip ID = 命令里的 -c

③ 创建 vNPU

npu-smi set -t create-vnpu -i id -c chip_id -f vnpu_config [-v vnpu_id] [-g vgroup_id]

官方参数说明:

参数 官方说明
id 设备 ID —— 通过 npu-smi info -l 查出的 NPU ID 即为设备 id
chip_id 芯片 ID —— 通过 npu-smi info -m 查出的 Chip ID 即为芯片 id
vnpu_config 虚拟化实例模板名称(参见官方《虚拟化模板》表)
vnpu_id 指定要创建的 vNPU 的 id。首次创建可以不指定,由系统默认分配;若重启后业务需要使用重启前的 vnpu_id,可以用 -v 指定重启前的 vnpu_id 进行恢复
vgroup_id 虚拟资源组 vGroup 的 id,取值范围 0~3,仅 Atlas 推理系列产品支持本参数

⭐ vnpu_id 的取值范围(这个要算,不是随便填):

产品 vnpu_id 取值范围
Atlas 推理系列产品 [phy_id*16 + 100, phy_id*16 + 107]
Ascend 910 [phy_id*16 + 100, phy_id*16 + 115]

phy_id 是什么:芯片物理 ID,可通过 ls /dev/davinci* 获取。 例如 /dev/davinci0,表示芯片的物理 ID 为 0。

举个数:phy_id = 0 的 Atlas 推理卡,可用 vnpu_id 是 100 ~ 107(正好 8 个)。

另外两条:vnpu_id 传入 4294967295 表示不指定虚拟设备号; 同一设备内不可重复创建相同 vnpu_id 的 vNPU。

官方使用示例(含期望输出,照抄可用):

# 在设备 1 中编号为 0 的芯片上,根据模板 vir02 创建 vNPU
npu-smi set -t create-vnpu -i 1 -c 0 -f vir02
        Status : OK         Message : Create vnpu success

# 指定 vnpu_id 为 103
npu-smi set -t create-vnpu -i 1 -c 0 -f vir02 -v 103
        Status : OK         Message : Create vnpu success

# 指定 vnpu_id 为 100,并指定 vgroup_id 为 1
npu-smi set -t create-vnpu -i 1 -c 0 -f vir02 -v 100 -g 1
        Status : OK         Message : Create vnpu success

④ 配置 vNPU 恢复状态(这一步不做,重启后配置就没了)

npu-smi set -t vnpu-cfg-recover -d mode

官方说明:该参数用于设备重启时,设备能够保存 vNPU 配置信息,重启后 vNPU 配置依然有效。 mode 为 "1" 表示开启,"0" 表示关闭,默认为使能状态。

npu-smi set -t vnpu-cfg-recover -d 1
       Status : OK
       Message : The VNPU config recover mode Enable is set successfully.

⑤ 查 vNPU

npu-smi info -t vnpu-cfg-recover        # 查配置恢复状态
VNPU config recover mode : Enable

npu-smi info -t info-vnpu -i id -c chip_id    # 查某芯片上的 vNPU 信息
npu-smi info -t info-vnpu -i 1 -c 0

⚠️ 官方提示:Atlas 推理系列产品支持返回 AICPU、Vgroup ID 信息,Ascend 910 不支持返回。

⑥ 销毁 vNPU

npu-smi set -t destroy-vnpu -i id -c chip_id -v vnpu_id
npu-smi set -t destroy-vnpu -i 1 -c 0 -v 103
       Status : OK
       Message : Destroy vnpu 103 success

⚠️ 官方提示:在销毁指定 vNPU 之前,请确保此设备未被使用。

⑦ 容器场景有两条路(这条对实际部署很省事)

官方对静态虚拟化的说明:

如果采用静态虚拟化方式使用 vNPU,在使用原生 Docker、MindX DL 挂载 vNPU 前, 需要通过 npu-smi 工具使用虚拟化实例命令按照用户的使用需求创建 vNPU。

官方对 Ascend Docker Runtime 的说明(另一条路):

Ascend Docker Runtime 使用 vNPU,既可以先通过 npu-smi 工具创建 vNPU,再将 vNPU 挂载到容器中; 也可以在拉起容器时,直接通过 ASCEND_VISIBLE_DEVICES 和 ASCEND_VNPU_SPECS 参数 从物理芯片上虚拟化出多个 vNPU 并挂载至容器。

⭐ 两条路的区别(实际选型时用):

路 怎么做 什么时候用
先建再挂(静态虚拟化) npu-smi set -t create-vnpu → 再挂到容器 需要固定分配、要能提前看到有几块
拉起时创建 容器启动参数里给 ASCEND_VISIBLE_DEVICES + ASCEND_VNPU_SPECS 按需创建、容器编排场景更顺

⚠️ vNPU 的使用限制(官方原文,做方案前必须知道)

  • 当前 vNPU 仅支持单个 vNPU 单容器任务,不支持创建多副本任务。
  • 任务运行过程中,不支持卸载 Volcano。
  • 目前任务的每个 pod 请求的 NPU 设备数量规则如下:使用切分后的 vNPU,则仅支持 1 个。
  • 静态虚拟化场景,如果创建或者销毁 vNPU,需要重启 Ascend Device Plugin。

⭐ 这几条直接决定方案可行性: 一个 vNPU 只能跑一个容器任务,意味着你不能指望一个切分出来的 vNPU 同时服务多个业务的容器 —— 要几个并行任务,就得切几个 vNPU。

切分规格的上限在哪(G1 第三段查过,这里给结论): Atlas 推理系列产品最大支持切分 7 个虚拟化实例,要按官方给的组合规格切。


4.6 第 5 步:开资产保护(模型混淆)

先查一件事:你的型号支不支持。

官方《Ras 类算子列表》的产品支持情况里, aclnnObfuscationCalculate 对 Ascend 950PR / Ascend 950DT 标注为「不支持」。

支持的型号上,用这三个接口:

接口 官方说明
aclnnObfuscationSetup / aclnnObfuscationSetupV2 完成 PMCC 模型混淆引擎的资源初始化和释放
aclnnObfuscationCalculate 把参数发送至 PMCC 混淆引擎,引擎的 CA 模块调用 TA 模块,进行张量混淆处理,最终返回 shape 与输入 x 一致的混淆后的张量 y
aclnnCrypto 调用 AICPU 加解密算子,按输入参数执行

⚠️ 诚实说明(很重要):官方文档给了这三个接口的定义与调用参数, 但本课没有找到"端到端接入 PMCC"的完整示例(不像 G3 那样有整段可跑代码)。 所以这一步不能照抄,需要按你手上版本的《算子接口(aclnn)》文档逐个接口对接。 —— 这是执行者路径中如实标注"这里还没有现成答案"的地方,比编一段代码强。

我会怎么推进这一步: 1. 先确认型号支持(查支持列表); 2. 按 aclnn 的通用调用方式(GetWorkspaceSize → 执行)对接 aclnnObfuscationSetup; 3. 在张量处理路径上插入 aclnnObfuscationCalculate; 4. 落盘/传输环节看是否需要 aclnnCrypto; 5. 最关键的一步验证:把模型文件拷到一台没开混淆的机器上,看能不能正常推理 —— 跑不出正确结果,说明混淆生效了。


4.7 第 6 步:收口数据流向

命令 ss -lntp

含义:看本机开了哪些"门"(正在监听等连接的端口)和对应进程 拆解:ss(socket statistics)+ -l(只看 listening)+ -n(端口用数字)+ -t(只看 TCP)+ -p(显示进程) 用法:见上 期望:列出监听端口 + 进程名 + PID 不过会怎样:看到不认识的服务在监听 → 先查清它是什么再决定留不留 ⭐ 重点看:有没有服务监听在 0.0.0.0(表示对所有网卡开放),而你只希望它在本机或内网可访问。

命令 ss -ntp

含义:看本机正在和谁"通着话"(已建立的 TCP 连接) 拆解:去掉 -l,就是"不看监听的,看已建立的" 用法:ss -ntp 期望(私有化环境):只有内网地址之间的连接 不过会怎样:出现连到公网 IP 的 ESTABLISHED 连接 → 这就是一条外发通道,必须查清 ⭐ 这是"数据出没出去"最直接的一条证据。 然后按这张表逐条过(这张表是部署实践归纳,官方没有对应成文清单):

数据 可能出去的路 我会怎么处理
模型下载 框架自动从公网拉权重 提前把权重放本地,设离线标志
依赖安装 pip / conda 从公网拉包 内网源或离线包(B4 讲过)
日志上报 采集/上报工具指向外部 只落本地盘,或采集器指向内网
推理请求的遥测 服务配置里的统计上报开关 关掉或指向内网地址
时间同步 NTP 指向公网 指内网 NTP
容器镜像 从公网 registry 拉镜像 提前 docker save 成 tar 搬进去

收口子最有效的动作:在防火墙上只放通必要出站(或干脆不通),然后完整跑一遍业务流程 —— 一切正常说明该在外面拉的东西都提前备好了;报错,那条报错就是你要补的口子。


4.8 第 7 步:验收 —— 拿出证据,而不是"我觉得"

我会按这七条逐条留证据:

# 判据 我拿什么当证据
① 断网能装完 内网机器上的完整安装记录(含 .run --check 的校验输出)
② 断网能跑起来 业务流程全程无外网的运行日志
③ 出站连接可解释 ss -ntp 输出 + 逐条标注每个连接是什么
④ 模型被拷走用不了 把权重拷到另一台无混淆环境的机器上试,记录结果
⑤ 多租户互不影响 两个 vNPU 上同时跑任务,记录是否互相干扰
⑥ vNPU 配置可恢复 npu-smi info -t vnpu-cfg-recover 输出为 Enable
⑦ 能说清每一路数据的去向 一张表,逐条列出数据流向

第 ⑦ 条是本课的验收口径:私有化最容易变成"我觉得很安全"。 能逐条写出数据去哪,才算做了私有化;写不出来,就只是"装在了内网"。

⭐ 顺带一个我每次都会做的动作:把第 ⑥ 条和"重启设备后 vNPU 还在不在"一起验 —— 因为生产环境总会有重启,而没开配置恢复的 vNPU 重启就没了, 这个坑不提前验,上线后会以"服务莫名其妙起不来"的形式出现。


4.9 这一节的方法论(它比具体命令更耐用)

把上面八步抽象出来,就是一条通用做法:

① 摸底:不装任何东西,先把"事实"查清楚(几台卡、能不能上网、系统版本) —— 尤其是【不可返工的事】要在这里查出来 ② 定档:先想清楚"要做哪一档",别默认上全套 ③ 预热:能在别处先跑一遍的,就先跑一遍,把清单和坑提前拿到 ④ 动手:按官方给的命令照做,每步都验,不攒着一起验 ⑤ 难以验证的:找【反面证据】—— 证明它"确实拦住了",比证明它"没报错"更有力 ⑥ 收口:拿"真实的完整流程跑一遍"当验收,而不是拿"配置项都设了" ⑦ 出证据:每一步留下可给别人看的东西(日志、输出、记录) ⑧ 诚实:官方没给答案的地方,明说"这里要自己查",不编

第 ⑤ 条和第 ⑧ 条是这套方法里最容易被跳过的,也是最能体现专业度的两条。 第 ⑤ 条:验证"数据不出内网",我不会只看"防火墙配了", 而是拿一台机器真的去连一下,把它连不上这个结果记下来 —— 这就是"反面证据"。 第 ⑧ 条:像模型混淆这一步,官方没给端到端示例 —— 我会在方案里写清"这里需要专项投入",而不是含糊过去。

第五段 怎么确认就位

5.1 ① 部署位置

命令 curl -s --max-time 5 https://www.hiascend.com

含义:测试本机能不能访问公网 用法:直接执行 期望(私有化环境):超时或拒绝连接 —— 这说明出站确实关着 不过会怎样:如果能正常返回内容,说明这台机器还能上外网,私有化没做彻底

5.2 ② 数据流向 —— 三条必查

命令 ss -lntp

期望:列出监听端口 + 进程名 + PID 不过会怎样:命令不存在 → 系统太精简,装 iproute2;看到不认识的进程在监听 → 先用 ps -p <PID> 查清它是什么

(含义见前文)→ 看有哪些进程在监听、监听在哪个地址 关注点:有没有服务监听在 0.0.0.0(所有网卡)而你只希望它在本机或内网可访问

命令 ss -ntp

含义:只看"已建立"的 TCP 连接(不看监听的) 拆解:-n 数字端口,-t TCP,-p 显示进程 用法:ss -ntp 期望:业务流程跑起来时,应该只有内网地址之间的连接 不过会怎样:看到连到公网 IP 的 ESTABLISHED 连接 → 这就是一条外发通道,必须查清

⚠️ 以上两条命令是通用的网络排查方法,不是昇腾专用命令。 昇腾设备侧的日志另有工具(msnpureport 导出 Device 侧日志,A3 讲过), 但"数据出没出去"是主机侧的事,用系统的网络工具看更直接。

5.3 ③ 资产保护

检查项 怎么看 通过标准
目标型号支持 PMCC 吗 查 CANN 对应版本的《Ras 类算子列表》产品支持情况 目标型号没标"不支持"
是否启用了混淆 看应用里有没有调用 aclnnObfuscationSetup 系列接口 有调用
多租户隔离用的是哪种模式 查 AVI 配置是硬件虚拟化还是软件虚拟化 按你的隔离要求选对了模式
切分规格合法吗 对照官方《虚拟化实例组合》/《虚拟化模板》 用的组合在官方列表内

第六段 判据 / 验收

# 判据 验证方式 不过说明
① 断网能装完 在内网机器上完整走一遍安装 部署位置没做透,缺离线包
② 断网能跑起来 业务流程全程无外网 有依赖在运行时才去外面拿
③ 出站连接可解释 ss -ntp 逐条对得上 有不明外发通道
④ 模型被拷走用不了 拷走权重到另一台无混淆环境的机器上试 资产保护没做
⑤ 多租户互不影响 两个 vNPU 上同时跑任务,看是否互相干扰 隔离模式选错了
⑥ 能说清每一路数据的去向 用表列出来 这条是灵魂

第 ⑥ 条是本课的差异化:私有化最容易变成"我觉得很安全"。 能逐条说清数据去哪,才算做了私有化;说不清,就只是"装在了内网"。


第七段 出问题怎么查

排障原则:先定"哪一件事没做到",再看技术细节。

你看到的现象 先归到哪件事 先查什么
内网装不上,报缺包 ① 部署位置 在外网同版本机器上对照 /usr/local/Ascend 清单,找缺的那个包
装完了,一跑就报错 ① → ② 多半是运行时去公网拉东西失败,看报错里有没有 URL
跑起来正常,但网络监控报警有出站 ② 数据流向 ss -ntp 看是谁连出去的;再查该进程的配置
模型拷到别的机器跑不出结果 ③ 资产保护 这可能说明混淆生效了 —— 先确认这是预期行为
模型拷到别的机器能正常跑,但你希望它不能 ③ 资产保护 混淆没启用,或目标型号不支持 PMCC
两个部门互相能看到对方的任务 ③ 资产保护 隔离没用 AVI,或用了软件虚拟化而你需要硬件虚拟化
实例创建失败 ③ 资产保护 切分组合超出官方规格(如超过 7 个实例)
create-vnpu 报错 ③ ① 设备/芯片 ID 填对没(npu-smi info -l / -m);② vnpu_id 在不在范围内([phy_id*16+100, phy_id*16+107](推理系列)/ +115(910));③ 同一设备内有没有重复的 vnpu_id
重启后 vNPU 不见了 ③ vnpu-cfg-recover 没开 → npu-smi set -t vnpu-cfg-recover -d 1,用 npu-smi info -t vnpu-cfg-recover 确认是 Enable
建/销毁 vNPU 后容器起不来 ③ 官方说明:静态虚拟化场景创建或销毁 vNPU 需要重启 Ascend Device Plugin
一个 vNPU 想跑多个容器任务 ③ 官方限制:当前 vNPU 仅支持单个 vNPU 单容器任务,不支持多副本 → 要几个并行任务就切几个 vNPU
容器里想要多个设备 ③ 官方规则:使用切分后的 vNPU,任务的每个 pod 请求的 NPU 设备数量仅支持 1 个
想做多租户但系统不支持 ③ 4.1 摸底时该查出来的:查对应产品驱动固件安装指南「算力分组场景下的安装 > 安装前必读」,确认操作系统版本是否支持虚拟化实例功能

第八段 常见报错清单

⚠️ 本课对应的报错较少被官方单独收录,因为私有化涉及的是组合场景。 下表给的是按现象排查的方向,具体报错原文请用官方案例库按现象检索: https://www.hiascend.com/document/caselibrary —— 按实际报错检索,不要按"私有化"检索(那不是一个官方分类词)。

现象 大概属于 先查什么
安装时报缺少依赖 ① 部署位置 离线包不全;对照外网机器的安装清单
pip 安装失败,报连不上源 ① 部署位置 内网没配源(B4 讲过的离线安装方式)
容器里找不到设备 ① 部署位置 驱动在宿主机(B5 的核心结论);容器要 --device 且权限是 rwm 不是 rw
服务启动卡住不动 ② 数据流向 有没有在等一个连不上的外部地址
日志里出现外部域名 ② 数据流向 该组件的遥测/上报配置项
调用混淆接口返回不支持 ③ 资产保护 目标型号在不在支持列表里(950PR/950DT 明确不支持 aclnnObfuscationCalculate)
创建 vNPU 失败 ③ 资产保护 切分组合是否在官方规格内(Atlas 推理系列最多 7 个实例);vnpu_id 是否在取值范围内
npu-smi info -t info-vnpu 少了一些字段 ③ 资产保护 官方提示:Atlas 推理系列支持返回 AICPU、Vgroup ID;Ascend 910 不支持返回 —— 不是故障

⭐ 检索技巧(E1 讲过,这里再用一次):去掉具体化信息。 不要搜"我们公司内网装不上",要搜报错原文里的稳定特征词(错误码、库名、函数名)。


第九段 小结 + 钩子 + 自测

三句话记住本课

  1. 私有化 = 部署位置 + 数据流向 + 资产保护。三件都做才叫私有化,只做第一件等于没做。
  2. 资产保护这一层,官方在 CANN 里给了真东西:PMCC 模型混淆(TrustZone + 混淆因子 + 动态掩码) 与 AICPU 加解密算子;多租户隔离用 AVI 虚拟化实例(硬件虚拟化 = 真隔离)。
  3. 官方明说安全加固只是"基本建议项",最终要按你所在组织的策略来 —— 这部分没人能替你做。

自测(不看上文)

  1. 「私有化」的三件事分别是什么?各自的验收标准?
  2. PMCC 的混淆因子存在哪里?为什么这让模型被拷走也没用?
  3. 硬件虚拟化和软件虚拟化,哪个是真正的资源隔离?
  4. Atlas 推理系列最多能切成几个虚拟化实例?
  5. 目标型号是 Ascend 950PR,能用 aclnnObfuscationCalculate 吗?

钩子:下一课

G1 解决了"模型和数据留在自己手里",但企业的下一个问题一定是:

模型是不出去了,可它答不了我们公司自己的问题 —— 我要怎么把公司的文档喂给它?

这就是 私有知识库(RAG) —— G 层的下一课。 官方在这块的对应物叫 RAG SDK(属 MindSDK 知识增强), 它提供多模态文档解析、检索、知识管理等能力, 但官方明确说它「不包含用户、权限等和业务强相关的功能接口」 —— 那部分怎么做,留到后面讲。


附录 A 官方出处

# 内容 官方出处
1 PMCC(Privacy & Model Confidential Computing)模型混淆特性:利用 CPU 核中的 TrustZone 可信执行环境隔离存储混淆因子、派生混淆掩码、执行动态掩码添加 CANN 9.2.0-beta.2《算子接口(aclnn)· RAS 类接口》→ zh/CANNCommunityEdition/920beta2/API/aolapi/context/ops-ras/aclnnObfuscationCalculate.md
2 aclnnObfuscationSetup / aclnnObfuscationSetupV2:完成 PMCC 模型混淆引擎的资源初始化和释放 CANN 9.2.0-beta.2《Ras 类算子列表》→ …/ops-ras/op_api_list.md
3 aclnnObfuscationCalculate:将参数发送至 PMCC 混淆引擎,引擎的 CA 模块调用 TA 模块进行张量混淆处理,返回 shape 与 x 一致的混淆后的张量 y。产品支持情况:Ascend 950PR / 950DT 不支持 同上
4 aclnnCrypto:调用 AICPU 加解密算子,按输入参数执行 CANN 9.2.0-beta.2《Ras 类算子列表》
5 AVI 虚拟化模式:硬件虚拟化(vNPU 的 AICore/AICPU/内存等资源和其他 vNPU 相互隔离,任务互不影响)/软件虚拟化(创建虚拟实例,共享硬件资源) 《昇腾虚拟化实例(AVI)用户指南》→ zh/computepoweralloca/300/cpaug/cpaug/cpaug_00007.html
6 虚拟化实例组合:Atlas 推理系列产品最大支持切分 7 个虚拟化实例,需按组合规格切分;Ascend 910 的虚拟化机制 同上 → …/cpaug/cpaug_00006.html
7 虚拟化模板:含 Ascend 910(30 核)等规格;昇腾 AI 产品包含 AI Core(矩阵乘等计算,适用于卷积模型)、AI CPU(控制算子、标量和向量等通用计算)、DVPP(数字视觉预处理)、内存 同上 → …/cpaug/cpaug_00005.html
8 《加固须知》:本文中列出的安全加固措施为基本的加固建议项;用户应根据自身业务重新审视整个系统的网络安全加固措施;应按照所在组织的安全策略进行相关配置(软件版本、口令复杂度、安全配置、权限配置、防火墙设置等) CANN 9.2.0-beta.2《安全加固》→ zh/CANNCommunityEdition/920beta2/softwareinst/instg/instg_0035.html
9 离线安装方式、安装包校验与完整安装参数 见 B4《七种安装方式》、A1《驱动与固件》
10 容器拿卡方式与权限要求(--device、rwm 而非 rw) 见 B5《装进容器》

⚠️ 本体系中属于「归纳/实践」而非官方原文的部分,已在正文明确标注: - 4.2 的《数据流向检查表》是部署实践归纳,官方没有对应的成文清单; - 第五段的 ss / curl 排查方法属通用系统方法,非昇腾专用命令。


附录 B 命令详解(本课新增部分)

A1–D5 已解释过的命令(npu-smi info、source、cat、export 等)此处不重复。

.run --check / .run --full / --install-path

命令 ./<安装包>.run --check

含义:只校验,不安装 —— 检查安装包是否完整、有没有损坏 拆解:./<安装包>.run(执行当前目录下的安装文件) --check(子参数:校验模式) --full(子参数:完整安装) --install-path=<路径>(子参数:指定安装位置) 用法:./Ascend-hdk-<型号>-npu-driver_<版本>linux-<架构>.run --check ./Ascend-hdk-<型号>-npu-driver<版本>_linux-<架构>.run --full --install-path=/usr/local/Ascend 期望:--check 输出校验结果;--full 显示安装进度与结果 不过会怎样:Check 失败 → 包在搬运中损坏(离线场景高发,U 盘/跳板机中转时) Full 失败 → 常见是权限(要 root)、磁盘空间、架构不匹配

ss(本课新增)

命令 ss -lntp 和 ss -ntp

不过会怎样:ss 命令不存在 → 系统太精简,装 iproute2; 看不认识的进程 → 用 ps -p <PID> 继续查它是谁

含义:ss = socket statistics,查看套接字(网络连接)状态 它不是昇腾命令,是 Linux 系统自带的网络排查工具 拆解:-l 只看 listening(正在监听等连接的) -n 端口用数字显示(不解析成 http/ssh 这类服务名,更准) -t 只看 TCP(另有 -u 看 UDP) -p 显示进程(process),即"谁在干这件事" -l 不加(即 ss -ntp)= 只看已经建立起来的连接 用法:ss -lntp # 我这个机器开了哪些门(监听) ss -ntp # 我这边正在和谁通着话(已建立连接) 期望:-lntp 列出监听端口 + 进程;-ntp 列出 ESTABLISHED 连接 + 进程 私有化环境的关键判据:-ntp 输出里不该出现公网地址 不过会怎样:命令不存在 → 系统太精简(可装 iproute2);正常输出即可读, 看不懂的进程名用 ps -p 进一步查

curl(在私有化场景的用法)

命令 curl -s --max-time 5 <地址>

含义:发一次 HTTP 请求看返回;私有化场景里,它是用来验证"通不通"的 拆解:-s(silent,静默模式,不显示下载进度条) --max-time 5(最多等 5 秒,超时就放弃 —— 不然会一直挂着) 用法:curl -s --max-time 5 https://www.hiascend.com # 测公网(私有化环境应超时) curl -s --max-time 5 http://<内网服务>:<端口>/<路径> # 测内网服务 期望:内网服务有返回;公网请求超时/拒绝 不过会怎样:内网服务也不通 → 先看服务起没起(ss -lntp)、再看防火墙

B.4 摸底与排查新增(本课第四段用到)

命令 ls /dev/davinci*

含义:列出系统里的昇腾芯片设备节点 拆解:ls(列出)+ 通配符 (匹配所有 davinci 开头的文件) 用法:ls /dev/davinci0 # 只看某一个 期望:打印设备节点路径 不过会怎样*:报 No such file or directory → 驱动没装/没识别 ⭐ 设备节点尾数 = 芯片物理 ID(phy_id),算 vnpu_id 取值范围要用

命令 npu-smi info -l

含义:列出所有 NPU 设备(-l = list) 用法:npu-smi info -l 期望:NPU ID 及各 NPU 信息 ⭐ 查出的 NPU ID = 后续命令的 -i 参数 不过会怎样:无输出或报错 → 驱动/权限问题;设备号与预期不符 → 先确认卡插好了(回 A2)命令 npu-smi info -m

含义:查看芯片映射信息 用法:npu-smi info -m 期望:NPU ID / Chip ID / Chip Logic ID 对照表 ⭐ 查出的 Chip ID = 后续命令的 -c 参数 不过会怎样:报错 → 驱动问题;列表为空 → 驱动没正常挂载,后面所有 -c 参数都无从填起命令 npu-smi set -t vnpu-mode -d mode

含义:设置虚拟化模式 拆解:npu-smi set(设置类操作)+ -t vnpu-mode(设置目标:虚拟化模式)+ -d(data,值) 用法:npu-smi set -t vnpu-mode -d 0 期望:设置成功回显 不过会怎样:mode 只能取 0 或 1;1(虚拟机模式)当前版本不支持 → 实际只能用 0

命令 npu-smi set -t create-vnpu -i id -c chip_id -f vnpu_config [-v vnpu_id] [-g vgroup_id]

含义:在指定芯片上创建一个 vNPU 拆解:-t create-vnpu(做什么:创建 vNPU) -i id 设备 ID(npu-smi info -l 查出的 NPU ID) -c chip_id 芯片 ID(npu-smi info -m 查出的 Chip ID) -f vnpu_config 虚拟化实例模板名称(如 vir02) -v vnpu_id 可选,指定 vNPU 的 id;首次可不填 -g vgroup_id 可选,虚拟资源组 id,取值 0~3,仅 Atlas 推理系列支持 用法:npu-smi set -t create-vnpu -i 1 -c 0 -f vir02 期望:Status : OK Message : Create vnpu success 不过会怎样:见第七段那几条(ID 填错 / vnpu_id 超范围 / 重复 vnpu_id)

命令 npu-smi set -t vnpu-cfg-recover -d mode

含义:配置 vNPU 的恢复状态 —— 开启后设备重启,vNPU 配置依然有效 拆解:-t vnpu-cfg-recover(做什么:配置恢复)+ -d(值:1 开启 / 0 关闭) 用法:npu-smi set -t vnpu-cfg-recover -d 1 期望:Status : OK Message : The VNPU config recover mode Enable is set successfully. 不过会怎样:不开 → 设备重启后 vNPU 配置丢失(默认为使能状态)

命令 npu-smi info -t vnpu-cfg-recover

含义:查询 vNPU 配置恢复状态 用法:npu-smi info -t vnpu-cfg-recover 期望:VNPU config recover mode : Enable 不过会怎样:报错或没有输出 → 该版本/驱动不支持此命令;显示 Disable → 恢复没开,设备重启后 vNPU 会丢命令 npu-smi info -t info-vnpu -i id -c chip_id

含义:查询某芯片上的 vNPU 信息 用法:npu-smi info -t info-vnpu -i 1 -c 0 期望:该芯片上的 vNPU 列表 ⚠️ Atlas 推理系列支持返回 AICPU、Vgroup ID;Ascend 910 不支持返回 不过会怎样:列表为空 → 该芯片上还没建 vNPU(回 4.5 第 ③ 步);报设备不存在 → -i/-c 填错了命令 npu-smi set -t destroy-vnpu -i id -c chip_id -v vnpu_id

含义:销毁指定的 vNPU 拆解:-v 这里必填(要指定销毁哪一个) 用法:npu-smi set -t destroy-vnpu -i 1 -c 0 -v 103 期望:Status : OK Message : Destroy vnpu 103 success 不过会怎样:⚠️ 销毁前请确保此设备未被使用(官方提示)

命令 pip3 list --format=freeze

含义:把已装的 Python 包按「包名==版本」格式列出来(requirements 那种格式) 拆解:--format=freeze(输出成可复制的格式) 用法:pip3 list --format=freeze > requirements_frozen.txt 期望:每行一个 包名==版本 ⭐ 内网搬迁时,这份清单是逐条核对的依据 不过会怎样:输出为空或报错 → Python 环境不对(回 4.1 摸底查 python3 -V)命令 find <目录> -maxdepth N -type d

含义:在目录下找文件/目录,限制往下几层 拆解:-maxdepth N(最多往下 N 层)+ -type d(只要目录;-type f 只要文件) 用法:find /usr/local/Ascend -maxdepth 2 -type d 期望:打印目录结构 ⭐ 备料时用它记录"装完之后多出来了什么" 不过会怎样:什么都没有 → 目录路径不对;用 echo $ASCEND_HOME_PATH 确认实际安装根目录

选修 · 昇腾 AI 部署实操 本机读完 0/51
选修 C · 昇腾 AI 部署实操
从零把昇腾 AI 部署学一遍:先看懂分几层,再逐层装起来,最后出问题能自己定位到哪一层。不需要先有卡就能开始。
看完整学习路径(6 站 + 3 门选修) · 进度只存在你这台设备的浏览器里,不用登录
辽ICP备2026019944号-1