当前位置: 首页 > 知识库问答 >
问题:

pytorch - 如何优化LSTM模型以充分利用多核CPU?

扶杜吟
2026-01-08

在服务器上使用torch调用lstm模型使用一维数据训练预测时,已经使用批处理去训练了,但是实际上在linux上运行测试时,发现其python的CPU占用率不高,在使用auotfromer训练预测时,其python的CPU占用率超过100%,达到300%,其明显感觉是多进程处理,该如何让lstm使用多进程优化,让其能充分利用CPU?

在调试时使用了批处理去训练数据,但是预测没改的,希望其在linux中运行CPU占用率能超过100%,但是到90%就不上去了,没有充分利用CPU,另一个autofromer测试时,其CPU利用率超过了100%,达到了300%多

服务器是DELL的R740,CPU是有两个6核12线程的,LSTM是使用了PyTorch的DataLoader进行批处理

共有1个答案

小牛24057
2026-01-08

要优化LSTM模型以充分利用多核CPU(特别是24逻辑核心的服务器),需结合PyTorch的并行机制和系统级配置。以下是关键优化步骤:

1. DataLoader多进程优化

from torch.utils.data import DataLoader

# 关键参数设置
dataloader = DataLoader(
    dataset,
    batch_size=128,  # 增大批处理大小
    shuffle=True,
    num_workers=8,    # 建议设置为物理核心数(12)或逻辑核心数一半(12)
    pin_memory=True,  # 加速CPU到GPU的数据传输(若用GPU)
    persistent_workers=True  # 避免重复创建进程
)
  • num_workers:设置为8-12(根据服务器负载调整),使数据预加载并行化
  • batch_size:增大到内存允许的最大值(如128+),确保每次计算负载充足

2. OpenMP并行计算优化

在代码开头设置环境变量(或在Linux终端提前export):

import torch
import os

# 设置OpenMP线程数(建议留2核给系统)
os.environ["OMP_NUM_THREADS"] = "22"  # 逻辑核心数-2
os.environ["MKL_NUM_THREADS"] = "22"
torch.set_num_threads(22)  # PyTorch直接设置

3. 预测阶段的批处理优化

# 预测时也必须使用批处理
test_dataloader = DataLoader(test_data, batch_size=256, num_workers=8)

with torch.no_grad():
    for batch in test_dataloader:
        outputs = model(batch)  # 确保输入是批数据

4. LSTM模型层优化

self.lstm = nn.LSTM(
    input_size=128,
    hidden_size=256,
    num_layers=4,       # 适当增加层数提升并行度
    batch_first=True,   # 必须设置为True以支持批处理
    bidirectional=True  # 双向LSTM可增加并行计算量
)

5. 系统级性能监控与调优

  • 使用htoptop检查:

    • %CPU显示>100%:表示多核已启用(如300%=3核满载)
    • %id(空闲)高:增加num_workersbatch_size
  • 禁用CPU频率缩放

    sudo cpupower frequency-set --governor performance

6. 高级优化(可选)

  • 混合精度训练(即使只用CPU):

    with torch.cpu.amp.autocast():
        outputs = model(inputs)
        loss = criterion(outputs, targets)
  • 内存分配器优化

    export LD_PRELOAD=/usr/lib/libjemalloc.so  # 使用jemalloc
    export MALLOC_CONF="oversize_threshold:1,background_thread:true"

⚠️ 验证指标

执行后监控:

top -1 -p $(pgrep -f python)  # 看单个进程多核利用率
  • 成功标志:Python进程%CPU稳定在2000%-2400%(约20-24核满载)
  • 失败时检查:

    1. 数据预处理是否成为瓶颈(I/O延迟)
    2. dmesg查看OOM(内存不足)日志
    3. 使用py-spy进行性能分析:py-spy top --pid <PID>

通过以上组合优化,可显著提升LSTM在Xeon多路服务器的CPU利用率至300%+级别,接近Autoformer的并行效率。

 类似资料:
  • 问题内容: 我维护一个定制的类似CMS的应用程序。 每当提交文档时,都会执行一些任务,这些任务可以大致分为以下几类: MySQL查询。 HTML内容解析。 搜索索引更新。 类别1包括对与文档内容有关的各种MySQL表的更新。 类别2包括对存储在MySQL LONGTEXT字段中的HTML内容的解析,以执行一些自动锚标记转换。我怀疑此任务花费了大量计算时间。 类别3仅使用与文档相对应的几个字段就对基

  • 本文向大家介绍pytorch 利用lstm做mnist手写数字识别分类的实例,包括了pytorch 利用lstm做mnist手写数字识别分类的实例的使用技巧和注意事项,需要的朋友参考一下 代码如下,U我认为对于新手来说最重要的是学会rnn读取数据的格式。 以上这篇pytorch 利用lstm做mnist手写数字识别分类的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐

  • 我想在Pytorch中实现多变量输入的LSTM。 在这篇使用keras的文章https://machinelearningmastery.com/how-to-develop-lstm-models-for-time-series-forecasting/之后,输入数据的形状是(样本数、时间步数、并行特征数) 在keras,这似乎很容易:

  • 有多台笔记本电脑,手机,如何统合这些计算资源? 比如我在一台电脑上安装QQ这个软件 另一台电脑上不需要再安装这个软件 也可以使用QQ这个程序也就是说同样的资源是需要在一台电脑上即可 (我尝试过网络存储,但是效果不太好,首先太慢了,其次需要把每台电脑灯配置成服务器) 另外一个要求 对于一个计算任务把它分配给不同电脑上的CPU进行计算 顺便问一下企业是如何实现多个CPU资源充分利用

  • 在北网的优化指南中,针对英特尔GPU的OpenCL开源实现 工作组大小应大于16,并且是16的倍数。 Gen上有两个可能的SIMD车道是8或16。为了不浪费SIMD车道,我们需要遵循这个规则。 英特尔处理器图形Gen7.5的计算架构中也提到: 对于Gen7。基于5个产品,每个EU有7个线程,总计28 KB的通用寄存器文件(GRF)。 。。。 在Gen7上。5计算架构,大多数SPMD编程模型都采用这

  • 本文向大家介绍pytorch构建多模型实例,包括了pytorch构建多模型实例的使用技巧和注意事项,需要的朋友参考一下 pytorch构建双模型 第一部分:构建"se_resnet152","DPN92()"双模型 第二部分构建densenet201单模型 以上这篇pytorch构建多模型实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 本文向大家介绍基于Pytorch SSD模型分析,包括了基于Pytorch SSD模型分析的使用技巧和注意事项,需要的朋友参考一下 本文参考github上SSD实现,对模型进行分析,主要分析模型组成及输入输出大小.SSD网络结构如下图: 每输入的图像有8732个框输出; VGG基础网络结构: 输出为: SSD中添加的网络 add_extras函数构建基本的卷积层 输出为: multibox函数得到

  • 我正在使用CUDA上运行的Marching Cubes算法从体积数据生成网格。 我尝试过保存网格并以3种方式渲染它。 将一组粗略的三角形保存为顶点数据的连续数组。我估计第一次通过时的大小,创建一个OpenGL VBO,将其映射到CUDA,并以下面的格式将顶点数据写入其中 并使用绘制它。 VBO中的冗余顶点,每个立方体的冗余顶点,无索引。 VBO中没有冗余顶点,生成索引。 VBO中的冗余顶点,每个立