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

本站现有博文333篇,共被浏览924638

本站已经建立2631天!

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