1.DeepSpeed源码笔记3优化器
2.fs/dev/zero的后台实现
3.多图详解万星Restful框架原理与实现
4.分享几个开源的Python游戏代码
5.当函数类型为整型时类型标识符可以省略吗?
6.树莓派Zero 2W安装Pyocd经验分享
DeepSpeed源码笔记3优化器
DeepSpeedZeroOptimizer_Stage3 是一个用于训练大模型的优化器,专门针对zero stage 3的源码策略。它通过将参数W划分为多份,代码每个GPU各自维护优化器状态、后台梯度和参数,源码以实现高效并行计算。代码无水印源码具体实现过程如下:
在进行前向计算时,后台每个GPU负责其部分数据,源码所有GPU的代码数据被分成了三份,每块GPU读取一份。后台完成前向计算后,源码GPU之间执行all-gather操作,代码合并所有GPU的后台参数W,得到完整的源码W。
在执行反向传播时,代码同样进行all-gather操作,收集所有GPU的完整W,然后执行梯度计算。完成反向传播后,立即释放不属于当前GPU管理的W。
在计算梯度后,通过reduce-scatter操作聚合所有GPU的梯度G,得到完整的梯度。接着,释放非当前GPU管理的梯度G。最后,使用当前GPU维护的部分优化器状态O和聚合后的梯度G来更新参数W,无需额外的allreduce操作。
初始化阶段包括设置参数和配置,如optimizer、flatten、unflatten、dtype、gradient_accumulation_dtype等。这些配置决定了优化器的运行方式和性能。初始化还包括创建参数分组和设置特定的分片操作。
分配模型参数到各个GPU上,batis源码结构通过多种方法如创建参数分组、创建参数子分组等进行细致的划分和管理。这些分组和子分组的创建和管理,是为了更有效地进行梯度聚合和参数更新。
在执行反向传播后,调用LossScaler进行梯度计算,随后通过特定的钩子函数(如reduce_partition_and_remove_grads)进行梯度聚合和释放。
执行优化器的step方法时,进行归一化梯度计算、更新参数和优化器状态,并在完成后清理和更新模型参数。此过程包括执行反向梯度聚合、更新模型参数权重、清理优化器状态和参数。
DeepSpeedZeRoOffload模块则负责模型参数的划分和管理工作,包括初始化、参数划分和状态更新等。初始化阶段会根据配置将参数分配到不同GPU上,并进行状态更新和参数访问的优化。
在进行参数划分时,首先将模型参数划分为非划分和划分的参数,并根据划分状态进一步处理。初始化外部参数后,会更新模块的状态,包括所有参数的存储位置和管理策略。
在执行partition_all_parameters方法时,根据GPU数量和参数大小计算每个GPU需要处理的部分,从模型参数中提取并分割到对应的GPU上,释放原参数并更新参数状态。
Init过程涉及到初始化配置、实现特定方法(如all_gather、partition等)和状态更新,确保模型参数能被正确地在不同GPU间共享和管理。对于特定的GPU(如主GPU),还会使用广播操作将参数分发给其他GPU。
fs/dev/zero的农场果实源码实现
在类UNIX操作系统中,/dev/zero是一个特殊文件,提供无限空字符流。常用于覆盖信息或生成特定大小空白文件。其实现依赖于mmap将/dev/zero映射至虚地址空间,实现共享内存。该操作等同于匿名内存使用,即没有与任何文件关联。系统分配内容(通过mmap或brk)通常清零,但虚拟地址按需分配物理页面。读取操作仅需保证零内容,虚拟地址映射至内容为0的物理页面,降低系统物理内存消耗。
在Linux中,万物皆是文件,/dev/zero的实现涉及特定目录下的tmpfs文件系统。通过shmem_zero_setup、shmem_kernel_file_setup和alloc_file等步骤构建。
mmap共享匿名映射实质上是文件映射,特殊文件位于/dev/zero目录,创建于tmpfs系统中。
相关文献深入剖析了mmap原理、共享内存虚拟文件系统、mmap内存映射本质及其源码实现。
进一步理解Linux内核共享内存机制,包括shmem和tmpfs,提供深入分析。
多图详解万星Restful框架原理与实现
rest框架概览
我们先通过go-zero自带的命令行工具goctl来生成一个apiservice,其main函数如下:
funcmain(){ flag.Parse()varcconfig.Configconf.MustLoad(*configFile,&c)ctx:=svc.NewServiceContext(c)server:=rest.MustNewServer(c.RestConf)deferserver.Stop()handler.RegisterHandlers(server,ctx)fmt.Printf("Startingserverat%s:%d...\n",c.Host,c.Port)server.Start()}解析配置文件
将配置文件传入,初始化serviceContext
初始化restserver
将context注入server中:
注册路由
将context中的启动的endpoint同时注入到router当中
启动server
接下来我们来一步步讲解其设计原理!Let'sGo!
web框架从日常开发经验来说,一个好的web框架大致需要满足以下特性:
路由匹配/多路由支持
支持自定义中间件
框架和业务开发完全解耦,方便开发者快速开发
参数校验/匹配
监控/日志/指标等服务自查功能
服务自保护(熔断/限流)
go-zerorest设计/api-grammar.html中的tag修饰符
Tips学习源码推荐fork出来边看边写注释和心得,可以加深理解,以后用到这块功能的时候也可以回头翻阅。
项目地址/zeromicro/go-zero
欢迎使用go-zero并star支持我们!
微信交流群关注『微服务实践』公众号并点击交流群获取社区群二维码。matrix源码大全
分享几个开源的Python游戏代码
以下是一些开源的Python游戏代码分享:
I wanna,源代码链接:pan.baidu.com/s/1DlULys...
提取码:kh2h
Covid-Hero,源代码github地址:github.com/zixinzeng-je...
The Game of Purifier,源代码github地址:github.com/epcm/PURIFIE...
进击的豌豆,源代码链接:pan.baidu.com/s/1YcojAC...
提取码:tsfm
以上游戏均采用Pygame Zero库(简称Pgzero)开发。Pgzero是Pygame的精简版本,能够实现Pygame库的主要功能,同时屏蔽了复杂的细节,对新手十分友好。
若想快速了解Pgzero,可以参考下文:
若要全面系统学习Pgzero,可以参考《趣学Python游戏编程》一书。该书通过十个经典游戏案例,深入浅出地介绍了游戏编程的基本原理,以及Pgzero的具体使用方法。相信学完这本书后你也能开发出上面这样精彩的Python游戏。
当函数类型为整型时类型标识符可以省略吗?
当函数返回类型为整型(int) 时,类型标识符能不能省略,要分如下两种情况分析。一、定义函数时,可以省略(但一般会报警告),如:
add(int a,int b)
{
return a+b;
}
zero()
{
}
二、函数声明时不能省略,如:
int add(int a,int b);
int zero();
三、下面是一个完整的例子:
#include <stdio.h>
int main()
{
//函数声明
int add(int a,int b);
int zero();
int sum=add(1,2);
int z=zero();
printf("sum=%d,z=%d\n",
sum,z);
return 0;
}
//函数定义
add(int a,int b)
{
return a+b;
}
zero()
{ }
四、下面是源码截图和运行结果截图
源码截图
运行结果截图
树莓派Zero 2W安装Pyocd经验分享
树莓派Zero 2W安装Pyocd的经验分享,我直接跳过系统的安装配置和更新软件源的部分,因为这些网上都有详尽的指南。树莓派内置的烧写系统流程简单,但有几个关键步骤需要特别注意。
首要任务是安装libusb库,这是Pyocd运行的基础。紧随其后,我需要安装pip(由于没有预先安装,这部分是scratch 源码生成必要的)。随后更新pip版本,确保兼容性。
安装过程中,理解python命令前加sudo与不加的区别十分重要。它们操作在不同的环境中,因此避免混淆。
下载并解压pyocd源码后,我遇到了一个挑战:Zero 2W的内存限制导致编译过程异常。官方文档指出问题可能与CMSIS-Pack-Manager有关,但经过实际测试,我发现卡死的原因是capstone包,一个用于反编译的工具。由于我主要使用Zero 2W来下载程序,因此并不需要编译capstone包。如果需要反编译功能,可以尝试交叉编译或在4B上编译后复制到Zero 2W。
解决capstone包的问题,我注释了该包,并在项目根目录的setup.cfg文件中进行调整。随后,我执行编译命令,加入了sudo以获得足够的权限访问USB调试设备。尝试发现,Zero 2W在执行此命令时存在权限问题,但4B和Zero W并无此困扰。因此,我选择将pyocd编译到管理员目录下,成功解决了权限问题。
成功编译后,我尝试烧写固件,这一过程顺利无阻。如果你也想烧写F,可以参考特定的安装指南,注意过程可能较为漫长,需要耐心等待。
阿尔法元之五子棋源码解读(AlphaZero-Gomoku)
阿尔法元在五子棋领域的源码解析揭示了强化学习在简单游戏中的深度应用。相较于围棋,五子棋虽简单,但其源码分析同样能让我们深入理解强化学习的原理。AlphaZero,最初凭借阿尔法狗的深度学习技术,后在没有人类干预的情况下,通过三天自学围棋并超越前辈,展现了人工智能的新里程碑。
本文着重探讨AlphaZero在五子棋上的具体应用,源码可在GitHub上获取,路径公开。理解该项目的前提是对强化学习有一定基础,如马尔可夫决策过程和蒙特卡洛方法。项目主要包含策略价值网络、蒙特卡洛树搜索算法和训练脚本,它们共同构建了强化学习与深度学习的交互过程。
项目的架构包括游戏处理、MCTS算法实现、策略价值网络训练以及人机对战脚本。Game.py定义了棋盘和游戏逻辑,mcts_alphaZero.py与mcts_pure.py则是MCTS玩家的实现,分别对应AlphaZero和纯MCTS版本。policy_value_net.py负责网络模型,根据不同框架实现,如Tensorflow或Pytorch。train.py则实现了AlphaZero的训练流程,通过模拟对弈和数据增强来优化网络。
运行项目,你可以通过human_play.py与预训练的AI对战,感受强化学习的力量。源码剖析中,human_play.py脚本的核心是创建棋盘、玩家,并通过循环进行人机对弈,直到游戏结束。
roc指标源码
不同指标的应用是投资者们需要去了解的。有些技术指标检测市场动向,有些技术指标检测市场走势,各种指标加在一起就监控了整个市场的动态。其中roc指标是变动速率指标,那么roc指标源码是什么?变动率指标roc是将当日收盘价与一定时期前收盘价进行对比的一个指标,然后根据收盘价变动的比例,来测算价格波动的情况,再根据得到的趋势来预测个股接下来的走势,是中线线投资者长用到的一种技术指标。
roc指标的应用
据了解,这roc指标源码:A1:=AMO/VOL/;ROC:*(A1-REF(A1,))/REF(A1,);MAROC:MA(ROC,6);EROC:EMA(ROC,9);ZERO:0,COLOR,POINTDOT。
至于该指标的应用技巧怎么样?当roc向上则表示强势,以0为中心线,由中心线下上穿大于0时为买入信号;当roc向下则表示弱势,以0为中心线,由中心线上下穿小于0时为卖出信号;当股价创新高时,roc未能创新高,出现背离,表示头部形成;当股价创新低时,roc未能创新低,出现背离,表示底部形成。
解决 pyzero 创建游戏有中文报错的问题
在使用 MuEditor 创建 Pygame Zero 游戏时,遇到中文或中文注释导致的报错问题可通过以下步骤解决。
首先,定位错误提示信息中的本地 runner.py 文件,通常位于安装路径下的特定目录内。以"C:\Program Files (x)\Mu\pkgs\pgzero"作为示例,找到并打开 C 盘。
接着,打开 runner.py 文件,并使用记事本软件进行编辑。在文件中,执行 Ctrl+F 快捷键进行搜索。
在搜索框中输入 "src",找到如下代码段:with open(path) as f: src = f.read()。
对这段代码进行修改,将最后一行修改为:with open(path,'r',encoding='utf-8') as f: src = f.read()。
完成修改后,按 Ctrl+S 保存文件。之后,重新输入中文内容,问题将得到解决。
此外,若需在 MuEditor 中创建并运行 Pygame Zero 游戏,确保已安装 Pygame Zero 库。若未安装,可以通过以下步骤添加库支持。
在游戏源代码最上方添加以下导入语句:
import os
import sys
curpath=os.path.abspath(os.path.dirname(__file__))
rootpath=os.path.split(curpath)[0]
sys.path.append(rootpath)
执行这些代码后,即可成功运行游戏窗口。
LM训练 ZeRO系列
分布式训练的几个主题包括:
LLM训练 分布式通信,LLM训练 显存占用分析,LLM训练 高效训练方法,LLM训练 数据并行,LLM训练 ZeRO系列,LLM训练 流水线并行,LLM训练 张量并行,LLM训练 Megatron-LM 源码分析。
微软发布了四篇论文:
ZeRO: Memory optimizations Toward Training Trillion Parameter Models (/) - 提出了ZeRO-DP和 ZeRO-R
ZeRO-Offload: Democratizing Billion-Scale Model Training (/) - 微软
ZeRO-Infinity: Breaking the GPU Memory Wall for Extreme Scale Deep Learning (/) - 微软
ZeRO++: Extremely Efficient Collective Communication for Giant Model Training (/) - 微软
ZeRO1.1 概览
ZeRO包含两组优化:
(1)ZeRO-DP:减少模型状态PGO的显存占用
(2)ZeRO-R:减少剩余显存的消耗。
1.2 ZeRO-DP
目标是优化数据并行,减少显存冗余,最小化通信量。
原理是使用动态通信策略来分区优化器状态、梯度和参数。
实现是对模型参数进行分区,梯度也相应分区,优化器只优化本分区的参数。
两个原则:类型:
1.2.1 ZeRO-Stage 1
原理是对优化器状态进行分区,每个rank更新相应参数后,收集构成完整模型。
流程:通信分析:单个GPU总通信量为2*ψ。
1.2.2 ZeRO-Stage 2
在Stage1基础上,对梯度进行分区。
ZeRO-2分割Optimizer States与Gradients。
用完即删原则:每个rank只对自己负责的参数Pi的梯度进行规约。
通信分析:同ZeRO-Stage1,单个GPU总通信量为2*ψ。
1.2.3 ZeRO-Stage 3
在Stage1/Stage2基础上,对模型参数进行分区。
ZeRO-3分割Optimizer States、Gradients和Parameters。
需要用时去取原则:计算特定layer时,对参数进行all-gather。
通信分析:单个GPU总通信量为3*ψ。
1.2.4 动画视频
The video below shows how ZeRO (with all three stages) performs a training step including forward pass, backward pass, and parameter update.
1.2.5 实验效果
实验配置:G 8*A、全参训练,bs=1,checkpointing=True。
实验全参训练,最多只能跑B模型,B模型跑不起来。
1.2.6 ZeRO-DP VS DDP
1.3 ZeRO-R
1.3.1 中间激活值
认为checkpoint方法虽然有用,但在大型LLM中激活值仍然占用大量显存。
eg:B的LLM,bs=,激活值显存占用GB。
方法:Offload到CPU中。
1.3.2 临时缓存区
在梯度reduce操作中,用于存储中间结果的临时缓冲区会消耗大量显存。
方法:申请固定大小的缓存区 constant size buffers 。
1.3.3 内存碎片
原因:内存碎片是tensor生命周期错配的结果。
问题:即使有足够的显存,可能会因为缺少连续内存而使得内存分配失败。
方法:ZeRO为激活检查点和梯度预先分配连续内存块,并在初始化时将它们复制到预先分配的连续内存中。
2、ZeRO-Offload
利用CPU内存来解决GPU显存不足的问题。
CPU:参数更新在CPU完成。
GPU:前向和后向的计算在GPU上完成。
3、ZeRO-Infinity
利用外接存储设备来解决GPU显存不足的问题。
4、ZeRO++
to do...
5、Deepspeed ZeRO源码
5.1 入口
5.1.1 总入口initialize()
源码地址:deepspeed.__init__
简介:选择不同的engin引擎。
5.1.2 ZeRO引擎DeepSpeedEngine
源码地址:deepspeed.runtime.engine
整体流程及关键方法如下所示:
(1)DeepSpeedEngine.init
核心内容:最重要的就是对优化器(Optimizer)的初始化。
ZeRO 的核心特性的实现都在优化器(Optimizer)中,核心方法_configure_zero_optimizer() 。
stage1/2 优化器:DeepSpeedZeroOptimizer
stage3 优化器:DeepSpeedZeRoOffload
(2)DeepSpeedEngine.forward
核心内容:在模型model进行前向传播,返回loss,ZeRO不需要进行特殊处理
(3)DeepSpeedEngine.backward
核心内容:获得各个rank上对应分片参数Pi的梯度Gi。
self.optimizer.backward()
Zero stage1:self.optimizer.reduce_gradients()
Zero stage2:self.overlapping_partition_gradients_reduce_epilogue
(4)DeepSpeedEngine.step
核心内容:基于梯度Gi更新对应的分片参数Pi,各rank收集最新的、完整的模型参数P
self.optimizer.step()
self.optimizer.zero_grad()
5.2 DeepSpeedZeroOptimizer
源码地址:deepspeed.runtime.zero.stage_1_and_2
简介:stage1/2 优化器,对参数的Optimizer States与Gradients进行分割。
5.2.1 init
核心思路:ZeRO初始化时候会对参数进行均匀切分给各个rank。通过参数分区,进而实现梯度、优化器的分区。
除此之外,注册梯度钩子函数reduce_partition_and_remove_grads(当梯度计算完成时自动调用该函数)
5.2.2 forward
在模型model进行前向传播,返回loss,ZeRO不需要进行特殊处理。
5.2.3 backward
5.2.4 reduce_ipg_grads()
ipg:Independent Parallel Gradient
简介:对连续的ipg梯度进行reduce。