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

本站现有博文334篇,共被浏览932076

本站已经建立2640天!

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