参加CUDA线上训练营·综述

为什么学习CUDA

1.作为点云相关的算法工程师,我发现许多算法(如体素滤波)本身很简单,但由于需要处理的点云数量非常庞大,使用CPU进行计算会消耗大量的时间。与之相比,拥有成百上千个CUDA核心的GPU非常适合处理这种步骤简单但数据庞大的计算。

2.在我所从事的自动驾驶领域,算法通常需要在规定的时间内(一般为100毫秒)完成一轮计算。近年来,各大厂商增加了激光雷达线束数量,从早期的32线增加至128线甚至更高,数量也从一个主要雷达变成一主+多补盲,数据量的暴涨导致处理器的计算压力进一步增加。
此外,考虑到车控、地图、决策、定位、故障诊断、通信等模块的算力需求,一般情况下算法端很难调用多核CPU进行加速(可能影响其余模块的处理速度)。因此,为了应对计算压力,除了优化算法,我们还可以将部分计算量大但算法简单的步骤放置在GPU进行处理,比如数据的预处理阶段,通常需要对点云进行坐标变换、裁剪、降采样、栅格化等操作,此时进行GPU加速具有很重要的工程意义。

3.虽然GPU加速很重要,但是否意味着需要学习cuda呢?我个人认为这得看情况。首先学习cuda并没有想象中的简单,至少有以下几个难点:

  • 程序员通过cuda操作GPU进行计算,理所当然需要对GPU的硬件结构有所了解,这一点其实对很多新手不是很友好(尤其对我这样的非科班程序员)。我在开发cuda程序时遇到的第一个问题是一直搞不清楚grid,block,thread具体对应显卡的那个硬件,这个问题困扰我了不少时间。
  • debug比较困难:和调用CPU相比,因为cuda代码运行在显卡上,且一般一个核函数就调用几百个核心进行计算,因此在排查故障时比较麻烦,需要掌握一定的debug技巧。
  • 深入困难:我确实认为算法和开发的同学都应该对cuda加速有了解,但只是写个核函数那确实不难,想继续深入下去难度确实不小,需要有数据结构,动态并行,锁,内存占用,算法并行设计等方面的经验积累,甚至还需要学习NVIDIA Nsight Compute等英伟达推出的性能分析工具。作为初级程序员,以前写CPU代码时对这些部分考虑的很少,现在都得补上。

因此从工程角度看,如果有现成的包可以调用或者修改,还是推荐直接调包,毕竟想写出高性能的cuda代码并不是一件容易的事,写的不好甚至不如串行执行。但如果想学习硬件,想更多地了解计算机基础,还是推荐学习cuda,而线上训练营就是一个很好的选择。

对训练营的一些建议

我一直心水英伟达提供的徽章等奖励,但比较遗憾的是去年夏令营遇到出差,这次冬令营又出差,两次考试都以为需要加班而错过,很是无奈。不过因为视频还是全部看完了,加上今年基于cuda开发了一个比较重要的项目,多少算有点经验。因此基于我在实际开发过程中遇到的问题,想给训练营提一些建议:

1.增加工程化方面的内容。对于大部分学员来说,学习cuda的最终目的还是要用到实际的项目中,目前主流的开发还是基于c++,python,Java等语言,很少直接运行.cu文件,因此需要将cuda集成到前述项目中。在夏令营中老师讲的是Makefile,建议考虑加入cmake的讲解,大概介绍下如何在cmakelists中设置cuda的编译与运行。

2.训练营主要以c和c++为主,但印象里没有怎么涉及到c++的类与cuda函数的关系,这将直接对cuda加速模块的程序结构设计产生影响。

3.对于基础的cuda内容,训练营讲的挺好,但在算法的并行思想方面个人认为涉及的不够丰富。对于算法或开发人员而言,如何把一个问题并行化是更加困难的事。毕竟语言特性,硬件结构等可以从网络查找,算法并行化设计却需要大量工程经验,这是网上较少涉及的。

文章大纲

这将是答主新开的cuda系列文章,主要还是希望能够拿到英伟达的奖品(毕竟上次夏令营已经当着老师的面吹牛皮。。。),次要方面也是希望记录工程开发中遇到的一些问题,毕竟好记性真的不如烂笔头,现在不记下来两个月后很多细节就会非常模糊,同样的错误也还会再犯。

系列文章主要包括以下几个部分:

  • cuda硬件架构:这一部分会主要分析GPU的硬件结构,尤其是通过与CPU的硬件对比说明那些计算适合放在CPU端,那些计算适合放在GPU端。该部分极为重要,开发人员应当意识到:不是所有的大规模简单计算都适合cuda加速
  • cuda编译:一如前面给的建议中所说,大型项目中cuda必须集成到c++工程中,因此,学会用cmake编译.cu文件是很重要的一环。另外,在快速验证阶段推荐使用xmake,这是国人开发的一款编译器,确实非常方便,可以省掉繁琐的编译步骤。
  • 线程层次与存储单元:在该部分我想分享对于线程的理解,以及如何与gpu的硬件结构一一对应,这毫无疑问是cuda的基础,但一度让我非常困惑,当然搞明白以后会发现其实还是很简单的。存储单元同样是非常重要的一环,毕竟目前来说内存墙的影响是非常大的,且在使用方面还需要注意一些细节,爆内存的debug会非常麻烦。
  • 原子操作:这块其实和锁的操作有些像(虽然我了解的也不多),主要的问题在于如何使用锁,那些情况最好不要用锁,以及如何规避锁。
  • 流处理:对cuda有基础了解的都知道,很多时候数据传输的耗时远比计算耗时长,而默认情况下GPU在数据回传时只能保持等待状态。因此可以考虑开一个计算流和一个数据传输流,在数据传输时进行计算,以进一步并行化,这是流的一种常规应用。

因为工作比较忙(人也比较懒),随缘更新。本人技术水平有限,欢迎在评论区讨论和建议

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
使用服务器进行CUDA训练模型时,需要执行以下命令: 1. 首先,登录到服务器的终端界面。 2. 检查服务器是否已经安装了合适版本的CUDA。可以使用以下命令来查看CUDA的版本: ``` nvcc --version ``` 如果没有安装CUDA,需要先根据服务器的操作系统和CUDA版本进行安装。 3. 创建一个虚拟环境(可选)。使用虚拟环境可以避免与其他环境中的软件库冲突。为了创建一个虚拟环境,可以运行以下命令: ``` virtualenv venv source venv/bin/activate ``` 4. 确保在虚拟环境中安装了相关软件库,例如TensorFlow或PyTorch。可以使用以下命令来安装TensorFlow: ``` pip install tensorflow-gpu ``` 或者使用以下命令来安装PyTorch: ``` pip install torch torchvision ``` 5. 准备数据集和模型文件。确保服务器上有可以使用的训练数据集和模型文件。 6. 编写训练脚本。创建一个Python脚本,其中包含CUDA训练模型的代码。这个脚本应该加载数据集、定义模型、定义训练过程等。 7. 使用以下命令来运行训练脚本: ``` python train.py ``` 这将启动训练过程。训练脚本将使用CUDA来利用服务器上的GPU进行模型训练。 8. 等待训练过程完成。训练时间可能会因为数据集大小和模型复杂度而有所不同。 以上就是在服务器上使用CUDA训练模型的基本过程和相关命令。根据不同的具体环境和需求,可能会有一些额外的步骤或命令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值