论文阅读:PIM-Comm

一篇非常深入UPMEM PIM底层实现的文章,值得深读。

问题

目前UPMEM PIM的PIM间沟通性能低,通用且高性能的Collective Communication Framework缺失。

性能低的原因有三点:

  1. 纠缠组的存在导致难以有效利用带宽
  2. 通信过程需要CPU的参与
  3. 通信流程为MRAM-VEC_REGISTER-CPU_MEMORY-VEC_REGISTER-MRAM

背景

纠缠组 Entangled Groups

alt text
要充分利用64位的访问总线,需要同时访问一个纠缠组中的8个bank,这八个bank分别位于同一个rank的8个chip中。

域转换 Domain Transfer

CPU对PIM读写数据,是通过AVX-512指令集(基于SIMD思想的x86高级向量扩展指令集)进行的。该指令集搭配的是512位向量寄存器(通常有32个),一个CPU核心可以在一个周期内,实现一条指令对单个512位寄存器中的多个数据执行相同操作(如读、写、与另一512位寄存器的多个数据进行并行算术运算等)。

CPU和PIM对数据的布局要求不同,原来的UPMEM PIM设计默认会在读写数据时,在到达向量寄存器时进行一次“矩阵转置”,称之为域转换。

通信原语

alt text

设计

  1. 设计超立方体抽象通信拓扑,支持多实例的集体通信。通过合理地生成多立方体和实际PIM单元的映射,最大程度地符合内存并行传输特性(包括bank-level、chanell-level等)。
    alt text
    多实例通信在超立方体架构中,可以并行地沿着边进行,且相比于树拓扑和环拓扑,有着更好的对称性,从而结点间通信更加灵活。

  2. 通过在PIM端增加运算,并减少无意义的域转换(当CPU不需要进行算术运算,只是作为单纯的传输中介时,域转换没必要),减少CPU的参与

  3. 通过谨慎地排布数据,使得操作尽可能在向量寄存器中即可完成,而无需放到CPU内存中。

比较对象

实验结果

启发

疑问

AI领域基本概念区分

人工智能 (AI)

人工智能是一个广泛的领域,旨在开发能够像人类一样执行任务的系统。实现人工智能的方法包括专家系统、搜索与优化算法、机器学习

机器学习

一些入门的文章:https://blog.csdn.net/qq_40181592/category_9106302.html。

在深度学习出来之前的机器学习方法,可以称之为传统机器学习,包括线性回归、FM、SVM支持向量机、决策树等。

FM (Factorization Machines 因子分解机)

论文:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=5694074&tag=1
blog:https://mp.weixin.qq.com/s?__biz=Mzg5NTYyMDgyNg==&mid=2247489278&idx=1&sn=f3652394955d719bf02a91ca3b179ed2&source=41#wechat_redirect

首先,说一下什么是Matrix Factorization(矩阵因子分解)?给定一个二维N*M的矩阵R,求一个N*K的矩阵W和一个K*M的矩阵V,使得WV尽可能等于R,误差定义为所有元素的误差之和(显然较大的K,训练出来的误差会更小),一般K会设置得比M和N小,从而将一个

深度学习

深度学习是机器学习的一个子领域,主要基于多层神经网络,利用大规模数据强大的计算能力自动学习特征并完成任务。深度学习模型一般统称为DNN模型,具体包括MLP、RNN、GNN、Transformer等。

  1. 多层神经网络:
    https://blog.csdn.net/illikang/article/details/82019945
    神经网络(NN),分为输入层、隐藏层(可选)、输出层。多层神经网络意味着隐藏层有多层。下一层的每个结点结果,由上一层的某些(也可能是全部)的结点,以及训练出来的参数(可以看作是这些边的“权重”)共同计算得到,就像神经元里的信息传递过程一样。简单的神经网络,如单层神经网络(也叫Perceptron 感知器),没有隐藏层,就算不上深度学习。
    alt text
  2. 大规模数据:层与层之间的转换,都需要大量的参数,这些参数提高了模型的表达能力,但同时也要求大量可供训练的数据,所以数据集小的也不适合深度学习。
  3. 强大的计算能力:相比于传统的机器学习,多层神经网络要训练大量参数,要求的计算资源非常多,所以神经网络的第二第三次兴起都源于计算能力的提升(CPU->二层神经网络,GPU->多层神经网络->深度学习)。
  4. 自动学习特征:这正是深度学习与传统机器学习的不同之处https://zhuanlan.zhihu.com/p/69776750 。传统机器学习通常依赖专家来做特征工程,在建立某个模型前需要对应用领域有较深的理解,人工提炼出影响结果的特征,并用于模型中。而深度学习只需你提供一些最基本的向量化的输入(其中包含着一些最简单的特征,对应输入层的多个结点),然后在层层神经网络的推进中,特征之间不断交互,形成更高阶且非线性的特征。通过大量的训练,模型自动学习所有参数,自动考虑各种特征对于输出的“重要性”,从而形成输入和输出的复杂函数关系,颇有一种力大砖飞的美感。当然了,在这个过程中,相比于传统机器学习,自然也丧失了一些模型的可解释性。

MLP (多层感知器)

MLP应该可以算是最简单的深度学习模型了,包含一系列串联的子模块,每个子模块包括一个全连接层(FC)和一个激活函数:
alt text
全连接层,输出Y的所有元素是输入X的所有元素的加权和,可以统一用矩阵计算表示为Y=XW+b,W是权重矩阵,b是偏置向量,都是要训练的参数,每个全连接层各有各的W和b。激活函数一般就是一个非线性函数,对向量中的每个元素进行单独的非线性计算,得到一个新的向量。通过一些泰勒展开可以发现(不必深究),MLP可以捕获特征之间(输入的结点之间)的高阶和非线性交互,也就是说,可以自动学习到结果与某些高阶特征的关系,而不必人工放入某个高阶特征。

InfiniBand及RDMA入门学习记录

链接:https://cloud.tencent.com/developer/article/2314766

InfiniBand概念

InfiniBand(无限带宽)是一种高性能、低延迟、高带宽的网络架构,专为大规模并行计算(如高性能计算、超算、数据中心等)设计, 关注存储设备之间的连接。它提供了一套完整的硬件和协议标准,支持多个通信模型,包括点对点通信、广播和组播。

核心公司:Mellanox(迈络思),后被nvidia收购。

核心技术:RDMA(远程直接内存访问)。后面以太网也支持了该技术(InfiniBand仍有许多特点,例如直接在硬件上支持了零拷贝)

直接竞争者:Ethernet(以太网)。尤其是25Gbps以上的高速以太网。二者主要区别如下,InfiniBand消灭了中间商:
alt text

InfiniBand配套硬件(NVIDIA Quantum-2 部分硬件)

英伟达收购Mellanox之后,于2021年推出了自己的第七代NVIDIA InfiniBand架构——NVIDIA Quantum-2。该架构有一系列硬件。
下面命令可以查看当前服务器是否有对应设备以及实际型号(若该设备是pcie设备)

1
lspci | grep Mellanox

ConnectX系列 Adapter

属于一个pcie设备,是一个InifiniBand网络架构(当然也支持RDMA)的网卡,两个有该网卡的服务器可以互相执行RDMA。

BlueField InfiniBand DPU

属于一个pcie设备,集成了数据处理单元(不受cpu控制,可制定一些规则,处理掉某些数据包而不用再传给cpu,减轻cpu负担),可以看作一个smartnic。

OFED(OpenFabrics Enterprise Distribution)

一个专为高性能计算(HPC)、数据中心和存储网络设计的开源软件包。它的主要作用是为支持 InfiniBand 和 RDMA(远程直接内存访问)技术的硬件提供驱动程序、库和工具,使这些硬件能够高效运行。

这个库非常全面,所以当需要某个rdma相关的工具包时,不要急着下载,先看看这里面有没有包含。

主要功能如下:

驱动程序支持

OFED 提供了许多硬件厂商的网络设备的驱动程序(如 Mellanox、Intel 等),以正常使用对应的RDMA设备。

开发和运行 RDMA 应用程序

提供一套用户态的 RDMA API(如 libibverbs 和 librdmacm),使开发者可以编写基于 RDMA 的高效分布式应用。

性能测试与调优

提供了perftest工具包(包含 ib_read_bw、ib_write_bw、ib_send_bw等功能),用于测试和调试 InfiniBand 或 RDMA 网络的性能。
如,服务端输入ib_read_bw,客户端输入ib_read_bw 服务端地址,即可测试客户端向服务端读取数据的带宽。

perftest 5.7.0 前后版本不兼容。如果实在服务器与要测试的服务器的perftest版本兼容,也可以一台服务器测试性能,自己发自己收,因为rdma是全双工的,进出带宽不会互相影响。

设备管理支持

ibstat可用于查看当前InfiniBand设备状态。

InfiniBand 带宽

InfiniBand各个标准对应带宽
InfiniBand各个标准对应带宽,以上结果来自ChatGPT。可以看出,这个带宽大小基本都是高速以太网以上的标准了(> 25Gbps)。
以上带宽都表示InfiniBand最大带宽(可以理解为最大网络传输带宽),测rdma传输的带宽时,需要跑满InfiniBand的四个通道且每次传输的数据包够大且带宽瓶颈为InfiniBand带宽时,实际带宽才能比较接近该最大带宽值。

输入ibstat命令,可以看到当前服务器的InfiniBand适配网卡是什么标准。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CA 'mlx5_0'
CA type: MT4119
Number of ports: 1
Firmware version: 16.35.4030
Hardware version: 0
Node GUID: 0xb8cef6030097d6fe
System image GUID: 0xb8cef6030097d6fe
Port 1:
State: Active
Physical state: LinkUp
Rate: 100 # 100Gbps 对应EDR标准
Base lid: 12
LMC: 0
SM lid: 11
Capability mask: 0xa651e84a
Port GUID: 0xb8cef6030097d6fe
Link layer: InfiniBand # 当前是InfiniBand模式,有些也可能是以太网模式,说明此时当作以太网的网卡运行。

输入lspci | grep Mellanox找到对应InfiniBand适配网卡的设备号(如ad:00.0),再输入sudo lspci -vv -s 设备号,会有如下两个信息:

1
2
3
4
LnkCap: Port #0, Speed 8GT/s, Width x16, ASPM not supported
ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp+
LnkSta: Speed 8GT/s (ok), Width x8 (downgraded)
TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-

LnkCap 和 LnkSta 字段显示了当前设备支持和实际使用的 PCIe 速率和通道宽度。
此处可以查询各个pcie版本各个通道数对应的https://blog.csdn.net/weixin_42229404/article/details/84069859。

如上面所示,实际该网卡是8通道接入pcie,导致此时pcie通道的带宽是7.877GB/s,而该EDR标准网卡的InfiniBand带宽为100Gbps(约为12.5GB/s),则rdma带宽测试是,瓶颈就会在pcie上,如果改回16通道,带宽就会是InfiniBand。

Unikernel内核模式下支持Linux多应用的前期准备

题目链接:https://raw.githubusercontent.com/arceos-org/oscamp/refs/heads/main/tour_books/prepare_unikernel_for_linux_apps/README.md

代码实现仓库(包含实验五的复现方式):https://github.com/yumu20030130/arceos

通过这个实验,主要学习了ArceOS的Unikernel模式下如何加载用户程序并执行。之前是内核直接启动一个应用(该应用不可被加载,是和内核一起编译的),现在把这个应用变成一个loader程序,然后通过这个程序再去加载一个或多个外部的用户程序,且加载的是bin文件而非elf文件,直接省去了elf加载的细节,只需把整个文件都load到内存中,并设置正确的执行开始入口,即可开始运行。

这样是最基础且最简单的加载方式,通过这些实验,可以很好地理解,Unikernel下加载一个最简单应用需要做什么。

Read More

Unikernel模式尝试劫持ecall以支持Linux应用运行

前言

在前面的博客中,提到了ArceOS宏内核模式是如何在libc层和OS层之间实现对Linux应用运行的支持的。
而这些Linux应用,都是默认其运行于用户态,然后通过ecall陷入内核态,进行系统调用来访问内核功能。而Unikernel中,应用也运行于内核态,则其实只需要函数调用即可。
如果想要纠正这种偏差,一种可以预见的方法是,通过对编译出来的elf文件里的所有ecall指令进行重写,将其变成一个跳转指令,以逃避ecall带来的各种特权级变换,同时满足函数调用的需求。

Read More

ArceOS宏内核模式如何支持Linux应用的运行

Linux应用运行条件

Linux应用假定自己运行于Linux环境,它本身及依赖库及工具链都基于这一假定。需要明确的是,目前仅考虑riscv64架构。

此处说支持Linux应用,其实可以认为是,之前能够在Linux平台上运行的应用,现在能够不改变源码就在ArceOS操作系统内核之上正常运行。

Read More