1.AI与PDE(七):AFNO模型的源码源代码解析
2.大神用Python做个AI出牌器,实现财富自由附源码
3.腾讯T2I-adapter源码分析(3)-训练源码分析
4.腾讯T2I-adapter源码分析(1)-运行源码跑训练
5.图解UE4源码AI行为树系统 其二 一棵行为树是资料怎么被运行起来的
6.腾讯T2I-adapter源码分析(2)-推理源码分析
AI与PDE(七):AFNO模型的源代码解析
本文旨在解析AFNO模型的源代码,帮助读者理解模型细节与主干结构。源码首先,资料AFNO模型的源码主干框架在afnonet.py文件中定义,通过类AFNONet实现。资料两个安卓手机互传图片源码模型的源码核心功能封装在多个类与函数中,依据代码注释逐步解析。资料
在代码中,源码forward_features函数负责模型的资料核心逻辑,包括patch切割与mixing过程。源码这些操作由PatchEmbed类实现。资料位置编码self.pos_embed通过高斯初始化得到,源码增加模型的资料表示能力。
关键模块AFNO2d位于代码中,源码它基于FNO的原理,负责处理输入数据。AFNO2d模块在forward_features函数中通过循环调用,实现数据的转换与混合。
经过数个L layer处理后,模型进入类似解码器的结构,用于将中间结果映射为目标结果。这一过程通过self.head(x)实现,以解决特定分类问题。
本文通过梳理代码流程与结构图,直观展示了AFNO模型的工作原理。读者可参考AFNO的GitHub源代码与论文,深入理解细节。后续文章将继续探讨基于AFNO模型框架的其他应用,如FourCastNet。
大神用Python做个AI出牌器,实现财富自由附源码
在互联网上,我注意到一个有趣的开源项目——快手团队的DouZero,它将AI技术应用到了斗地主游戏中。今天,我们将通过学习如何使用这个原理,来制作一个能辅助出牌的欢乐斗地主AI工具,也许它能帮助我们提升游戏策略,迈向财富自由的境界。 首先,让我们看看AI出牌器的网页源码去广告实际运作效果: 接下来,我们逐步构建这个AI出牌器的制作过程:核心功能与实现步骤
UI设计:首先,我们需要设计一个简洁的用户界面,使用Python的pyqt5库,如下是关键代码:
识别数据:在屏幕上抓取特定区域,通过模板匹配识别AI的手牌、底牌和对手出牌,这部分依赖于截图分析,核心代码如下:
地主确认:通过截图确定地主身份,代码负责处理这一环节:
AI出牌决策:利用DouZero的AI模型,对每一轮出牌进行判断和决策,这部分涉及到代码集成,例如:
有了这些功能,出牌器的基本流程就完成了。接下来是使用方法:使用与配置
环境安装:你需要安装相关库,并配置好运行环境,具体步骤如下:
位置调整:确保游戏窗口设置正确,AI出牌器窗口不遮挡关键信息:
运行测试:完成环境配置后,即可启动程序,与AI一起战斗:
最后,实际操作时,打开斗地主游戏,让AI在合适的时间介入,体验AI带来的智慧策略,看看它是否能帮助你赢得胜利!腾讯T2I-adapter源码分析(3)-训练源码分析
随着stable-diffusion和midjourney等AI技术展现令人惊叹的艺术创作,人们对AI可控绘图的追求日益高涨。为提升AI图像生成的可控性,Controlnet和T2I-adapter等解决方案应运而生。系列文章将从T2I-adapter的源码出发,深入剖析其训练部分的实现原理。
本篇我们将聚焦于训练源码的解析,通过代码结构的梳理,了解T2I-Adapter的训练流程。
训练代码的运行涉及数据处理、模型加载、优化器设置以及实际训练过程。在第一部分,我们首先设置参数并加载数据,如DepthDataset,它从txt文件中读取、友价源码内核对应的深度图和文本描述。
在模型加载阶段,我们区分了stable-diffusion模型和adapter。stable-diffusion模型加载时,其配置与推理阶段有所差异,如增加调度器参数、提高精度、调整分辨率和训练相关参数。adapter模型的加载则遵循推理过程中的初始化方法,通过构建不同模块来实现。
训练过程中,adapter模型的关键结构包括下采样、卷积和ResnetBlock的使用,相比controlnet,T2I-adapter的参数更少,没有注意力层,这使得训练更为高效。模型放入GPU后,使用adamW优化器进行训练,同时设置学习率和数据保存路径。
状态恢复部分,程序会判断是否从头开始或恢复训练,设置log信息。接下来,代码进入实际的训练循环,包括条件编码、隐藏状态生成、adapter结果附加至sd模型以及adapter梯度计算。
loss函数定义在模型配置中,采用L2损失来衡量生成图像与给定时间点加噪ground truth的接近程度。训练过程中,loss计算和模型保存都在代码中明确体现。
总的来说,T2I-adapter的训练源码展示了精细的结构和参数设置,确保了AI绘画的可控性和性能。在AI艺术的探索中,每一行代码都承载着技术进步的点滴痕迹。
腾讯T2I-adapter源码分析(1)-运行源码跑训练
稳定扩散、midjourney等AI绘图技术,为人们带来了令人惊叹的站群链接源码效果,不禁让人感叹技术发展的日新月异。然而,AI绘图的可控性一直不是很好,通过prompt描述词来操控图像很难做到随心所欲。为了使AI绘制的图像更具可控性,Controlnet、T2I-adapter等技术应运而生。本系列文章将从T2I-adapter的源码出发,分析其实现方法。
本篇是第一篇,主要介绍源码的运行方法,后续两篇将以深度图为例,分别分析推理部分和训练部分的代码。分析T2I-Adapter,也是为了继续研究我一直在研究的课题:“AI生成同一人物不同动作”,例如:罗培羽:stable-diffusion生成同一人物不同动作的尝试(多姿势图),Controlnet、T2I-adapter给了我一些灵感,后续将进行尝试。
T2I-Adapter论文地址如下,它与controlnet类似,都是在原模型增加一个旁路,然后对推理结果求和。
T2I-Adapter和controlnet有两个主要的不同点,从图中可见,其一是在unet的编码阶段增加参数,而controlnet主要是解码阶段;其二是controlnet复制unit的上半部结构,而T2I-Adapter使用不同的模型结构。由于采用较小的模型,因此T2I-Adapter的模型较小,默认下占用M左右,而controlnet模型一般要5G空间。
首先确保机器上装有3.6版本以上python,然后把代码clone下来。随后安装依赖项,打开requirements.txt,可以看到依赖项的内容。然后下载示例,下载的会放到examples目录下。接着下载sd模型到model目录下,斗牛圈app源码再下载T2I-Adapter的模型到目录下,模型可以按需到huggingface.co/TencentA...下载。这里我下载了depth和openpose。sd模型除了上述的v1-5,也还下载了sd-v1-4.ckpt。
根据文档,尝试运行一个由深度图生成的例子,下图的左侧是深度图,提示语是"desk, best quality, extremely detailed",右侧是生成出来的。运行过程比较艰辛,一开始在一台8G显存的服务器上跑,显存不够;重新搭环境在一台G显存的服务器上跑,还是不够;最后用一台G显存的服务器,终于运行起来了。
接下来尝试跑openpose的例子,下图左侧是骨架图,提示词为"Iron man, high-quality, high-res",右侧是生成的图像。
既然能跑推理,那么尝试跑训练。为了后续修改代码运行,目标是准备一点点数据把训练代码跑起来,至于训练的效果不是当前关注的。程序中也有训练的脚步,我们以训练深度图条件为例,来运行train_depth.py。
显然,习惯了,会有一些问题没法直接运行,需要先做两步工作。准备训练数据,分析代码,定位到ldm/data/dataset_depth.py,反推它的数据集结构,然后准备对应数据。先创建文件datasets/laion_depth_meta_v1.txt,用于存放数据文件的地址,由于只是测试,我就只添加两行。然后准备,图中的.png和.png是结果图,.depth.png和.depth.png是深度图,.txt和.txt是对应的文本描述。
文本描述如下,都只是为了把代码跑起来而做的简单设置。设置环境变量,由于T2I-Adapter使用多卡训练,显然我也没这个环境,因此要让它在单机上跑。而代码中也会获取一些环境变量,因此做简单的设置。
做好准备工作,可以运行程序了,出于硬件条件限制,只能把batch size设置为1。在A显卡跑了约8小时,完成,按默认的配置,模型保存experiments/train_depth/models/model_ad_.pth。那么,使用训练出来的模型试试效果,能生成如下(此处只是为了跑起来代码,用训练集来测试),验证了可以跑起来。
运行起来,但这还不够,我们还得看看代码是怎么写法,下一篇见。
PS:《直观理解AI博弈原理》是笔者写的一篇长文,从五子棋、象棋、围棋的AI演进讲起,从深度遍历、MAX-MIN剪枝再到蒙特卡罗树搜索,一步步介绍AI博弈的原理,而后引出强化学习方法,通俗易懂地介绍AlphaGo围棋、星际争霸强化学习AI、王者荣耀AI的一些强化学习要点,值得推荐。
AUTOMATIC的webui是近期很流行的stable-diffusion应用,它集合stable-diffusion各项常用功能,还通过扩展的形式支持controlnet、lora等技术,我们也分析了它的源码实现,写了一系列文章。
图解UE4源码AI行为树系统 其二 一棵行为树是怎么被运行起来的
在本系列的第三部分,我们将深入探讨行为树的运行过程。首先,行为树的运行分为几个关键步骤:发起行为树运行
行为树的运行可以通过两种方式启动:调用AAIController::RunBehaviorTree()函数。
通过Run Behavior任务节点执行子行为树。
抽象逻辑理解
理解流程时,想象一个抽象流程图,我们将讲解分为蓝色泳道(检查和加载)和红色泳道(初始化和执行)。检查和加载子树
开始前,UBehaviorTreeComponent会对子树进行三项检查:确保子树使用的黑板资源与父树一致。
确保全局的UBehaviorTreeManager可用。
确认发起节点的父节点是否允许push新子树,如SimpleParallel节点限制。
树的加载
检查通过后,进入资源加载阶段,首先尝试从缓存获取数据,避免重复加载。缓存和数据初始化
加载行为树资源,如果缓存中有匹配的模板,直接返回。否则,创建新模板并计算节点初始化信息,包括内存需求和执行顺序。执行树的初始化
加载完成后,进一步在UBehaviorTreeComponent::PushInstance中初始化FBehaviorTreeInstance和FBehaviorTreeInstanceId,设置内存偏移,填充数组,然后将新实例入栈并标记为活跃。行为树的执行
最后,执行新树,从根节点的service开始,然后执行根节点,进入下一轮迭代。后续的节点执行细节将作为下一部分内容。腾讯T2I-adapter源码分析(2)-推理源码分析
随着stable-diffusion和midjourney展示出AI绘图的惊人潜力,人们对技术进步的惊叹不已。然而,AI绘图的可控性一直是痛点,仅凭描述词控制图像并不尽如人意。为增强AI图像的可控性,Controlnet和T2I-adapter等技术应运而生。本文将通过解析T2I-adapter的推理源码,揭示其工作原理。
本文将深入剖析推理部分的代码,以便理解T2I-Adapter的实际操作。使用如下的命令行指令进行推理,如test_adapter.py,它需要指定条件类型、深度图路径、前置处理器类型、提示语、模型和缩放尺寸等参数。
在test_adapter.py中,主要分为参数读取、模型加载和推理运算三个步骤。参数读取部分包括检查支持的条件、构建提示语,以及根据输入选择前置处理。模型加载涉及stable-diffusion和adapter模型,前者通过配置加载,后者根据输入条件构造Adapter模型。
加载stable-diffusion模型时,代码引用了来自github的CompVis/stable-diffusion库,其中关键部分包括加载参数、模型配置以及UNetModel的改动。Adapter模型的构造与论文中的结构图一致,通过ResnetBlock的组合实现。
在推理过程中,先对输入进行预处理,如深度图的处理。随后,get_adapter_feature和diffusion_inference两个核心函数调用adapter模型,与stable-diffusion模型结合进行特征融合和采样。最后,DDIM采样器接收并处理adapter特征,最终生成图像。
通过以上分析,我们逐步揭示了T2I-adapter的推理机制。后续文章将探讨训练代码。在游戏开发中,AI生成游戏角色动作的应用,如AUTOMATIC,展示了这种技术的实际应用,以解决美术资源匮乏的问题。
OpenAI/Triton MLIR 第零章: 源码编译
本文旨在深入探讨开源AI项目OpenAI Triton MLIR,着重介绍Triton作为编程语言与编译器在GPU加速计算领域的应用与优化。Triton为用户提供了一种全新的方式,通过将其后端接入LLVM IR,利用NVPTX生成GPU代码,进而提升计算效率。相较于传统CUDA编程,Triton无需依赖NVIDIA的nvcc编译器,直接生成可运行的机器代码,体现出其在深度学习与数据科学领域的高性能计算潜力。Triton不仅支持NVIDIA GPU,还计划扩展至AMD与Intel GPU,其设计基于MLIR框架,通过Dialect支持多样化后端。本文将从源码编译角度出发,逐步解析Triton的设计理念与优化策略,为研究编译技术和系统优化的工程师提供宝贵资源。
首先,需要访问Triton的官方网站,克隆其官方代码库,以便后续操作。构建过程涉及两个重要依赖:LLVM与pybind。LLVM作为Triton的核心后端,通过将高级Python代码逐步转换至LLVM IR,最终生成GPU可运行代码,体现了其在计算优化领域的优势。pybind组件则用于封装C++/CUDA或汇编代码,实现Python DSL与高性能组件的无缝集成。
接下来,将LLVM与pybind分别编译安装,通过手动配置指定路径,确保编译过程顺利进行。LLVM的安装对于基于Triton进行二次开发的工程师和研究人员至关重要,因为它为Triton提供了强大的计算基础。在特定的commit ID下编译Triton,确保与后续版本兼容。
在编译过程中,配置pybind同样至关重要,它允许用户通过Python API调用高性能组件,实现自动化生成高性能算子。完成编译后,生成的.so文件(libtriton.so)为后续Triton的Python接口提供了支持。
将libtriton.so移动至triton/python/triton/_C目录下,确保Python路径正确配置,实现无缝导入与调用。通过简单的import triton命令,即可开启Triton的开发之旅。验证Triton性能,可以选择tutorials目录下的示例代码,如-matrix-multiplication.py,通过运行该脚本,观察Triton在GPU上的性能表现。
Triton在NVGPU上的成熟映射路线,从抽象的Python DSL到贴近GPU层面的IR,最终生成高效机器代码,体现了其在高性能计算领域的优越性。Triton未来的发展蓝图将支持更多前端语言,对接不同硬件厂商的硬件,实现高效映射,满足多样化计算需求。
AI顶底公式?
已通达信为例,AI分时顶底公式如下:趋势:SMA(((CLOSE-LLV(LOW,))/(HHV(HIGH,)-LLV(LOW,))*),3,1) ,COLORGREEN;
STICKLINE(趋势>,趋势,,4,0),COLORB;
STICKLINE(>趋势,趋势,,4,0),COLOR;
IF(趋势>, 趋势,DRAWNULL), COLORRED;
RSV:=(CLOSE-LLV(CLOSE,9))/(HHV(CLOSE,9)-LLV(CLOSE,9))*;
K:=SMA(RSV,3,1);
D:=SMA(K,3,1);
TYP:=(HIGH+LOW+CLOSE)/3;
CCI:=(TYP-MA(TYP,))/(0.*AVEDEV(TYP,));
DIFF:=EMA(CLOSE,2)-EMA(CLOSE,);
DEA:=EMA(DIFF,6);
MACD:=2*(DIFF-DEA);
转点:=IF(K>D AND CCI>0 AND DIFF>DEA AND MACD>0,1,0);
STICKLINE(转点=1,,,6,0),COLORYELLOW;
STICKLINE(转点=0,,,6,0),COLORCYAN;
顶部:,COLORYELLOW;
底部:,COLORCYAN;
判断:SMA(趋势,3,1),COLORFFFF, LINETHICK2;
IF( 趋势>判断,判断,DRAWNULL), COLORYELLOW, LINETHICK2;
IF( 趋势<判断,判断,DRAWNULL) ,COLORFFF,LINETHICK2;
DRAWICON(CROSS(趋势,判断),判断,1);
DRAWICON(CROSS(趋势,顶部),顶部,2);
LC:= REF(CLOSE,1);
RSI:=SMA(MAX(CLOSE-LC,0),6,1)/SMA(ABS(CLOSE-LC),6,1)*;
VAR1:=(HHV(HIGH,9)-CLOSE)/(HHV(HIGH,9)-LLV(LOW,9))*-;
VAR2:=SMA(VAR1,9,1)+;
VAR3:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*;
VAR4:=SMA(VAR3,3,1);
VAR5:=SMA(VAR4,3,1)+;
VAR6:=VAR5-VAR2;
短线1: IF(VAR6>,VAR6-,0),COLORA6B8C1;
VAR2Q:=REF(LOW,1);
VAR3Q:=SMA(ABS(LOW-VAR2Q),3,1)/SMA(MAX(LOW-VAR2Q,0),3,1)*;
VAR4Q:=EMA(IF(CLOSE*1.3,VAR3Q*,VAR3Q/),3);
VAR5Q:=LLV(LOW,);
VAR6Q:=HHV(VAR4Q,);
VAR7Q:=IF(MA(CLOSE,),1,0);
VAR8Q:=EMA(IF(LOW<=VAR5Q,(VAR4Q+VAR6Q*2)/2,0),3)/*VAR7Q;
VR2:=REF(LOW,1);
VR3:=SMA(ABS(LOW-VR2),3,1)/SMA(MAX(LOW-VR2,0),3,1)*;
VR4:=EMA(IF(CLOSE*1.3,VR3*,VR3/),3);
VR5:=LLV(LOW,);
VR6:=HHV(VR4,);
VR7:=IF(MA(CLOSE,),1,0);
VR8:=EMA(IF(LOW<=VR5,(VR4+VR6*2)/2,0),3)/*VR7;
VR9:=IF(VR8>,,VR8);
主力进场:STICKLINE(VR9>-,0,VR9,3,0), , COLORFFFF;
洗盘:IF(VR9<REF(VR9,1),VR9,0),COLORGREEN,NODRAW;
STICKLINE(VR9<REF(VR9,1),0,VR9,3,0),COLORGREEN;
短线获利:STICKLINE(REF("KDJ.J",1)<0 AND "KDJ.J">0,,,2,0),COLORYELLOW;
VARK1:=(CLOSE-LLV(LOW,))/(HHV(HIGH,)-LLV(LOW,))*;
VARK2:=REVERSE(VARK1);
VARK3:=SMA(VARK1,3,1);
逃顶:=CROSS(,RSI);
STICKLINE( 逃顶,逃顶,,5,0),COLORFF;
STICKLINE( 逃顶,逃顶,,3,0),COLORFF;
STICKLINE( 逃顶,逃顶,,2,0),COLORFFAA;
STICKLINE( 逃顶,逃顶,,1,0),COLORFFCC;
D1:=(C+L+H)/3;
D2:=EMA(D1,6);
D3:=EMA(D2,5);
BBUY:=CROSS(D2,D3);
风险区:,COLORFFFF;
安全区:,COLORYELLOW,POINTDOT;
天线:,COLORFFFF;
强弱线:,COLORGREEN,POINTDOT;
DRAWICON(BBUY,(LOW *1),1);
VARR1:=SMA(MAX(CLOSE-REF(C,1),0),6,1)/SMA(ABS(CLOSE-REF(C,1)),6,1)*;
DRAWICON(CROSS(,VARR1),HIGH,);
DRAWTEXT(CROSS(,VARR1),,'逃'),COLORYELLOW;
MAV:=(2*C+H+L)/4;
VAR9:=LLV(LOW,);
VAR7:=HHV(HIGH,);
SK:= EMA((MAV-VAR9)/(VAR7-VAR9)*,);
SD: EMA(0.*REF(SK,1)+0.*SK,2);
高抛:, POINTDOT;
低吸:, POINTDOT;
强弱分界:, POINTDOT;
DRAWTEXT(CROSS(SD,),低吸,'●主力'),COLORF0FF,LINETHICK3;