EADST

Print Transformers Pytorch Model Information

import os
import re
import torch
from safetensors import safe_open
from safetensors.torch import load_file
import glob
from collections import defaultdict
import numpy as np

model_dir = "/dfs/data/model_path_folder/"

def inspect_model_weights(directory_path):
    """
    检索文件夹中所有的bin或safetensors文件并打印模型权重信息

    参数:
        directory_path (str): 包含模型文件的文件夹路径
    """
    # 查找所有bin和safetensors文件
    bin_files = glob.glob(os.path.join(directory_path, "*.bin"))
    safetensors_files = glob.glob(os.path.join(directory_path, "*.safetensors"))

    all_files = bin_files + safetensors_files

    if not all_files:
        print(f"在 {directory_path} 中没有找到bin或safetensors文件")
        return

    print(f"找到 {len(all_files)} 个模型文件:")
    for idx, file_path in enumerate(all_files):
        print(f"{idx+1}. {os.path.basename(file_path)}")

    total_size = 0
    param_count = 0
    layer_stats = defaultdict(int)
    tensor_types = defaultdict(int)
    shape_info = defaultdict(list)

    # 处理每个文件
    for file_path in all_files:
        file_size = os.path.getsize(file_path) / (1024 * 1024)  # MB
        total_size += file_size

        print(f"\n检查文件: {os.path.basename(file_path)} ({file_size:.2f} MB)")

        # 根据文件扩展名加载权重
        if file_path.endswith('.bin'):
            try:
                weights = torch.load(file_path, map_location='cpu')
            except Exception as e:
                print(f"  无法加载 {file_path}: {e}")
                continue
        else:  # safetensors
            try:
                weights = load_file(file_path)
            except Exception as e:
                print(f"  无法加载 {file_path}: {e}")
                continue

        # 分析权重
        print(f"  包含 {len(weights)} 个张量")
        for key, tensor in weights.items():
            # 统计参数数量
            num_params = np.prod(tensor.shape)
            param_count += num_params

            # 统计层类型
            layer_type = "other"
            if "attention" in key or "attn" in key:
                layer_type = "attention"
            elif "mlp" in key or "ffn" in key:
                layer_type = "feed_forward"
            elif "embed" in key:
                layer_type = "embedding"
            elif "norm" in key or "ln" in key:
                layer_type = "normalization"
            layer_stats[layer_type] += num_params

            # 统计张量类型
            tensor_types[tensor.dtype] += num_params

            # 记录形状信息
            shape_str = str(tensor.shape)
            shape_info[shape_str].append(key)

            # 打印详细信息(前10个张量)
            if len(shape_info) <= 10 or num_params > 1_000_000:
                print(f"  - {key}: 形状={tensor.shape}, 类型={tensor.dtype}, 参数数={num_params:,}")

    # 打印汇总信息
    print("\n模型权重汇总:")
    print(f"总文件大小: {total_size:.2f} MB")
    print(f"总参数数量: {param_count:,}")

    print("\n按层类型划分的参数:")
    for layer_type, count in layer_stats.items():
        percentage = (count / param_count) * 100
        print(f"  {layer_type}: {count:,} 参数 ({percentage:.2f}%)")

    print("\n张量数据类型分布:")
    for dtype, count in tensor_types.items():
        percentage = (count / param_count) * 100
        print(f"  {dtype}: {count:,} 参数 ({percentage:.2f}%)")

    print("\n常见张量形状:")
    sorted_shapes = sorted(shape_info.items(), key=lambda x: np.prod(eval(x[0])), reverse=True)
    for i, (shape, keys) in enumerate(sorted_shapes[:10]):
        num_params = np.prod(eval(shape))
        percentage = (num_params * len(keys) / param_count) * 100
        print(f"  {shape}: {len(keys)} 个张量, 每个 {num_params:,} 参数 (总共占 {percentage:.2f}%)")
        if i < 3:  # 只显示前3种最常见形状的示例
            print(f"    例如: {', '.join(keys[:3])}" + ("..." if len(keys) > 3 else ""))

def main():
    # model_dir = input("请输入模型文件夹路径: ")
    inspect_model_weights(model_dir)

if __name__ == "__main__":
    main()
相关标签
About Me
XD
Goals determine what you are going to be.
Category
标签云
GPT4 Mixtral Tensor Michelin 证件照 报税 API网关 WAN Hilton Qwen2 CUDA Proxy Llama CSV SAM GIT Algorithm NLTK CTC mmap Paper printf JSON 关于博主 Pickle Anaconda Tracking 算法题 PIP Color 递归学习法 DeepSeek Heatmap SQLite CAM Magnet Excel Sklearn AI LLM RL Jupyter Ptyhon Knowledge MD5 C++ Attention Vmess Crawler 云服务器 Hotel SQL tar PyTorch 腾讯云 VSCode TSV 音频 Review LoRA Breakpoint FP64 InvalidArgumentError Quantize XML Bert FP32 Ubuntu Land Permission 继承 uwsgi TensorFlow 强化学习 Numpy Distillation ms-swift WebCrawler Django OpenAI 版权 Google BF16 llama.cpp Baidu CEIR torchinfo Animate ModelScope Claude 论文 SPIE GGML 域名 Tiktoken Disk git News LLAMA Paddle FP8 Bitcoin Github Card git-lfs hf Statistics 多进程 Cloudreve 论文速读 ResNet-50 Streamlit Jev NameSilo v0.dev EXCEL Password PyCharm Miniforge Firewall IndexTTS2 Food v2ray Qwen2.5 顶会 图形思考法 YOLO Input FastAPI Conda icon Domain VPN Git 签证 Gemma PDF Harness Diagram BeautifulSoup tqdm ONNX 多线程 Freesound uWSGI LeetCode DeepStream BTC GoogLeNet Use Agent CC Zip HuggingFace VGG-16 Jetson Dataset 阿里云 CV Safetensors Rebuttal Template RGB Bin CLAP UI XGBoost COCO Markdown Search SVR 图标 FlashAttention Shortcut PDB GPTQ 第一性原理 LaTeX Qwen Plotly Vim FP16 Datetime Math Pytorch Hungarian Clash Random Web OCR Nginx 搞笑 Image2Text RAR Plate OpenCV Base64 Website Docker Logo Linux 财报 Data Windows Augmentation 飞书 TTS Interview NLP Python 公式 ChatGPT UNIX Translation QWEN Pandas HaggingFace Pillow diffusers scipy Quantization TensorRT Video transformers 净利润 logger Bipartite API Transformers
站点统计

本站现有博文338篇,共被浏览988779次

本站已经建立2700天!

热门文章
文章归档
回到顶部