【Pytorch】物理cpu、逻辑cpu、cpu核数、pytorch线程数设置

article/2025/10/25 9:53:58

上周末写ddp,常常遇到中途退出的问题,解决中途遇到了很多CPU线程数和核心数的问题,记录如下

1. 物理cpu、逻辑cpu、cpu核数、超线程

这一部分主要来自什么是物理cpu,什么是逻辑cpu,什么cpu核数,什么是超线程?

a. 物理CPU

就是实实在在插在主机上看得见摸得着那块CPU硬件,可通过如下命令来查看物理CPU个数:

cat /proc/cpuinfo | grep 'physical id' | sort | uniq | wc -l

下图代表服务器有两块cpu

b.cpu核数

一块物理CPU上能处理数据的芯片组数量。也就是说一个物理CPU上可能会有多个核心,日常中说的双核,四核就是指的CPU核心。可通过如下命令来查看CPU核心数:

cat /proc/cpuinfo | grep 'core id' | sort | uniq | wc -l

下图代表一块cpu有10个核心

c.超线程

一个CPU核就是一个物理线程,由英特尔开发超线程技术可以把一个物理线程模拟出两个线程来使用,使得单个核心用起来像两个核一样,以充分发挥CPU的性能。

d.逻辑cpu

逻辑CPU的概念比较抽象,可简单理解为一个处理单元,通常来说,总的逻辑CPU数对应总的CPU核数,但借助超线程技术,一个核用起来像两个核,这时逻辑CPU数就是核心数的两倍了。可通过如下命令来查看逻辑CPU数:

cat /proc/cpuinfo | grep 'processor' | sort | uniq | wc -l

下图代表服务器逻辑cpu数为40,显然开启了超线程

总核数 = 物理CPU个数 X 每颗物理CPU的核数
总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

top指令中的%cpu就是占用的逻辑cpu数,如下图为占用一个逻辑cpu

2. Pytorch设置线程数

a. torch.set_num_threads

这一部分来自Set the Number of Threads to Use in PyTorch

Pytorch使用CPU计算op时默认使用OpenMP进行并行计算,一般默认使用全部CPU线程(即逻辑cpu数)的一半

set_num_threads()用于设置CPU上用于内部操作(intra operations)的线程数。 根据这里的讨论,内部操作大致是指在一个操作中执行的操作,例如矩阵乘法。 默认情况下,pytorch将使用计算机上所有可用的内核(比如我这里是2*10=20),为了验证这一点,我们可以使用torch.get_num_threads()获取默认线程数。

import timeimport torch
import numpy as np
import os
#torch.set_num_threads(8) 这里有注释!
while True:arr= np.zeros((100,3, 300, 300), dtype=np.float32)start=time.time()aaa=torch.from_numpy(arr)start = time.time()aaa.add_(-0.406)print('time2',time.time() - start)print("hello")print("num_threads: %d" % torch.get_num_threads())

输出如下,可以看到用了一半的逻辑cpu数

取消上面对torch.set_num_threads(8)的注释

下图可以看到占用了约8个线程

对于支持并行性的操作,增加线程的数量通常会使CPU上的执行速度更快。 除了通过pytorch设置线程数,还可以设置环境变量OMP_NUM_THREADSMKL_NUM_THREADS来设置线程数。

b. torch.set_num_threads 和’MKL_NUM_THREADS’ 'OMP_NUM_THREADS’三个的区别是什么?

先贴pytorch官方解释两图

以下部分参考pytorch模型在multiprocessing下前馈速度明显降低的原因是什么?

Pytorch使用CPU计算op时默认使用OpenMP进行并行计算。每次模型进行inference的时候,pytorch的核心会fork出多个线程进行Inter-op的并行计算,在每个op计算的内部(Intra-op)又会使用ATen,MKL,MKL-DNN等矩阵加速库进行加速,并使用OpenMP(默认)或TBB进行多线程计算。

标题提到的torch.set_num_threads 和’MKL_NUM_THREADS’ 'OMP_NUM_THREADS’,其实我也分不太清楚。记住有优先级并且’MKL_NUM_THREADS’ 'OMP_NUM_THREADS’一起设置为torch.set_num_threads的数目好了即三个设置成一样的,怕出错就按如下顺序设置。

    torch.set_num_threads(1)os.environ["OMP_NUM_THREADS"] = "1"  # 设置OpenMP计算库的线程数os.environ["MKL_NUM_THREADS"] = "1"  # 设置MKL-DNN CPU加速库的线程数。

c.ddp下的线程设置

pytorch下的DistributedDataParallel(即ddp),推荐每个进程的OMP_NUM_THREADS设置为1,防止系统过载。(但这样挺低效的,根据自己的子进程数来看叭)

Setting OMP_NUM_THREADS environment variable for each process to be 1 in default, to avoid your system being overloaded, please further tune the variabl
e for optimal performance in your application as needed.

它推荐的设置法(亲测环境变量加在这里比代码中有效)

OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 python -m torch.distributed.launch --nproc_per_node=2 test.py

d.num_workers下的线程数

关于DataLoader num_workerstorch.set_num_threads

The num_workers for the DataLoader specifies how many parallel workers to use to load the data and run all the transformations. If you are loading large images or have expensive transformations then you can be in situation where GPU is fast to process your data and your DataLoader is too slow to continuously feed the GPU. In that case setting higher number of workers helps. I typically increase this number until my epoch step is fast enough. Also, a side tip: if you are using docker, usually you want to set shm to 1X to 2X number of workers in GB for large dataset like ImageNet.

The torch.set_num_threads specifies how many threads to use for parallelizing CPU-bound tensor operations. If you are using GPU for most of your tensor operations then this setting doesn’t matter too much. However, if you have tensors that you keep on cpu and you are doing lot of operations on them then you might benefit from setting this. Pytorch docs, unfortunately, don’t specify which operations will benefit from this so see your CPU utilization and adjust this number until you can max it out.

总结就是这两没有关系,num_workers是独立于程序单独开出来的torch.set_num_threads是pytorch给cpu做并行的。

如果我使用

OMP_NUM_THREADS=10 MKL_NUM_THREADS=10 python -m torch.distributed.launch --nproc_per_node=2 test.py

会得到下面的结果,十个线程。两个是ddp给的进程(前两个),后面八个是4*2即两个进程分别的num_workers用于读取数据。

3. torch.set_num_threads没用?

个人觉得三个原因(可能)

A. 刚刚的图片展示了,其实我每个进程都是torch.set_num_threads(10),但是cpu的进程7010和7006才分别用了不到200%。很大可能是cpu上进行的数据操作不多,时间很短也用不不着这么多线程就结束了,这个是最有可能的

B. 要把num_workers 也设置不为零
来自https://github.com/pytorch/pytorch/issues/19213

This only happens when num_workers is set for the dataloader. If num_workers is not set, torch.set_num_threads works correctly. I’d say it’s like set_num_threads is not inherited by the dataloader workers, which fall back to the default.

C. opencv中也用了openmp做加速,有时出现死锁。可以设置

cv2.setNumThreads(0)
cv2.ocl.setUseOpenCL(False)

个人不推荐使用


参考链接

1.什么是物理cpu,什么是逻辑cpu,什么cpu核数,什么是超线程?

2. Linux下确认CPU是否开启超线程

3. Linux OS下,你真的读懂了cat /proc/cpuinfo 吗?

4. torch.set_num_threads

5. Set the Number of Threads to Use in PyTorch

6. DataLoader num_workers vs torch.set_num_threads

7.pytorch锁死在dataloader(训练时卡死)


http://chatgpt.dhexx.cn/article/Y4ZUgUjV.shtml

相关文章

Linux下关于物理CPU、逻辑CPU和CPU核数、超线程

1、概念 (1) 【物理CPU数】 :实际Server中插槽上的CPU个数,物理cpu数量可以数不重复的 physical id 有几个 (physical id) (2) 【CPU核数】:单块CPU上面能处理数据的芯…

物理CPU,CPU核数,逻辑CPU

CPU概念 物理CPU 在Info中由physical id识别 物理CPU指的是实际主板上插槽上的CPU个数。physical id 就是每个物理CPU的ID,不重复的 physical id 有几个,物理cpu数量就是几个。 CPU核数(物理核) 在Info中由 cpu cores 识别 CPU核…

物理cpu数,逻辑cpu数,cpu核数

一、物理CPU数 机器的主板上实际插入插槽的CPU个数。 二、CPU核数 单块CPU上面集成一个或者多个处理器芯片(称为Core,核心)。 CPU最初发展的时候是一个CPU一个处理核心,CPU的性能主要靠提高核心工作频率来提高,但是仅仅提高单核芯片的速度…

物理cpu数和cpu核数和逻辑cpu数和vcpu区别

物理cpu数和cpu核数和逻辑cpu数和vcpu区别1.物理cpu数:主板上实际插入的cpu数量,可以数不重复的 physical id 有几个(physical id) 2.cpu核数:单块CPU上面能处理数据的芯片组的数量,如双核、四核等 &#…

CPU相关概念:物理cpu数、核数、逻辑cpu数,12核20线程实例分析

文章目录 0. 写此篇博客的原因1. 物理CPU,核,逻辑CPU概念1.1 内核工作方式1.2 超线程1.3 什么是大小核 2. CPU信息的查询方法2.1 Windows下查询CPU信息的方法2.2 Linux下查询CPU信息的方法方法一:lscpu 整体查看方法二:分别查看 3…

Linux系统下物理CPU和逻辑CPU的区别

01、问题 最近在搞Linux下性能评测,在做CPU评测时发现了个有意思的现象,因为uos系统是自带系统监视器的,在对输入法进程检测时,发现其CPU占用率为1%: 但是我用top命令查询时却发现它的CPU占用率为4%! 这是…

理解物理 CPU 与逻辑 CPU

这是一篇有关物理和逻辑 CPU 实际含义以及它们之间有何差异的速写文章。 首先,CPU 这个术语在互联网上的使用非常的模糊和不严谨,常用来指处理器(Processor)、核心(Cores)或硬件线程(Hardware …

【cpu概念】物理cpu个数、核数、逻辑cpu数的概念

首先要明确物理cpu个数、核数、逻辑cpu数的概念 1.物理cpu数:主板上实际插入的cpu数量,可以数不重复的 physical id 有几个(physical id) 2.cpu核数:单块CPU上面能处理数据的芯片组的数量,如双核、四核等 …

物理cpu、物理cpu内核、逻辑cpu

物理cpu:就是实在的可以看到的计算机硬件,插入计算机的cpu插槽里面。如下图所示 在Linux系统中想查看物理cpu个数命令:cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l 物理cpu内核:以前最早是一个cpu一个核心…

[转]物理CPU、CPU核数、逻辑CPU、超线程

转自:http://wulc.me/2016/01/06/物理CPU、CPU核数、逻辑CPU、超线程/ 基本概念 物理CPU: 物理CPU就是插在主机上的真实的CPU硬件,在Linux下可以数不同的physical id 来确认主机的物理CPU个数。核心数: 物理CPU下一层概念就是核心…

内核/逻辑处理器/线程/多线程/多CPU/多核CPU

文章目录 1. 逻辑CPU2. 线程数和逻辑CPU个数,内核个数3.线程/进程/多核CPU3.1 线程3.2 多核cpu3.3 进程和线程 1. 逻辑CPU 先查看电脑cpu信息,可以看到,是8个逻辑cpu 2. 线程数和逻辑CPU个数,内核个数 在任务管理器中&#xf…

mysql 批量插入更新数据 的 两种方法

有时会有这种需求,当符合某种条件的数据存在时,去修改它,不存在时,则新增,也就是saveOrUpdate操作 当没有的时候就是插入语句 有数据的时候判断主键和唯一索引是否一样,一样那就按照 ON DUPLICATE KEY UPD…

MySQL批量插入数据脚本

作为测试环境,往往需要大数据量的情况下来测试SQL查询性能 这里编写一个批量插入数据的数据脚本: 1)设置log_bin_trust_function_creators //创建函数,假如报错:This function has none of DETERMINISTIC… 查看是否…

mysql 批量插入

最近新的项目写了不少各种 insertBatch 的代码,一直有人说,批量插入比循环插入效率高很多,那本文就来实验一下,到底是不是真的? 测试环境: SpringBoot 2.5Mysql 8JDK 8Docker 首先,多条数据的插入&#…

Mysql批量插入1000条数据

使用mysql的存储过程 1.现有如下一张表&#xff1a;site_row 2.创建存储过程 CREATE PROCEDURE p01 () BEGIN declare i int; set i1;while i<1000 doINSERT INTO site_row(row_id,row_num) VALUES ( i,i);set ii1; end WHILE;END; 3.执行存储过程 CALL p01(); 4.查看效…

mysql 批量查询插入,MySQL批量插入查询出来的数据

timg.jpg 先看SQL&#xff1a; INSERT INTO movie_detail_tab (VIDEO_ID, PLAY_URL) SELECT b.ID AS VIDEO_ID, x.playurl AS PLAY_URL FROM ( SELECT a.playurl, CONCAT( a.卡通名, a.第几集 ) AS videoCname FROM ( SELECT playurl, SUBSTRING_INDEX(sname, , 1) AS 卡通名,…

C++向mysql批量插入数据

一、以下共统计了3种批量插入的方法: 1、普通方法:一条一条插入; 2、使用拼接语句一次性插入,拼接语句的语法如下: insert into table (col1,col2,col3) values (’a’,’b‘,’c‘), (’a1’,’b1‘,’c1‘),(’a2‘,’b2‘,’c2),...... 对于拼接语句sql有…

mysql新增,更新,批量插入操作

mysql新增和更新操作 一、Insert的几种语法 例子: CREATE TABLE users (id int(11) NOT NULL AUTO_INCREMENT,username varchar(30) DEFAULT NULL,money double DEFAULT NULL,PRIMARY KEY (id),UNIQUE KEY username_index (username) ) ENGINEInnoDB AUTO_INCREMENT10 DEFAU…

MySQL优化:批量插入大数据4种实用、讲究方案的测试

简明&#xff1a;本文记录个人使用MySQL插入大数据总结较实用的方案&#xff0c;通过对常用插入大数据的4种方式进行测试&#xff0c;即for循环单条、拼接SQL、批量插入saveBatch()、循环 开启批处理模式&#xff0c;得出比较实用的方案心得。 &#xff08;个人记录学习笔记内…

Hi3559A Hi3519A Hi3556A算力对比

Hi3559A Hi3519A Hi3556A算力对比 Hi3559A 即Hi3559ARFCV100 4T算力 封装 FC-BGA 常备 Hi3519A Hi3519ARFVV100 才是AI芯片 2T算力 订货 先进的智能IP摄像头Soc Hi3519V101 先进的工业IP摄像头Soc Hi3516DV300 1T算力 常备 专业4M智能IP摄像SoC Hi3516CV500 0.5T算力 常备货…