GPU 进阶笔记(二):华为昇腾 910B GPU
大家读完觉得有意义记得关注和点赞!!!
- 1 术语
- 1.1 与 NVIDIA 术语对应关系
- 1.2 缩写
- 2 产品与机器
- 2.1 GPU 产品
- 2.2 训练机器
- 底座 CPU
- 功耗
- 操作系统
- 2.3 性能
- 3 实探:鲲鹏底座 8*910B GPU 主机
- 3.1 CPU
- 3.2 网卡和网络
- 3.3 GPU 信息
- 3.3.1 GPU 卡间互连:HCCS
- 3.3.2 GPU/Memory 使用率
- 3.4 Linux 设备
- 4 容器相关
- 参考资料
1 术语
1.1 与 NVIDIA 术语对应关系
大部分人目前还是对 NVIDIA GPU 更熟悉,所以先做一个大致对照,方便快速了解华为 GPU 产品和生态:
| NVIDIA | HUAWEI | 功能 |
|---|---|---|
| GPU | NPU/GPU | 通用并行处理器 |
| NVLINK | HCCS | GPU 卡间高速互连技术 |
| InfiniBand | HCCN | RDMA 产品/工具 |
nvidia-smi | npu-smi | GPU 命令行工具 |
| CUDA | CANN | GPU 编程库 |
| DCGM | DCMI | GPU 底层编程库/接口,例如采集监控信息 |
说明:华为很多地方混用术语 NPU 和 GPU,为简单起见,本文统称为 GPU。
1.2 缩写
- NPU: Neural-network Processing Unit
- HCCS: Huawei Cache Coherence System
- HCCN: Huawei Cache Coherence Network
- CANN: Huawei compute Architecture for Neural Networks
-
DCMI: DaVinci Card Management Interface参考下 NVIDIA 一张图,看下 DCGM/DCMI 在软件栈中的位置:

NVIDIA nswitch software stack
2 产品与机器
2.1 GPU 产品
- 训练:昇腾 910B,对标 NVIDIA
A100/A800,算力对比; - 推理:Atlas 300 系列,对标 NVIDIA T4;
2.2 训练机器
底座 CPU
根据 CPU 不同分为两种:
-
x86 底座
- 客户需要适配的工作量小一些;
-
arm 底座:鲲鹏系列
- 华为云上一般提供的是这种
- 功耗低,叠加液冷,可以实现比常规 NVIDIA 服务器更好的“性能/功耗”比;
功耗
16 卡昇腾 910B 训练机器,8U,功耗对比:
- X86: 12KW
- ARM: 4.5KW
操作系统
华为默认是自家的欧拉操作系统 EulerOS(基于 CentOS),
$ cat /etc/os-release
EulerOS release 2.0 (SP10)
NAME="EulerOS"
VERSION="2.0 (SP10)"
ID="euleros"
VERSION_ID="2.0"
PRETTY_NAME="EulerOS 2.0 (SP10)"
ANSI_COLOR="0;31"
2.3 性能
一些公开信息:
- 算力指标基本对齐
NVIDIA A800,卡间互联带宽还有差距; - 科大讯飞称和华为联合优化之后,在他们的场景中已经达到 A100 的性能;
910B 的官方公开信息比较少,但上一代 910 是发了 paper 的,想了解内部细节(例如 HCCS)的可参考 [2]。
3 实探:鲲鹏底座 8*910B GPU 主机
8 卡训练机器配置,来自华为云环境:
- 机型: physical.kat2ne.48xlarge.8.ei.pod101
- CPU:
Kunpeng 920(4*48Core@2.6GHz),ARM 架构,192核 - 内存:
24*64GBDDR4 - 网卡:
2*100G + 8*200G - 浸没式液冷
3.1 CPU
$ cat /proc/cpuinfo
...
processor : 191
BogoMIPS : 200.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma dcpop asimddp asimdfhm ssbs
CPU implementer : 0x48 # <-- ARM_CPU_IMP_HISI
CPU architecture: 8
CPU variant : 0x1
CPU part : 0xd01
CPU revision : 0
CPU implementer 是 CPU 厂商, ARM 架构的完整列表见内核源码 arch/arm64/include/asm/cputype.h, 其中 0x48 对应的是华为海思。
3.2 网卡和网络
网卡:
$ ip addr # 输出有精简
2: enp67s0f5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000inet 192.168.0.128/24 brd 192.168.0.255 scope global dynamic noprefixroute enp67s0f5
3: enp189s0f0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
4: enp189s0f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
5: enp189s0f2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
6: enp189s0f3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
看到只有网卡 2 上配置了 IP 地址。3~6 是 RDMA 网卡,需要用华为的 RDMA 命令行工具 hccn_tool 来查看和修改配置:
$ hccn_tool -i 3 -status -g # 相当于 ethtool <eth NIC>
Netdev status:Settings for eth3:Supported ports: [ Backplane ]Supported link modes: 1000baseKX/Full...100000baseKR4/FullSupported pause frame use: SymmetricSupports auto-negotiation: NoSupported FEC modes: None RSAdvertised link modes: Not reportedSpeed: 200000Mb/s # <-- 200Gbps 网卡...
查看一些硬件统计:
$ hccn_tool -i 3 -hw_stats -g
[devid 3] pd_alloc: 1
[devid 3] pd_dealloc: 0
[devid 3] mr_alloc: 0
[devid 3] mr_dealloc: 0
[devid 3] cq_alloc: 1
[devid 3] cq_dealloc: 0
[devid 3] qp_alloc: 1
[devid 3] qp_dealloc: 0
[devid 3] pd_active: 1
[devid 3] mr_active: 0
[devid 3] cq_active: 1
[devid 3] qp_active: 1
[devid 3] aeqe: 0
[devid 3] ceqe: 0
查看 LLDP 信息(直连的交换机):
$ hccn_tool -i 3 -lldp -g # 类似以太网中的 lldpctl/lldpcli
Chassis ID TLVMAC: ...
Port ID TLVIfname: 400GE1/1/20:2
System Description TLVVersatile Routing Platform Software
VRP (R) software, Version 8.211 (DX511 V200R021C10SPC600)Huarong DX511System Capabilities TLVEnabled capabilities: Bridge, Router
Management Address TLVIPv4: 26.xx.xx.xx
...
Maximum Frame Size TLV9216
End of LLDPDU TLV
查看网卡的 IP 地址和路由:
$ hccn_tool -i 3 -ip -g
ipaddr:29.1.112.213
netmask:255.255.0.0$ hccn_tool -i 3 -route -g
Routing table:
Destination Gateway Genmask Flags Metric Ref Use Iface
default 29.1.0.1 0.0.0.0 UG 0 0 0 eth3
29.1.0.0 * 255.255.0.0 U 0 0 0 eth3
127.0.0.1 * 255.255.255.255 UH 0 0 0 lo
192.168.1.0 * 255.255.255.0 U 0 0 0 end3v0
192.168.2.0 * 255.255.255.0 U 0 0 0 end3v0
RDMA 网卡的启动配置其实在配置文件,
$ cat /etc/hccn.conf # RDMA 网卡 0-7 的配置
address_0=29.1.137.205
netmask_0=255.255.0.0
netdetect_0=29.1.0.1
gateway_0=29.1.0.1
send_arp_status_0=1
...
address_7=29.1.170.143
netmask_7=255.255.0.0
netdetect_7=29.1.0.1
gateway_7=29.1.0.1
send_arp_status_7=1
RDMA ping:
$ hccn_tool -i 3 -ping -g address 29.1.137.205
device 3 PING 29.1.137.205
recv seq=0,time=1.418000ms
recv seq=1,time=0.034000ms
recv seq=2,time=0.040000ms
3 packets transmitted, 3 received, 0.00% packet loss
3.3 GPU 信息
$ npu-smi info
+------------------------------------------------------------------------------------------------+
| npu-smi 23.0.rc2 Version: 23.0.rc2 |
+---------------------------+---------------+----------------------------------------------------+
| NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page)|
| Chip | Bus-Id | AICore(%) Memory-Usage(MB) HBM-Usage(MB) |
+===========================+===============+====================================================+
| 0 910B1 | OK | 88.4 46 0 / 0 |
| 0 | 0000:C1:00.0 | 0 0 / 0 4175 / 65536 |
+===========================+===============+====================================================+
| 1 910B1 | OK | 92.1 47 0 / 0 |
| 0 | 0000:01:00.0 | 0 0 / 0 4175 / 65536 |
+===========================+===============+====================================================+
...
+===========================+===============+====================================================+
| 7 910B1 | OK | 92.7 48 0 / 0 |
| 0 | 0000:42:00.0 | 0 0 / 0 4174 / 65536 |
+===========================+===============+====================================================+
- GPU 型号 910B1
- 64GB HBM 显存
$ npu-smi info -h
Usage: npu-smi info <watch|proc|-h|-m|-l|-t type> [Options...]Commands:watch Show all device's status in scrolling formatproc Show device's matrix process status in scrolling format-h, --help Show this help text and exit-m Show all device's mapping information-l Show all device's topology information-t type Show information for typetype: board, flash, memory, usages, sensors, temp, power, volt, mac-addr,common, health, product, ecc, ip, sys-time, i2c_check, work-mode,ecc-enable, p2p-enable, ssh-enable, license, customized-info,device-share, nve-level, aicpu-config, pcie-err, mcu-monitor,err-count, boot-area, vnpu-mode, info-vnpu, vnpu-svm, cpu-num-cfg,first-power-on-date, proc-mem, phyid-remap, vnpu-cfg-recover, key-manage,template-info, pkcs-enable, p2p-mem-cfg, pwm-mode, pwm-duty-ratio,boot-select, topo.Options:-i %d Card ID-c %d Chip ID-p %d Chip Physical ID
3.3.1 GPU 卡间互连:HCCS
角色类似于 NVIDIA NVLink。
$ npu-smi info -t topo
NPU0 NPU1 NPU2 NPU3 NPU4 NPU5 NPU6 NPU7 CPU Affinity
NPU0 X HCCS HCCS HCCS HCCS HCCS HCCS HCCS 144-167
NPU1 HCCS X HCCS HCCS HCCS HCCS HCCS HCCS 0-23
NPU2 HCCS HCCS X HCCS HCCS HCCS HCCS HCCS 144-167
NPU3 HCCS HCCS HCCS X HCCS HCCS HCCS HCCS 0-23
NPU4 HCCS HCCS HCCS HCCS X HCCS HCCS HCCS 96-119
NPU5 HCCS HCCS HCCS HCCS HCCS X HCCS HCCS 48-71
NPU6 HCCS HCCS HCCS HCCS HCCS HCCS X HCCS 96-119
NPU7 HCCS HCCS HCCS HCCS HCCS HCCS HCCS X 48-71Legend:X = SelfSYS = Path traversing PCIe and NUMA nodes. Nodes are connected through SMP, such as QPI, UPI.PHB = Path traversing PCIe and the PCIe host bridge of a CPU.PIX = Path traversing a single PCIe switchPXB = Path traversing multipul PCIe switchesHCCS = Connection traversing HCCS.
很多资料都说 910B 的卡间互连带宽是 392GB/s,看起来跟 A800 的 400GB/s 差不多了, 但其实还是有区别的,主要是互连拓扑不同导致的,详见 [1]。

3.3.2 GPU/Memory 使用率
第一个 chip 的利用率:
$ npu-smi info -t usages -i 0NPU ID : 0Chip Count : 1DDR Capacity(MB) : 0DDR Usage Rate(%) : 0DDR Hugepages Total(page) : 0DDR Hugepages Usage Rate(%) : 0HBM Capacity(MB) : 65536HBM Usage Rate(%) : 4Aicore Usage Rate(%) : 0Aivector Usage Rate(%) : 0Aicpu Usage Rate(%) : 0Ctrlcpu Usage Rate(%) : 0DDR Bandwidth Usage Rate(%) : 0HBM Bandwidth Usage Rate(%) : 0Chip ID : 0
第二个 chip 的常规利用率信息:
$ npu-smi info -t common -i 1NPU ID : 1Chip Count : 1Chip ID : 0Memory Usage Rate(%) : 0HBM Usage Rate(%) : 4Aicore Usage Rate(%) : 0Aicore Freq(MHZ) : 1800Aicore curFreq(MHZ) : 800Aicore Count : 24Temperature(C) : 46NPU Real-time Power(W) : 93.4Chip Name : mcuTemperature(C) : 38
3.4 Linux 设备
8 张 910B GPU 及一个管理设备:
$ ls /dev/davinci*
/dev/davinci0 /dev/davinci1 /dev/davinci2 /dev/davinci3 /dev/davinci4 /dev/davinci5 /dev/davinci6 /dev/davinci7 /dev/davinci_manager
davinci 是华为 GPU/NPU 的架构名,更多信息见下一篇 GPU 进阶笔记(三):华为 NPU (GPU) 演进(2024)。 还有两个设备比较重要:
$ ll /dev/hisi_hdc # HDC-related management device
crw-rw---- 1 HwHiAiUser HwHiAiUser 237, 0 /dev/hisi_hdc$ ll /dev/devmm_svm # Memory-related management device
crw-rw---- 1 HwHiAiUser HwHiAiUser 238, 0 /dev/devmm_svm
4 容器相关
docker 配置:
$ cat /etc/docker/daemon.json
{"runtimes": {"ascend": {"path": "/usr/local/Ascend/Ascend-Docker-Runtime/ascend-docker-runtime","runtimeArgs": []}},"default-shm-size": "8G","default-runtime": "ascend"
}
然后 docker run 可以直接启动容器,挂载必要的设备、驱动等等:
$ sudo docker run -itd --cap-add=SYS_PTRACE --net=host --shm-size="32g" \--device=/dev/davinci0 --device=/dev/davinci1 --device=/dev/davinci2 \--device=/dev/davinci3 --device=/dev/davinci4 --device=/dev/davinci5 \--device=/dev/davinci6 --device=/dev/davinci7 \--device=/dev/davinci_manager \--device=/dev/devmm_svm \--device=/dev/hisi_hdc \-v /usr/local/dcmi:/usr/local/dcmi \-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \--name <name> <image> /bin/bash
$ ls /usr/local/dcmi/
dcmi_interface_api.h libdcmi.so
用 k8s 部署 pod 目前问题会比较多。
参考资料
- GPU Performance (Data Sheets) Quick Reference (2023)
- Ascend: a Scalable and Unified Architecture for Ubiquitous Deep Neural Network Computing, HPCA, 2021
- Introduction to the npu-smi Command, huawei.com, 2023
- Host Directories Mounted to a Container, huawei.com, 2024
相关文章:
GPU 进阶笔记(二):华为昇腾 910B GPU
大家读完觉得有意义记得关注和点赞!!! 1 术语 1.1 与 NVIDIA 术语对应关系1.2 缩写2 产品与机器 2.1 GPU 产品2.2 训练机器 底座 CPU功耗操作系统2.3 性能3 实探:鲲鹏底座 8*910B GPU 主机 3.1 CPU3.2 网卡和网络3.3 GPU 信息 3.3…...
Spring AOP:this 调用当前类方法无法被拦截
问题复现 假设我们正在开发一个宿舍管理系统,这个模块包含一个负责电费充值的类 ElectricService,它含有一个充电方法 charge(): Service public class ElectricService {public void charge() throws Exception {System.out.println("E…...
K8S-LLM:用自然语言轻松操作 Kubernetes
在 Kubernetes (K8s) 的日常管理中,复杂的命令行操作常常让开发者感到头疼。无论是部署应用、管理资源还是调试问题,都需要记住大量的命令和参数。Kubernetes 作为容器编排的行业标准,其强大的功能伴随着陡峭的学习曲线和复杂的命令行操作。这…...
lua和C API库一些记录
相关头文件解释 lua.h:声明lua提供的基础函数,所有内容都有个前缀lua_; luaxlib.h:声明辅助库提供的函数,所有内容都有个前缀luaL_; lualib.h:声明了打开标准库的函数; 辅助库对…...
SpringSecurity中的过滤器链与自定义过滤器
关于 Spring Security 框架中的过滤器的使用方法,系列文章: 《SpringSecurity中的过滤器链与自定义过滤器》 《SpringSecurity使用过滤器实现图形验证码》 1、Spring Security 中的过滤器链 Spring Security 中的过滤器链(Filter Chain)是一个核心的概念,它定义了一系列过…...
Slate文档编辑器-Decorator装饰器渲染调度
Slate文档编辑器-Decorator装饰器渲染调度 在之前我们聊到了基于文档编辑器的数据结构设计,聊了聊基于slate实现的文档编辑器类型系统,那么当前我们来研究一下slate编辑器中的装饰器实现。装饰器在slate中是非常重要的实现,可以为我们方便地…...
本地Docker部署Flowise并实现远程构建LLM应用程序原型高效开发
文章目录 前言1. Docker安装Flowise2. Ubuntu安装Cpolar3. 配置Flowise公网地址4. 远程访问Flowise5. 固定Cpolar公网地址6. 固定地址访问 前言 相信很多对AI感兴趣的小伙伴都会觉得正在逐渐流行的工作流自动化和AI集成特别酷炫,没错,这些技术像“秘密武…...
多点通信、流式域套接字
一、广播 1.1广播的发送端模型: #include<myhead.h>#define BEN_IP "192.168.191.129" #define BEN_PORT 8888#define PORT 6666int main(int argc, const char *argv[]) {int oldfd socket(AF_INET,SOCK_DGRAM,0);if(oldfd -1){perror("soc…...
vue3使用video-player实现视频播放(可拖动视频窗口、调整大小)
1.安装video-player npm install video.js videojs-player/vue --save在main.js中配置全局引入 // 导入视频播放组件 import VueVideoPlayer from videojs-player/vue import video.js/dist/video-js.cssconst app createApp(App) // 视频播放组件 app.use(VueVideoPlayer)2…...
模块化和面向接口的设计:深入理解和应用
模块化和面向接口的设计:深入理解和应用 在面向对象编程中,模块化 和 面向接口设计 是两种非常重要的编程理念。它们能帮助开发人员构建更加清晰、可维护和易于扩展的系统。接下来,我们将详细解释这两种设计思想,并结合 Python 中…...
《SwiftUI 实现点击按钮播放 MP3 音频》
功能介绍 点击按钮时,应用会播放名为 yinpin.mp3 的音频文件。使用 AVAudioPlayer 来加载和播放音频。 关键点: 按钮触发:点击按钮会调用 playAudio() 播放音频。音频加载:通过 Bundle.main.url(forResource:) 加载音频文件。播…...
微机接口课设——基于Proteus和8086的打地鼠设计(8255、8253、8259)Proteus中Unknown 1-byte opcode / Unknown 2-byte opcode错误
原理图设计 汇编代码 ; I/O 端口地址定义 IOY0 EQU 0600H IOY1 EQU 0640H IOY2 EQU 0680HMY8255_A EQU IOY000H*2 ; 8255 A 口端口地址 MY8255_B EQU IOY001H*2 ; 8255 B 口端口地址 MY8255_C EQU IOY002H*2 ; 8255 C 口端口地址 MY8255_MODE EQU IOY003H*2 ; …...
MySQL如何执行.sql 文件:详细教学指南
在使用MySQL数据库过程中,我们经常需要执行包含SQL语句的.sql文件。这些文件通常用于数据库的备份和恢复或批量执行SQL脚本。本文将详细介绍如何在不同环境下执行MySQL的.sql文件。 前置准备 在开始之前,请确保以下条件已经满足: 已经安装…...
非周期性脑活动的动态重构支持癫痫患者的认知功能:一种神经指纹识别方法
摘要 颞叶癫痫(TLE)的特征是大脑活动模式发生大规模的变化,并且这种变化与患者的认知功能受损密切相关。本研究旨在使用神经指纹方法分析大脑活动的动态重构,以描绘TLE患者的个体特征及其认知功能相关性。本研究收集了68名TLE患者和34名对照组的10min静息…...
ZYNQ初识6(zynq_7010)clock时钟IP核
基于板子的PL端无时钟晶振,需要从PS端借用clock1(50M)晶振 接下去是自定义clock的IP核封装,为后续的simulation可以正常仿真波形,需要注意顶层文件的设置,需要将自定义的IP核对应的.v文件设置为顶层文件&a…...
使用MFC编写一个paddleclas预测软件
目录 写作目的 环境准备 下载编译环境 解压预编译库 准备训练文件 模型文件 图像文件 路径整理 准备预测代码 创建预测应用 新建mfc应用 拷贝文档 配置环境 界面布局 添加回cpp文件 修改函数 报错1解决 报错2未解决 修改infer代码 修改MFCPaddleClasDlg.cp…...
SAP SD BP名称和销售订单描述的对应不起来的问题
问题 VBPA-ADRNR地址 和 KNA1-ADRNR 指向同一个号码 销售订单读取这个地址 改正后恢复正常 原因:推测 应该是创建Y0 电商客户的时候,引起锁和混乱导致的。 具体实际时什么样,不太清楚 写于20241230 浙江台州...
FlastOcc-网络复现-1.环境配置及问题
研究OCC网络 1.RuntimeError: Ninja is required to load C extensions RuntimeError: Ninja is required to load C extensions #32 Ninja is required to load C extensions File “/FlashOCC/projects/mmdet3d_plugin/core/evaluation/ray_metrics.py”, line 12, in dvr …...
Go语言中值接收者和指针接收者的区别?
在 Go 语言中,值接收者和指针接收者是方法定义中的两种接收者类型。它们的主要区别在于方法调用时的行为、接收者是否可以被修改,以及性能上的差异。 值接收者 定义 值接收者的方法接收的是调用对象的一个副本,方法内部对该副本的修改不会影…...
kafka小实站
需要先在前面的文章里面照着下载好kafka,并且启动 先启动zookeeper 项目目录 package kafka; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.springframework.kafka.annotation.KafkaListener; import…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
网页端 js 读取发票里的二维码信息(图片和PDF格式)
起因 为了实现在报销流程中,发票不能重用的限制,发票上传后,希望能读出发票号,并记录发票号已用,下次不再可用于报销。 基于上面的需求,研究了OCR 的方式和读PDF的方式,实际是可行的ÿ…...
AWS vs 阿里云:功能、服务与性能对比指南
在云计算领域,Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商,各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5],我将从功能、服务和性能三个方面进行结构化对比分析&#…...
