电脑GPU/CPU资源查看及使用

电脑GPU/CPU资源查看及使用

import torch
'''
1. 服务器GPU状态查询

    1) lspci | grep -i nvidia 可以查询所有nvidia显卡

    2) lspci -v -s [显卡编号] 可以查看显卡具体属性

    3) nvidia-smi 可以查看显卡的显存利用率

2. torch.cuda主要函数

    1) 查看是否有可用GPU、可用GPU数量: torch.cuda.is_available(), torch.cuda.device_count()

    2) 查看当前使用的GPU序号:torch.cuda.current_device()

    3) 查看指定GPU的容量、名称:

        torch.cuda.get_device_capability(device),  torch.cuda.get_device_name(device)

    4) 清空程序占用的GPU资源: torch.cuda.empty_cache()

    5) 为GPU设置随机种子:torch.cuda.manual_seed(seed), torch.cuda.manual_seed_all(seed)

'''

def select_device(id):
    force_cpu = False
    if id == -1: force_cpu = True
    cuda = False if force_cpu else torch.cuda.is_available()    #如果电脑不存在GPU,即使id不为零,cuda也是False
    device = torch.device('cuda:{}'.format(id) if cuda else 'cpu')
    '''
    format()是python2.6新增的一个格式化字符串的方法,功能非常强大,有可能在未来完全替代%格式化方法,相比 % ,format()的优点有:
    1 .格式化时不用关心数据类型的问题,format()会自动转换,而在%方法中,%s用来格式化字符串类型,%d用来格式化整型;
    2. 单个参数可以多次输出,参数顺序可以不同
    3. 填充方式灵活,对齐方式强大
    更多千位分隔符、百分数表示可见:https://blog.csdn.net/dcrmg/article/details/78188647?utm_source=blogxgwz3
    '''
    #打印电脑上已有的GPU/CPU设备
    if not cuda:
        print('Using CPU')
    if cuda:
        c = 1024 ** 2  # bytes to MB
        ng = torch.cuda.device_count()   #通过os.environ["CUDA_VISIBLE_DEVICES"]设置系统变量后,可能会使结果不准确
        x = [torch.cuda.get_device_properties(i) for i in range(ng)]
        print("Using CUDA device0 _CudaDeviceProperties(name='%s', total_memory=%dMB)" %
              (x[0].name, x[0].total_memory / c))
        if ng > 0:
            # torch.cuda.set_device(0)  # OPTIONAL: Set GPU ID
            for i in range(1, ng):
                print("           device%g _CudaDeviceProperties(name='%s', total_memory=%dMB)" %
                      (i, x[i].name, x[i].total_memory / c))    #%g根据值的大小决定使用%f或%e

    return device  #返回本次代码使用的设备


if __name__ == "__main__":
    _ = select_device(0)
    '''
    [1]单前导下划线 _var: 单个下划线是一个Python命名约定,表示这个名称是供内部使用的。 它通常不由Python解释器强制执行,仅仅作为一种对程序员的提示。
                     特例是使用通配符从模块中导入所有名称,则Python不会导入带有前导下划线的名称(使用时会显示:NameError: "name '_var' is not defined")
    [2]单末尾下划线 var_: 单个末尾下划线(后缀)是一个约定,用来避免与Python关键字产生命名冲突。
    [3]双前导下划线 __var: 名称修饰(name mangling) - 解释器更改变量的名称,以便在类被扩展的时候不容易产生冲突。将类内__方法或__变量变为_类名__方法名(变量名)
                    样例如下:
                    class Test:
                        def __init__(self):
                            self.foo = 11
                            self._bar = 23
                            self.__baz = 23
                            
                    >>> t = Test()
                    >>> dir(t)
                    [//'_Test__baz'//, '__class__', '__delattr__', '__dict__', '__dir__',
                    '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
                    '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__',
                    '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
                    '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
                    '__weakref__', //'_bar'//, //'foo'//]
    [4] 双前导和双末尾下划线 _var_: Python保留了有双前导和双末尾下划线的名称,用于特殊用途,这些dunder方法通常被称为神奇方法(魔法方法)。
                    最好避免在自己的程序中使用以双下划线(“dunders”)开头和结尾的名称,以避免与将来Python语言的变化产生冲突。
    [5]单下划线 _: 按照习惯,有时候单个独立下划线是用作一个名字,来表示某个变量是临时的或无关紧要的。也就是一个不感兴趣的变量,不想花心思取名,本质上就是一个变量名。
                   除了用作临时变量之外,_表示由解释器评估的最近一个表达式的结果
                    >>> 20 + 3
                    23
                    >>> _
                    23
                    >>> print(_)
                    23
 
                    >>> list()
                    []
                    >>> _.append(1)
                    >>> _.append(2)
                    >>> _.append(3)
                    >>> _
                    [1, 2, 3]
    Python中下划线的5种含义:https://blog.csdn.net/tcx1992/article/details/80105645
    '''

运行结果
在这里插入图片描述

你可能感兴趣的:(pytorch,gpu,cuda,python)