随机生成pytorch算子测试序列且保证算子参数合法

2024-05-29 18:52

本文主要是介绍随机生成pytorch算子测试序列且保证算子参数合法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

随机生成pytorch算子测试序列且保证算子参数合法

  • 代码
  • 输出

背景:

1.一些对维度进行操作的算子的单算子测试,结果正常,但多个算子组合在一起,结果就不对。是否能给一个算子列表,随机生成它们的组合呢

功能描述:

1.此程序用于在 CUDA 环境中生成随机张量并对其施加一系列随机选择的操作

2.程序首先随机生成张量的形状和内容,然后随机选择一个操作(如 reshapetransposematmul 等),并生成适当的参数以执行该操作

3.最终输出变换后的张量并打印相关操作信息

4.整个过程在100次不同的种子下每次进行10次操作,以保证操作的多样性和结果的随机性

代码

import torch
import random
from functools import reduce
from operator import mul
import numpy as npmax_size = 4096  # 每个维度的最大大小
max_tensor_elements = 1*4096*4096  # 张量中元素的总数限制min_dim_size = 1  # 最小维度大小
max_dim_size = max_size  # 扩大这个范围可以更快生成符合要求的大小def generate_random_shape(dim, max_attempts=10):for _ in range(max_attempts):shape = [random.randint(min_dim_size, max_dim_size) for _ in range(dim)]if reduce(mul, shape, 1) <= max_tensor_elements:return tuple(shape)# 兜底策略,防止尝试次数用尽:再遍历生成的随机形状,逐个将维度缩小直到符合限制shape = [random.randint(1, max_size) for _ in range(dim)]current_elements = reduce(mul, shape, 1)while current_elements > max_tensor_elements:for i in range(len(shape)):if shape[i] > 1:shape[i] //= 2current_elements = reduce(mul, shape, 1)if current_elements <= max_tensor_elements:breakreturn tuple(shape)def generate_random_input(shape):return torch.randn(shape).to("cuda").half()def generate_random_operator(input_shape):operators = ['unsqueeze', 'repeat', 'permute', 'transpose', 'reshape', 'expand', 'contiguous', 'matmul', 'mul', 'concat',"view"]return random.choice(operators)def generate_random_reshape(input_shape):# 计算输入张量的总元素数total_elements = np.prod(input_shape)divisors = []# 找到 total_elements 的所有约数for i in range(1, int(np.sqrt(total_elements)) + 1):if total_elements % i == 0:divisors.append(i)if i != total_elements // i:divisors.append(total_elements // i)dimensions = []remaining_elements = total_elements# 随机选择新的维度并且保证元素数量不变while remaining_elements > 1 and len(dimensions) < len(input_shape):divisor = np.random.choice(divisors)dimensions.append(divisor)remaining_elements //= divisordivisors = [d for d in divisors if remaining_elements % d == 0]if remaining_elements > 1:dimensions.append(remaining_elements)    np.random.shuffle(dimensions)    return tuple(dimensions)def generate_reshape_params(tensor):return generate_random_reshape(tensor.shape)def random_transpose_params(tensor):return random.sample(range(tensor.dim()), 2)def generate_repeat_params(input_shape):while True:repeats = [random.randint(1, 4) for _ in input_shape]if reduce(mul, [dim * repeat for dim, repeat in zip(input_shape, repeats)], 1) <= max_tensor_elements:return tuple(repeats)def generate_expand_params(input_shape):expanded_shape = []while True:expanded_shape = [random.randint(min(2,dim), dim*2) if dim == 1 else dim for dim in input_shape]if reduce(mul, expanded_shape, 1) <= max_tensor_elements:breakreturn expanded_shapedef generate_random_operator_parameters(input_shape, operator, input_tensor):if operator == 'unsqueeze':return (random.randint(0, len(input_shape) - 1),)if operator == 'repeat':return generate_repeat_params(input_shape)if operator == 'permute':return random.sample(range(len(input_shape)), len(input_shape))if operator == 'transpose':return random_transpose_params(input_tensor)if operator in ['reshape',"view"]:return generate_reshape_params(input_tensor)if operator == 'expand':return generate_expand_params(input_shape)if operator == 'matmul':if input_tensor.dim() == 1:return ()return (input_tensor.size(-1), random.randint(1, max_size))if operator in ['contiguous','mul']:return ()if operator == 'concat':return (random.randint(0, len(input_shape) - 1),)def execute_operator(input_tensor, operator, operator_parameters):if operator == 'unsqueeze':return input_tensor.unsqueeze(*operator_parameters)if operator == 'repeat':return input_tensor.repeat(operator_parameters)if operator == 'permute':return input_tensor.permute(operator_parameters)if operator == 'transpose':return input_tensor.transpose(*operator_parameters)if operator == 'reshape':return input_tensor.reshape(operator_parameters)if operator == 'view':return input_tensor.view(operator_parameters)    if operator == 'expand':return input_tensor.expand(operator_parameters)if operator == 'contiguous':return input_tensor.contiguous()if operator == 'matmul':if input_tensor.dim() ==1:return input_tensorother = torch.randn(*operator_parameters).to(input_tensor.device).type_as(input_tensor)return torch.matmul(input_tensor, other)if operator == 'mul':return input_tensor * input_tensorif operator == 'concat':return torch.cat((input_tensor, input_tensor), dim=operator_parameters[0])def main():for seed in range(2):random.seed(seed)np.random.seed(seed)torch.random.manual_seed(seed)for i in range(10):input_shape = generate_random_shape(random.randint(2, 5))input_tensor = generate_random_input(input_shape)operator = generate_random_operator(input_shape)operator_parameters = generate_random_operator_parameters(input_shape, operator, input_tensor)output_tensor = execute_operator(input_tensor, operator, operator_parameters)print(f"seed:{seed:03d} seq:{i:02d} {operator:<10} input:{str(input_shape):<32} param:{str(operator_parameters):<32} output:{str(output_tensor.shape):<32}")print(output_tensor.cpu().numpy().reshape(-1)[:8])torch.cuda.empty_cache()
if __name__ == '__main__':main()

输出

seed:000 seq:00 repeat     input:(7, 42, 26, 36, 56)              param:(1, 1, 1, 1, 1)                  output:torch.Size([7, 42, 26, 36, 56])
seed:000 seq:01 view       input:(248, 227, 276)                  param:(92, 908, 186)                   output:torch.Size([92, 908, 186])
seed:000 seq:02 view       input:(18, 21, 51, 32, 17)             param:(17, 4536, 136)                  output:torch.Size([17, 4536, 136])
seed:000 seq:03 reshape    input:(2548, 3565)                     param:(644, 65, 217)                   output:torch.Size([644, 65, 217])
seed:000 seq:04 reshape    input:(46, 42, 14, 57, 7)              param:(28, 266, 3, 483)                output:torch.Size([28, 266, 3, 483])
seed:000 seq:05 contiguous input:(222, 100, 597)                  param:()                               output:torch.Size([222, 100, 597])
seed:000 seq:06 view       input:(15, 27, 56, 8, 59)              param:(3, 3, 20160, 1, 59)             output:torch.Size([3, 3, 20160, 1, 59])
seed:000 seq:07 view       input:(1461, 1161)                     param:(188469, 9)                      output:torch.Size([188469, 9])
seed:000 seq:08 reshape    input:(19, 29, 19, 17, 54)             param:(31407, 1, 3, 17, 6, 1)          output:torch.Size([31407, 1, 3, 17, 6, 1])
seed:000 seq:09 transpose  input:(12, 126, 46, 157)               param:[2, 3]                           output:torch.Size([12, 126, 157, 46])
[-0.581   0.568   1.187   2.46   -0.1392 -0.3362  0.2076 -0.662 ]
seed:001 seq:00 view       input:(119, 354, 236)                  param:(4, 1, 17, 146202)               output:torch.Size([4, 1, 17, 146202])
seed:001 seq:01 reshape    input:(60, 961, 178)                   param:(3, 3421160)                     output:torch.Size([3, 3421160])
seed:001 seq:02 expand     input:(16, 10, 34, 37, 58)             param:[16, 10, 34, 37, 58]             output:torch.Size([16, 10, 34, 37, 58])
seed:001 seq:03 concat     input:(12, 44, 12, 26, 55)             param:(1,)                             output:torch.Size([12, 88, 12, 26, 55])
seed:001 seq:04 expand     input:(48, 9, 28, 20, 68)              param:[48, 9, 28, 20, 68]              output:torch.Size([48, 9, 28, 20, 68])
seed:001 seq:05 repeat     input:(16, 16, 162, 233)               param:(1, 1, 1, 1)                     output:torch.Size([16, 16, 162, 233])
seed:001 seq:06 expand     input:(25, 426, 19, 63)                param:[25, 426, 19, 63]                output:torch.Size([25, 426, 19, 63])
seed:001 seq:07 permute    input:(153, 153, 380)                  param:[2, 1, 0]                        output:torch.Size([380, 153, 153])
seed:001 seq:08 permute    input:(3091, 1445)                     param:[1, 0]                           output:torch.Size([1445, 3091])
seed:001 seq:09 mul        input:(142, 254, 388)                  param:()                               output:torch.Size([142, 254, 388])
[3.31   0.3372 0.2354 0.1373 0.594  2.326  0.7344 2.16  ]

这篇关于随机生成pytorch算子测试序列且保证算子参数合法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1014355

相关文章

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

pytorch之torch.flatten()和torch.nn.Flatten()的用法

《pytorch之torch.flatten()和torch.nn.Flatten()的用法》:本文主要介绍pytorch之torch.flatten()和torch.nn.Flatten()的用... 目录torch.flatten()和torch.nn.Flatten()的用法下面举例说明总结torch

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro