CUDA的基础知识

news2025/1/11 23:49:52

文章目录

  • 数据精度
  • CUDA概念
    • 线程&线程块&线程网络&计算核心
    • GPU规格参数
    • 内存
  • GPU并行方式
    • 数据并行
    • 流水并行
    • 张量并行
    • 混合专家系统

数据精度

  • FP32 是单精度浮点数,用8bit 表示指数,23bit 表示小数;
  • FP16 是半精度浮点数,用5bit 表示指数,10bit 表示小数;
  • BF16 是对FP32单精度浮点数截断数据,即用8bit 表示指数,7bit 表示小数
    在这里插入图片描述
  • 为什么聚焦半精度?
  1. 内存占用更少:fp16 模型占用的内存只需 fp32 模型的一半:
    • 模型训练时,可以用更大的batchsize;
    • 模型训练时,GPU并行时的通信量大幅减少,大幅减少等待时间,加快数据的流通;
  2. 计算更快:主流 GPU 都有针对 fp16 的计算进行优化,在这些 GPU 中,半精度的计算吞吐量可以是单精度的 2-8 倍;

CUDA概念

线程&线程块&线程网络&计算核心

  • CUDA中线程可以分成三个层次:线程、线程块和线程网络
    • 线程(Thread):CUDA 中基本执行单元,由硬件支持、开销很小,每个线程执行相同代码;
    • 线程块(Block):若干线程的分组,Block 内一个块至多512个线程、或1024个线程(根据不同的 GPU 规格),线程块可以是一维、二维或者三维的;
    • 线程网络(Grid):若干线程块 Block 的网格,Grid 是一维和二维的
  • GPU 有很多线程,在CUDA里被称为 Thread,同一组 Thread归为一个Block,而Block 又会被组织成一个Grid
    在这里插入图片描述
  • GPU 上有很多计算核心[ Streaming Multiprocessor (SM)], SM 是一块硬件,包含固定数量的运算单元,寄存器和缓存。
  • 在具体的硬件执行中,一个SM会同时执行一组线程,在CUDA 里叫warp,直接可以理解这组硬件线程warp会在这个 SM 上同时执行一部分指令,一组的数量一般为32或者64个线程
  • 一个 Block 会被绑定到一个SM上,这些线程组会被相应的调度器来进行调度,在逻辑层面上1024个线程同时执行,但实际上在硬件上是一组线程同时执行。假如一个SM同时能执行 64个线程,但一个Block 有1024个线程,那这 1024 个线程是分 1024 / 64 = 16 1024/64=16 1024/64=16次执行

  • GPU 在管理线程的时候是以block为单元调度到 SM 上执行。每个 block 中以warp(一般32个线程或64线程) 作为一次执行的单位(真正的同时执行)
  1. 一个GPU包含多个 SM ,而每个SM包含多个 Core,SM 支持并发执行多达几百的Thread 。
  2. 一个Block只能调度到一个 SM 上运行,直到Thread Block运行完毕。一个SM可以同时运行多个Block (因为有多个 Core)

GPU规格参数

不同的GPU规格参数不一样,执行参数不同,比如 Fermi 架构:

  • 每一个SM上最多同时执行 8 个 Block。(不管 Block 大小)
  • 每一个SM上最多同时执行 48 个 warp。
  • 每一个SM上最多同时执行 48 × 32 = 1536 48 \times 32=1536 48×32=1536 个线程。

内存

  • 一个 Block 会绑定在一个 SM 上,同时一个 Block内的Thread共享一块 ShareMemory(一般是SM的一级缓存,越靠近SM的内存就越快)。
  • GPU和CPU也一样有着多级 Cache 还有寄存器的架构,把全局内存的数据加载到共享内存上再去处理可以有效的加速。
    在这里插入图片描述

GPU并行方式

  • 数据并行(Data Parallelism):在不同的GPU上运行同一批数据的不同子集;
  • 流水并行(Pipeline Parallelism):在不同的GPU上运行模型的不同层;
  • 张量并行(Tensor Parallelism):将单个数学运算(如矩阵乘法)拆分到不同的GPU上运行;
  • 混合专家系统(Mixture-of-Experts):只用模型每一层中的一小部分来处理
    在这里插入图片描述

数据并行

  • 将整个模型放在一块GPU里,再复制到每一块GPU上,同时进行正向传播和反向误差传播,相当于加大batch_size。
  • 每个GPU都加载模型参数,这些GPU称为工作节点(workers),为每个GPU分配分配不同的数据子集同时进行处理,分别求解梯度,然后求解所有节点的平均梯度,每个节点各自进行反向传播

  • 各节点的同步更新策略
  1. 单独计算每个节点上的梯度
  2. 计算节点之间的平均梯度(阻塞,涉及大量数据传输,影响训练速度)
  3. 单独计算每个节点相同的新参数
  • Pytorch对于数据并行有很好的支持,数据并行也是最常用的GPU并行加速方法之一。

  • 将模型按层分割,不同的层被分发到不同的GPU上运行。每个GPU上只有部分参数,因此每个部分的模型消耗GPU的显存成比例减少,常用于GPU显存不够,无法将一整个模型放在GPU上
    请添加图片描述

流水并行

  • layer的输入和输出之间存在顺序依赖关系,因此在一个GPU等待其前一个GPU的输出作为其输入时,朴素的实现会导致出现大量空闲时间。这些空闲时间被称作“气泡”,而在这些等待的过程中,空闲的机器本可以继续进行计算。
    请添加图片描述

张量并行

  • 张量并行:如果在一个layer内“水平”拆分数据。许多现代模型(如Transformer)的计算瓶颈是将激活值与权重相乘

  • 矩阵乘法可以看作是若干对行和列的点积:可以在不同的 GPU 上计算独立的点积,也可以在不同的 GPU 上计算每个点积的一部分,然后相加得到结果。

  • 无论采用哪种策略,都可以将权重矩阵切分为大小均匀的“shards”,不同的GPU负责不同的部分,要得到完整矩阵的结果,需要进行通信将不同部分的结果进行整合

混合专家系统

  • 混合专家系统(MoE)是指,对于任意输入只用一小部分网络用于计算其输出在拥有多组权重的情况下,网络可以在推理时通过门控机制选择要使用的一组权重,这可以在不增加计算成本的情况下获得更多参数。
  • 每组权重都被称为“专家(experts)”,理想状态下,网络能够学会为每个专家分配专门的计算任务不同的专家可以托管在不同的GPU上,为扩大模型使用的GPU数量提供一种明确的方法。
    请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1635782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】封装哈希表 unordered_map和unordered_set容器

目录​​​​​​​ 一、unordered系列关联式容器 1、unordered_map 2、unordered_map的接口 3、unordered_set 二、哈希表的改造 三、哈希表的迭代器 1、const 迭代器 2、 operator 3、begin()/end() ​ 4、实现map[]运算符重载 四、封装 unordered_map 和 unordered_se…

ThinkPHP Lang多语言本地文件包含漏洞(QVD-2022-46174)漏洞复现

1 漏洞描述 ThinkPHP是一个在中国使用较多的PHP框架。在其6.0.13版本及以前,存在一处本地文件包含漏洞。当ThinkPHP开启了多语言功能时,攻击者可以通过lang参数和目录穿越实现文件包含,当存在其他扩展模块如 pear 扩展时,攻击者可…

【城市】2023香港身份与生活定居相关政策(IANG,优才/高才/专才,受养人/单程证)

【城市】2023香港身份与生活定居相关政策(IANG,优才/高才/专才,受养人/单程证) 文章目录 一、如何获得香港身份1、7年计划2、旅游签 二、港澳相关的证件类别1、HK证件2、CN证件 三、香港生活对比内地 本文仅代表2023年查阅相关资料…

「C/C++ 01」计算结构体/类的大小和内存对齐

目录 一、计算结构体的大小 二、计算类的大小 三、内存对齐 一、计算结构体的大小 计算结构体的大小要遵循内存对齐规则:即从第二个成员变量开始,起始位置要计算,在自己的大小和默认对齐数(VS编译器中默认对齐数为8)中选择较小的那个&#x…

LVGL自定义滑动

触摸和编码器都可以操作 typedef struct {lv_obj_t* obj;int16_t x;int16_t y;int16_t width;int16_t height; }pos_and_size_t;typedef struct {lv_obj_t* obj;lv_coord_t height;lv_coord_t width;lv_coord_t width_pad;lv_coord_t height_pad;lv_coord_t child_widget;lv_co…

监控操作台为生活提供安全保障

在科技日新月异的现代社会,监控操作台已成为我们生活中不能缺少的一部分。它犹如一座城市的守护神,默默无闻地守护着我们的安全,确保着每一刻的平安。今天,和北京嘉德立一同走进这个神秘的世界,揭开监控操作台的神秘面…

(十四)Servlet教程——Servlet中HttpSession的使用

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,相应地也增加了服务器的存储压力。 1. 什么是Session Session是另外一种记录客户端状态的机制,不同的是Cookie保存在客户…

线程池嵌套导致的死锁问题

1、背景 有一个报告功能,报告需要生成1个word,6个excel附件,总共7个文件,需要记录报告生成进度,进度字段jd初始化是0,每个文件生成成功进度加1,生成失败就把生成状态置为失败。 更新进度语句&…

Vue入门到关门之Vue项目工程化

一、创建Vue项目 1、安装node环境 官网下载,无脑下一步,注意别放c盘就行 Node.js — Run JavaScript Everywhere (nodejs.org) 需要两个命令 npm---->pipnode—>python 装完检查一下,hello world检测,退出crtlc 2、搭建vu…

Linux:浏览器访问网站的基本流程(优先级从先到后)

浏览器访问网站的基本流程(优先级从先到后) 首先查找浏览器是否存在该网站的访问缓存 其次查找本机的域名解析服务器 windows:C:\Windows\System32\drivers\etc\hostsLinux:/etc/hosts 使用外部的域名解析服务器解析&#xff…

逆向第一步 去掉debugger(无任何门槛小白可学习)

准备工具 1.ReRes 地址:ReRes 用法: 用法 2.nodepad 地址:nodepad 注意下载后缀为.x64.exe版本的 我这里下的npp.8.6.5.Installer.x64.exe 3给nodepad装上JSTool插件 下载 可省略下叙详细步骤点此链接直接下载 JSToolNpp 然后到导…

Go语言基本语法(三)指针

什么是指针 在Go语言中,"指针是一种存储变量内存地址的数据类型",意味着指针本身是一个特殊的变量,它的值不是数据本身,而是另一个变量在计算机内存中的位置(地址)。形象地说,就像存…

Avalonia .NET构建Linux桌面应用

目录 👻前言 💻安装Avalonia 📦创建项目 📚在win下运行 ​🔑打包发布​编辑 📻在linux下运行 环境WIN10 VS2022 debian 👻前言 Avalonia 是一个用于创建跨平台用户界面 (UI) 的开源框架…

C++——STL容器——vector

vector是STL容器的一种,和我们在数据结构中所学的顺序表结构相似,其使用和属性可以仿照顺序表的形式。vector的本质是封装了一个动态大小的数组,支持动态管理容量、数据的顺序存储以及随机访问。 1.前言说明 vector作为容器,应该…

对6个默认成员函数的总结

前言:本篇文章是对六大默认成员函数的自我总结,不适合刚入门的新人学习。适合想进一步深入了解六大默认成员函数的人学习。 1.构造函数:给对象初始化的函数,相当于之前写的Init函数。 构造函数的特性: 对内置类型不…

深度解析:人工智能作画算法的原理与技术

引言 在数字艺术的探索中,人工智能(AI)作画算法以其独特的创造性和艺术性引起了广泛的兴趣。这些算法不仅仅是简单的图像处理工具,它们背后蕴藏着复杂的神经网络和深度学习模型。本文将深入探讨AI作画算法的原理与技术&#xff0…

day15 学一下Tailwindcss(java转ts全栈/3r教室)

目前距离全栈差得最多的是前端,而对于前端主要是CSS一直不熟悉,觉得很复杂写起来总是不上道,所以特别关注下Tailwindcss吧,其他前端框架可以先放放,多说无益直接用tailwindcss做个页面试试 看下文档:Tailwi…

【LeetCode刷题记录】104. 二叉树的最大深度

104 二叉树的最大深度 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3 示例 2: 输入&#xff…

HarmonyOS开发案例:【排行榜页面】

介绍 本课程使用声明式语法和组件化基础知识,搭建一个可刷新的排行榜页面。在排行榜页面中,使用循环渲染控制语法来实现列表数据渲染,使用Builder创建排行列表布局内容,使用装饰器State、Prop、Link来管理组件状态。最后我们点击…

基于python+django网易新闻+评论的舆情热点分析平台

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…