NV黑客松小记
Weiquan Huang本次比赛主要考察项目设计,通过使用英伟达相关硬件来构建出自己的一个框架。我们DDST实验室小组计划通过NV的GPU/DPU/RDMA构建一个分布式的大模型训推框架。
由于只有两天时间,肯定不是从零开始,所以相当于基于FlexGen的开源代码进行改编;毕竟是设计类比赛,拿奖玄学,看吹逼能力和运气。由于赛前有两位硕博因故未能出席,因此只能由研究DOCA的博士生来带我们两个本科生。我之前从来没有接触过DOCA,所以相当于速通自学,但其实也不难,就是配环境比较恶心。
具体工作
我的任务是为write_tensor
和read_tensor
两个函数增加编码和解码过程,让他们在DPU处执行编码和解码,然后发送到RDMA,让RDMA远程传输这些张量的时候能够降低带宽的使用,从而缓解RDMA网络带宽逊于本地访存的性能瓶颈。
在gcc/g++编译器中,只有安装在默认搜索路径usr/include
这类路径对第三方库的引用能够使用#include <doca_error.h>
这种形式,其余的库函数是不行的;很遗憾,我要使用的函数并满足上述条件,因此采用比较挫的方法,就是把需要的文件拷贝到项目的某个文件夹中,然后一步步递归,直到不需要再额外拷贝(即剩下的均可以通过#include <xxx.h>
来引入为止。
通过阅读源码,我发现他给的例子中,事实上是通过
将文件写入到磁盘文件->发送到DPU进行压缩->DPU把压缩过的内容写入到DPU的磁盘里->发送回DRAM
这种方式来完成的。DPU是英伟达智能网卡的一种硬件架构,即智能网卡上具有Data Processing Unit,所以智能网卡也是一台“服务器”,你甚至可以通过ssh连接上他的shell。所以这里智能网卡其实是有计算能力的。
所以上面的方法显然不能满足我们的需求,总不能我们还需要把张量从内存写到磁盘然后再发送吧?所以我这里先做一个toy版本,让这些tensor能够正确地执行压缩和解压缩算法,当然由于数据传输是别的同学做的,因此我这里只能先让CPU去执行DPU的算法了,也就是我这部分是没有发送给DPU这一操作的。虽然这并没有什么意义,但是debug的时候也可以发现一些能够为下一步做铺垫的有效经验。
通过观察函数和调用例子,我发现他们都需要初始化compress_resources
file_compression_config
这两个结构体,指定他们为COMPRESS
还是DECOMPRESS
状态,这样会触发不同的函数调用;同样的,由于是在CPU上处理的压缩,压缩模式不能选择HardWare
只能选择SoftWare
,估计是因为HW
和DPU的特征有关,具体不清楚。
好不容易,花了一天半时间搞出一个能跑的版本~
Debug
这里的bug不仅仅是运行时候的bug,甚至包括一些编译不通过的情况。有个有意思的东西叫做pybind11
python要调用C++底层代码的时候有几种方法,其中一种就是通过pybind11
来进行绑定。
1 |
|
这里最简单的示例就是这样,example
是python代码用来import
的“库”,m
是在PYBIND11_MODULE
函数中让example
库中的python函数名和C++函数指针能够对应上的指代对象,用于创建函数绑定、类型或类函数绑定等。
根据B站up主的视频与github仓库,大致了解了pybind11是需要下载并且放在待开发项目的某个目录内以待包含并且一起编译的项目。然后可以在项目中对想要用C++实现的函数进行绑定,而在py代码中包含相关的库(py代码会从编译好的C++项目的.so
中引入)就可以调用使用pybind11使用的。
.so
为动态链接库,运行时链接,和调用者程序文件解耦,从而不需要在库更新后重新编译,符合Python解释性语言的特征.a
为静态链接库,编译时链接,运行速度较快
1 | add_subdirectory(extern/pybind11) |
然后可以在example.cpp
文件中对类函数等进行绑定,具体的语法可以等用到了之后再参考教程或者用例再看
反正这个就是搞了我半天,最后把函数绑定的参数写好之后就好了
后续
后续在第二天晚上,发现原先学长的python代码有bug,导致我的部分一直没跑出来,同时另一位本科生同学的RDMA通信也出了玄学bug,最后把影响我的那部分修好了之后就开始写PPT画图开始忽悠了。
答辩那个早上我去杭州继续实习了,当时学长说现场演示的时候ssh连不上实验室服务器了,最后拿了二等奖,再次证明草台班子理论。