- 2024-09-26
-
发表了主题帖:
《大模型时代的基础架构》机器学习应用开发与运行平台
此为本书的第十一章,总结来说,本章对涉及的内容只是概括了一下,更详细的需要个人去日常持续学习知识,积累工作经验
微服务平台
使用Kubernetes提供基本的服务注册发现和服务路由能力,通过Service实现
使用istio实现非侵入性、语言无关性的服务治理、链路追踪
容器平台调度
拆分微服务 《大模型时代的基础架构》第十一章 机器学习应用中,算法以外的问题
中间件服务
消息队列中间件
书中主要讲了Kafka、RabbitMq、RocketMq
应用场景
异步优化性能
系统间解耦
流量削峰
选型考察点
可靠性
业内常用MQ
集群化支持
QPS--吞吐量
常用功能是否完备
对比
缓存中间件
Redis
详情见我的另外几篇文章,讲的比本书中此部分详细:
一文吃透Redis源码(数据结构篇)
一文吃透Redis源码(事件驱动框架篇)
数据库中间件
这节主要讲了数据库的ACID
原子性
一致性
隔离性
持久性
-
回复了主题帖:
《大模型时代的基础架构》GPU集群的存储设计与实现
Jacktang 发表于 2024-9-26 07:21
系统盘无法制作快照,本地硬盘,这个怎么理解
它的意思应该是从基础软件层面来说没支持,只是简单的把硬盘分给虚拟机用,其他各种周边都很难做,这样搞的话
- 2024-09-25
-
发表了主题帖:
《大模型时代的基础架构》GPU集群的存储设计与实现
分布式块存储
块存储的业务需求
本地盘,把宿主机的物理硬盘分配给虚拟机
创建新虚拟机,需完整复制一份系统盘镜像数据到本地盘,导致创建时间长
热迁移需要完整复制系统盘,热迁移性能低下
系统盘无法制作快照,本地硬盘
将位于网络远端的快存储作为虚拟机的系统盘
操作系统引导:启动就可发现块存储设备
正常挂载:识别块存储设备,并将文件系统落盘的读/写命令字从网卡发送到块存储设备
数据冗余备份:快照
集中式块存储
FC-SAN:
HBA卡
SAN Switch
基于FC-SAN存储控制器的集中式存储设备
问题在于性能和终端数量的扩展性
分布式块存储
使用大容量磁盘的工业标准服务器组成集群,通过多副本或EC方式实现存储的数据冗余备份
Ceph:CRUSH算法(随机)会浪费空间
各家自研块存储:Raft算法,节点/磁盘/磁盘偏移量三元数组
分布式对象存储
用来高效存储检索非结构化数据(文档、图片、视频、声音)
采用基于HTTP的开放接口存取
定义存储桶(Bucket),桶内每个文件都有全局唯一标识符
为对象添加键值标签,方便检索
Ceph
统一了三种接口的统一存储平台,上层应用支持Object、Block、File
数据强一致性算法,数据的所有副本都写入并返回才算写事务的完成,写的效率会差一些,所以更适合写少读多的场景。
Swift
OpenStack的一个组件
只保障数据的最终一致性,写完2个副本后即可Commit,这就导致读操作需要进行副本的对比校验,读的效率相对较低。
采用一致性哈希算法完成数据分布计算,通过首次计算对象针对逻辑对象(Zone)的映射实现数据副本的故障隔离分布,然后通过哈希一致性算法完成对象在Bucket当中的分布计算,采用Ring环结构组织Bucket节点组织,数据分布不如Ceph均匀。
需借助Proxy节点完成对数据的访问,不同于通过客户端直接访问数据节点,相对数据的访问效率来讲,比Ceph要差一些。
商业化对象存储
一致性哈希算法
冷热数据分层管理
一般分为HTTP服务层、存储节点层、键值数据库层
通过云负载均衡服务示例对云外提供VIP,并通过VPCGW对VPC内的虚拟机提供服务发现和服务路由,实现无限横向扩展
MinIO
基于Go的高性能分布式开源存储项目
提供了与k8s、etcd、docker等主流容器化技术深度集成方案
不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并且支持跨越多个数据中心。
Amazon S3兼容
使用纠删码和Checksum机制来防止硬件错误和静默数据污染。在最高冗余度配置下,即使丢失1/2的磁盘也能恢复数据。
分布式文件存储
JuiceFS
采用「数据」与「元数据」分离存储的架构。
支持多种访问接口,包括兼容 POSIX 文件系统的接口、Hadoop Java SDK、FUSE 和 Kubernetes 等。
提供了本地多级缓存机制,以提高数据访问速度和吞吐量。
JuiceFS 具有良好的兼容性,支持 POSIX、HDFS 和 S3 API 等多种文件系统接口。
- 2024-09-24
-
回复了主题帖:
#没读懂#《大模型时代的基础架构》关于GPU跨节点异号卡数据交换路径
richiefang 发表于 2024-9-22 10:49
不同编号的GPU卡,跨GPU服务器节点的通信,只能通过上一层交换机(一般称为spine, 或核心层)转发,这是因 ...
既然GPU层面不支持,那是否可以在代码层面实现这种数据传输控制呢,比如使用一些gpu通信库,或者进行通信数据链路优化啥的
然后老师,我还想问 现在业界是否可以做到单个node故障以后,不重启整个训练任务,而使训练任务恢复呢,我们现在是重启整个训练任务,代价太大了
-
回复了主题帖:
#没读懂#《大模型时代的基础架构》关于GPU跨节点异号卡数据交换路径
richiefang 发表于 2024-9-22 10:49
不同编号的GPU卡,跨GPU服务器节点的通信,只能通过上一层交换机(一般称为spine, 或核心层)转发,这是因 ...
感谢大佬解答
- 2024-09-16
-
发表了主题帖:
《大模型时代的基础架构》软件程序与专用硬件的结合
GPU并行计算库
第二章比较了C语言和GPU实现向量加法代码的区别,来体现在GPU上运行的CUDA是一个原生为并行计算设计的框架。
CUDA向开发者屏蔽了内存数据传输到方式,在libcudart.so等动态链接库中调用了GPU的KMD来让GPU执行计算。
KMD:Kernel Mode Driver,内核模式驱动
分布式AI训练
模型并行策略:将模型部署到很多设备上,由于显存限制,当模型很大的时候,单个模型难以跑在单个GPU。
数据并行策略:多个GPU上放置相同模型,各个GPU采用不同的数据进行训练。
总结
希望可以对大家去学习CUDA和TensorFlow的原理起到抛砖引玉的效果。深入AI,学习原理必不可少。
-
发表了主题帖:
《大模型时代的基础架构》GPU硬件架构剖析
本帖最后由 ltaodream 于 2024-9-16 23:00 编辑
GPU的总体设计
GPU,本质上是一个PCIE插卡/扣卡,由PCB、GPU芯片、GPU内存以及其它附属电路组成。
PCB:印刷电路板
GPU芯片:H100、A100等
GPU芯片:GPU显存
如下图,Nvidia H100的GPU的核心是Nvidia GH100芯片,它对外的接口包括16个PCI-E5.0通道、18个lane通道(NVLink)和6个HBM3/HBM2e通道。
16个PCI-E5.0通道,CPU发送指令,GPU访问主存,可提供63GBps的理论传输带宽。
18个lane通道(NVLink),连接其它GPU,或通过NVLink Switch连接多个GPU,可提供900GBps的理论传输带宽。
6个HBM3/HBM2e通道,单个HBM stack可提供800GBps的理论传输带宽,6个可提供4.8TBps。
芯片架构剖析
Nvidia H100采用了Nvidia的Hopper架构,除了以上提到的通道,整个GH100上有8个GPC,每4个GPC共用30MB的L2 Cache,每个GPC都有9个TPC,。换句话来说,一颗GH100芯片集成了144个SM。
GPC:GPU处理集群
TPC:纹理处理集群
SM:流式多处理器
每个SM内部有256KB的L1 Cache,4个Tex,4个Tensor Core,128个Cuda Core,Hopper架构还引入了TMA。
Tex:纹理处理单元
Tensor Core:Hopper中是第四代Tensor Core,增加了对Transformer算子的支持
TMA:张量存储器,使用张量维度和块坐标指定数据传输
总结
GPU的发展,就是数据局部性原理的典型体现,将数据尽量放在靠近计算单元的位置,让计算单元尽可能的发挥缓存低延迟、高带宽的优势。
- 2024-09-12
-
回复了主题帖:
#没读懂#《大模型时代的基础架构》关于GPU跨节点异号卡数据交换路径
Jacktang 发表于 2024-9-12 07:31
只能说,数据直接通过 NVLink 或 InfiniBand 等高速网络传输到 节点2的GPU1。
这种路径适用于节点之间有直 ...
模型训练是会碰到这样的情况的,而且节点之间不可能有nvlink
- 2024-09-11
-
回复了主题帖:
#聊一聊#《大模型时代的基础架构》关于GPU共享相关
wangerxian 发表于 2024-8-19 16:42
感觉这个技术研究的有点深入。
一起学习
-
回复了主题帖:
#聊一聊#《大模型时代的基础架构》关于GPU共享相关
hellokitty_bean 发表于 2024-8-20 10:34
cloud native总让人好高深呀。。。。。。。。。。。一般个人想玩,怎么玩?
可以找点4090 4060玩玩,笔记本上的就行,假如财力雄厚,可以去云厂商租赁几台GPU服务器玩
-
发表了主题帖:
#没读懂#《大模型时代的基础架构》关于GPU跨节点异号卡数据交换路径
问题来源:第六章 GPU集群的网络设计与实现
在阅读这个章节中注意到书中所说的GPU跨节点异号卡数据交换是通过接入层经过汇聚层交换机,才会抵达另一个节点的异号卡GPU,但是之前有听说过另一种说法
另一种说法:通过中间节点进行通信
如果节点1的GPU0需要与节点2的GPU1进行通信,数据可能首先通过Roce交换机传输到节点2的GPU0,然后由节点2的GPU0通过NVlink Switch转发到GPU1
不知道两种说法哪种对,希望大家来讨论一下,希望老师解答一下
-
回复了主题帖:
读书活动颁奖:《Rust实战》
- 2024-09-07
-
发表了主题帖:
《大模型时代的基础架构》大模型时代对基础架构的需求
大模型缘起
2022 年 11 月底,OpenAI 发布了 ChatGPT,2023 年 1 月注册用户超过一亿,成为历史上增长最快的应用,上一个纪录保持者是 TikTok,注册用户超过一亿用时 9 个月。
随着 ChatGPT 的火爆,国内互联网公司也在纷纷跟进。2023 年 3 月开始,随着百度文心一言和清华智谱的chatGLM的发布,打响了国内大模型的第一枪,各大厂短时间内相继发布了一系列大模型产品。
同时,大模型从chatGPT的语言模型到图像、多模态、空间计算,面向物理世界快速演进。
国内各大小公司垂类大模型涌现,开始寻找解决大模型现实场景问题的路径。
距离上次大众对AI印象深刻还在 2016 年,AlphaGo以 4 比 1 的绝对优势战胜了围棋世界冠军李世石。与1997年超级计算机深蓝战胜国际象棋世界冠军卡斯帕罗夫采用的专家系统不同的是,围棋采用的数学模型是通过机器学习实现的。
机器学习
排名前10的机器学习算法
线性回归算法
罗吉斯回归算法
决策树算法
支撑向量机算法
朴素贝叶斯算法
K-近邻算法
欧几里得距离聚类算法
随机森林算法
降维算法
梯度提升算法
以最简单的一元线性回归方程为例子,帮助理解机器学习
表达式:y=ax+b
一元线性回归算法使用的核心是最小二乘法,如下图,在有n个点的情况下,需要进行4n次乘加运算(乘法运算与加法运算的组合,将乘法运算结果累加)。而得出参数a、b以后计算y值只需要进行一次乘加运算。
那么通过用机器学习算法相关术语描述上述一元线性回归方程可以得出:
训练样本:平面直角坐标系上的n个点
模型:描述平面直角坐标系上直线的方程
权重参数:方程中的参数a和b
训练:根据样本计算出权重参数的过程
推理:得到参数a和b后,根据x计算出y的过程
将一元线性回归算法推广到多元非线性函数,实际上就是用线性多项式函数无限逼近无理函数(非整数次幂函数)和超越函数(指数/对数函数、 三角/反三角函数、双曲/反双曲函数),基于深度学习算法计算出的结果,就是多项式中各项的系数,即模型的权重参数。
机器学习指的是,先构建一个参数待定的高次线性方程模型,再输入大量的训练样本(也就是方程模型中自变量及因变量的值),让计算机算出方程模型的参数。该参数被称为权重,该步骤被称为训练。而基于机器学习得到的方程模型。通过输入自变量得到因变量的过程,被称为推理。
AI大模型对计算机硬件的需求
乘加运算在计算机领域一般称为“向量点积”或者“向量卷积”。绝大多数机器学习算法的核心运算都是向量卷积运算。简单来说,AI大模型对计算机硬件的需求就是能够并行批量的进行乘加运算。
CPU
中央处理器(central processing unit),作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。
约25%的ALU(算术逻辑单元):负责执行基本的算术运算(如加法、减法)和逻辑运算(如与、或、非)。
约25%的Control(控制单元):负责指令的解码、执行顺序的控制以及数据路径的选择,处理复杂的逻辑控制。
约50%的Cache(缓存单元):用于存储频繁访问的数据,以减少访问主内存的时间延迟。
强大的逻辑运算能力:能够处理各种复杂的计算任务。
复杂的控制逻辑:需要处理复杂的指令集,并协调多个运算单元的工作。
多层次的缓存:用于存储频繁访问的数据,提高数据访问效率。
一个CPU core 包含一个或多个ALU。
Intel x86 架构(如 Intel Core 系列)
现代 Intel Core 系列处理器通常具有多个 ALU。以 Intel Skylake 微架构为例,一个核心包含 4 个整数 ALU 和 2 个浮点 ALU。
ARM 架构(如 ARM Cortex-A 系列)
ARM Cortex-A 系列处理器中的核心包含多个 ALU。例如,Cortex-A72 核心有 2 个整数 ALU 和 2 个浮点/矢量 ALU。
虽然CPU的ALU肯定是支持乘法指令和加法指令的(乘加向量卷积),但由于数量远少于GPU,所以运算效率会很低。虽然Intel和AMD等厂商在ALU中增加SIMD运算单元,在一条指令中计算多个数据,并且引入了MMX(0-7)寄存器,但受限于CPU的设计实现,这些加速计算的措施并不能显著提高并行计算的效率(例如128bit寄存器只能存储16个打包的8bit数据),即使现代 CPU 支持更大位宽的寄存器,如 AVX-512
GPU
图形处理器(英语:Graphics Processing Unit,缩写:GPU),又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上做图像和图形相关运算工作的微处理器。
约90%的ALU(算术逻辑单元):负责执行大量的简单运算,如矩阵乘法、向量卷积等。
约5%的Control(控制单元):负责基本的数据控制和数据转发。
约5%的Cache(缓存单元):用于存储频繁访问的数据,但规模相对较小。
大量的简单并行运算:适合处理大规模的并行任务。
简单的控制逻辑:主要用于执行大量的简单运算任务。
较小规模的缓存:主要用于存储频繁访问的数据,减少数据传输延迟。
在 CPU 中,缓存的主要目的是存储频繁访问的数据,以减少访问主内存(DRAM)的时间延迟。缓存通常包含最近使用过或即将使用的数据,这样可以快速访问这些数据,提高整体性能。
在 GPU 中,缓存的设计和用途有所不同。GPU 的缓存主要用于服务于线程(thread),而不是简单地存储频繁访问的数据。
合并访问请求
如果有很多线程需要访问相同的内存位置(例如,同一张纹理图中的一个像素值),GPU 的缓存会合并这些访问请求。
这意味着缓存不仅仅是为了存储数据,更重要的是为了合并来自多个线程的重复访问请求。
减少 DRAM 访问次数
当多个线程需要访问相同的内存位置时,GPU 的缓存会先检查是否有缓存命中(hit)。
如果命中,则直接返回缓存中的数据;如果没有命中,则缓存会从 DRAM 中读取数据,并将结果返回给所有需要的线程。
这种合并访问的方式可以显著减少 DRAM 的访问次数,从而提高整体性能。
虽然GPU是为了图像处理而生的,但是通过前面的介绍可以发现,它在结构上并没有专门为图像服务的部件,只是对CPU的结构进行了优化与调整(将CPU结构修改,牺牲执行复杂计算的能力,增强并行简单计算的能力)。所以现在GPU不仅被运用到图像处理领域,还被用来科学计算、密码破解、数值分析,海量数据处理(排序,Map-Reduce等),金融分析等需要大规模并行计算的领域。
CPU和GPU都是较为通用的芯片。
TPU
张量处理器(Tensor Processing Unit):是谷歌专门为加速深度神经网络运算能力而设计的一种定制化硬件加速处理器(张量专用,专为 TensorFlow 框架设计)。向量是一个一维张量。
专为处理大规模的并行计算任务而设计,擅长计算矩阵和向量,精简了其他计算功能。
TPU 的 ALU 数量远多于 CPU 和 GPU,以支持高效的并行处理(数万个)。
TPU在芯片上使用了高达24MB的局部内存,6MB的累加器内存以及用于与主控处理器进行对接的内存,总共占芯片面积的37%。与同期的CPU和GPU相比,可以提供15-30倍的性能提升,以及30-80倍的效率(性能/瓦特)提升。主要有两个原因:
执行完毕直接将中间结果传递给下一步骤。
无论是CPU还是GPU,所有运算过程的中间结果都需要被保存在内存中,而TPU根本没有将中间结果保存到内存中,而是在执行完毕直接将中间结果传递给下一步骤。
片外内存访问是GPU能效比低的罪魁祸首(2024年的今天,RAM的读取和写入时延一般在100ns的数量级,而100ns够GPU的每个cuda core都完成100次左右的运算),所以谷歌不惜成本的在芯片上放了巨大的内存。相比之下,英伟达同时期的K80只有8MB的片上内存,因此需要不断地去访问片外DRAM。
对低运算精度的容忍。
低精度运算带来的算法准确率损失很小,但是在硬件实现上却可以带来巨大的便利,包括功耗更低、速度更快、占芯片面积更小的运算单元、更小的内存带宽需求等,TPU采用了8比特的低精度运算。
举例:如果外面下雨了,你其实并不需要知道每秒到底有多少滴雨, 而只要知道雨是大还是小。与此类似,神经网络通常不需要 16/32bit 浮点数做精确计算,可能 8bit 整型预测的精度就足以满足需求了。
NPU
神经网络处理器(Neural Processing Unit)是专门用于加速神经网络计算的硬件单元
效率更高,功耗更小,响应更快,适合用在手机、边缘计算、物联网等等场景。
设计原因:
在神经网络中,每个神经元接收输入信号,然后通过突触权重(权重乘法)和偏置项(加法)计算出激活值,再通过激活函数(如ReLU、sigmoid等)得到输出。
突触权重通常是实数,可以正可以负,表示神经元之间的连接强度。这些权重是在训练过程中通过反向传播算法不断调整优化的。神经突触通常涉及乘法、加法、激活函数等几种运算。
传统的冯·诺伊曼架构(如 x86 和 ARM 处理器)在执行上述运算时效率较低,因为它们需要多次加载数据、执行乘法和加法,然后存储结果。这种存储和计算分离的结构导致了大量的数据搬运开销。
由于深度学习的基本操作是神经元和突触的处理,而传统的处理器指令集(包括x86和ARM等)是为了进行通用计算发展起来的,其基本操作为算术操作(加减乘除)和逻辑操作(与或非),往往需要数百甚至上千条指令才能完成一个神经元的处理,深度学习的处理效率不高。
突破经典的冯·诺伊曼结构!神经网络中存储和处理是一体化的------>集成在现代处理器中的神经网络加速单元
用途:
TPU 主要用于大规模的训练任务,适合云平台部署。
NPU 用于终端设备的推理任务,适合嵌入式系统。
小结
大模型时代的AI算法,在本质上是通过多个线性幂函数的叠加来逼近现实世界中事物的数学模型。
计算这些线性幂函数的参数的过程,就是所谓的调参。这个计算过程中要进行大量的乘加运算。
因此随着AI算力需求的增长,按照需求领域专用化路线演进,将针对AI算法不同需求的优化到了极致。
CPU->GPU->TPU/NPU
- 2024-08-19
-
发表了主题帖:
#聊一聊#《大模型时代的基础架构》关于GPU共享相关
看了书上第七八章的虚拟化调度方案,又想起之前发现的一个有趣的开源项目,阿里云开源的gpushare Device Plugin、gpushare-scheduler-extender两个配合使用,所能达到的效果属于哪一层呢,好像并没有隔离,只是按照显存划分调度,那假如多个任务绑了相同节点的GPU是不是会造成争抢呢?
当前GPU云原生化方面有没有哪些rust的开源项目,哪些地方可以利用rust的特性呢
- 2024-08-05
-
回复了主题帖:
《大模型时代的基础架构》一文了解GPU云原生虚拟化调度方案
一起学习大模型基础架构
-
发表了主题帖:
《大模型时代的基础架构》一文了解GPU云原生虚拟化调度方案
## 背景
大模型时代,当前单 GPU 算力调度技术主要有
- 基于虚拟机的 PCI-E 设备直通
- 基于 Kubernetes 的 Device Plugin
这两种方式都对GPU调度的颗粒度都是单卡(整颗GPU芯片),会独占整个 GPU 。但在当前 GPU 寸土寸金的时代,这种调用方式在一些任务场景下会浪费大量 GPU 资源。
- AI推理:通常一次只处理一个或一小批输入样本(流量波动)
- 高性能计算:一些 HPC 应用会因 CPU 的瓶颈而对 GPU 的利用率不高
- 开发环境:研发人员使用 Jupyter Notebook 进行交互式的模型开发,大多数情况只需较低规格的机器
- 测试环境:测试人员对大模型应用进行测试
- CI/CD :流水线往往只需要在触发的时候有限的GPU资源运行测试用例
## 需求
GPU虚拟化应当实现对需求:
- 硬件复用
- 时分复用(类比单核时间片轮转)
- 空分复用(多个进程可以同时运行在一个 GPU 上)
- 隔离性(互不影响)
- 可运营(保证租户实际可用的资源量)
## 层级
GPU虚拟化方案从硬件层到应用层:
- 硬件级:Nvidia MIG、AMD SRIOV技术、百度昆仑 SRIOV技术
- 虚拟机/虚拟硬件级:Nvidia vGPU技术、Intel GVT-G技术
- CUDA内核劫持/驱动劫持:阿里闭源cGPU、腾讯闭源qGPU、百度内核态虚拟化、火山引擎闭源mGPU
- CUDA聚合:Nvidia MPS技术(多进程服务解决方案)
- CUDA运行时劫持:腾讯开源vCUDA、rCUDA
- 机器学习框架:AntMan项目
分类:
- 当前常见的虚拟化方式,包括内核态虚拟化、NVIDIA vGPU虚拟化,在底层实际都是基于时间片轮转的时分复用方案。在某一时间片内,如果该进程无法很好的利用计算资源,这些计算资源就是浪费掉的。
- 而MPS,真正实现了并行(parallel),该方案可以做到空分复用,是目前看到同时兼顾效率与性能的方案。
延迟敏感型的在线推理任务,建议选择基于进程融合的空分方案。要求严格隔离的场景建议选择时分方案。其它场景选择两者没有区别。
## 对于Kubernete中GPU调度的理解
**k8s的GPU共享是要服务于GPU调度,但GPU调度并不需要GPU共享。**
理解GPU调度与GPU共享的关系
- **GPU共享服务于GPU调度**:
- 在GPU资源有限或成本敏感的情况下,GPU共享技术可以帮助提高资源利用率,使得更多的Pods可以在同一物理GPU上运行。
- GPU共享技术可以将一个物理GPU分割成多个虚拟GPU实例,每个实例可以分配给不同的Pods。这样,即使资源有限,也能支持更多的任务运行。
通过GPU共享,调度器可以在有限的GPU资源上调度更多的Pods,从而提高集群的整体效率。
- **GPU调度不一定需要GPU共享**:
- 如果集群中有足够的GPU资源,并且每个Pod需要完整的GPU资源,那么不需要使用GPU共享技术。
- 在这种情况下,GPU调度只是简单地将每个GPU分配给一个Pod,以确保资源的独占使用。
- 当GPU资源充足时,每个Pod都可以拥有一个完整的GPU,调度器只需确保没有资源冲突即可。
GPU调度的要点在于:**GPU要尽可能响应任务、任务完成时间尽可能短、资源利用率尽可能高、不要卡在IO上。**
由于CPU与GPU有异步等待关系,存储、网络IO是最影响GPU利用率的问题。
**由于当前GPU的稀缺性,CPU、存储、网络等一切其他资源都要让步给GPU。**
- 2024-07-22
-
回复了主题帖:
读书活动入围名单:《大模型时代的基础架构:大模型算力中心建设指南》
个人信息无误,确认可以完成阅读分享计划
- 2024-07-12
-
回复了主题帖:
《Rust实战》书友互动第十集:进程、线程和容器
吾妻思萌 发表于 2024-6-24 10:56
提问:
之前做WEB server都是调试时候用ctrl+C直接中断掉,似乎没想过如何让其能够优雅的中断。
哪位 ...
你可以用Rust标准库中的tokio异步运行时和signal-hook库来优雅地处理一下SIGINT(Ctrl+C)信号
-
回复了主题帖:
《Rust实战》书友互动第十一集:内核
吾妻思萌 发表于 2024-6-28 09:02
一个小问题:
作为业余感兴趣去学习Rust的有一丝丝编程基础的人,Rust是否是太过于coding硬核了,像是很 ...
没必要,可以先从更容易入门的比如go,进行入手,再来进行rust
-
回复了主题帖:
《Rust实战》书友互动剧终:信号、中断和异常
吾妻思萌 发表于 2024-7-5 08:02
多线程中断该怎么调度啊,感觉很复杂啊?要把任务压到栈里吗
多线程是通过std::thread模块来实现的,但直接中断一个线程(如Java中的Thread.stop())在Rust中并不直接支持,因为这样做可能引发数据竞争和其他未定义行为
在Rust中,处理线程中断和任务调度通常依靠以下几种策略:
通信(Communication): 使用std::sync中的同步原语(如Mutex, Arc, Condvar)或std::mpsc(多生产者单消费者通道)来协调线程间的消息传递。当需要停止一个任务时,可以发送一个特定的信号或消息给工作线程,让它优雅地自我结束。
标志(Flags): 可以通过共享的原子布尔标志(std::sync::atomic::AtomicBool)来通知线程应该停止工作。线程在执行任务时定期检查这个标志,一旦发现应停止,则自行退出。
JoinHandle与线程退出: 创建线程时会得到一个JoinHandle,你可以使用它来等待线程结束,但不能直接中断线程。一种间接的方法是在线程函数中检查外部条件(如上述的标志),或者在主线程中等待所有子线程完成(join())。
异步编程: Rust的异步编程模型(async/await)和tokio或async-std这样的库提供了更高级的并发和任务管理机制。在异步世界中,任务(通常称为“future”)可以被取消,而且异步运行时提供了更灵活的调度能力。
外部库: 使用如crossbeam这样的第三方库可以提供更多高级的并发工具,如线程池和工作窃取调度器,这些可以帮助更高效地管理和调度线程。