Linux脚本和脚本知识

测试模型训练的小的python脚本

PHPer 2025-09-03 1 0 0

简单的一个测试脚本,用来测硬件做深度学习训练时的性能。

# train_simple.py
import torch
import time
from diffusers import UNet2DModel
from pathlib import Path
import platform
import psutil

# -----------------------------
# 1. 系统信息打印
# -----------------------------
def print_system_info():
    print("🔍 系统信息检测中...")

    cpu_name = platform.processor()
    if not cpu_name:
        try:
            with open("/proc/cpuinfo", "r") as f:
                for line in f:
                    if "model name" in line:
                        cpu_name = line.split(":")[1].strip().split(" @ ")[0]
                        break
        except:
            cpu_name = "Unknown CPU"
    cpu_cores = psutil.cpu_count(logical=False)
    cpu_threads = psutil.cpu_count(logical=True)
    print(f"🧮  CPU: {cpu_name} ({cpu_cores} 核 / {cpu_threads} 线程)")

    memory = psutil.virtual_memory()
    total_ram = memory.total / (1024**3)
    available_ram = memory.available / (1024**3)
    print(f"🧠 内存: {total_ram:.2f} GB 总计, {available_ram:.2f} GB 可用")

    if torch.cuda.is_available():
        gpu_count = torch.cuda.device_count()
        print(f"🎮 GPU: {gpu_count} 张可用 (CUDA)")
        for i in range(gpu_count):
            gpu_name = torch.cuda.get_device_name(i)
            print(f"   🟩 [{i}] {gpu_name}")
    else:
        print("🎮 GPU: 未检测到 (CUDA 不可用)")

    print("-" * 50)

print_system_info()

print("🚀 开始执行 UNet2DModel 分阶段训练测试...")

# -----------------------------
# 2. 全局计时开始
# -----------------------------
total_start_time = time.time()

# 创建模型(不指定设备)
model = UNet2DModel(
    sample_size=32,
    in_channels=3,
    out_channels=3,
    layers_per_block=1,
    block_out_channels=(32, 64),
    down_block_types=("DownBlock2D", "AttnDownBlock2D"),
    up_block_types=("UpBlock2D", "AttnUpBlock2D"),
)

# 模拟数据
batch_size = 2
x_cpu = torch.randn(batch_size, 3, 32, 32)
y_cpu = torch.randn(batch_size, 3, 32, 32)
timesteps_cpu = torch.zeros(batch_size, dtype=torch.long)

# 显示模型参数量
def count_params(m):
    return sum(p.numel() for p in m.parameters() if p.requires_grad)

print(f"🧠 模型参数量: {count_params(model):,}")

# 优化器(后面会重建)
optimizer = None

# -----------------------------
# 3. 阶段1:CPU 训练
# -----------------------------
print("🚀 开始 CPU 训练...")
cpu_start_time = time.time()

# 使用 CPU
model_cpu = UNet2DModel(
    sample_size=32,
    in_channels=3,
    out_channels=3,
    layers_per_block=1,
    block_out_channels=(32, 64),
    down_block_types=("DownBlock2D", "AttnDownBlock2D"),
    up_block_types=("UpBlock2D", "AttnUpBlock2D"),
)
model_cpu.train()
model_cpu = model_cpu.to("cpu")

optimizer = torch.optim.Adam(model_cpu.parameters(), lr=1e-3)
n_steps = 10

for step in range(n_steps):
    optimizer.zero_grad()
    output = model_cpu(x_cpu, timesteps_cpu).sample
    loss = torch.nn.functional.mse_loss(output, y_cpu)
    loss.backward()
    optimizer.step()
    print(f"Step {step+1:2d} | Device: CPU | Loss: {loss.item():.6f}")

cpu_end_time = time.time()
cpu_elapsed = cpu_end_time - cpu_start_time
print(f"⏱️  CPU 训练耗时: {cpu_elapsed:.2f} 秒")

# -----------------------------
# 4. 阶段2:GPU 训练(如果可用)
# -----------------------------
gpu_elapsed = 0.0
if torch.cuda.is_available():
    print("🚀 开始 GPU 训练...")
    gpu_start_time = time.time()

    model_gpu = UNet2DModel(
        sample_size=32,
        in_channels=3,
        out_channels=3,
        layers_per_block=1,
        block_out_channels=(32, 64),
        down_block_types=("DownBlock2D", "AttnDownBlock2D"),
        up_block_types=("UpBlock2D", "AttnUpBlock2D"),
    )
    model_gpu.train()
    device = torch.device("cuda")
    model_gpu = model_gpu.to(device)

    x_gpu = x_cpu.to(device)
    y_gpu = y_cpu.to(device)
    timesteps_gpu = timesteps_cpu.to(device)
    optimizer = torch.optim.Adam(model_gpu.parameters(), lr=1e-3)

    for step in range(n_steps):
        optimizer.zero_grad()
        output = model_gpu(x_gpu, timesteps_gpu).sample
        loss = torch.nn.functional.mse_loss(output, y_gpu)
        loss.backward()
        optimizer.step()
        print(f"Step {step+1:2d} | Device: GPU | Loss: {loss.item():.6f}")

    gpu_end_time = time.time()
    gpu_elapsed = gpu_end_time - gpu_start_time
    print(f"⏱️  GPU 训练耗时: {gpu_elapsed:.2f} 秒")
else:
    print("⚠️  GPU 不可用,跳过 GPU 训练阶段")

# -----------------------------
# 5. 保存模型(仅保存最后一次训练的模型)
# -----------------------------
save_dir = Path("output") / "test-unet-final"
save_dir.mkdir(parents=True, exist_ok=True)

# 保存 GPU 模型优先,否则保存 CPU
final_model = model_gpu if torch.cuda.is_available() else model_cpu
final_model.eval()
final_model.save_pretrained(save_dir)
print(f"💾 模型已保存至: {save_dir.resolve()}")

# 清理命令
if platform.system() == "Windows":
    delete_cmd = f'rd /s /q "{save_dir}"'
else:
    delete_cmd = f'rm -rf "{save_dir}"'
print(f"📋 清理命令(如需删除): {delete_cmd}")

# -----------------------------
# 6. 总耗时统计
# -----------------------------
total_end_time = time.time()
total_elapsed = total_end_time - total_start_time
print(f"✅ 总训练耗时: {total_elapsed:.2f} 秒")
print(f"📊 详细耗时: CPU={cpu_elapsed:.2f}s, GPU={gpu_elapsed:.2f}s")
print("🎉 所有训练阶段完成!环境一切正常,可开始真实训练。")

20250903...

立即注册

更新于:2025-09-03 14:01:45
    您需要登录后才可以评论。 立即注册
    相关内容

    Python与模型相关知识以及问题的整理

    学习模型蒸馏之蒸馏SoloSpeech 2025年8月

    Google colab 测试运行SoloSpeech蒸馏项目中教师模型的训练

    学习模型蒸馏之蒸馏SoloSpeech 2025年8月 与通义对话

    腾讯云代码助手(Tencent Cloud CodeBuddy)插件在VS Code上

    线上训练数据的一些技巧

    云主机选择 试试 DigitalOcean 毕竟有新加坡服务器。

    云盘选择

    Linux/Ubuntu服务器命令行使用百度网盘

    SoloSpeech 模型训练终于有了眉目 20250829 2325

    各种和模型训练相关的工具

    相关问题报错

    python 调式代码的几种方法

    python报错 ModuleNotFoundError: No module named 'solospeech'​

    如何用有效的用conda安装python扩展

    SoloSpeech 训练的扩展安装

    python的一些包或扩展依赖于torch,会在安装的时候安装上torch的CPU版

    模型训练过程中的报错 unexpected pos 88457920 vs 88457808

    模型训练平台汇总

    Copilot的能力不低,不可小觑 20250902

    关于魔塔的静默提示,解决静默提醒提示。

    python -m py_compile "d:\python\SoloSpeech\solospeech\stable_audio_v...

    python 报错整理2

    给出一份「Python 中常见 import 名称 与 pip install 名称不一致」的速查表

    Python 学习整理2

    fastapi-speaker-extractor whisperx 项目报错 ValueError: The chosen ...

    python报错 UnicodeEncodeError: 'gbk' codec can't encode character '\u...

    python whisperx 报错 in load_align_model raise ValueError(f'The ch...

    pyannote/embedding 模型是真难引入模型

    Trae 或者是我自己 莫名奇妙创建了个文件,影响了项目代码的运行。

    WhisperX 无法加载模型

    HUGGINGFACE_HUB_CACHE 设置错误导致的问题

    Trae的bug太多了,怪不得免费

    通义之旅

    通义之旅2

    目标说话人声音提取模型训练的思路

    python报错 can't convert cuda:0 device type tensor to numpy. Use Tenso...

    Expected all tensors to be on the same device, but found at least two ...

    腾讯元宝推荐的项目结构(音频处理项目)

    音频处理项目fse

    各种python 相关命令

    python 报错 SyntaxError: 'return' outside function

    python常用命令

    腾讯编程助手

    python一些扩展兼容安装的处理方案

    AI和Python 学习整理

    AudioSeparationGUI 对输入的音频,自动根据说话人进行分类 20250817

    SoloSpeech 项目安装和运行测试 20250817

    python 多项目部署 优先考虑用Anaconda

    espnet 声音分离

    ClearerVoice-Studio 安装测试遇到的问题,安装pysptk一直失败

    uvr5 bs roformer 爆显存以及关于huggingface的国内镜像hf-mirror.com

    用Kimi编程

    Studio One 调试插件Techivation AI-Rack 一键智能混音

    在hf-mirror.com模型镜像站用代码下载模型遇到报错 speaker-diarization模型不...

    用腾讯元宝编程

    Conda国内镜像源

    数字对象标识符 (DOI)

    在创建conda环境时,如果不指定Python版本,conda将不会默认安装Python。

    whisperx 的使用 音频处理

    Win10系统 Trae的使用 关于powershell报错: 因为在此系统上禁止运行脚本

    warp的使用

    AI编程工具比较

    FastApi

    Python 常用命令整理

    魔塔社区 modelscope 常用命令

    推荐内容

    怎样使用V2Ray代理和SSTap玩如魔兽世界/绝地求生/LOL台服/战地3/黑色沙漠/彩...

    sstap游戏代理教程 从此玩如魔兽世界/绝地求生/LOL台服/战地3/黑色沙漠/彩虹六...

    BT磁力搜索网站汇总和找不到的资源

    什么是磁力链接,您如何使用?

    Z-Library:全球最大的数字图书馆/含打不开的解决方案/镜像

    使用V2Ray的mKCP协议加速游戏

    v2rayN已停止工作

    【车险课堂】什么是无赔款优待系数ncd,你“造”吗?