python计算stable-diffusion-1.5模型参数量以及该模型每一层网络的参数量【其他LLM模型也有参考意义】

news/2024/11/28 16:11:50/

最近在计算stable-diffusion-1.5模型参数量上花了点心思,总结了一些方法,一起学习:

stable-diffusion-1.5模型结构

首先stable-diffusion-1.5模型主要有三个关键组件(text_encoder,unet,vae),关于stable-diffusion-1.5模型,有个大佬总结的帖子十分到位,推荐大家学习,链接:
Stable Diffusion1.5网络结构-超详细原创

计算模型的整体参数量

那么对于这种大模型,我们又该怎么计算其参数量呢?
我的思路是直接读取文件,分别计算三个关键组件(text_encoder,unet,vae)的参数量,再相加,直接上代码:

from diffusers import StableDiffusionPipeline
import torchdef count_parameters(model):return sum(p.numel() for p in model.parameters() if p.requires_grad)def print_layer_info(model):for name, layer in model.named_modules():if hasattr(layer, 'parameters'):layer_params = sum(p.numel() for p in layer.parameters() if p.requires_grad)print(f"Layer: {name}, Parameters: {layer_params}")pipe = StableDiffusionPipeline.from_pretrained("xxxxxxx/stable - diffusion - v1 - 5",torch_dtype=torch.float16
)
pipe = pipe.to("cuda")# 分别计算各个组件的参数
num_params_text_encoder = count_parameters(pipe.text_encoder)
num_params_unet = count_parameters(pipe.unet)
num_params_vae = count_parameters(pipe.vae)total_num_params = num_params_text_encoder + num_params_unet + num_params_vae
print(f"Number of parameters in Text Encoder: {num_params_text_encoder}")
print(f"Number of parameters in UNet: {num_params_unet}")
print(f"Number of parameters in VAE: {num_params_vae}")
print(f"Total number of parameters: {total_num_params}")# 打印每个部件每一层的信息和参数量信息
print("Text Encoder Layers Information:")
print_layer_info(pipe.text_encoder)print("UNet Layers Information:")
print_layer_info(pipe.unet)print("VAE Layers Information:")
print_layer_info(pipe.vae)prompt = "a photo of an astronaut riding a horse on mars"
image = pipe(prompt).images[0]
image.save("astronaut_rides_horse.png")

注意:需要将"xxxxxxx/stable - diffusion - v1 - 5",这个地址改成你自己保存源码的地址。

上面代码的输出内容如下:
在这里插入图片描述

精细的输出每一部分的每一层的参数信息

又有一个问题,如果我想要看到每一个组件中的每一层的参数量,又该怎么做?直接上代码:

from diffusers import StableDiffusionPipeline
import torchdef count_parameters(model):return sum(p.numel() for p in model.parameters() if p.requires_grad)def print_layer_info(model):for name, layer in model.named_modules():if hasattr(layer, 'parameters'):layer_params = sum(p.numel() for p in layer.parameters() if p.requires_grad)print(f"Layer: {name}, Parameters: {layer_params}")pipe = StableDiffusionPipeline.from_pretrained("xxxxxxxxxx/stable - diffusion - v1 - 5",torch_dtype=torch.float16
)
pipe = pipe.to("cuda")# 分别计算各个组件的参数
num_params_text_encoder = count_parameters(pipe.text_encoder)
num_params_unet = count_parameters(pipe.unet)
num_params_vae = count_parameters(pipe.vae)total_num_params = num_params_text_encoder + num_params_unet + num_params_vae
print(f"Number of parameters in Text Encoder: {num_params_text_encoder}")
print(f"Number of parameters in UNet: {num_params_unet}")
print(f"Number of parameters in VAE: {num_params_vae}")
print(f"Total number of parameters: {total_num_params}")# 打开文件用于保存输出信息
with open('model_info.txt', 'w') as f:# 将总参数量信息写入文件f.write(f"Number of parameters in Text Encoder: {num_params_text_encoder}\n")f.write(f"Number of parameters in UNet: {num_params_unet}\n")f.write(f"Number of parameters in VAE: {num_params_vae}\n")f.write(f"Total number of parameters: {total_num_params}\n")# 打印并保存每个部件每一层的信息和参数量信息f.write("Text Encoder Layers Information:\n")for name, layer in pipe.text_encoder.named_modules():if hasattr(layer, 'parameters'):layer_params = sum(p.numel() for p in layer.parameters() if p.requires_grad)f.write(f"Layer: {name}, Parameters: {layer_params}\n")f.write("\n")f.write("UNet Layers Information:\n")for name, layer in pipe.unet.named_modules():if hasattr(layer, 'parameters'):layer_params = sum(p.numel() for p in layer.parameters() if p.requires_grad)f.write(f"Layer: {name}, Parameters: {layer_params}\n")f.write("\n")f.write("VAE Layers Information:\n")for name, layer in pipe.vae.named_modules():if hasattr(layer, 'parameters'):layer_params = sum(p.numel() for p in layer.parameters() if p.requires_grad)f.write(f"Layer: {name}, Parameters: {layer_params}\n")

上述代码将该过程的打印信息都保存在了当前目录的model_info.txt文件下。这样就会看到每一层的参数信息了。在这里插入图片描述
以上就是我的两种方法,对于大部分LLM模型,这种读取参数的操作都是适用的,如果有伙伴想尝试读取其他模型的参数,也可以借鉴。


http://www.ppmy.cn/news/1550662.html

相关文章

【NLP 2、机器学习简介】

人生的苦难不过伏尔加河上的纤夫 —— 24.11.27 一、机器学习起源 机器学习的本质 —— 找规律 通过一定量的训练样本找到这些数据样本中所蕴含的规律 规律愈发复杂,机器学习就是在其中找到这些的规律,挖掘规律建立一个公式,导致对陌生的数…

Spring Boot整合Redis Stack构建本地向量数据库相似性查询

Spring Boot整合Redis Stack构建本地向量数据库相似性查询 在微服务架构中,数据的高效存储与快速查询是至关重要的。Redis作为一个高性能的内存数据结构存储系统,不仅可以用作缓存、消息代理,还可以扩展为向量数据库,实现高效的相…

Linux指标之平均负载(The Average load of Linux Metrics)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

redis cluster 3主3从部署方案

文章目录 1 Redis Cluster 介绍1 Redis cluster 架构2 Redis cluster的工作原理2.1 数据分区2.2 集群通信2.3 集群伸缩2.3.1 集群扩容2.3.2 集群缩容 2.4 故障转移2.4.1 主观下线2.4.2 客观下线 3 Redis Cluster 部署架构说明3.1 部署方式介绍3.2 实战案例:基于Redi…

Jmeter测试nginx部署的静态网页最大在线人数

一、下载Jmeter apache-jmeter-5.4.3.tar资源-CSDN文库 解压之后,双击ApacheJMeter.jar,即可打开 二、测试最大在线人数 1、plugins-manager下载安装 起初刚解压的jmeter里面没有插件管理这个选项 去官网下载:Install :: JMeter-Plugins.org 将下载j…

【好玩的经典游戏】Docker环境下部署贪吃蛇网页小游戏(二)

【好玩的经典游戏】Docker环境下部署贪吃蛇网页小游戏(二) 一、贪吃蛇小游戏介绍1.1 小游戏简介1.2 项目预览二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.3 检查Docker版本3.4 检查docker compose 版本四、下载容器镜像五、部…

【C语言】使用字符串处理函数

1、puts函数-----输出字符串的函数 其一般形式是: puts(字符数组); 函数的原型是: int puts ( const char * str );该函数的返回值为: 注意:使用puts()库函数时,要包含头文件:#incl…

【MySQL篇】持久化和非持久化统计信息的深度剖析(第一篇,总共六篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…