1. GPU的硬件架构 以A100为例
一个GPU 又108个SM,每个SM 中有64个FP32cuda core 4个tensor core,计算卡上还有8个FP16 cudacore; 被分为4个warp,每个warp有有l0指令缓存区, 寄存器文件16384个,寄存器文件大小32bit
A100每个SM上面的占有率有如下受限因素:
2. GPU的内存结构,按照速度从高到底进行排序:
GPU的内存结构可以按照速度从高到低进行排序,通常包括以下几种类型的内存:
寄存器(Registers):寄存器是GPU内存中速度最快的一种,用于存储每个线程的局部变量和临时数据。寄存器通常位于GPU的处理器核心内部,访问速度非常快,但数量有限。
共享内存(Shared Memory):共享内存是位于每个线程块内部的内存,用于线程块内的线程之间共享数据。它比全局内存访问速度更快,但仍然较快。共享内存通常用于加速线程块内的协同计算。
本地内存(Local Memory):本地内存是位于每个线程块内部的内存,通常用于存储局部变量和临时数据。它的访问速度介于共享内存和全局内存之间,通常比全局内存更快。
全局内存(Global Memory):全局内存是GPU内存中速度较低的一种,用于存储全局数据,可以被所有线程块和线程访问。全局内存通常是GPU主内存的一部分,访问速度相对较慢,但容量较大。
常量内存(Constant Memory):常量内存用于存储只读数据,例如常数和预计算数据。它有较快的访问速度,但不能被写入。
纹理内存(Texture Memory):纹理内存用于存储图像和纹理数据,通常用于图形处理和一些科学计算任务。它有特殊的高速纹理缓存,用于提高对纹理数据的访问速度。
全局缓存(L2 Cache):一些现代GPU具有全局缓存,用于加速对全局内存的访问。它的速度介于全局内存和更快的内存层级之间。
3.GPU的线程层次结构:
CUDA的线程组织结构是用于GPU编程的重要概念。在CUDA(Compute Unified Device Architecture)中,线程组织结构主要包括以下几个关键元素:
线程块(Thread Block):线程块是CUDA程序中的一个基本执行单元。每个线程块包含多个线程,它们可以协同工作并访问共享内存。线程块内的线程可以通过共享内存进行数据交换和协同计算,通常在一个线程块内的线程之间的通信效率更高。
网格(Grid):网格是线程块的集合,用于组织和管理大规模的并行任务。每个线程块都属于一个网格,网格可以包含多个线程块。
线程(Thread):线程是GPU上执行的最小单元。线程可以由程序员定义,然后由GPU并行执行。线程可以访问全局内存和共享内存,并可以进行各种计算任务。
线程束(Warps):线程束是一组线程,通常包含32个线程。在GPU上,线程束是并行执行的基本单位。所有线程束中的线程执行相同的指令,但可以在不同的数据上操作。
4.CUDA stream的概念,为什么要使用多个stream?
5. GPU和CPU分别适合执行哪些程序?结合它们的硬件架构解释一下为什么它们有各自的优势。
CPU(中央处理器):
GPU(图形处理器):
6.半精度浮点数FP16各个部分的具体位数,为什么要有半精度浮点数?
Bfloat16 – a brief intro - AEWIN
半精度浮点数(FP16)是一种二进制浮点数表示方法,通常由16位组成,具体位数分为以下几部分:
符号位(1位):用于表示数的正负,0表示正数,1表示负数。
指数位(5位):用于表示数的指数部分,允许在一定范围内表示数的大小。由于只有5位,所以指数范围相对较小。
尾数位(10位):尾数部分用于表示数的精度,包括小数部分。10位尾数相对于单精度浮点数(32位)的23位尾数来说,精度较低。
7.为什么要有半精度浮点数呢?
节省存储空间:半精度浮点数占用的存储空间较少,适用于需要大量存储或传输数据的应用,如神经网络模型权重和激活值。
提高计算性能:半精度浮点数在某些情况下可以提高计算性能,尤其是在图形处理单元(GPU)等硬件中,它们可以同时处理多个半精度浮点数操作,从而加速计算。
适用于深度学习:深度学习中的许多模型和算法可以在半精度浮点数下进行训练和推断,而不会显著损害性能。这可以降低硬件要求并加快训练速度。
8.Tensor core的原理: 深入理解混合精度训练:从 Tensor Core 到 CUDA 编程 - 知乎
9.平时如何进行kernel的优化,会用到哪些工具?
优化GPU内核通常涉及以下步骤:
Profiling:首先,使用上述工具之一进行性能分析,以确定内核中的性能瓶颈。
减少数据传输:尽量减少主机与设备之间的数据传输,以减少延迟和带宽开销。
并行化:确保内核中的计算是并行的,以充分利用GPU的多个处理单元。
内存访问模式:优化内核中的内存访问模式,以减少内存延迟。使用局部内存和共享内存来提高内核性能。
向量化:使用SIMD(单指令多数据)指令来优化内核,以在单个指令中处理多个数据元素。
减少分支:尽量减少条件分支,因为分支会降低GPU的性能。
循环展开:对于循环,可以考虑展开循环以增加内核的并行度。
代码重用:尽量重用计算和内存操作,减少冗余计算。
缓存:使用本地和全局内存缓存来减少内存访问。
8.roofline模型有什么用?如何确定最优的BLOCK_SIZE。
9.GPU资源调度有哪些方法?
GPU资源调度有多种方法,以下是一些常见的:
FIFO(先进先出)调度:这是最简单的调度方法,任务按照它们进入GPU队列的顺序依次执行。这种方法没有优先级考虑,可能导致任务等待时间较长。
抢占式调度:抢占式调度允许优先级更高的任务中断正在执行的任务,以确保重要任务能够及时执行。这种方法通常需要硬件支持,并且需要合适的调度算法来确定何时抢占。
Round Robin(轮询调度):任务按照轮询的方式执行,每个任务在一个时间片内运行一段时间,然后切换到下一个任务。这种方法可以确保每个任务都有机会执行。
公平分享调度:在这种调度方法中,每个任务被分配一个权重,任务的资源分配与其权重成正比。这可以确保资源按比例分配给不同的任务。
基于机器学习的调度:一些先进的GPU调度方法使用机器学习算法来动态地分配资源,以最大化系统性能。这些算法可以根据任务的特性和需求来调整资源分配。
队列调度:任务被放置在不同的队列中,每个队列可能有不同的优先级或资源限制。任务根据队列的规则执行,这可以用于管理不同类型的工作负载。
Elastic调度:Elastic调度系统可以根据工作负载的需求自动伸缩GPU资源。当需要更多资源时,它可以分配更多的GPU,而当资源不再需要时,它可以释放资源。
这些方法的选择取决于应用程序的需求、硬件支持以及性能目标。不同的调度方法可以在不同情况下提供更好的性能和资源利用率。
9.进行推理优化的原因:
行推理优化有几个重要的原因:
性能优化:直接使用TensorFlow或PyTorch的推理接口可能会在一些情况下导致性能问题,特别是在部署到生产环境中时。推理优化可以帮助提高模型的性能,使其更快速地处理输入数据。
资源利用率:推理优化可以有效地管理计算资源,减少内存占用和计算需求。这有助于在资源有限的环境中更有效地运行模型,如嵌入式系统或移动设备。
部署和集成:推理优化可以简化模型的部署和集成,使其更容易与各种应用程序和平台集成。这对于将深度学习模型用于实际应用非常重要。
移动设备支持:移动设备通常具有有限的计算和存储资源,因此推理优化对于在这些设备上运行深度学习模型非常关键,以确保良好的性能。
总之,推理优化可以提高深度学习模型在生产环境中的性能、效率和可部署性,使其更适合各种应用场景。
10.模型推理优化的常用方法有哪些?
模型推理优化的常用方法包括以下几种:
量化(Quantization):将模型的参数和激活值从浮点数转换为较低位宽的整数,从而减小模型在推理时的计算量,提高推理速度。
剪枝(Pruning):通过去除模型中不必要的参数和连接,减小模型的大小,从而提高推理速度,同时保持相对较高的性能。
模型压缩(Model Compression):使用各种技术,如知识蒸馏(Knowledge Distillation)、模型量化和权重共享,减小模型的大小以提高推理速度。
硬件加速:使用专门的硬件加速器,如GPU、TPU、FPGA等,以提高模型推理的速度。
分布式推理(Distributed Inference):将模型的推理任务分发到多个设备或服务器上,以加快处理速度。
缓存优化:利用缓存机制来存储中间计算结果,以减少计算重复,提高推理速度。
异步推理:允许多个推理任务并行执行,从而减少等待时间。
模型量化(Model Quantization):将模型参数从浮点数转换为定点数或低精度浮点数,以减小模型大小和计算需求。
剖析和分析(Profiling and Analysis):使用工具来分析模型的推理性能,识别瓶颈,并优化模型或硬件配置。
这些方法可以单独或结合使用,根据具体的应用和硬件环境来优化模型的推理性能。
11. 模型量化的加速原理,模型量化带来的精度损失如何解决?
模型量化是一种用于减小深度学习模型的计算和内存需求的技术,通常用于嵌入式系统和移动设备中,以提高推断速度和降低能耗。模型量化的加速原理可以总结为以下几点:
减小模型权重的表示精度: 在模型量化中,通常会减小模型权重参数的位数表示,例如从浮点数到定点数或者减小位宽。这样可以大幅减小模型在内存中的占用和计算时的复杂性。
量化技巧: 模型量化使用一些技巧来最小化精度损失。例如,使用对称量化或非对称量化,将权重映射到有限的离散值,从而在保留模型性能的同时减小精度。
Quantization-Aware Training (QAT): 在训练过程中,可以使用量化感知训练技术,以最小化量化后的精度损失。这种方法可以在训练期间考虑模型的量化,并相应地调整权重。
模型量化带来的精度损失是一个常见的问题,但可以采取一些方法来解决它:
Finetuning: 一种方法是在量化后对模型进行微调。通过在量化的模型上继续进行训练,可以尝试提高模型的性能,尽量减小精度损失。
混合精度: 有时可以在模型中使用混合精度,即在某些层使用高精度权重,而在其他层使用量化的低精度权重,以平衡性能和计算效率。
模型架构优化: 重新设计模型架构,以适应量化技术。一些模型架构可能对量化更敏感,需要特定的优化。
总之,模型量化是一种有助于提高深度学习模型在嵌入式设备上的性能的技术,但在减小模型的计算和内存需求的同时,需要仔细处理精度损失的问题。这些方法可以帮助缓解精度损失,同时提高模型的效率。