代码之家  ›  专栏  ›  技术社区  ›  Felipe

Tensorflow:GPU加速只发生在第一次运行之后

  •  0
  • Felipe  · 技术社区  · 7 年前

    tensorflow-gpu .

    使用的版本:


    这是 nvidia-smi ,显示显卡配置。

    | NVIDIA-SMI 410.78       Driver Version: 410.78       CUDA Version: 10.0     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  GeForce GTX 960M    On   | 00000000:02:00.0 Off |                  N/A |
    | N/A   44C    P8    N/A /  N/A |    675MiB /  4046MiB |      0%   E. Process |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |    0      1502      G   /usr/lib/xorg/Xorg                           363MiB |
    |    0      3281      G   compiz                                        96MiB |
    |    0      4375      G   ...uest-channel-token=14359313252217012722    69MiB |
    |    0      5157      C   ...felipe/proj/venv/bin/python3.6            141MiB |
    +-----------------------------------------------------------------------------+
    

    device_lib.list_local_devices()

    [name: "/device:CPU:0"
      device_type: "CPU"
      memory_limit: 268435456
      locality {
      }
      incarnation: 5096693727819965430, 
    name: "/device:XLA_GPU:0"
      device_type: "XLA_GPU"
      memory_limit: 17179869184
      locality {
      }
      incarnation: 13415556283266501672
      physical_device_desc: "device: XLA_GPU device", 
    name: "/device:XLA_CPU:0"
      device_type: "XLA_CPU"
      memory_limit: 17179869184
      locality {
      }
      incarnation: 14339781620792127180
      physical_device_desc: "device: XLA_CPU device", 
    name: "/device:GPU:0"
      device_type: "GPU"
      memory_limit: 3464953856
      locality {
        bus_id: 1
        links {
        }
      }
      incarnation: 13743207545082600644
      physical_device_desc: "device: 0, name: GeForce GTX 960M, pci bus id: 0000:02:00.0, compute capability: 5.0"
    ]
    

    运行一些虚拟矩阵乘法

    shapes = [(50, 50), (100, 100), (500, 500), (1000, 1000), (10000,10000), (15000,15000)]
    
    devices = ['/device:CPU:0', '/device:XLA_GPU:0']
    
    for device in devices:
        for shape in shapes:
            with tf.device(device):
                random_matrix = tf.random_uniform(shape=shape, minval=0, maxval=1)
                dot_operation = tf.matmul(random_matrix, tf.transpose(random_matrix))
                sum_operation = tf.reduce_sum(dot_operation)
    
            # Time the actual runtime of the operations
            start_time = datetime.now()
            with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as session:
                result = session.run(sum_operation)
            elapsed_time = datetime.now() - start_time
    
            # PRINT ELAPSED TIME, SHAPE AND DEVICE USED       
    

    这是惊喜 . 第一次运行包含这段代码的单元格(我在jupyter笔记本上)时 GPU的计算时间比CPU长得多 :

    # output of first run: CPU is faster
    ----------------------------------------
    Input shape: (50, 50) using Device: /device:CPU:0 took: 0.01
    Input shape: (100, 100) using Device: /device:CPU:0 took: 0.01
    Input shape: (500, 500) using Device: /device:CPU:0 took: 0.01
    Input shape: (1000, 1000) using Device: /device:CPU:0 took: 0.02
    Input shape: (10000, 10000) using Device: /device:CPU:0 took: 6.22
    Input shape: (15000, 15000) using Device: /device:CPU:0 took: 21.23
    ----------------------------------------
    Input shape: (50, 50) using Device: /device:XLA_GPU:0 took: 2.82
    Input shape: (100, 100) using Device: /device:XLA_GPU:0 took: 0.17
    Input shape: (500, 500) using Device: /device:XLA_GPU:0 took: 0.18
    Input shape: (1000, 1000) using Device: /device:XLA_GPU:0 took: 0.20
    Input shape: (10000, 10000) using Device: /device:XLA_GPU:0 took: 28.36
    Input shape: (15000, 15000) using Device: /device:XLA_GPU:0 took: 93.73
    ----------------------------------------
    

    # output of reruns: GPU is faster
    ----------------------------------------
    Input shape: (50, 50) using Device: /device:CPU:0 took: 0.02
    Input shape: (100, 100) using Device: /device:CPU:0 took: 0.02
    Input shape: (500, 500) using Device: /device:CPU:0 took: 0.02
    Input shape: (1000, 1000) using Device: /device:CPU:0 took: 0.04
    Input shape: (10000, 10000) using Device: /device:CPU:0 took: 6.78
    Input shape: (15000, 15000) using Device: /device:CPU:0 took: 24.65
    ----------------------------------------
    Input shape: (50, 50) using Device: /device:XLA_GPU:0 took: 0.14
    Input shape: (100, 100) using Device: /device:XLA_GPU:0 took: 0.12
    Input shape: (500, 500) using Device: /device:XLA_GPU:0 took: 0.13
    Input shape: (1000, 1000) using Device: /device:XLA_GPU:0 took: 0.14
    Input shape: (10000, 10000) using Device: /device:XLA_GPU:0 took: 1.64
    Input shape: (15000, 15000) using Device: /device:XLA_GPU:0 took: 5.29
    ----------------------------------------
    

    为什么只有在我运行一次代码之后GPU才会加速呢?

    我可以看到GPU的设置是正确的(否则不会发生任何加速)。这是由于某种初始开销造成的吗?GPU需要吗 热身

    附笔。: 在两次运行中(即GPU速度较慢的一次运行和GPU速度较快的下一次运行),我都可以看到GPU的使用率是100%,所以它肯定被使用了。

    附笔。: 捡起 . 如果我运行两次、三次或多次,第一次运行之后的所有运行都是成功的(即GPU计算速度更快)。

    0 回复  |  直到 7 年前
        1
  •  1
  •   Felipe    7 年前

    robert-crovella's comment

    原来GPU以两种方式映射到Tensorflow设备:XLA设备和普通GPU。

    这就是为什么有两个装置,一个叫做 "/device:XLA_GPU:0" 另一个呢 "/device:GPU:0" .

    我需要做的就是 是为了激活 相反。现在GPU立即被Tensorflow接收。