采用遗传算法搜索MAC效率最高的矩阵乘规模
如何采用遗传算法搜索MAC效率最高的矩阵乘规模
- 具体实现
- MAC效率评估代码(eval.py)
- 遗传算法实现
本文介绍了采用遗传算法搜索MAC效率最高的矩阵乘规模
需求背景:
- 一些AI加速卡在做矩阵乘时,因硬件或软件的约束,并不是规模越大MAC效率越高
- 在测试AI加卡的实际算力时,采用MAC效率最高的M,K,N会显得比较好看.能接近宣称的理论性能
- 因此,可以将该问题变成一个优化的问题。M,K,N是变量,目标是最大化实测FLOPS
- 由于某些规模的矩阵乘,加速卡不支持或有BUG,并不是所有的的优化算法都适用。经测试发现,遗传算法适合该场景
具体实现
MAC效率评估代码(eval.py)
# eval.pyimport os
import sys
import torch
import time
import numpy as np
from calflops import calculate_flopsclass MatMulModel(torch.nn.Module):def __init__(self,M,N,K):super(MatMulModel, self).__init__()self.b=torch.nn.Parameter(torch.randn(K, N))def forward(self,x):return torch.matmul(x, self.b)def evaluate(M,N,K):model=MatMulModel(M,N,K).eval()input_tensor = torch.randn(M,K)FLOPS=M*N*K flops, macs, params = calculate_flops(model, input_shape=(M,K))print(flops)def build_and_warmup(model,M,N,K):#省略return engine def forward(engine,input,count):for i in range(count):engine.run(input)return 0 engine=build_and_warmup(model,M,N,K)t0=time.time()count=3forward(engine,input_tensor,count)t1=time.time()flops=(count*FLOPS)/(t1-t0)tflops=flops/1000/1000/1000/1000print("MatMulResult,{},{},{},{},{:.3f}".format(M,N,K,FLOPS,tflops))return tflopsif __name__ == "__main__":evaluate(int(sys.argv[1]),int(sys.argv[2]),int(sys.argv[3]))
遗传算法实现
import os
import sys
import time
import numpy as np
import geatpy as ea
import subprocessdef eval(M,N,K):cmd="python eval.py {} {} {} > rlog.txt 2>&1".format(M,N,K)if os.path.exists("rlog.txt"):os.remove("rlog.txt")try:p=subprocess.Popen(cmd,shell=True)p.wait()with open("rlog.txt","r") as f:content = [s for s in f.readlines() if s.find("MatMulResult")>=0]if len(content)==1:ret=float(content[0].strip().split(",")[5])return retexcept:passprint("{}:{}:{} device error,reboot".format(M,N,K))p=subprocess.Popen("reboot device cmd",shell=True)p.wait()time.sleep(5)return 0class MatMulParamsProblem(ea.Problem):def __init__(self):name = 'MatMulParamsProblem' # 初始化name(函数名称,可以随意设置)M = 1 # 初始化M(目标维数)maxormins = [-1] # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)Dim = 3 # 初始化Dim(决策变量维数)varTypes = [1,1,1] # 初始化varTypes(决策变量的类型,元素为0表示对应的变量是连续的;1表示是离散的)self.Ms=range(16,10240,16)self.Ns=range(16,10240,16)self.Ks=range(16,10240,16)lb = [0,0,0] # 决策变量下界ub = [len(self.Ms),len(self.Ns),len(self.Ks)] # 决策变量上界lbin = [1,1,1] # 决策变量下边界(0表示不包含该变量的下边界,1表示包含)ubin = [0,0,0] # 决策变量上边界(0表示不包含该变量的上边界,1表示包含)# 调用父类构造方法完成实例化ea.Problem.__init__(self,name,M,maxormins,Dim,varTypes,lb,ub,lbin,ubin)def evalVars(self, Vars):output=[]for Var in Vars:VarInt = Var.astype(np.int32)M = self.Ms[VarInt[0]]N = self.Ns[VarInt[1]]K = self.Ks[VarInt[2]]tflops=eval(M,N,K)print("{:05d},{:05d},{:05d},{:.3f}".format(M,N,K,tflops))output.append(tflops)return np.array(output).reshape(-1,1)def calReferObjV(self):referenceObjV = np.array([[33]])return referenceObjVdef main():# 实例化问题对象problem = MatMulParamsProblem()# 构建算法algorithm = ea.soea_DE_rand_1_bin_templet(problem,ea.Population(Encoding='RI', NIND=50),MAXGEN=25, # 最大进化代数。logTras=1, # 表示每隔多少代记录一次日志信息,0表示不记录。trappedValue=1e-3, # 单目标优化陷入停滞的判断阈值。maxTrappedCount=10) # 进化停滞计数器最大上限值。algorithm.mutOper.F = 0.5 # 差分进化中的参数F。algorithm.recOper.XOVR = 0.2 # 差分进化中的参数Cr。# 求解res = ea.optimize(algorithm,verbose=True,drawing=3,outputMsg=True,drawLog=True,saveFlag=True,dirName="./GaQaunt")print(res)if __name__ == "__main__":main()
相关文章:
采用遗传算法搜索MAC效率最高的矩阵乘规模
如何采用遗传算法搜索MAC效率最高的矩阵乘规模 具体实现MAC效率评估代码(eval.py)遗传算法实现 本文介绍了采用遗传算法搜索MAC效率最高的矩阵乘规模 需求背景: 一些AI加速卡在做矩阵乘时,因硬件或软件的约束,并不是规模越大MAC效率越高在测试AI加卡的实际算力时,采用MAC效率最…...
流计算之Flink
文章目录 概要有界无界流集群JobManagerTaskManagersTasks 和算子链Task Slots 和资源 小结 概要 Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模…...
【Linux基础】Linux自动化构建工具make/makefile
背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后…...
问题慢慢解决-通过android emulator调试android kernel-内核条件断点遇到的问题和临时解决方案
起因 在摸索到这个方案之后,mac m1调试aarch64 android kernel最终方案,就准备调试内核了,预备下断点的地方是 b binder_poll b ep_ptable_queue_proc b remove_wait_queue但是由于是android系统,上面三个函数会被频繁的触发&am…...
社区发现之标签传播算法(LPA)
在Graph领域,社区发现(Community detection)是一个非常热门且广泛的话题,后面会写一个系列,该问题实际上是从子图分割的问题演变而来,在真实的社交网络中,有些用户之间连接非常紧密,有些用户之间的连接较为稀疏,连接紧密的用户群体可以看做一个社区,在风控问题中,可…...
【前端素材】推荐优质后台管理系统Dashy平台模板(附源码)
一、需求分析 后台管理系统(或称作管理后台、管理系统、后台管理平台)是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成,为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…...
MFC 配置Halcon
1.新建一个MFC 工程,Halcon 为64位,所以先将工程改为x64 > VC 目录设置包含目录和库目录 包含目录 库目录 c/c ->常规 链接器 ->常规 > 链接器输入 在窗口中添加头文件 #include "HalconCpp.h" #include "Halcon.h"…...
xss-跨站脚本攻击漏洞
前备知识: Cookie和Session是Web开发中用于维持用户状态、跟踪用户会话的核心技术,它们的主要目的是在无状态的HTTP协议基础上实现有状态的用户交互。 **Cookie**: - Cookie是一种由服务器发送到客户端(通常是用户的浏览器&#x…...
在MFC对话框中嵌入web网页时事件失效问题
2010-04-20 日志 在MFC对话框中嵌入web网页时,网页初始化中添加事件无效 document.body.onkeydown function () {//onkeydown"keydownbody()" 不能激发alert(event.keyCode);if(event.keyCode 27)//VK_ESCAPE //String.fromcharcode(A);{if (external…...
【Leetcode】235. 二叉搜索树的最近公共祖先
文章目录 题目思路代码结果 题目 题目链接 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度…...
python 基础语法及保留字
编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*-上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码,对应适合语…...
Parade Series - NVR Stat
获取文件夹占用空间信息 DIR %NVRHOME% /W /SDIR %NVRHOME% /s | tail -n2 | sed s/,//g | awk {if(NR1){key"Used";}else{key"Free";};sum$3/(1024*1024);unit"MB";if(sum^>1024){sumsum/1024;unit"GB";}printf("{\"Ty…...
【shell脚本实战学习笔记】#2
场景描述 你负责一个Web应用的运维工作,该应用部署在一组Linux服务器上。你需要编写一个Shell脚本来自动化以下任务: 检查Web服务器进程: 确保Web服务器(例如Apache或Nginx)正常运行。如果没有运行,则尝试…...
docker 安装nacos 一脚shell脚本
要创建一个用于安装Nacos的Docker的Shell脚本,你可以按照以下步骤进行。这个脚本会执行以下操作: 拉取Nacos的Docker镜像。创建一个Docker容器并映射必要的端口。设置Nacos的环境变量。如果需要,可以持久化存储数据到本地目录。 以下是一个…...
mysql的隔离级别,和实现
参考链接 https://xiaolincoding.com/mysql/transaction/mvcc.html#%E4%BA%8B%E5%8A%A1%E7%9A%84%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB%E6%9C%89%E5%93%AA%E4%BA%9B 事务特性(ACID) 原子性(Atomicity): 事务是原子的&…...
Linux的信号
Linux的信号是一种用于进程之间通信的机制。它们用于向进程发送通知,告知进程发生了某种事件或请求进程执行某个操作。信号可以由内核、其他进程或进程自身发送。 信号的作用有以下几个方面: 通知进程某个事件的发生,如进程的终止、挂起、恢…...
Spring数据脱敏实现
在当今的数字化时代,数据安全和个人隐私保护变得日益重要。为了遵守各种数据保护法规,如欧盟的GDPR(通用数据保护条例),企业在处理敏感信息时需要格外小心。数据脱敏是一种常见的技术手段,用于隐藏敏感数据…...
Java核心-核心类与API(4)
话接上回,继续核心类与API的学习,最后介绍一下Object类以及与数学、日期/时间有关的类,就结束该部分的学习了,其他的根据需要自行了解。 一、Object类 1、概述 Object 是 Java 类库中的一个特殊类,也是所有类的父类…...
【C语言】详解计算机二级c语言程序题
文章目录 前言资料相关程序题 一(字符串)程序题 二(数组)程序题 三(基础)程序题 四(结构体)程序题 五(结构体)程序题 六(基础) 前言 …...
限流算法
下面对常见的限流算法进行讨论。目前,常用的限流算法主要有三种:计数器法、滑动窗口算法、漏桶算法和令牌桶算法。下面分别介绍其原理。 1. 计数器法 计数器法是通过计数对到来的请求进行选择性处理。如系统限制一秒内最多有X个请求,则在该…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...
