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

ops/2024/11/29 22:52:30/

最近在计算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/ops/137766.html

相关文章

鸿蒙学习统一上架与多端分发-快速上架(1)

文章目录 1 快速上架1.1证书颁发1.2 统一上架1.3 上架审核HUAWEI AppGallery Connect 为开发者提供全球化、全场景一站式应用分发能力,并为开发者提供质量、安全、工程管理等领域的能力,大幅降低应用开发与运维难度,提升版本质量,帮助开发者获得用户并实现收入的规模增长。…

Spring Boot英语知识网站:安全与维护

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了英语知识应用网站的开发全过程。通过分析英语知识应用网站管理的不足,创建了一个计算机管理英语知识应用网站的方案。文章介绍了英语知识应用网站的系…

视频汇聚平台Liveweb国标GB28181视频平台监控中心设计

在现代安防视频监控领域,Liveweb视频汇聚平台以其卓越的兼容性和灵活的拓展能力,为用户提供了一套全面的解决方案。该平台不仅能够实现视频的远程监控、录像、存储与回放等基础功能,还涵盖了视频转码、视频快照、告警、云台控制、语音对讲以及…

IIS结合nginx配置

双服务器负载均衡 #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid;events {worker_connections 1024; }http {include mime.types;default_type…

关于VNC连接时自动断联的问题

在服务器端打开VNC Server的选项设置对话框,点左边的“Expert”(专家),然后找到“IdleTimeout”,将数值设置为0,点OK关闭对话框。搞定。 注意,服务端有两个vnc服务,这俩都要设置ide timeout为0才行 附件是v…

基于Matlab SIR模型的传染病动态模拟与扩展研究

SIR模型作为流行病学领域的经典模型,在研究传染病传播规律和动态变化方面发挥了重要作用,为分析疾病在特定人群中的传播趋势提供了理论基础和工具支持。然而,传统的SIR模型假设人口总数不变且免疫力永久有效,在面对实际复杂的疫情…

Android叠加双RecyclerView ScaleGestureDetector AnimatorSet动态放大缩小,Kotlin(1)

Android叠加双RecyclerView ScaleGestureDetector AnimatorSet动态放大缩小&#xff0c;Kotlin&#xff08;1&#xff09; <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/andr…

手机设置了卡2上网,卡1禁止上网,但是卡1还是会偷偷跑流量,这是什么情况???

双卡双待手机&#xff0c;卡2设置为默认上网卡&#xff0c;卡1却会偷偷跑流量&#xff0c;这就很迷。 双卡双待手机&#xff0c;不管是哪个牌子&#xff08;网上有小米&#xff0c;华为&#xff0c;vivo出现这种情况&#xff0c;我的是华为mate20&#xff09;&#xff0c;都存在…