1.CUDA学习:基础知识小结
2.CUDA编程OneFlow Softmax 算子源码解读之WarpSoftmax
3.极智开发 | 解读英伟达软件生态 一切的腐蚀腐蚀基础CUDA
4.conda安装的cudatoolkit,cudnn与在主机上安装的cuda,cud
5.GPU编程3:CUDA环境安装和IDE配置
6.Windows用Visual Studio 2022编译支持CUDA12的gromacs 2024.2教程
CUDA学习:基础知识小结
在CUDA学习中,理解编译流程是源码基础。首先,代码让我们深入探讨nvcc的腐蚀腐蚀编译过程。在将源代码SRC编译为PTX时,源码编译选项中的代码逍遥录源码XY代表虚拟架构的计算能力,它限制了代码可以利用的腐蚀腐蚀CUDA特性。接着,源码ZW在PTX到cubin的代码转换中表示真实架构的计算能力,确保执行文件能适配的腐蚀腐蚀GPU性能,必须注意ZW应大于等于XY。源码示例编译选项如下:
除了常规编译,代码JIT编译方式会在执行时动态编译PTX,腐蚀腐蚀这里也有一个JIT编译选项示例。源码简化编译选项如-arch=sm_XY,代码等同于指定虚拟架构。
CUDA编程中,SM、SP、grid、block、warp和thread等概念是关键。从软件角度看,它们之间有明确的关系。例如,grid和block的维度可以是三维的,而thread的索引通过维度转换来获取。这里有一张图展示了这些概念的关系。
kernel function是CUDA程序的核心,它的定义和使用有一些限制。要正确调用,需要指定grid_size和block_size,它们对应于block的数量和thread的数量。这里详细解释了kernel function的定义和调用方式。
CUDA函数的修饰词__host__、__device__、__global__决定函数的执行环境。CUDA程序通常分为数据准备、执行kernel、数据交换和错误处理等步骤,其中数据拷贝是一个关键环节,使用cudaMemcpy进行,它支持多种数据传输方向。
计时是性能评估的重要手段,CUDA通过事件来实现。Debug功能则涉及API错误检测和kernel function的异步执行错误检查。CUDA-MEMCHECK工具集是调试工具的重要组成部分,可以通过特定命令调用。
CUDA编程OneFlow Softmax 算子源码解读之WarpSoftmax
深度学习框架中的传奇源码什么语言Softmax操作在模型中扮演关键角色,尤其在多分类任务中,其用于将logits映射成概率分布,或在Transformer结构中衡量query与key的相似度。Softmax的CUDA实现直接关系到模型训练效率。本文以OneFlow框架中的一种优化Softmax实现为例,即Warp级别的Softmax,特别适用于矩阵宽度不超过的场景。
Softmax操作的计算公式如下:
[公式]
为解决数值溢出问题,通常先减去向量的最大值。优化后的公式为:
[公式]
Softmax计算涉及五个关键步骤:reduceMax、broadcastSub、exp、reduceSum、broadcastDiv。本篇文章将深入探讨OneFlow源码中的实现技巧。
OneFlow采用分段函数优化SoftmaxKernel,针对不同数量的列选择不同实现策略,以适应各种场景。为实现优化,OneFlow提供三种Softmax实现方式,以期在所有情况下达到较高的有效带宽。
对于WarpSoftmax分支,源码中函数调用关系清晰,实现细节分为四部分:数据Pack、调用链、DispatchSoftmaxWarpImpl、DispatchSoftmaxWarpImplCols、DispatchSoftmaxWarpImplPadding、LaunchSoftmaxWarpImpl。各部分分别专注于提升访问带宽、确定函数参数、实现核心计算逻辑。
在WarpSoftmax的核函数SoftmaxWarpImpl中,重点实现以下步骤:核函数启动参数确定、线程网格形状定义、数据加载到寄存器、计算最大值、计算指数和、规约操作、通信优化等。实现过程中,OneFlow通过优化数据访问模式、利用寄存器存储中间结果、并行规约操作,以及束内通信,提升了计算效率。
总结WarpSoftmax源码中的关键点,本文详细解读了其优化策略与实现细节,影视源码前端教程旨在提高模型训练速度。通过深入分析OneFlow框架中的Softmax实现,读者可以更全面地理解深度学习框架在CUDA环境下进行优化的策略。
极智开发 | 解读英伟达软件生态 一切的基础CUDA
欢迎关注我的公众号 [极智视界],获取我的更多经验分享
大家好,我是极智视界,本文来介绍一下 解读英伟达软件生态 一切的基础CUDA。
邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接: t.zsxq.com/0aiNxERDq
CUDA,全称为 Compute Unified Device Architecture,是英伟达于 年推出的一个平行计算平台和应用编程接口 API 模型。CUDA 之于英伟达的重要性主要体现在下面几个方面:
所以,解读英伟达软件生态,必须要从 CUDA 说起。虽然 CUDA 再往下还有如 PTX 的指令集加速层级,但是PTX 的普及程度其实并不高,甚至可能很多朋友都没听说过 PTX,其实也算正常,因为基本上的 N 卡开发者,根本没必要接触到 PTX,把 CUDA 学好就足够够的了。
把 CUDA 作为标杆,似乎是很多 AI 芯片厂商 "共同的做法",比较有代表性的是升腾的 Ascend C、寒武纪的 Bang C,但是其实这几个之间有相似但又有不相似的地方。相似的地方在于不管是升腾还是寒武纪都想提供一套类似 CUDA 的可以充分调用自己 NPU 硬件加速的对外接口,提高客制化的灵活性。不相似的地方一方面在于我们是在学人家,很多接口其实是为了贴近 CUDA 的接口而进行的高级封装,毕竟大部分开发者其实已经形成了 CUDA 的开发习惯,这个时候让大家切换起来更加顺手的做法就是 "模仿",而要做这种程度的 "模仿" 势必要协调好硬件架构和软件接口的映射;不相似的另外一方面体现在软件生态的层次清晰度,这个拿升腾来专门说,升腾 Ascend C 的发布时间在 年 5 月 6 日,而反观英伟达 CUDA 的发布时间是 年。什么意思呢,很明显可以看到英伟达的软件生态是以 CUDA 为基础然后层层往上叠的,而升腾是先有了 CANN,先有了 MindSpore 这些 "高层建筑",然后往下才有了 Ascend C,这种软件生态的层次结构就没有那么清晰,当然这种说法也只是基于时间上的,这并不影响它在空间上还是具备不错的软件生态层次结构。
再回到 CUDA 本身,需要清楚的一点是,CUDA 其实一开始主要是框架与源码分析面向优化计算密集型计算 (Compute-Bound),因为不管是最开始的通用科学计算还是后来的以 CNN 为主流的深度学习计算都是计算密集型,但是后来 Transformer 又逐渐流行,所以 CUDA 也是不断在 "与时俱进" 在做平衡、做兼顾,比如在 A 开始,CUDA 新增了从 L1 Cache 到 HBM Global Memory 数据直接异步拷贝的指令,其实也是在丰富自身对于访存密集型计算 (Memory-Bound) 的优化。
我之前写过挺多关于 CUDA 的分享,罗列一些,
CUDA 是一种硬件强相关的编程模型,要掌握好 CUDA,需要先看懂 GPU 硬件架构,从而映射到 CUDA 内存模型、线程模型上,这点跟 C 语言、跟 C++ 这类 "高级" 编程语言就很不一样,所以很多朋友会觉得 CUDA C 比较难写,特别是要写出高性能的 CUDA C,比较难。确实,这是事实,特别是对于写出高性能的 CUDA C,会涉及资源的高效调度,比如 Shared Memory、L1 Cache 等的调度;会涉及适应硬件架构超参的配置,比如 Thread、Block、Grid 等的配置。
总之,对于 CUDA 的深入学习,是一门 "稳挣不亏" 的 "买卖",原因不再过多赘述,主要体现在它的重要性上。
好了,以上分享了 解读英伟达软件生态 一切的基础CUDA,希望我的分享能对你的学习有一点帮助。
公众号传送
conda安装的cudatoolkit,cudnn与在主机上安装的cuda,cud
通过调用生成 tensorflow / pytorch 库时设置的链接库寻找目录,可以确定使用哪个 cuda 库。以 pytorch 为例,项目根目录下的 setup.py 文件指定链接库搜索目录,其中 CUDA_HOME 在 tool.setup_helpers.cuda 中获取,其过程大致如下(基于 pytorch 源码版本 '1.3.0')。具体细节可查阅 pytorch 源码。tensorflow 源码的处理逻辑可能相似。
使用 conda 安装的 cudatoolkit 包含的库文件位于 miniconda3/lib(或 miniconda3 / pkgs / cudatoolkit-.x.xxx /lib)中,可直接查看。原生安装的 cuda 包含 conda-cudatoolkit 包的所有内容,甚至更多。摇头灯控制源码尝试两种安装方法,通过肉眼比较,差异一目了然。如有疑问,可访问 nvidia 官网获取文档解答。
通过执行 ldd xx.so 命令,可以直接查看所依赖的库及其详细路径。
GPU编程3:CUDA环境安装和IDE配置
本文指导如何在个人机器上安装CUDA环境,结合集成开发环境Clion进行配置,以方便后续CUDA编程学习。
安装CUDA环境如下:
1. 针对显卡型号,从官方下载相应驱动。
示例显卡型号:小米pro寸,GF MX 。
参考链接:nvidia.cn/Download/index.aspx
2. 阻止或卸载nouveau驱动。
3. 通过控制台进入文本界面,安装NVIDIA驱动。
步骤示例:调整引导运行级别,以便开机进入文本界面。
网址参考:jingyan.baidu.com/article/0abcb0fbdf.html
4. 确认驱动安装。
5. 尽量与CUDA版本匹配安装NVIDIA驱动。
6. 进行CUDA测试。
CUDA代码编译与运行:
编译CUDA源码时,包含两个部分:CUDA设备函数与主机函数,它们分开独立编译。CUDA 5.0+支持文件间设备代码独立编译,而整体编译是默认模式。
编译三个文件(a.cu, b.cu, c.cpp),其中a.cu调用了b.cu中定义的设备代码,可以使用独立编译方式实现。
详细编译步骤:使用nvcc编译设备函数,普通C/C++编译器编译主机代码。
举例:`nvcc a.cu`编译设备文件。
实际工程中,为了优化编译效率,常采用`makefile`或`CMake`工具配置源码编译。
`nvcc`支持多种快捷开关,如`-arch=sm_`编译特定架构。
基于Clion的CUDA配置流程:
1. 遇到Clion创建CUDA可执行文件失败问题。
检查是否已安装NVCC。
验证机器安装GPU卡。
检查安装路径:执行`which nvcc`,若未找到,则进行安装。
确认安装位置:输入`nvcc`显示默认路径,通常为`/usr/bin/nvcc`。
2. 利用Clion新建CUDA项目,并设置CMake。
配置CMake代替`makefile`,简化编译过程。
输出及结果:提供示例链接供参考。
Windows用Visual Studio 编译支持CUDA的gromacs .2教程
为了在 Windows 上使用 Visual Studio 编译 Gromacs .2 版本支持 CUDA,您需要遵循以下步骤。
首先,安装 Visual Studio ,无论是企业版、专业版还是社区版均可,确保在安装时选择使用 C++ 的桌面开发组件。
其次,下载并安装 CUDA ,从官方 CUDA Toolkit Archive 获取。
接着,下载并安装 FFTW3.3.,从 fftw.org 下载相应的库。
打开命令提示符,解压 FFTW3.3. 的源码,并在目录中建立 build 文件夹。
进入 build 文件夹,然后在命令提示符中执行编译安装命令。
修改 CUDA 头文件中的 host_config.h,定位到大约第 行,将版本号从 改为 ,确保编译过程顺利。
下载 Gromacs .2 的编译源码,从提供的链接获取。
下载完成后,解压缩源码,进入 build 目录,执行 cmake 命令进行配置。
在 cmake 配置时,选择合适的 GMX_CUDA_TARGET_SM 参数,根据您的显卡选择 sm_, sm_, sm_, sm_, sm_, sm_, sm_, sm_, sm_, sm_, sm_ 中的一个,我以 sm_ 为例,即 -DGMX_CUDA_TARGET_SM=。
编译时可能会遇到错误,如 nvcc fatal 错误或 CMake 错误。解决这类问题需要耐心,确保按照配置正确地执行编译过程。
如果需要比较修改的代码,可以使用 Beyond_Compare 工具进行代码对比,下载地址为提供的链接。
[fastllm]cuda-kernels源码解析
在fastllm中,CUDA-kernels的使用是关键优化点之一,主要涉及以下几个高频率使用的kernel:gemv_int4、gemv_int8、gemm_int8、RMSNorm、softmax、RotatePosition2D、swiglu等。其中,gemm是计算密集型的,而其余大部分都是内存受限型。利用量化bit进行计算,比原始的torch转为浮点数更快,同时,没有进行融合操作,为后续优化留下了空间。
gemv_int4 kernel:主要用于实现float*int4的GEMV乘积,其中偏置值设定为最小值。在计算中,矩阵被划分为不同的tile,不同tile之间并行操作。在遍历m/2的过程中,找到对应int4值的位置,通过保存的mins找到最小值minv。同一组的两个int4值共享同一个minv,计算结果的最终和被保存在sdata[0]上,用于更新对应m列位置的output值。结果向量为n*1。
gemv_int8 kernel:在功能上与gemv_int4类似,但偏置值由保存的minv变为了zeros。
gemm_int8 kernel:此kernel负责计算n*m矩阵与m*k矩阵的乘积。计算过程涉及多个tile并行,block内部保存的是部分和。考虑到线程数量限制,通常会有优化空间。最终结果通过为单位进行更新。
layerNorm实现:此kernel实现layernorm计算,通过计算均值和方差来调整数据分布。计算中,sdata存储所有和,sdata2存储平方和。每个block内计算部分和后,规约得到全局的均值和方差,从而更新output。
RMS kernels解析:RMSNorm kernel实现RMS归一化,通过计算输入的平方和和均值,进而更新output。
softmax kernels解析:计算输入的softmax值,涉及最大值查找、指数计算和规约求和等步骤,以防止浮点数下溢。
RotatePosition2D Kernels解析:用于旋转位置编码,线程展开成三层循环。LlamaRotatePosition2D、NearlyRotatePosition和RotatePosition2D在旋转方式上有所区别,体现在不同的位置上进行计算。
AttentionMask Kernels解析:对输入按照mask掩码置值,普通mask直接置为maskv,而Alibimask则是置为相对位置的值之和。具体含义可能涉及空间上的概念,但文中未详细说明。
swiglu kernels解析:作为激活函数,这些kernel在原地操作中执行常见函数,线程足够使用,直接按照公式计算即可。
综上所述,fastllm中CUDA-kernels的使用旨在通过优化计算过程和内存操作,提升模型的计算效率,实现更高效的推理和训练。
ubantu下非root用户安装CUDA和cuDNN——以CUDA.6为例
在公司或学校的公共服务器上,面向不能使用sudo权限的用户,配置不同版本的深度学习环境成为了一个挑战。本文将详细阐述在Ubuntu环境下,非root用户如何安装CUDA和cuDNN,以CUDA.6为例。
1. 什么是CUDA?
CUDA是NVIDIA公司开发的一种并行计算平台和编程模型,它允许用户在GPU上运行计算密集型应用。了解CUDA的不同版本、支持的系统架构、驱动程序,阅读官网文档是理解CUDA的基础。
1.1 安装方式选择
在安装CUDA时,有多种方式可供选择,如通过pip、conda或直接从官网下载。pip安装的CUDA与从官网下载的版本在源代码、安装流程和环境兼容性上存在差异。conda安装的CUDA则在Anaconda虚拟环境中使用,提供更便捷的包管理。
2. 查看本机已安装的nvidia驱动版本及支持的CUDA最高版本
使用nvidia-smi命令查看本机nvidia驱动版本。推荐安装的CUDA版本通常与驱动版本兼容。通过python3或python命令,可以检查当前已安装的CUDA版本。
3. 下载CUDA和cuDNN原始文件
依据驱动版本号选择对应的CUDA版本,通过官网下载页面下载。同时,下载与CUDA版本匹配的cuDNN文件,并上传至服务器的指定文件夹。
4. 安装CUDA和cuDNN
4.1 安装CUDA
使用wget命令下载CUDA的.run文件,进入安装目录执行.sh脚本,按照提示完成CUDA的安装过程。自定义安装路径和选项以满足非root用户需求。
4.2 安装cuDNN
解压cuDNN文件后,通过复制命令将cuDNN的头文件和库文件移动至CUDA目录下,调整权限完成cuDNN的安装。
5. 测试与验证
通过nvcc -V命令验证cuDNN和CUDA安装成功,并确认版本与预期相符。
6. 后记
在Windows环境下,通过pytorch官网命令安装GPU版本的pytorch即可自动安装CUDA Toolkit,适合仅使用Python进行研究的用户。对于不希望在Ubuntu环境下过多折腾的用户,使用pip命令安装pytorch足以满足需求。
银河系CUDA编程指南(2.5)——NVCC与PTX
在构建了一个以cuDNN和cuBLAS为基础的简单深度学习框架后,我已将其开源,并鼓励大家参与交流学习。未来计划逐步完善框架,将尝试使用纯CUDA C实现,并与cuDNN进行性能比较。关于cuDNN的使用,我也会后续专门撰写文章进行详细介绍。
NVCC,CUDA的编译器,其核心是NVVM优化器,基于LLVM编译器结构。它本质上是一个集合,调用gcc、cicc、ptxas等工具编译CUDA源代码,区分主机代码(用ANSI C编写)和设备代码(CUDA扩展语言编写)。
NVCC的编译过程分为离线编译和即时编译,通过预处理将源代码分为两部分,分别由不同编译器处理,最终合并为单个object文件。例如,通过dryrun选项可以查看编译步骤,包括头文件配置、CUDA设备代码编译等。
PTX是CUDA的编程模型和指令集,是一种虚拟架构汇编,允许跨GPU优化。NVCC通过虚拟架构编译生成PTX,然后在实际GPU上执行为SASS。编译时,需设置虚拟和实际GPU架构以保证兼容性。
Separate Compilation允许在编译阶段将device code分开处理,形成relocatable代码,然后在链接阶段定位到最终的host object。这与Whole Program Compilation不同,后者直接编译为executable device code。
以cudnn-learning-framework的Makefile为例,需配置CUDA相关路径,添加cuDNN库,并调整编译生成部分,确保链接所有需要的.o文件。NVCC命令在编译时会执行链接任务。
[技术随笔]🛠🛠从源码安装Pytorch3D详细记录及学习资料
这篇文章详细介绍了如何从源码安装Pytorch3D,包括选择合适的镜像、配置工具和编译步骤。首先,选择Pytorch 1.9的devel镜像,包含CUDA和驱动,确保与Pytorch3D的版本要求相匹配,比如Python 3.7和CUDA .2。在镜像内,需要检查nvcc编译器、CUDA工具箱和驱动是否正常,同时安装基本工具如git、vim、sudo和curl。
配置CUB工具是关键步骤,根据Pytorch3D文档,需要在编译前设置CUB_HOME。即使Pytorch镜像自带CUDA,也建议手动设置`FORCE_CUDA`为1以确保兼容。接着,如果遇到conda依赖问题,作者选择从源码编译Pytorch3D,编译过程中的安装log和版本检查是必要的。
最后,通过测试用例,如从ARkit导出数据并渲染白模,验证GPU的使用。结果显示GPU正常工作,安装成功。对于更深入的Pytorch3D使用,作者还分享了一些参考资源,以便初学者入门。