精华内容
下载资源
问答
  • torch.load
  • bootstrap._gcd_import(name[level:], package, level) File "", line 986, in _gcd_import File "", line 969, in _find_and_load File "", line 958, in _find_and_load_unlocked File "", line 666, in _load_...

    任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~

     

    完整报错信息如下:

    Traceback (most recent call last):
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 18, in swig_import_helper
    return importlib.import_module(mname)
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
    File "<frozen importlib._bootstrap>", line 986, in _gcd_import
    File "<frozen importlib._bootstrap>", line 969, in _find_and_load
    File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
    File "<frozen importlib._bootstrap>", line 666, in _load_unlocked
    File "<frozen importlib._bootstrap>", line 577, in module_from_spec
    File "<frozen importlib._bootstrap_external>", line 906, in create_module
    File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
    ImportError: DLL load failed: 找不到指定的模块。
    
    
    During handling of the above exception, another exception occurred:
    
    
    Traceback (most recent call last):
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 41, in <module>
    from tensorflow.python.pywrap_tensorflow_internal import *
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 21, in <module>
    _pywrap_tensorflow_internal = swig_import_helper()
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 20, in swig_import_helper
    return importlib.import_module('_pywrap_tensorflow_internal')
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
    ImportError: No module named '_pywrap_tensorflow_internal'
    
    
    During handling of the above exception, another exception occurred:
    
    
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\__init__.py", line 24, in <module>
    from tensorflow.python import *
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\__init__.py", line 51, in <module>
    from tensorflow.python import pywrap_tensorflow
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 52, in <module>
    raise ImportError(msg)
    ImportError: Traceback (most recent call last):
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 18, in swig_import_helper
    return importlib.import_module(mname)
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
    File "<frozen importlib._bootstrap>", line 986, in _gcd_import
    File "<frozen importlib._bootstrap>", line 969, in _find_and_load
    File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
    File "<frozen importlib._bootstrap>", line 666, in _load_unlocked
    File "<frozen importlib._bootstrap>", line 577, in module_from_spec
    File "<frozen importlib._bootstrap_external>", line 906, in create_module
    File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
    ImportError: DLL load failed: 找不到指定的模块。
    
    
    During handling of the above exception, another exception occurred:
    
    
    Traceback (most recent call last):
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 41, in <module>
    from tensorflow.python.pywrap_tensorflow_internal import *
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 21, in <module>
    _pywrap_tensorflow_internal = swig_import_helper()
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 20, in swig_import_helper
    return importlib.import_module('_pywrap_tensorflow_internal')
    File "C:\Users\toy\AppData\Local\Programs\Python\Python35\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
    ImportError: No module named '_pywrap_tensorflow_internal'
    
    
    
    
    Failed to load the native TensorFlow runtime.
    
    
    See https://www.tensorflow.org/install/install_sources#common_installation_problems
    
    
    for some common reasons and solutions. Include the entire stack trace
    above this error message when asking for help.

     

    错误原因如下:

    1.版本问题

    我自己的电脑上是,cuddn更换成6.0,之前TensorFlow1.3+python3.6+cuda8.0+cudnn5.0也是这个错误,换成cudnn6.0就成功了,亲测可用可以试试。以下是其他版本。

    tensorflow-gpu v1.9.0 | cuda9.0 |  cuDNN7.1.4可行  | 备注:7.0.4/ 7.0.5/ 7.1.2不明确

    tensorflow-gpu v1.8.0 | cuda9.0 |  cuDNN  不明确 | 备注:7.0.4/ 7.0.5/ 7.1.2/ 7.1.4

    tensorflow-gpu v1.7.0 | cuda9.0 |  cuDNN  不明确 | 备注:7.0.4/ 7.0.5/ 7.1.2/ 7.1.4

    tensorflow-gpu v1.6.0 | cuda9.0 |  cuDNN  不明确 | 备注:7.0.4/ 7.0.5/ 7.1.2/ 7.1.4

    tensorflow-gpu v1.5.0 | cuda9.0 |  cuDNN  不明确 | 备注:7.0.4/ 7.0.5/ 7.1.2/ 7.1.4

    tensorflow-gpu v1.4.0 | cuda8.0 |  cuDNN 6.0 | 备注:6.0正常使用, 7.0.5不能用,5.1未知 

    tensorflow-gpu v1.3.0 | cuda8.0 |  cuDNN 6.0 | 备注:6.0正常使用, 7.0.5不能用,5.1未知 

    tensorflow-gpu v1.2.0 | cuda8.0 |  cuDNN 5.1 | 备注:5.1正常使用, 6.0/ 7.0.5 未知

    tensorflow-gpu v1.1.0 | cuda8.0 |  cuDNN 5.1 | 备注:5.1正常使用, 6.0/ 7.0.5 未知
     

     

    如果是版本不兼容,假如你之前安装的是cudnn5.1的话,若你的TensorFlow为1.3版本以上,则只要将cudnn64_5改成cudnn64_6就可以了

     

    2. 环境问题

    • python的版本太高了,换成3.6的就好。
    • 安装Visual C++ Redistributable for Visual Studio 2015 vc_redist.x64就可以解决。
    • 确定你的系统中有MSVCP140.DLL,如果没有,可以在这里下载 
    • 确认你的系统PATH环境变量设置正确,把CUDA目录下的bin,lib/x64等路径包含进去 
    • 确认你的电脑正确安装了DXSDK_Jun10 

    最后记得安装之前一定要把tensorflow卸载干净:

     pip uninstall tensorflow
     pip uninstall tensorflow-gpu

    >>>关于作者

    CSDN 博客专家,2019-CSDN百大博主,计算机(机器学习方向)博士在读,业余Kaggle选手,有过美团、腾讯算法工程师经历,目前就职于Amazon AI lab。喜爱分享和知识整合。

    关注微信公众号,点击“学习资料”菜单即可获取算法、编程资源以及教学视频,还有免费SSR节点相送哦。其他平台(微信/知乎/B站),欢迎关注同名公众号「图灵的猫」~

    展开全文
  • keras读取h5文件load_weights、load代码详解

    万次阅读 多人点赞 2019-07-31 16:30:04
    keras利用h5py读取h5文件,keras.models.load_model() 读取网络、权重;keras.models.load_weights() 仅读取权重。代码详解。

    关于保存h5模型、权重网上的示例非常多,也非常简单。主要有以下两个函数:
    1、keras.models.load_model() 读取网络、权重
    2、keras.models.load_weights() 仅读取权重
    load_model代码包含load_weights的代码,区别在于load_weights时需要先有网络、并且load_weights需要将权重数据写入到对应网络层的tensor中。

    下面以resnet50加载h5权重为例,示例代码如下

    import keras
    from keras.preprocessing import image
    import numpy as np
    
    from network.resnet50 import ResNet50
    #修改过,不加载权重(默认官方加载亦可)
    model = ResNet50() 
    
    # 参数默认 by_name = Fasle, 否则只读取匹配的权重
    # 这里h5的层和权重文件中层名是对应的(除input层)
    model.load_weights(r'\models\resnet50_weights_tf_dim_ordering_tf_kernels_v2.h5')  
    

    模型通过 model.summary()输出
    在这里插入图片描述

    一、模型加载权重 load_weights()
    def load_weights(self, filepath, by_name=False, skip_mismatch=False, reshape=False):
        if h5py is None:
            raise ImportError('`load_weights` requires h5py.')
        with h5py.File(filepath, mode='r') as f:
            if 'layer_names' not in f.attrs and 'model_weights' in f:
                f = f['model_weights']
            if by_name:
                saving.load_weights_from_hdf5_group_by_name(
                    f, self.layers, skip_mismatch=skip_mismatch,reshape=reshape)
            else:
                saving.load_weights_from_hdf5_group(f, self.layers, reshape=reshape)
    

    这里关心函数saving.load_weights_from_hdf5_group(f, self.layers, reshape=reshape)即可,参数 f 传递了一个h5py文件对象。
    读取h5文件使用 h5py 包,简单使用HDFView看一下resnet50的权重文件。
    在这里插入图片描述

    • resnet50_v2 这个权重文件,仅一个attr “layer_names”, 该attr包含177个string的Array,Array中每个元素就是层的名字(这里是严格对应在keras进行保存权重时网络中每一层的name值,且层的顺序也严格对应)。
    • 对于每一个key(层名),都有一个属性"weights_names",(value值可能为空)。例如:
      conv1的"weights_names"有"conv1_W:0"和"conv1_b:0",
      flatten_1的"weights_names"为null。
      在这里插入图片描述

    这里就简单介绍,后面在代码中说明h5py如何读取权重数据。

    二、从hdf5文件中加载权重 load_weights_from_hdf5_group()

    1、找出keras模型层中具有weight的Tensor(tf.Variable)的层

    def load_weights_from_hdf5_group(f, layers, reshape=False):
    	# keras模型resnet50的model.layers的过滤
    	# 仅保留layer.weights不为空的层,过滤掉无学习参数的层
    	filtered_layers = []
        for layer in layers:
            weights = layer.weights
            if weights:
                filtered_layers.append(layer)
    

    在这里插入图片描述
    filtered_layers为当前模型resnet50过滤(input、paddind、activation、merge/add、flastten等)层后剩下107层的list
    2、从hdf5文件中获取包含权重数据的层的名字
    前面通过HDFView看过每一层有一个[“weight_names”]属性,如果不为空,就说明该层存在权重数据。
    先看一下控制台对h5py对象f的基本操作(需要的去查看相关数据结构定义):

    >>> f
    <HDF5 file "resnet50_weights_tf_dim_ordering_tf_kernels_v2.h5" (mode r)>
    
    >>> f.filename
    'E:\\DeepLearning\\keras_test\\models\\resnet50_weights_tf_dim_ordering_tf_kernels_v2.h5'
    
    >>> f.name     
    '/'
    
    >>> f.attrs.keys()         #  f属性列表 #
    <KeysViewHDF5 ['layer_names']>
    
    >>> f.keys()  #无顺序
    <KeysViewHDF5 ['activation_1', 'activation_10', 'activation_11', 'activation_12', 
    ...,'activation_8', 'activation_9', 'avg_pool', 'bn2a_branch1', 'bn2a_branch2a', 
    ...,'res5c_branch2a', 'res5c_branch2b', 'res5c_branch2c', 'zeropadding2d_1']>
    
    >>> f.attrs['layer_names']       #*** 有顺序, 和summary()对应 ****
    array([b'input_1', b'zeropadding2d_1', b'conv1', b'bn_conv1',
           b'activation_1', b'maxpooling2d_1', b'res2a_branch2a',
           ..., b'res2a_branch1', b'bn2a_branch2c', b'bn2a_branch1', 
           b'merge_1', b'activation_47', b'res5c_branch2b', b'bn5c_branch2b',
           ..., b'activation_48', b'res5c_branch2c', b'bn5c_branch2c', 
           b'merge_16', b'activation_49', b'avg_pool', b'flatten_1', b'fc1000'],
          dtype='|S15')
    
    >>> f['input_1']
    <HDF5 group "/input_1" (0 members)>
    
    >>> f['input_1'].attrs.keys()   # 在keras中,每一个层都有‘weight_names’属性 #
    <KeysViewHDF5 ['weight_names']>
    
    >>> f['input_1'].attrs['weight_names']   # input层无权重  #
    array([], dtype=float64)
    
    >>> f['conv1']
    <HDF5 group "/conv1" (2 members)>
    
    >>> f['conv1'].attrs.keys()
    <KeysViewHDF5 ['weight_names']>
    
    >>> f['conv1'].attrs['weight_names']    # conv层有权重w、b  #
    array([b'conv1_W:0', b'conv1_b:0'], dtype='|S9')
    
    

    从文件中读取具有权重数据的层的名字列表

    	# 获取后hdf5文本文件中层的名字,顺序对应
        layer_names = load_attributes_from_hdf5_group(f, 'layer_names')
    	#上一句实现 layer_names = [n.decode('utf8') for n in f.attrs['layer_names']]
        filtered_layer_names = []
        for name in layer_names:
            g = f[name]
            weight_names = load_attributes_from_hdf5_group(g, 'weight_names')
            #上一句实现 weight_names = [n.decode('utf8') for n in f[name].attrs['weight_names']]
            #保留有权重层的名字
            if weight_names:
                filtered_layer_names.append(name)
        layer_names = filtered_layer_names
        # 验证模型中有有权重tensor的层 与 从h5中读取有权重层名字的 数量 保持一致。
        if len(layer_names) != len(filtered_layers):
            raise ValueError('You are trying to load a weight file '
                             'containing ' + str(len(layer_names)) +
                             ' layers into a model with ' +
                             str(len(filtered_layers)) + ' layers.')
    

    3、从hdf5文件中读取的权重数据、和keras模型层tf.Variable打包对应
    先看一下权重数据、层的权重变量(Tensor tf.Variable)对象,以conv1为例

    >>> f['conv1']['conv1_W:0']   # conv1_W:0 权重数据数据集
    <HDF5 dataset "conv1_W:0": shape (7, 7, 3, 64), type "<f4">
    
    >>> f['conv1']['conv1_W:0'].value  # conv1_W:0 权重数据的值, 是一个标准的4d array
    array([[[[ 2.82526277e-02, -1.18737184e-02,  1.51488732e-03, ...,
              -1.07003953e-02, -5.27982824e-02, -1.36667420e-03],
             [ 5.86827798e-03,  5.04415408e-02,  3.46324709e-03, ...,
               1.01423981e-02,  1.39493728e-02,  1.67549420e-02],
             [-2.44090753e-03, -4.86173332e-02,  2.69966386e-03, ...,
              -3.44439060e-04,  3.48098315e-02,  6.28910400e-03]],
            [[ 1.81872323e-02, -7.20698107e-03,  4.80302610e-03, ...,. ]]]])
    
    >>> conv1_w = np.asarray(f['conv1']['conv1_W:0'])  # 直接转换成numpy格式  
    >>> conv1_w.shape
    (7, 7, 3, 64)
    
    # 卷积层
    >>> filtered_layers[0]
    <keras.layers.convolutional.Conv2D object at 0x000001F7487C0E10>
    
    >>> filtered_layers[0].name
    'conv1'
    
    >>> filtered_layers[0].input
    <tf.Tensor 'conv1_pad/Pad:0' shape=(?, 230, 230, 3) dtype=float32>
    
    #卷积层权重数据
    >>> filtered_layers[0].weights
    [<tf.Variable 'conv1/kernel:0' shape=(7, 7, 3, 64) dtype=float32_ref>, 
     <tf.Variable 'conv1/bias:0' shape=(64,) dtype=float32_ref>]
    

    将模型权重数据变量Tensor(tf.Variable)、读取的权重数据打包对应,便于后续将数据写入到权重变量中.

    weight_value_tuples = []
    # 枚举过滤后的层
    for k, name in enumerate(layer_names):
       g = f[name]
       weight_names = load_attributes_from_hdf5_group(g, 'weight_names')
       # 获取文件中当前层的权重数据list, 数据类型转换为numpy array 
       weight_values = [np.asarray(g[weight_name]) for weight_name in weight_names]
       # 获取keras模型中层具有的权重数据tf.Variable个数
       layer = filtered_layers[k]
       symbolic_weights = layer.weights
       # 权重数据预处理
       weight_values = preprocess_weights_for_loading(layer, weight_values,
                              original_keras_version, original_backend,reshape=reshape)
       # 验证权重数据、tf.Variable数据是否相同
       if len(weight_values) != len(symbolic_weights):
           raise ValueError('Layer #' + str(k) + '(named "' + layer.name + 
                  '" in the current model) was found to correspond to layer ' + name +  
                  ' in the save file. However the new layer ' + layer.name + ' expects ' + 
                  str(len(symbolic_weights)) + 'weights, but the saved weights have ' + 
                  str(len(weight_values)) + ' elements.')
       # tf.Variable 和 权重数据 打包
       weight_value_tuples += zip(symbolic_weights, weight_values)
    

    4、将读取的权重数据写入到层的权重变量中
    在3中已经对应好每一层的权重变量Tensor和权重数据,后面将使用tensorflow的sess.run方法进新写入,后面一行代码。

    K.batch_set_value(weight_value_tuples)
    

    实际实现

    def batch_set_value(tuples):
        if tuples:
           assign_ops = []
           feed_dict = {}
           for x, value in tuples: 
           	  # 获取权重数据类型   			
              value = np.asarray(value, dtype=dtype(x))
              tf_dtype = tf.as_dtype(x.dtype.name.split('_')[0])
              if hasattr(x, '_assign_placeholder'):
                  assign_placeholder = x._assign_placeholder
                  assign_op = x._assign_op
              else:
              	  # 权重的tf.placeholder
                  assign_placeholder = tf.placeholder(tf_dtype, shape=value.shape)
                  # 对权重变量Tensor的赋值 assign的operation
                  assign_op = x.assign(assign_placeholder)
                  x._assign_placeholder = assign_placeholder # 用处?
                  x._assign_op = assign_op                   # 用处?
              assign_ops.append(assign_op)
              feed_dict[assign_placeholder] = value
          # 利用tensorflow的tf.Session().run()对tensor进行assign批次赋值
          get_session().run(assign_ops, feed_dict=feed_dict)
    

    至此,先有网络模型,后从h5中加载权重文件结束。后面就可以直接利用模型进行predict了。

    三、模型加载 load_model()

    这里基本和前面类似,多了一个加载网络而已,后面的权重加载方式一样。
    首先将前面加载权重的模型使用 model.save()保存为res50_model.h5,使用HDFView查看
    在这里插入图片描述
    属性成了3个,backend, keras_version和model_config,用于说明模型文件由某种后端生成,后端版本,以及json格式的网络模型结构。
    有一个key键"model_weights", 相较于属性有前面的h5模型,属性多了2个为['backend', 'keras_version', 'layer_names'] 该key键下面的键值是一个list, 和前面的h5模型的权重数据完全一致。
    类似的,先利用python代码查看下文件结构

    >>> ff
    <HDF5 file "res50_model.h5" (mode r)>
    
    >>> ff.attrs.keys()
    <KeysViewHDF5 ['backend', 'keras_version', 'model_config']>
    
    >>> ff.keys()
    <KeysViewHDF5 ['model_weights']>
    
    >>> ff['model_weights'].attrs.keys()  ## ff['model_weights']有三个属性
    <KeysViewHDF5 ['backend', 'keras_version', 'layer_names']>
    
    >>> ff['model_weights'].keys()   ## 无顺序
    <KeysViewHDF5 ['activation_1', 'activation_10', 'activation_11', 'activation_12',, 'avg_pool', 'bn2a_branch1', 'bn2a_branch2a', 'bn2a_branch2b',, 'bn5c_branch2c', 'bn_conv1', 'conv1', 'conv1_pad', 'fc1000', 'input_1',, 'c_branch2a', 'res5c_branch2b', 'res5c_branch2c']>
    
    >>> ff['model_weights'].attrs['layer_names']  ## 有顺序
    array([b'input_1', b'conv1_pad', b'conv1', b'bn_conv1', b'activation_1',
           b'pool1_pad', b'max_pooling2d_1', b'res2a_branch2a',
           b'bn2a_branch2a', b'activation_2', b'res2a_branch2b',
    	   ... 省略
           b'activation_48', b'res5c_branch2c', b'bn5c_branch2c', b'add_16',
           b'activation_49', b'avg_pool', b'fc1000'], dtype='|S15')
    

    1、加载模型主函数load_model

    def load_model(filepath, custom_objects=None, compile=True):
        if h5py is None:
            raise ImportError('`load_model` requires h5py.')
        model = None
        opened_new_file = not isinstance(filepath, h5py.Group)
        # h5加载后转换为一个 h5dict 类,编译通过键取值
        f = h5dict(filepath, 'r')
        try:
        	# 序列化并compile
            model = _deserialize_model(f, custom_objects, compile)
        finally:
            if opened_new_file:
                f.close()
        return model
    

    2、序列化并编译_deserialize_model
    函数def _deserialize_model(f, custom_objects=None, compile=True)的代码显示主要部分

    第一步,加载网络结构,实现完全同keras.models.model_from_json()

    # 从h5中读取网络结构的json描述字符串
    model_config = f['model_config']
    model_config = json.loads(model_config.decode('utf-8'))
    # 根据json构建网络模型结构
    model = model_from_config(model_config, custom_objects=custom_objects)
    

    第二步,加载网络权重,完全同model.load_weights()

    # 获取有顺序的网络层名, 网络层
    model_weights_group = f['model_weights']
    layer_names = model_weights_group['layer_names'] 
    layers = model.layers
    # 过滤 有权重Tensor的层
    for layer in layers:
        weights = layer.weights
        if weights:
            filtered_layers.append(layer)
    # 过滤有权重的数据
    filtered_layer_names = []
    for name in layer_names:
        layer_weights = model_weights_group[name]
        weight_names = layer_weights['weight_names']
        if weight_names:
            filtered_layer_names.append(name)
    # 打包数据  weight_value_tuples
    weight_value_tuples = []
    for k, name in enumerate(layer_names):
       layer_weights = model_weights_group[name]
       weight_names = layer_weights['weight_names']
       weight_values = [layer_weights[weight_name] for weight_name in weight_names]
       layer = filtered_layers[k]
       symbolic_weights = layer.weights
       weight_values = preprocess_weights_for_loading(...)
       weight_value_tuples += zip(symbolic_weights, weight_values)   
    # 批写入   
    K.batch_set_value(weight_value_tuples)
    

    第三步,compile并返回模型
    正常情况,模型网路建立、加载权重后 compile之后就完成。若还有其他设置,则可以再进行额外的处理。(模型训练后save会有额外是参数设置)。
    例如,一个只有dense层的网路训练保存后查看,属性多了"training_config",键多了"optimizer_weights",如下图。
    在这里插入图片描述
    当前res50_model.h5没有额外的参数设置。
    处理代码如下

    if compile:
    	training_config = f.get('training_config')
    	if training_config is None:
    		warnings.warn('No training configuration found in save file: '
                      'the model was *not* compiled. Compile it manually.')
            return model
        training_config = json.loads(training_config.decode('utf-8'))
    	optimizer_config = training_config['optimizer_config']
    	optimizer = optimizers.deserialize(optimizer_config, custom_objects=custom_objects)
    	# Recover loss functions and metrics.
    	loss = convert_custom_objects(training_config['loss'])
        metrics = convert_custom_objects(training_config['metrics'])
        sample_weight_mode = training_config['sample_weight_mode']
        loss_weights = training_config['loss_weights']
        # Compile model.
        model.compile(optimizer=optimizer, loss=loss, metrics=metrics,
               loss_weights=loss_weights, sample_weight_mode=sample_weight_mode)
        # Set optimizer weights.
        if 'optimizer_weights' in f:
            # Build train function (to get weight updates).
            model._make_train_function()
            optimizer_weights_group = f['optimizer_weights']
            optimizer_weight_names = [ 
                n.decode('utf8') for n in ptimizer_weights_group['weight_names']]
            optimizer_weight_values = [
                optimizer_weights_group[n] for n in optimizer_weight_names]
            try:
                model.optimizer.set_weights(optimizer_weight_values)
            except ValueError:
                warnings.warn('Error in loading the saved optimizer state. As a result,'
                  'your model is starting with a freshly initialized optimizer.')
    
    展开全文
  • ⚠警告问题、原因 及解决方案 DevTools failed to load SourceMap: Could not load content for chrome extension://ncennffkjdiamlpmcbajkmaiiiddgioo/js/xl-content.js.map

    DevTools failed to load SourceMap: Could not load content

    这里的意思是dev工具未能成功加载出源映射:无法加载内容 重点在for后面的部分,
    我遇到的提示是这样的
    Could not load content for chrome extension

    DevTools failed to load SourceMap: Could not load content for chrome extension://ncennffkjdiamlpmcbajkmaiiiddgioo/js/xl-content.js.map

    即为chrome拓展工具的部分,映射未能成功加载。

    经查询,后面的这个链接是因chrome中迅雷扩展工具的开启导致的,但并不影响正常运行,有强迫症的朋友可以考虑在扩展程序中将该工具禁用
    在这里插入图片描述

    参考

    来自其他相关插件问题的参考。

    来自tenserflow中tfjs文件的改正方法。

    展开全文
  • CPU核数和load average的关系

    万次阅读 多人点赞 2018-04-27 18:12:59
    在前面的文章《Linux系统监控——top命令》中我简单提到了,判断load average的数值到底大不大的判断依据,就是数值除以CPU核数,大于5,就说明超负荷运转了。——这里其实不太严谨 今天这篇文章来仔细分析分析,...

    作者新建了QQ群:460430320,供大家交流测试心得(培训机构勿进)。另外,还会不定期上传测试资料,也欢迎您共享测试资料。

    在前面的文章《Linux系统监控——top命令》中我简单提到了,判断load average的数值到底大不大的判断依据,就是数值除以CPU核数,大于5,就说明超负荷运转了。——这里其实不太严谨

    今天这篇文章来仔细分析分析,CPU和load average的关系。

    转载文章一

    我们知道判断一个系统的负载可以使用top,uptime等命令去查看,它分别记录了一分钟、五分钟、以及十五分钟的系统平均负载

    例如我的某台服务器:
    这里写图片描述

    你可能对于 Linux 的负载均值(load averages)已有了充分的了解。负载均值在 uptime 或者 top 命令中可以看到,它们可能会显示成这个样子:

    load average: 1.84, 1.34, 0.68

    很多人会这样理解负载均值:三个数分别代表不同时间段的系统平均负载(一分钟、五 分钟、以及十五分钟),它们的数字当然是越小越好。数字越高,说明服务器的负载越大,这也可能是服务器出现某种问题的信号。

    而事实不完全如此,是什么因素构成了负载均值的大小,以及如何区分它们目前的状况是 “好”还是“糟糕”?什么时候应该注意哪些不正常的数值?

    回答这些问题之前,首先需要了解下这些数值背后的些知识。我们先用最简单的例子说明, 一台只配备一块单核处理器的服务器。

    行车过桥
    一只单核的处理器可以形象得比喻成一条单车道。设想下,你现在需要收取这条道路的过桥费 — 忙于处理那些将要过桥的车辆。你首先当然需要了解些信息,例如车辆的载重、以及 还有多少车辆正在等待过桥。如果前面没有车辆在等待,那么你可以告诉后面的司机通过。 如果车辆众多,那么需要告知他们可能需要稍等一会。

    因此,需要些特定的代号表示目前的车流情况,例如:

    0.00 表示目前桥面上没有任何的车流。 实际上这种情况与 0.00 和 1.00 之间是相同的,总而言之很通畅,过往的车辆可以丝毫不用等待的通过。

    1.00 表示刚好是在这座桥的承受范围内。 这种情况不算糟糕,只是车流会有些堵,不过这种情况可能会造成交通越来越慢。

    超过 1.00,那么说明这座桥已经超出负荷,交通严重的拥堵。 那么情况有多糟糕? 例如 2.00 的情况说明车流已经超出了桥所能承受的一倍,那么将有多余过桥一倍的车辆正在焦急的等待。3.00 的话情况就更不妙了,说明这座桥基本上已经快承受不了,还有超出桥负载两倍多的车辆正在等待。

    上面的情况和处理器的负载情况非常相似。一辆汽车的过桥时间就好比是处理器处理某线程 的实际时间。Unix 系统定义的进程运行时长为所有处理器内核的处理时间加上线程 在队列中等待的时间。

    和收过桥费的管理员一样,你当然希望你的汽车(操作)不会被焦急的等待。所以,理想状态 下,都希望负载平均值小于 1.00 。当然不排除部分峰值会超过 1.00,但长此以往保持这 个状态,就说明会有问题,这时候你应该会很焦急。

    假设当前服务器只有一个CPU,那么上面的"load average"就告诉我们在最近一分钟内,平均有0.14个进程在等待CPU;最近五分钟内,CPU有30%的idle时间;而最近15分钟,平均有3.06个进程在等待CPU。而当服务器有4个CPU的时候,则是另外一番景象。

    “所以你说的理想负荷为 1.00 ?”

    嗯,这种情况其实并不完全正确。负荷 1.00 说明系统已经没有剩余的资源了。在实际情况中 ,有经验的系统管理员都会将这条线划在 0.70:

    “需要进行调查法则”: 如果长期你的系统负载在 0.70 上下,那么你需要在事情变得更糟糕之前,花些时间了解其原因。

    “现在就要修复法则”:1.00 。 如果你的服务器系统负载长期徘徊于 1.00,那么就应该马上解决这个问题。否则,你将半夜接到你上司的电话,这可不是件令人愉快的事情。

    “凌晨三点半锻炼身体法则”:5.00。 如果你的服务器负载超过了 5.00 这个数字,那么你将失去你的睡眠,还得在会议中说明这情况发生的原因,总之千万不要让它发生。

    PS:接下来是非常关键的一点,当前的CPU负载高还是不高,只看上面的数据是不行的,还要看服务器有多少个CPU 。

    转载文章二:

    CPU利用率与Load Average的区别?

    CPU利用率,是对一个时间段内CPU使用状况的统计,通过这个指标可以看出在某一个时间段内CPU被占用的情况,如果CPU被占用时间很高,那么就需要考虑CPU是否已经处于超负荷运作,长期超负荷运作对于机器本身来说是一种损害,因此必须将CPU的利用率控制在一定的比例下,以保证机器的正常运作。

    Load Average是 CPU的Load,它所包含的信息不是CPU的使用率状况,而是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息,也就是CPU使用队列的长度的统计信息。

    那么CPU利用率与Load Average对于性能测试的意义有什么区别呢?实际上,CPU利用率反映的是CPU被使用的情况,当CPU长期处于被使用而没有得到足够的时间休息间歇,那么对于CPU硬件来说是一种超负荷的运作,需要调整使用频度。而Load Average却从另一个角度来展现对于CPU使用状态的描述,Load Average越高说明对于CPU资源的竞争越激烈,CPU资源比较短缺。对于资源的申请和维护其实也是需要很大的成本,所以在这种高Average Load的情况下CPU资源的长期“热竞争”也是对于硬件的一种损害。

    如何评估性能需求中合理的Load Average?

    一般来说,Load Average是与机器内核数有关的。以一个单核的机器为例,load=0.5表示CPU还有一半的资源可以处理其他的线程请求,load=1表示CPU所有的资源都在处理请求,没有剩余的资源可以利用了,而load=2则表示CPU已经超负荷运作,另外还有一倍的线程正在等待处理。所以,对于单核机器来说,理想状态下,Load Average要小于1。同理,对于双核处理器来说,Load Average要小于2。结论是:多核处理器中,你的Load Average不应该高于处理器核心的总数量。

    不同核处理器之间的load值怎样换算?
    性能测试中可能遇到这样的问题,你的线上机器是8核的,但是线下性能测试机只有4核的,那么我用4核机器测试得到的load值是4,换算到8核机器上应该是多少呢?————这里原作者计算感觉晕了,我写自己的逻辑
    应该是4*4/8=2,即核多了,load值会变小。

    转载文章三

    平均负载是指上一分钟同时处于就绪状态的平均进程数。在CPU中可以理解为CPU可以并行处理的任务数量,就是CPU个数X核数。如果CPU Load等于CPU个数乘以核数,那么就说CPU正好满负载,再多一点,可能就要出问题了,有些任务不能被及时分配处理器,那要保证性能的话,最好要小于CPU个数X核数X0.7。

    Load Average是指CPU的Load。它所包含的信息是在一段时间内CPU正在处理及等待CPU处理的进程数之和的统计信息,也就是CPU使用队列的长度的统计信息。

    Load Average的值应该小于CPU个数X核数X0.7,Load Average会有3个状态平均值,分别是1分钟、5分钟和15分钟平均Load。如果1分钟平均出现大于CPU个数X核数的情况,还不需要担心;如果5分钟的平均也是这样,那就要警惕了;15分钟的平均也是这样,就要分析哪里出现问题,防范未然。

    转载文章四

    在平时的运维工作中,当一台服务器的性能出现问题时,通常会去看当前的CPU使用情况,尤其是看下CPU的负载情况(load average)。对一般的系统来说,根据cpu数量去判断。比如有2颗cup的机器。如果平均负载始终在1.2以下,那么基本不会出现cpu不够用的情况。也就是Load平均要小于Cpu的数量。

    对于cpu负载的理解,首先需要搞清楚下面几个问题:

    1)系统load高不一定是性能有问题。
    因为Load高也许是因为在进行cpu密集型的计算

    2)系统Load高不一定是CPU能力问题或数量不够。
    因为Load高只是代表需要运行的队列累计过多了。但队列中的任务实际可能是耗Cpu的,也可能是耗i/0奶子其他因素的。

    3)系统长期Load高,解决办法不是一味地首先增加CPU
    因为Load只是表象,不是实质。增加CPU个别情况下会临时看到Load下降,但治标不治本。

    4)在Load average 高的情况下需要鉴别系统瓶颈到底是CPU不足,还是io不够快造成或是内存不足造成的。

    ===============================================================================================================
    要想获得服务器的CPU负载情况,有下面几种命令:
    1)w命令
    [root@localhost ~]# w
    12:12:41 up 167 days, 20:46, 2 users, load average: 0.00, 0.01, 0.05
    USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
    root pts/0 192.168.1.5 10:01 1.00s 0.11s 0.00s w
    root pts/2 192.168.1.5 10:19 1:47m 0.04s 0.04s -bash

    2)uptime命令(一般首先会根据最后那个15分钟的load负载为准)
    [root@localhost ~]# uptime
    12:12:55 up 167 days, 20:46, 2 users, load average: 0.00, 0.01, 0.05

    3)top命令
    [root@localhost ~]# top
    top - 12:13:22 up 167 days, 20:47, 2 users, load average: 0.00, 0.01, 0.05
    Tasks: 272 total, 1 running, 271 sleeping, 0 stopped, 0 zombie
    %Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
    KiB Mem : 65759080 total, 58842616 free, 547908 used, 6368556 buff/cache
    KiB Swap: 2097148 total, 2097148 free, 0 used. 64264884 avail Mem

    对上面第三行的解释:
    us(user cpu time):用户态使用的cpu时间比。该值较高时,说明用户进程消耗的 CPU 时间比较多,比如,如果该值长期超过 50%,则需要对程序算法或代码等进行优化。
    sy(system cpu time):系统态使用的cpu时间比。
    ni(user nice cpu time):用做nice加权的进程分配的用户态cpu时间比
    id(idle cpu time):空闲的cpu时间比。如果该值持续为0,同时sy是us的两倍,则通常说明系统则面临着 CPU 资源的短缺。
    wa(wait):等待使用CPU的时间。
    hi(hardware irq):硬中断消耗时间
    si(software irq):软中断消耗时间
    st(steal time):虚拟机偷取时间

    以上解释的这些参数的值加起来是100%。

    4)vmstat
    [root@localhost ~]# vmstat
    procs -----------memory---------------------swap-------io---------system--------cpu-----
    r b swpd free buff cache si so bi bo in cs us sy id wa st
    3 0 0 1639792 724280 4854236 0 0 4 34 4 0 19 45 35 0 0

    解释说明:

    procs部分的解释

    • r 列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。
    • b列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。

    cpu部分的解释

    • us 列显示了用户方式下所花费 CPU 时间的百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
    • sy 列显示了内核进程所花费的cpu时间的百分比。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
    • wa 列显示了等待CPU时间的百分比。这里wa的参考值为5%,如果wa超过5%,说明CPU等待严重
    • id 列显示了cpu处在空闲状态的时间百分比

    system部分的解释
    in 列表示在某一时间间隔中观测到的每秒设备中断数。
    cs列表示每秒产生的上下文切换次数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。


    memory部分的解释
    swpd 切换到内存交换区的内存数量(k表示)。如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常
    free 当前的空闲页面列表中内存数量(k表示)
    buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。
    cache: 作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。


    swap部分的解释
    si 由内存进入内存交换区数量。
    so由内存交换区进入内存数量。


    IO部分的解释
    bi 从块设备读入数据的总量(读磁盘)(每秒kb)。
    bo 块设备写入数据的总量(写磁盘)(每秒kb)

    5)也可以使用dstat命令查看cpu信息
    [root@localhost ~]# dstat
    ----total-cpu-usage---- -dsk/total- -net/total- —paging-- —system–
    usr sys idl wai hiq siq| read writ| recv send| in out | int csw
    19 45 35 0 0 0| 30k 265k| 0 0 | 0 0 |9025 12k
    9 18 73 0 0 0| 0 144k|2578k 65k| 0 0 |3956 4343

    6)可以使用iostat查看IO负载
    [root@localhost ~]# iostat 1 1
    Linux 2.6.32-696.16.1.el6.x86_64 (nc-ftp01.kevin.cn) 2017年12月29日 x86_64 (4 CPU)

    avg-cpu: %user %nice %system %iowait %steal %idle
    19.32 0.00 45.44 0.06 0.26 34.93

    Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
    xvda 14.17 29.94 265.17 63120486 558975100

    解释说明:
    avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值
    %user: 在用户级别运行所使用的CPU的百分比.
    %nice: nice操作所使用的CPU的百分比.
    %sys: 在系统级别(kernel)运行所使用CPU的百分比.
    %iowait: CPU等待硬件I/O时,所占用CPU百分比.
    %idle: CPU空闲时间的百分比.

    Device段:各磁盘设备的IO统计信息
    tps: 每秒钟发送到的I/O请求数.
    Blk_read /s: 每秒读取的block数.
    Blk_wrtn/s: 每秒写入的block数.
    Blk_read: 读入的block总数.
    Blk_wrtn: 写入的block总数.

    [root@localhost ~]# iostat -x -k -d 1
    Linux 2.6.32-696.el6.x86_64 (centos6-vm02) 01/04/2018 x86_64 (4 CPU)

    Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
    scd0 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 0.36 0.36 0.00 0.36 0.00
    vda 0.01 0.13 0.04 0.13 0.60 0.89 18.12 0.00 2.78 0.19 3.53 2.55 0.04
    dm-0 0.00 0.00 0.04 0.22 0.58 0.88 11.25 0.00 3.27 0.25 3.82 1.61 0.04
    dm-1 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 0.13 0.13 0.00 0.04 0.00
    dm-2 0.00 0.00 0.00 0.00 0.00 0.00 7.91 0.00 0.19 0.10 5.00 0.16 0.00

    解释说明:
    rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
    wrqm/s: 每秒对该设备的写请求被合并次数
    r/s: 每秒完成的读次数
    w/s: 每秒完成的写次数
    rkB/s: 每秒读数据量(kB为单位)
    wkB/s: 每秒写数据量(kB为单位)
    avgrq-sz:平均每次IO操作的数据量(扇区数为单位)
    avgqu-sz: 平均等待处理的IO请求队列长度
    await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
    svctm: 平均每次IO请求的处理时间(毫秒为单位)
    %util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率

    如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
    idle小于70% IO压力就较大了,一般读取速度有较多的wait。
    同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)

    (2)简单说下CPU负载和CPU利用率的区别
    1)CPU利用率:显示的是程序在运行期间实时占用的CPU百分比
    2)CPU负载:显示的是一段时间内正在使用和等待使用CPU的平均任务数。

    CPU利用率高,并不意味着负载就一定大。
    举例来说:
    如果有一个程序它需要一直使用CPU的运算功能,那么此时CPU的使用率可能达到100%,但是CPU的工作负载则是趋近于"1",因为CPU仅负责一个工作!
    如果同时执行这样的程序两个呢?CPU的使用率还是100%,但是工作负载则变成2了。所以也就是说,当CPU的工作负载越大,代表CPU必须要在不同的工作之间
    进行频繁的工作切换。

    ------------------------下面通过一个电话亭打电话的比喻来说明这两者之间的区别------------------------
    某公用电话亭,有一个人在打电话,四个人在等待,每人限定使用电话一分钟,若有人一分钟之内没有打完电话,只能挂掉电话去排队,等待下一轮。
    电话在这里就相当于CPU,而正在或等待打电话的人就相当于任务数。

    在电话亭使用过程中,肯定会有人打完电话走掉,有人没有打完电话而选择重新排队,更会有新增的人在这儿排队,这个人数的变化就相当于任务数的增减。
    为了统计平均负载情况,我们5分钟统计一次人数,并在第1、5、15分钟的时候对统计情况取平均值,从而形成第1、5、15分钟的平均负载。

    有的人拿起电话就打,一直打完1分钟,而有的人可能前三十秒在找电话号码,或者在犹豫要不要打,后三十秒才真正在打电话。如果把电话看作CPU,人数看
    作任务,我们就说前一个人(任务)的CPU利用率高,后一个人(任务)的CPU利用率低。当然, CPU并不会在前三十秒工作,后三十秒歇着,只是说,有的程
    序涉及到大量的计算,所以CPU利用率就高,而有的程序牵涉到计算的部分很少,CPU利用率自然就低。但无论CPU的利用率是高是低,跟后面有多少任务在排队
    没有必然关系。

    (3)load average相关梳理(一分钟,五分钟,十五分钟的平均CPU负载,最重要的指标是最后一个数字,即前15分钟的平均CPU负载,这个数字越小越好。所谓CPU负载指的是一段时间内任务队列的长度,通俗的讲,就是一段时间内一共有多少任务在使用或等待使用CPU。(当前的"负载值除以cpu核数"就是cpu的利用率))
    load average表示的是系统的平均负荷,即CPU的Load。
    它所包含的信息不是CPU的使用率状况,而是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息,也就是CPU使用队列的长度的统计信息。
    它包括3个数字,分别表示系统在1、5、15分钟内进程队列中的平均进程数量(即处理的进程情况),
    原则上来说这3个数字越小越好,数字越小表示服务器的工作量越小,系统负荷比较轻

    当CPU完全空闲的时候,平均负荷为0(即load average的值为0);当CPU工作量饱和的时候,平均负荷为1。

    这里需要注意的是:
    load average这个输出值,这三个值的大小一般不能大于系统逻辑CPU的个数
    比如一台服务器有4个逻辑CPU,如果load average的三个值长期大于4时,说明CPU很繁忙,负载很高,可能会影响系统性能;
    但是偶尔大于4时,倒不用担心,一般不会影响系统性能。
    相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲,比如本例中的输出,CPU是比较空闲的。

    -------------load average举例理解---------------
    判断系统负荷是否过重,必须理解load average的真正含义。假设当前我的一台服务器只有一个CPU,所有的运算都必须由这个CPU来完成。
    不妨把这个CPU想象成一座大桥,桥上只有一根车道,所有车辆都必须从这根车道上通过(很显然,这座桥只能单向通行)。
    1)系统负荷为0,意味着大桥上一辆车也没有。
    2)系统负荷为0.5,意味着大桥一半的路段有车。
    3)系统负荷为1.0,意味着大桥的所有路段都有车,也就是说大桥已经"满"了。但是必须注意的是,直到此时大桥还是能顺畅通行的。
    4)系统负荷为1.7,意味着车辆太多了,大桥已经被占满了(100%),后面等着上桥的车辆为桥面车辆的70%。
    以此类推,系统负荷2.0,意味着等待上桥的车辆与桥面的车辆一样多;
    系统负荷3.0,意味着等待上桥的车辆是桥面车辆的2倍。
    总之,当系统负荷大于1,后面的车辆就必须等待了;系统负荷越大,过桥就必须等得越久。

    CPU的系统负荷,基本上等同于上面的类比。大桥的通行能力,就是CPU的最大工作量;桥梁上的车辆,就是一个个等待CPU处理的进程(process)。
    如果CPU每分钟最多处理100个进程,那么:
    系统负荷0.2,意味着CPU在这1分钟里只处理20个进程;
    系统负荷1.0,意味着CPU在这1分钟 里正好处理100个进程;
    系统负荷1.7,意味着除了CPU正在处理的100个进程以外,还有70个进程正排队等着CPU处理。

    为了服务器顺畅运行,系统负荷最好不要超过1.0,这样就没有进程需要等待了,所有进程都能第一时间得到处理。
    很显然,1.0是一个关键值,超过这个值,系统就不在最佳状态了,就需要动手干预了。

    --------1.0是系统负荷的理想值吗?-----------
    不一定,系统管理员往往会留一点余地,当这个值达到0.7,就应当引起注意了。
    以往经验是这样的:
    当系统负荷持续大于0.7,必须开始调查了,问题出在哪里,防止情况恶化。
    当系统负荷持续大于1.0,必须动手寻找解决办法,把这个值降下来。
    当系统负荷达到5.0,就表明系统有很严重的问题,长时间没有响应,或者接近死机了。觉不能让系统达到这个值。

    上面,假设我的这台服务器只有1个CPU。如果它装了2个CPU,就意味着服务器的处理能力翻了一倍,能够同时处理的进程数量也翻了一倍。
    还是用大桥来类比,两个CPU就意味着大桥有两根车道了,通车能力翻倍了。
    所以,2个CPU表明系统负荷可以达到2.0,此时每个CPU都达到100%的工作量。推广开来,n个CPU的服务器,可接受的系统负荷最大为n.0。

    ---------至于load average是多少才算理想,这个有争议,各有各的说法---------
    个人比较赞同CPU负载小于等于"内核数乘以0.5-0.7"算是一种理想状态。
    比如4核CPU的服务器,理想负载是小于等于2,最好不要超过2.8,否则性能多少会受影响。

    不管某个CPU的性能有多好,1秒钟能处理多少任务,可以认为它无关紧要,虽然事实并非如此。
    在评估CPU负载时,只以5分钟为单位做统计任务队列长度。如果每隔5分钟统计的时候,发现任务队列长度都是1,那么CPU负载就为1。

    假如现在某台服务器只有一个单核的CPU,负载一直为1,意味着没有任务在排队,还不错。
    但是这台服务器是双核CPU,等于是有4个内核,每个内核的负载为1的话,总负载为4。这就是说,如果这台服务器的CPU负载长期保持在4左右,还可以接受。
    但是每个内核的负载为1,并不能算是一种理想状态!这意味着服务器的CPU一直很忙,不得清闲。

    -----------load average返回三个平均值应该参考哪个值?------------
    如果只有1分钟的系统负荷大于1.0,其他两个时间段都小于1.0,这表明只是暂时现象,问题不大。
    如果15分钟内,平均系统负荷大于1.0(调整CPU核心数之后),表明问题持续存在,不是暂时现象。
    所以应该主要观察"15分钟系统负荷",将它作为服务器正常运行的指标。

    ----------如何来降低服务器的CPU负载?--------------
    最简单办法的是更换性能更好的服务器,不要想着仅仅提高CPU的性能,那没有用,CPU要发挥出它最好的性能还需要其它软硬件的配合。
    在服务器其它方面配置合理的情况下,CPU数量和CPU核心数(即内核数)都会影响到CPU负载,因为任务最终是要分配到CPU核心去处理的。两块CPU要比一块
    CPU好,双核要比单核好。因此,需要记住的是:除去CPU性能上的差异,CPU负载是基于内核数来计算的。有一个说法是"有多少内核,即有多少负载"。

    展开全文
  • unity动态加载Resources.Load方法

    万次阅读 多人点赞 2016-04-08 09:46:25
    Resources.Load:使用这种方式加载资源,首先需要下Asset目录下创建一个名为Resources的文件夹,这个命名是U3D规定的方式,然后把资源文件放进去,当然也可以在Resources中再创建子文件夹,代码加载时需要添加相应的...
  • torch.load()

    万次阅读 2020-06-09 17:20:57
    torch.load(f, map_location=None, pickle_module=<module 'pickle' from '/opt/conda/lib/python3.6/pickle.py'>, **pickle_load_args)[source] 从文件中加载一个用torch.save()保存的对象。 load()使用...
  • aload、aload_1、iload都是什么意思

    千次阅读 2019-05-09 09:07:51
    aload 什么意思 原文链接 http://www.importnew.com/13107.html1、aload 1、aload 从局部变量表的相应位置装载一个对象引用到操作数栈的栈顶 aload_0把this装载到了操作数栈中aload_0是一组格式为aload_的操作码中的...
  • MATLAB中load用法

    万次阅读 2019-08-02 20:36:39
    load 将文件变量加载到工作区中 语法 load(filename) load(filename,variables) load(filename,'-ascii') load(filename,'-mat') load(filename,'-mat',variables) S =load(___) loadfilename 说明 load...
  • 解决办法:Failed to load the native TensorFlow runtime.

    万次阅读 多人点赞 2018-10-09 09:56:17
    跑CPU版的object-detection的示例程序,导入tensorflow时...Failed to load the native TensorFlow runtime. 解决办法就是:pip install --upgrade --ignore-installed tensorflow 更新一下tensorflow就好了 ...
  • java小白,开个博客记录...商户登录页面,打开后直接报:DevTools failed to load SourceMap: Could not load content for http://localhost:9102/js/plugins/jquery/jquery.min.map: HTTP error: status code 404, ...
  • load命令

    千次阅读 2017-06-01 14:50:43
    1、DB2数据库事物回滚、数据恢复、数据备份等,所有与数据安全有关的工作都是通过日志来完成的。 2、DB2数据库日志分为:循环日志、归档日志。 3、load命令实现了快速导入数据的...在 LOADLOAD、BUILD、DELETE
  • torch.load invalid load key, ‘\x00

    千次阅读 2019-06-14 21:17:13
    torch加载yolov3.weights,报错: ...torch.load invalid load key, '\x00' cfg='cfg/yolov3.cfg' model = Darknet(cfg, img_size) # Load weights if weights.endswith('.pt'): # pytorch format ...
  • Load-sharing vs Load-balancing

    千次阅读 2015-05-26 16:35:36
    Load-sharing vs Load-balancingJune 3, 2009 The terminology load sharing vs. load balancing are commonly misunderstood terms in the networking industry. Most people use the term load-balancing ...
  • C#反射-Assembly.LoadLoadFrom与LoadFile 反射Demo: public class Person { public int Age; public void SayHello() { Console.WriteLine("Hello Person"); } } clas
  • 深入理解 Linux Load Average

    千次阅读 2020-02-13 12:26:48
    一直不解,为什么io占用较高时,系统负载也会变高,...uptime和top等命令都可以看到load average指标,从左至右三个数字分别表示1分钟、5分钟、15分钟的load average: uptime 16:04:43 up 20 days, 6:08, 2 user...
  • Python中json模块的load/loads方法实战及参数详解

    万次阅读 多人点赞 2019-09-07 15:20:57
    前言 适用于python2和python3 正文 在Python中json是一个非常常用的模块,这个主要有4个方法: json.dumps ...json.load ...这里主要分析讲解一下json的loads和load方法。...load方法是把文件内容转...
  • DOMcontentload与load

    千次阅读 2018-04-15 19:15:25
    简介:DOMContentLoaded与load简介DOMContentLoaded事件在页面文档加载解析完毕之后马上执行。而不会等待图片文件和子框架页面的加载onloadload事件会在页面所有资源被加载进来之后才会触发load事件。load时间在...
  • Httpload

    千次阅读 2013-12-18 15:29:09
    来自:... Httpload(转) Httpload ...标签:Httpload ...分享到发表评论(0)编辑词条开心001人人网新浪微博目录 ...简介编辑本段回目录http_load是一个Web并发测试工具,可以以单进程
  • datagrid中load,reload,loadData方法

    千次阅读 2018-07-07 17:23:41
    一.load方法$(“#grid”).datagrid(“load”,{ });参数为一个json对象,里面写的是你要传输的参数的键值对,调用这个方法来加载数据的时候,它传给后台的分页信息是从第一页开始的二.reload方法:$(“#grid”)....
  • DC中wire_load_model与wire_load_mode

    千次阅读 2019-06-10 20:33:57
    说起wire load model,IC设计EDA流程工程师就会想到DC的两种工具模式:线负载模式(wire load mode)和拓扑模式(topographicalmode)。为什么基本所有深亚微米项目都使用拓扑模式而不是wireload模式?现在还有必要了解...
  • LoadError - cannot load such file -- nanaimo,翻译过来就是 LoadError - 无法加载此类文件 - nanaimo。该错误产生的时机一般是在验证 .podspec 文件的时候。本文具体介绍如何解决该类错误。
  • vue @load

    千次阅读 2020-04-11 15:53:39
    之前用@load的时候总是不生效。 其实原因是这样的: image src有值的时候,才开始加载 onload事件是在src的资源加载完毕的时候,才会触发 这样的话,在img标签的src属性填充上值之后,就可以等待onload事件的触发...
  • Db2中可以使用ADMINTABINFO来查询表的load的状态,如果LOAD_STATUS字段值为PENDING,说明为load pending,如果值为IN_PROGRESS,说明正在做load操作,示例: qingsong@node01:~$ db2 "select substr(TABSCHEMA,1,20...
  • datagrid中load,reload,loadData方法区别

    千次阅读 2018-08-30 16:28:45
    1.load方法 $(“#grid”).datagrid(“load”,{ }); 参数为一个json对象,里面写的是你要传输的参数的键值对,调用这个方法来加载数据的时候,它传给后台的分页信息是从第一页开始的 2.reload方法: $(“#grid...
  • 一言以蔽之 把原先模型eval,把加载后模型eval。才保证两模型完全一样。 保存模型 torch.save(net,'./model.pth') 或者 ... 加载模型 net=torch.load('./model.pth') ...net.load_state_dict(torch.load('./mo...
  • DevTools failed to load SourceMap: Could not load content for chrome-extension://ncennffkjdiamlpmcbajkmaiiiddgioo/js/xl-content.js.map: HTTP error: status code 404, net::ERR_UNKNOWN_URL_SCHEME 如图...
  • [emacs]load-file , load , require , autoload

    千次阅读 2017-07-20 22:39:39
    load-file , load , require , autoload

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 435,834
精华内容 174,333
关键字:

load