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

本站现有博文337篇,共被浏览955489次

本站已经建立2666天!

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