环境

  • IDC :Internet Data Center 即互联网数据中心
  • 华为私有云,主要用于提供基础环境
  • 主要业务:图像识别应用,通过监控摄像头处理图像,实现市政管理监控,应用了商汤的算法模型,同时也可以自己训练

服务器信息

[root@bms-2d36 ~]# uname -a
Linux bms-2d36 4.19.90-23.8.v2101.ky10.aarch64 #1 SMP Mon May 17 17:07:38 CST 2021 aarch64 aarch64 aarch64 GNU/Linux

  • 运行的是 Linux 内核版本为 4.19.90-23.8.v2101.ky10.aarch64。
  • aarch64架构

aarch64架构是ARM(Advanced RISC Machine)架构中的一个64位版本。ARM架构最初是为嵌入式系统设计的,但现在也被广泛用于移动设备和一些服务器和超级计算机中。aarch64架构是ARMv8指令集架构的一个子集,提供了对64位处理器的支持。许多移动设备、嵌入式系统以及一些服务器都采用了aarch64架构,特别是在需要低功耗和高性能的场景下。

服务器使用的是atlas800平台,搭载了比较新的8块ascend910B npu,每块npu有32GB内存。

Atlas 300I 推理卡(型号:3000/3010)基于昇腾处理器,提供超强AI推理性能,支持80路高清视频实时分析,可广泛应用于智慧城市、智慧交通、智慧金融等场景。支持JPEG和视频硬件编解码,提升图片和视频类应用性能,例如支持H.264/H.265 Decoder硬件解码,80路1080P 25FPS,YUV420。

DVR代表数字视频录像机(Digital Video Recorder),而NVR代表网络视频录像机(Network Video Recorder)。

最开始以为服务器的芯片是ascend310,是推理卡,无法进行训练任务。后来经过查实发现搭载的是ascend910B,可以进行训练或推理(训练卡可能需要更多的显存,用于保存训练时的中间状态)。

功耗:实际在推理应用中,观察到单张npu的功耗在200W左右,闲置时的功率在60W附近。

cpu info

[root@bms-2d36 ~]# lscpu
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 192
On-line CPU(s) list: 0-191
Thread(s) per core: 1
Core(s) per socket: 48
Socket(s): 4
NUMA node(s): 8
Vendor ID: HiSilicon
Model: 0
Model name: Kunpeng-920
Stepping: 0x1
CPU max MHz: 2600.0000
CPU min MHz: 200.0000
BogoMIPS: 200.00
L1d cache: 12 MiB
L1i cache: 12 MiB
L2 cache: 96 MiB
L3 cache: 192 MiB
NUMA node0 CPU(s): 0-23
NUMA node1 CPU(s): 24-47
NUMA node2 CPU(s): 48-71
NUMA node3 CPU(s): 72-95
NUMA node4 CPU(s): 96-119
NUMA node5 CPU(s): 120-143
NUMA node6 CPU(s): 144-167
NUMA node7 CPU(s): 168-191
Vulnerability Itlb multihit: Not affected
Vulnerability L1tf: Not affected
Vulnerability Mds: Not affected
Vulnerability Meltdown: Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1: Mitigation; __user pointer sanitization
Vulnerability Spectre v2: Not affected
Vulnerability Srbds: Not affected
Vulnerability Tsx async abort: Not affected
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jsc
vt fcma dcpop asimddp asimdfhm ssbs

Linux服务器命令

使用scp向服务器传输文件或从服务器下载文件,加入参数-r可以传输文件夹

scp Ascend-cann-toolkit_7.0.0_linux-aarch64.run root@172.27.84.235:/home/

通过端口转发连接服务器
ssh -L 7777:localhost:7860 root@172.27.84.235

端口转发需要修改sshd配置文件
vim /etc/ssh/sshd_config
PermitTunnel yes
Forwarding yes
systemctl restart sshd

查看端口占用进程
netstat -tunlp |grep 7860

export 命令配置临时运行环境
export LD_PRELOAD=/usr/lib64/libgomp.so.1:$LD_PRELOAD

配置终端默认环境
vim ~/.bashrc

查看指定文件位置
sudo find / -name file-name

vim使用

  • 使用/进行查找
  • 撤回:u

查看进程

ps -aux|grep jupyter

显示包括操作系统信息在内的完整系统信息,如内核版本、主机名、处理器架构等。
uname -a

显示包括操作系统名称、版本、ID等在内的系统发行版信息。
cat /etc/os-release

终止进程
kill -9 PID

下列命令可以开启后台进程,关闭ssh连接,不会终止进程。
nohup python -u  model_download.py  --repo_id THUDM/chatglm2-6b >run_info.log 2>&1 &

  • nohup指不断地运行,是no hang up的缩写,指不间断,不挂断。运行一个进程的时候,不想让其在你退出账号时关闭,即可用nohup。
  • -u:python的输出又缓冲,导致xxx.log并不能够马上看到输出。-u参数,使得python不启用缓冲。可以即时看到输出
  • xxx.log保存输出的信息,运行程序时会生成这个xxx文件,里面保存这输出的信息。
  • 2>&1 将错误信息重定向到标准输出
  • & 最后一个&符号代表后台运行

root路径的FileSystem爆满,无法下载东西,需要通过lvm命令进行硬盘扩容。

常用Linux服务器目录

  1. bin:存放系统基本命令的可执行文件,一般是一些用户和管理员常用的命令。
  2. opt:存放可选软件包的安装目录,一些第三方软件通常安装在这个目录下。
  3. root:root用户的主目录。

atlas设备

在计算机领域中,NPU通常指的是神经网络处理器(Neural Processing Unit)。NPU是一种专门用于执行人工神经网络推断计算的硬件加速器,通常用于机器学习和人工智能应用中。

查询设备0所有芯片的统计信息。

npu-smi info -t usages -i 0

查看服务器npu资源
npu-smi -info

NPU驱动和固件版本可通过以下命令查询。
npu-smi info -t board -i NPU ID

查询设备0中编号为0的芯片的详细信息,可以发现芯片类型是910B。
npu-smi info -t board -i 0 -c 0
NPU ID : 0
Chip ID : 0
Chip Type : Ascend
Chip Name : 910B
Chip Version : V1
Board ID : 0x21
PCB ID : NA
BOM ID : 1
VDie ID : 185011DC 21B0230C 3858EA55 95A5090A 4D102003
NDie ID : 22D07194 21B0901C 3C58EA55 95A5090A CC102003
Chip Position ID : 0
PCIe Bus Info : 0000:C1:00.0
Firmware Version : 1.84.15.1.310

照着gitee上的sample文档操作,发现可以生成om模型,但是在执行的时候,出现了报错。查询相关信息,发现是推理卡在推理的时候出错。猜测可能是cann的版本问题,机器上的cann是商业版6.0.1,MCU和NPU版本正常。按照教程将cann-toolkits更新到社区版8.0RC。

查看cann版本信息,安装成功。

~# cat /opt/ascend-toolkit/latest/aarch64-linux/ascend_toolkit_install.info
package_name=Ascend-cann-toolkit
version=8.0.RC1.alpha001
innerversion=V100R001C77B220SPC008
compatible_version=[V100R001C80,V100R001C84],[V100R001C77,V100R001C79],[V100R001C29],[V100R001C11,V100R001C50]
arch=aarch64
os=linux
path=/opt/ascend-toolkit/8.0.RC1.alpha001/aarch64-linux

mindspore各个版本貌似要适配特定版本的cann。最新的社区版8.0还没有适配…
尝试安装7.0版本,报错固件版本不正确。但是却可以使用cann 6.0.1和cann 8.0….

去年12月,pytorch官方支持了Ascend设备,只需要安装一些依赖,然后将原来的.cuda换成.npu就能正常运行了。

运行时若需启动多张npu,需要导入环境变量:

export ASCEND_VISIBLE_DEVICES=0-7

然后指定需要的npu,如npu:7。

AIPP(AI Preprocessing Pipeline):

AIPP是一种用于深度学习推理的预处理管道,可用于对输入数据进行预处理以满足神经网络的输入要求。它可以执行诸如色彩空间转换、图像缩放、裁剪、对比度调整和格式转换等功能,以提高深度学习推理的效率和准确性。AIPP的存在可以帮助将图像数据转换为适合特定神经网络模型输入的格式,从而简化后续推理过程。

DVPP(Data Visuo-Processing Pipeline):

DVPP是一种数据视觉处理管道,专门用于图像和视频数据的处理。它能够执行多种任务,包括图像解码、尺寸调整、颜色空间转换、图像格式转换和特定算法加速等。DVPP的存在可以帮助加速图像和视频数据的处理过程,提高处理效率和节省计算资源。

conda

常用的conda环境管理命令

  1. 创建一个新环境:
    conda create --name myenv
  2. 创建指定版本的Python环境:
    conda create --name myenv python=3.8
  3. 激活一个环境:
    conda activate myenv
  4. 退出当前环境:
    conda deactivate
  5. 复制一个现有的环境:
    conda create --name myclone --clone myenv
  6. 删除一个环境:
    conda remove --name myenv --all
  7. 查看所有环境
    conda info --envs

    注意事项

    使用前需要激活conda 的 python环境
    export PYENV_ROOT=”/root/anaconda3”

linux下的conda create不会安装python,需要指定
conda install python=3.9

jupyter无法发现虚拟环境

pip install ipkernel
python -m ipykernel install --user --name npu_torch --display-name "Python (torch)"

配置jupyter notebook自动换行不生效
查看配置文件,将多处配置文件同时修改确保生效

mindspore

看起来很像pytorch,配合cann-kit一起使用。

更新软件时,先更新固件,后更新驱动。

安装软件时,一定要注意官网上的流程,确保各种环境和版本都是适配的,否则很可能出现错误。

pytorch

简介:开发了名为torch_npu的Ascend Adapter for PyTorch插件,使昇腾NPU可以适配PyTorch框架,为使用PyTorch框架的开发者提供昇腾AI处理器的超强算力。

ascend/pytorch项目链接

使用起来感觉非常方便,只需要import npu_torch,剩余都和cuda运行差不多。不过明显感觉适配度不高,有的模型运行很慢,或者运行出错。

使用python3.10时,会有如下报错,但是也能正常运行。更换python3.9之后正常运行。

SystemError: PY_SSIZE_T_CLEAN macro must be defined for '#' formats

onnx模型使用流程

要使用华为的Atlas 300进行推理(即使用NPU来运行深度学习模型进行预测),通常需要按照以下步骤进行:

  1. 准备模型:首先需要准备好要进行推理的深度学习模型。这包括模型文件(如TensorFlow模型、PyTorch模型等)以及模型的权重文件。

  2. 转换模型:根据Atlas 300所支持的模型格式要求,有时需要将模型转换为适用于Atlas 300的格式。华为通常会提供相应的转换工具或者指导。

  3. 使用MindSpore或TensorFlow等框架进行推理:一旦模型准备好,你可以使用支持Atlas 300的深度学习框架(比如华为的MindSpore)来进行推理。这通常会涉及使用框架提供的API加载模型,并将输入数据传递给模型进行预测。

  4. 部署到Atlas 300硬件:将经过转换的模型部署到Atlas 300的硬件上进行推理,可以通过一些特定的接口和工具来实现。

  5. 性能优化和调试:根据实际应用需求,可以通过调整模型参数、硬件配置、推理策略等手段对推理性能进行优化。

DDK为用户提供基于NPU的数字开发者套件。DDK可以用于构建相关工程的编译环境。不同的发布包里集成了不同NPU形态的DDK。

在atlas平台上进行推理,需要将开源框架的网络模型,例如Caffe、TensorFlow等框架训练好的模型,通过OMG(Offline Model Generator:离线模型生成器)将其转换成昇腾AI处理器支持的离线模型,模型转换过程中可以实现算子调度的优化、权值数据重排、量化压缩、内存使用优化等,可以脱离设备完成模型的预处理。

开发工具

华为生态开发常用工具

  • Atlas系列产品:提供AI训练、推理卡及训练服务器.
  • CANN(异构计算架构):芯片算子库和自动化算法开发工具。
  • ModelBox:适用于端边云场景的AI推理应用开发框架,提供标准SDK API接口。
  • MindSpore(AI框架):支持“端-边-云”独立和协同的统一训练和推理框架。
  • MindX SDK(昇腾SDK):行业SDK和应用解决方案。
  • mxIndex:对于大规模特征检索/聚类的应用场景需求,基于开源Faiss框架,提供极简易用、高性能API。
  • mxManufacture:提供制造业视觉质检相关API。
  • mxVision:提供智能视频分析相关API。
  • ModelArts(AI开发平台):华为云AI开发平台。
  • MindStudio(全流程开发工具链):AI全流程开发IDE。

推理方式

  • 离线推理:是基于原有AI框架模型转换OM模型,不依赖于AI框架执行推理的场景。
  • 在线推理:是将原有AI框架做推理的应用快速迁移至昇腾AI处理器上,依赖于AI框架执行推理的场景。

模型格式

OM

OM,全称Offline Model,华为Ascend AI处理器支持的离线模型,实现算子调度的优化,权值数据重排、压缩,内存使用优化等可以脱离设备完成的预处理功能。 TensorRT,NVIDIA 推出的高性能深度学习推理的SDK,包括深度推理优化器和runtime,提高深度学习模型在边缘设备上的推断速度。

ONNX

ONNX(即开放神经网络交换)是一种用于深度学习模型的开源标准,用来表示深度学习模型的开放格式。所谓开放就是 ONNX 定义了一组与环境、平台均无关的标准格式,来增强各种AI模型的可交互性。是由 Facebook 和 Microsoft 共同开发的,目的是让研究人员和工程师更容易在不同的深度学习框架和硬件平台之间迁移模型。

ONNX 的主要优点之一是它允许轻松地从一个框架(例如 PyTorch)导出模型,并导入到另一个框架(例如 TensorFlow)中。这对于想要尝试不同框架来训练和部署模型的研究人员,或者需要在不同硬件平台上部署模型的工程师特别有吸引力。

查看onnx模型信息

#导入并查看模型
import onnx
import onnxruntime
model_name="./trans/text_encoder/model.onnx"
onnx_model=onnx.load(model_name)
onnx.checker.check_model(onnx_model)
# 查看模型的输入和输出信息
print("Inputs:")
for input in onnx_model.graph.input:
print(input.name, input.type)

print("Outputs:")
for output in onnx_model.graph.output:
print(output.name, output.type)

# 查看模型的图结构
print("Graph structure:")
print(onnx_model.graph)

ort_session=onnxruntime.InferenceSession(model_name)
print("input_nodes_size=",len(ort_session.get_inputs()))
for input_node in ort_session.get_inputs():
print(input_node.name)

pytorch运行onnx

  1. 导入模型
  2. 数据导入并预处理为输入格式
  3. 模型运行并输出结果
  4. 解析输出结果

使用onnx_runtime运行模型

ort_session=onnxruntime.InferenceSession(model_dir)
input_name = ort_session.get_inputs()[0].name
# 获取模型的输入名称,这里假设模型只有一个输入
inputs = {input_name: input_data}
output = ort_session.run(None, inputs)

部署应用

AscendCL图片分类应用

ResNet50 是一种非常流行的深度神经网络模型,它是由微软研究院提出的。ResNet50 是 Residual Network(残差网络)的一个具体实现,采用了深度残差学习的思想。残差学习的核心概念是通过引入”残差块”(residual block),使得网络可以学习到相对于之前层的残差而不是直接学习目标映射。这种设计能够有效地解决深度神经网络训练过程中的梯度消失和梯度爆炸问题,使得可以训练非常深的网络。

ResNet50 具有50层深度,由多个残差块组成,其中包括卷积层、全局平均池化层和全连接层。该模型在 ImageNet 数据集上训练有素,可以用于图像分类和特征提取等任务。由于其卓越的性能和相对较小的模型尺寸,ResNet50 成为了许多计算机视觉任务的首选模型之一。

在实际应用中,ResNet50 被广泛用于图像识别、目标检测、图像细粒度分类等领域。它的设计理念和优秀性能使得它成为了深度学习领域中的经典模型之一。

目录结构
├── data // 用于存放测试图片
├── model // 用于存放模型文件
├── scripts // 用于存放运行样例的脚本
├── src // 用于存放源码

设置环境变量。

设置CANN依赖的基础环境变量
/usr/local/Ascend/ascend-toolkit/set_env.sh
#如果用户环境存在多个python3版本,则指定使用python3.7.5版本
export PATH=/usr/local/python3.7.5/bin:$PATH
#设置python3.7.5库文件路径
export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH
配置程序编译依赖的头文件与库文件路径
export DDK_PATH=/usr/local/Ascend/ascend-toolkit/latest 
export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub

安装opencv

查看opencv包的信息,未查询到有关信息

pkg-config opencv --libs

上传文件到服务器:

scp opencv-3.3.1.zip root@172.27.84.235:/home/
NSz6BE17

解压

cd /home
unzip opencv-3.3.1.zip

配置cmake

mkdir build
cd build
cmake ..

编译源文件(很久)安装

make
make install

配置环境(每次使用都要配置,除非写到环境管理文件中)
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig/

查看opencv包的信息
pkg-config opencv --libs

完整环境导入

/opt/ascend-toolkit/set_env.sh
export PATH=/usr/local/python3.7.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH
export DDK_PATH=/opt/ascend-toolkit/latest
export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig/

样例运行

获取onnx模型并转化为om模型。芯片类型是910B!!!

cd /home/samples/inference/modelInference/sampleResnetQuickStart/python/model 
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/resnet50/resnet50.onnx
atc --model=resnet50.onnx --framework=5 --output=resnet50 --input_shape="actual_input_1:1,3,224,224" --soc_version=Ascend910B

atc命令中各参数的解释如下,详细约束说明请参见《ATC模型转换指南》。

  • model:ResNet-50网络的模型文件的路径。
  • framework:原始框架类型。5表示ONNX。
  • output:resnet50.om模型文件的路径。请注意,记录保存该om模型文件的路径,后续开发应用时需要使用。
  • input_shape:模型输入数据的shape。
  • soc_version:昇腾AI处理器的版本。

获取样例的测试图片dog1_1024_683.jpg,放在data目录下。

cd /home/samples/inference/modelInference/sampleResnetQuickStart/python/data 
wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog1_1024_683.jpg

执行以下脚本运行样例:

cd /home/samples/inference/modelInference/sampleResnetQuickStart/python/scripts 
bash sample_run.sh

[INFO] The sample starts to run
out_dog1_1024_683.jpg
label:162 conf:0.902203 class:beagle
*****run finish******

成功运行

stable-diffusion-2-1

模型介绍

This is a model that can be used to generate and modify images based on text prompts. It is a Latent Diffusion Model that uses a fixed, pretrained text encoder (OpenCLIP-ViT/H).

服务器连不上hugging face,可以采用 https://aliendao.cn/ 这样的静态镜像网站下载。

ascend910B的出图速度非常的快,经过测试,在推理轮数50轮下,平均一轮的速度为0.5 s/it,在笔记本上的cpu上跑是大概50 s/it,显存占用大概为20GB。

stable-diffusion-xl-base-1.0

模型介绍

SDXL consists of an ensemble of experts pipeline for latent diffusion: In a first step, the base model is used to generate (noisy) latents, which are then further processed with a refinement model (available here: https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/) specialized for the final denoising steps.

模型使用

使用这个模型出现了很多问题,首先是下载的时候,出现了很多次断联,然后重复下载了很多次,模型导入的时候,也有不完整的报错。后来运行的时候,没有任何警告或者报错,但是输出的图片是彩色的乱码,搜索了很久相关信息,还是没找到解决方法。

猜测可能是由于以下原因之一:

  • 镜像网站上提供的vae模型版本不对
  • 镜像网站上下载的模型文件不完整
  • ascend对pytorch的适配出现问题

chatglm2-6b

模型介绍

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。

模型使用

部署完成后,测试发现,在atlas平台上输出的速度非常慢,平均几秒甚至几十秒一个token。有一个warning,说使用了代价很高的算子,可能是算子不太适配,在转化的过程中,转化过程比较低效。不过效果确实还不错。