判断服务器的可用cpu数量来设置num_workers

在一个多人使用的集群环境中,直接使用 multiprocessing.cpu_count() 获取的 CPU 核心数量可能不准确,因为部分 CPU 核心可能已经被其他用户的任务占用。为了更准确地确定可用的 CPU 核心数量,你可以使用一些系统工具来检查当前系统的 CPU 负载情况。

使用 psutil 检查可用 CPU 核心

psutil 是一个跨平台的库,可以轻松获取系统的运行信息,包括 CPU 负载、内存使用情况等。下面是一个示例代码,展示如何使用 psutil 来获取可用 CPU 核心数量:

import psutil

def get_available_cpu_count():
    """
    获取当前系统的可用CPU核心数量
    :return: 可用的CPU核心数量
    """
    # 获取每个CPU核心的当前负载
    cpu_percentages = psutil.cpu_percent(percpu=True)
    
    # 设置一个阈值,例如CPU负载小于50%时认为是可用的
    threshold = 50.0
    available_cores = sum(cpu < threshold for cpu in cpu_percentages)
    
    return available_cores

available_cpu_count = get_available_cpu_count()
print(f"Available CPU cores: {available_cpu_count}")

使用 psutilmultiprocessing 综合判断

为了更全面地获取系统的 CPU 信息,可以结合 psutilmultiprocessing 来判断总的 CPU 核心数量和当前可用的 CPU 核心数量。

import psutil
import multiprocessing

def get_total_and_available_cpu_count():
    """
    获取总的CPU核心数量和当前系统的可用CPU核心数量
    :return: 总的CPU核心数量, 可用的CPU核心数量
    """
    total_cpu_count = multiprocessing.cpu_count()
    cpu_percentages = psutil.cpu_percent(percpu=True)
    
    # 设置一个阈值,例如CPU负载小于50%时认为是可用的
    threshold = 50.0
    available_cores = sum(cpu < threshold for cpu in cpu_percentages)
    
    return total_cpu_count, available_cores

total_cpu_count, available_cpu_count = get_total_and_available_cpu_count()
print(f"Total CPU cores: {total_cpu_count}")
print(f"Available CPU cores: {available_cpu_count}")

示例代码:根据可用 CPU 核心数设置 num_workers

在获取了可用的 CPU 核心数量后,你可以根据这个数量来设置 num_workers

import os
import numpy as np
import torch
from torch.utils.data import Dataset, DataLoader
import psutil
import multiprocessing

class InMemoryVideoFramesDataset(Dataset):
    def __init__(self, root_dir, transform=None):
        self.root_dir = root_dir
        self.transform = transform
        self.dataset_dirs = [os.path.join(root_dir, d) for d in os.listdir(root_dir) if os.path.isdir(os.path.join(root_dir, d))]
        self.frames_list = self.load_all_frames_to_memory()
    
    def load_all_frames_to_memory(self):
        all_frames = []
        for dataset_dir in self.dataset_dirs:
            frames_list = sorted([os.path.join(dataset_dir, f) for f in os.listdir(dataset_dir) if f.endswith('.raw')])
            frames = [self.read_raw_file(frame_path) for frame_path in frames_list]
            all_frames.append(frames)
        return all_frames
    
    def __len__(self):
        return len(self.frames_list)
    
    def __getitem__(self, idx):
        frames = self.frames_list[idx]
        if self.transform:
            frames = [self.transform(frame) for frame in frames]
        return torch.stack(frames, dim=0)
    
    @staticmethod
    def read_raw_file(file_path):
        with open(file_path, 'rb') as f:
            frame = np.fromfile(f, dtype=np.uint8).reshape((480, 640))
        return torch.from_numpy(frame).float() / 255.0

def get_available_cpu_count():
    cpu_percentages = psutil.cpu_percent(percpu=True)
    threshold = 50.0
    available_cores = sum(cpu < threshold for cpu in cpu_percentages)
    return available_cores

# 数据集根目录
root_dir = 'path_to_your_root_directory'

# 创建数据集
dataset = InMemoryVideoFramesDataset(root_dir)

# 获取可用的CPU核心数
available_cpu_count = get_available_cpu_count()
num_workers = available_cpu_count // 2

# 创建数据加载器
dataloader = DataLoader(dataset, batch_size=1, shuffle=True, num_workers=num_workers)

# 测试数据加载器
for batch in dataloader:
    print(batch.shape)

总结

通过使用 psutil 获取当前系统的 CPU 负载信息,可以更准确地确定可用的 CPU 核心数量,并根据这个数量来设置 num_workers。这样可以更好地利用系统资源,提高数据加载和训练的效率。如果你有进一步的问题或需要更多帮助,请随时告诉我。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值