使用 Nvidia DOCA 制作 DPA All-to-all Application
背景
首先来了解一些本示例中的概念:
- DPA:一个硬件组件,叫数据路径加速器。它的作用是帮助加速数据处理和传输的任务。
- MPI:消息传递接口,这是一个用于编写并行程序的编程模型和通信协议。它更多的被用在分布式内存和多处理器计算系统,比如一个集群,它还提供一系列标准化的 API,允许程序中不同的进程(比如运行在多核或多节点上)相互发送和接受消息。
- ranks:指代一个并行程序中的单个进程,这里可以将一个 rank 简单理解为进程的一个编号或者标识符。
那么我今天要做的 All-to-all 应用究竟是什么操作呢,上面提到一个 rank 代表一个并行程序中的单个进程,那么 All-to-all 通俗的讲指的就是在有多个 rank 时,每个进程都向其他进程发送消息,并且接收消息。结果是,每个进程都会收到来自其他进程的数据的一部分,这其实很想一个完全链接的网络,每个节点之间都是互联并交换信息的。这样的交互方式有很多用途,比如:
- 数据分发:在一个并行算法的初始化阶段,将数据从主进程分发到所有其他进程
- 全局操作:执行需要每个进程都与其他所有进程交换信息的全局操作,比如某些并行算法中的归约操作
- 通信模式:在并行算法执行时,进程间需要交换数据,来更新某些状态,All-to-all 就是一个实现这种通信模式的方法。
其实数据模型算法训练的朋友已经发现,这些特点都是在做模型训练时数据层提高效率所需要的。那么在我们这个例子中,我们用 DPA 来加速这一操作(All-to-all),其本质是把这些数据传输和交换任务从 CPU 卸载到了专门的硬件上,这样既提高了数据交换效率,又释放了 CPU 的资源,让它可以专注于计算。
实现步骤
环境配置信息
这里是我所使用的基础环境信息,可以做个参考。
依赖项
-
DOCA Libraries:特指 DOCA DPA 库,详情可以参考官方
-
NVIDIA BlueField-3:也就是我们指的专门处理数据的硬件处理器 DPU,DPA 作用之一就是将数据操作从 CPU 卸载到 DPU 上,来提高整体效率。
-
Open MPI version 4.1.5rc2 or greater:这一步也就是数据交换接口的安装一般会被包含在 DOCA 的安装中,关于 DOCA 的安装可以参考官方
编译
在安装好 DOCA 的环境中,访问 /opt/mellanox/doca/applications/dpa_all_to_all/
。applications
这个文件夹中都是 DOCA 应用的一些示例,我们可以编译所有,也可以编辑某一个。
我们使用 MPI 来编译这个应用程序,所以在此前需要确保 MPI 已经安装并且配置好了。虽然 openmpi 会在安装 DOCA 时一起安装,但默认情况下 mpich 这个命令是不会安装的,所以先检查一下:
dpkg -l |grep mpich
如果没有,则执行安装命令:
apt-get install mpich
如果需要自己安装 openmpi,则在安装时确保设置了正确的环境变量,比如:
export PATH=/usr/mpi/gcc/openmpi-4.1.7a1/bin:${PATH}
export LD_LIBRARY_PATH=/usr/mpi/gcc/openmpi-4.1.7a1/lib:${LD_LIBRARY_PATH}
接下来,执行编译 meson /tmp/build
、ninja -C /tmp/build
,这一步是在 /opt/mellanox/doca/applications
路径下执行的,如果需要单独编译本次的 All-to-all 应用,则执行:
cd /opt/mellanox/doca/applications/
meson /tmp/build -Denable_all_applications=false -Denable_dpa_all_to_all=true
ninja -C /tmp/build
这里也可以使用 meson 的配置文件来执行,打开 meson_options.txt
文件后简单的设置所编译一你用的 true 和 false 就可以了。
运行
当程序编译完成后,doca_dpa_all_to_all
这个命令就可以使用了,可以 -h
来查看参数。这里我们是这执行:
mpirun -np 8 /tmp/build/dpa_all_to_all/doca_dpa_all_to_all
np
标志指定了要运行的进程数,所以这个命令运行了一个默认消息大小的 8 进程的 DPA All-to-all 程序,来看看效果:
我们再运行一个 4 进程,并且指定了消息大小和运行设备的命令:
mpirun -np 4 /tmp/build/dpa_all_to_all/doca_dpa_all_to_all -m 32 -d "mlx5_0"
这里我们忘了说如何查看设备的标志:mst status -v
可以看到有两个设备,他们的 RDMA 分别为 mlx5_1 和 mlx5_0。
结果分析
运行上面的命令,我们得到过这样一个结果:
[16:23:36:223229][1193489][DOCA][INF][dpa_all_to_all_core.c:1749][dpa_a2a] Number of processes = 8, message size = 32, message count = 1, buffer size = 8
------------send buffs----------------------
Rank 0 |1589 1159 555 905 989 8763 8855 9859|
Rank 1 |8203 5248 6811 6012 6778 9127 8487 6929|
Rank 2 |2101 2655 5076 9623 4884 2039 8995 8954|
Rank 3 |3898 692 2689 3549 5362 522 2149 7787|
Rank 4 |7948 362 4121 5522 3795 1285 9123 1617|
Rank 5 |1546 8645 9079 8418 797 5490 993 8963|
Rank 6 |3354 5603 5533 7785 2907 450 2495 1767|
Rank 7 |1303 1672 5065 5279 958 2304 2753 1447|
------------recv buffs----------------------
Rank 0 |1589 8203 2101 3898 7948 1546 3354 1303|
Rank 1 |1159 5248 2655 692 362 8645 5603 1672|
Rank 2 |555 6811 5076 2689 4121 9079 5533 5065|
Rank 3 |905 6012 9623 3549 5522 8418 7785 5279|
Rank 4 |989 6778 4884 5362 3795 797 2907 958 |
Rank 5 |8763 9127 2039 522 1285 5490 450 2304|
Rank 6 |8855 8487 8995 2149 9123 993 2495 2753|
Rank 7 |9859 6929 8954 7787 1617 8963 1767 1447|
可以看到结果分为发送 buffs 和接收 buffs,在发送区我们看 Rank0 发送了 555 和 905 两组数据,在接受区中,分别被 Rank2 和 Rank3 接受到,其他的所有数据也都是类似的交换,这说明,这次 All-to-all 操作是成功的,且我们给予 DPA,将原本运行于 CPU 的数据通信动作卸载到了 DPU 上。
总结
遇到的问题
在此次实验中,虽然技术执行层面较为顺利,但在概念理解和应用设计阶段,我们遇到了以下具体问题:
- 概念理解障碍:DOCA和DPU作为相对较新的技术,其专业术语和抽象概念初期难以消化。例如,理解DPU如何与CPU、GPU协同工作,以及DOCA框架下的资源管理方式,需要大量的背景知识和实践经验。
- 技术选型困难:在构思DPU加速样例时,选择合适的应用场景和优化点是一个挑战。我们需要深入分析不同的数据处理任务,以确定哪些任务最适合由DPU来加速。
- 资源限制:在实验过程中,我们注意到DPU资源的配置和管理需要一定的专业知识。如何高效利用DPU资源,避免资源浪费,是我们需要解决的问题。
- 生态系统支持:虽然DOCA提供了丰富的工具和库,但在实际应用中,我们发现相关的文档和社区支持可能还不够完善,这在一定程度上增加了学习和应用的难度。
思考
通过这次实验,我对DOCA和DPU的能力有了更深刻的认识,在于:
- 技术融合的趋势:DOCA和DPU的出现体现了计算技术从传统的CPU中心向更加专业化的硬件加速转变的趋势。这种转变预示着未来数据处理将更加依赖于特定任务的硬件加速器。
- 性能与成本的平衡:虽然DPA加速带来了显著的性能提升,但我们注意到,这种提升往往伴随着较高的硬件成本。因此,未来技术的发展需要在不牺牲性能的前提下,寻找降低成本的方法。
- 软件生态的重要性:为了推广DPU的使用,需要建立一个更加完善的软件生态系统。这包括提供更多的开发工具、库、文档和社区支持,以降低开发者的入门门槛。
- 场景适应性:我们认识到,DPU和DPA技术并非适用于所有场景。未来,我们需要进一步研究如何根据不同的应用需求,选择合适的加速方案。
- 可扩展性和灵活性:随着数据处理需求的增长,DPU解决方案需要具备良好的可扩展性和灵活性。这意味着硬件和软件设计都需要考虑到未来的扩展性,以便能够适应不断变化的需求。
- 教育与培训:为了让更多的开发者和技术人员能够利用DPU和DOCA技术,有必要开展相关的教育和培训项目,提高行业内的技术认知和应用能力。