1.树莓派Zero 2W安装Pyocd经验分享
2.fs/dev/zero的源码实现
3.分享几个开源的Python游戏代码
4.LM训练05 ZeRO系列
5.roc指标源码
6.当函数类型为整型时类型标识符可以省略吗?
树莓派Zero 2W安装Pyocd经验分享
树莓派Zero 2W安装Pyocd的经验分享,我直接跳过系统的源码安装配置和更新软件源的部分,因为这些网上都有详尽的源码指南。树莓派内置的源码烧写系统流程简单,但有几个关键步骤需要特别注意。源码
首要任务是源码溯源码证明安装libusb库,这是源码Pyocd运行的基础。紧随其后,源码我需要安装pip(由于没有预先安装,源码这部分是源码必要的)。随后更新pip版本,源码确保兼容性。源码
安装过程中,源码理解python命令前加sudo与不加的源码区别十分重要。它们操作在不同的源码环境中,因此避免混淆。
下载并解压pyocd源码后,我遇到了一个挑战:Zero 2W的内存限制导致编译过程异常。官方文档指出问题可能与CMSIS-Pack-Manager有关,但经过实际测试,我发现卡死的原因是capstone包,一个用于反编译的工具。由于我主要使用Zero 2W来下载程序,因此并不需要编译capstone包。如果需要反编译功能,可以尝试交叉编译或在4B上编译后复制到Zero 2W。javaaqs框架源码
解决capstone包的问题,我注释了该包,并在项目根目录的setup.cfg文件中进行调整。随后,我执行编译命令,加入了sudo以获得足够的权限访问USB调试设备。尝试发现,Zero 2W在执行此命令时存在权限问题,但4B和Zero W并无此困扰。因此,我选择将pyocd编译到管理员目录下,成功解决了权限问题。
成功编译后,我尝试烧写固件,这一过程顺利无阻。如果你也想烧写F,可以参考特定的安装指南,注意过程可能较为漫长,需要耐心等待。
fs/dev/zero的实现
在类UNIX操作系统中,/dev/zero是一个特殊文件,提供无限空字符流。常用于覆盖信息或生成特定大小空白文件。其实现依赖于mmap将/dev/zero映射至虚地址空间,实现共享内存。印度zj源码该操作等同于匿名内存使用,即没有与任何文件关联。系统分配内容(通过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,提供深入分析。
分享几个开源的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...
进击的wcdb源码分析豌豆,源代码链接:pan.baidu.com/s/1YcojAC...
提取码:tsfm
以上游戏均采用Pygame Zero库(简称Pgzero)开发。Pgzero是Pygame的精简版本,能够实现Pygame库的主要功能,同时屏蔽了复杂的细节,对新手十分友好。
若想快速了解Pgzero,可以参考下文:
若要全面系统学习Pgzero,可以参考《趣学Python游戏编程》一书。该书通过十个经典游戏案例,深入浅出地介绍了游戏编程的基本原理,以及Pgzero的具体使用方法。相信学完这本书后你也能开发出上面这样精彩的Python游戏。
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。
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未能创新低,出现背离,表示底部形成。
当函数类型为整型时类型标识符可以省略吗?
当函数返回类型为整型(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()
{ }
四、下面是源码截图和运行结果截图
源码截图
运行结果截图
阿尔法元之五子棋源码解读(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脚本的核心是创建棋盘、玩家,并通过循环进行人机对弈,直到游戏结束。