2017-12-27 27 views
1

일부 DL 계산을 위해 Tensorflow를 사용하고 있으며 이해할 수없는 동작이 있습니다. 나는 그 자체로 정방 행렬의 곱셈을 테스트입니다 : tf.matmul(a,a)을 :상수 성능의 Tensorflow 곱하기가 tf.random보다 느립니다.

행렬이 무작위로 각 실행에 초기화 될 때 행렬이 tf.constant
  • 으로 작성됩니다

    내 기대가 첫 번째 경우에는 초기 데이터를 전송하는 데 약간의 오버 헤드가 있어야하며 100MB (float32를 사용하는 5000x5000 행렬)이지만 두 번째 케이스의 실행은 각 런에서 무작위 초기화로 인해 약간 느려야합니다.

    그러나 내가 본 것은 상수의 곱셈이 동일한 세션에서 연속적으로 실행 되더라도 훨씬 느리다는 것입니다.

    코드

    import tensorflow as tf 
    import numpy as np 
    from timeit import timeit 
    import os 
    
    os.environ["TF_CPP_MIN_LOG_LEVEL"]="2" # nospam 
    SIZE = 5000 
    NUM_RUNS = 10 
    
    a = np.random.random((SIZE, SIZE)) 
    _const_a = tf.constant(a, dtype=tf.float32, name="Const_A") 
    _mul_const_a = tf.matmul(_const_a, _const_a, name="Mul_Const") 
    
    _random_a = tf.random_uniform((SIZE, SIZE), dtype=tf.float32, name="Random_A") 
    _mul_random_a = tf.matmul(_random_a, _random_a, name="Mul_Random") 
    
    with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as s: 
        # Run once to make sure everything is initialised 
        s.run((_const_a, _mul_const_a, _random_a, _mul_random_a)) 
    
        # timeit 
        print("TF with const\t", timeit(lambda: s.run((_mul_const_a.op)), number=NUM_RUNS)) 
        print("TF with random\t", timeit(lambda: s.run((_mul_random_a.op)), number=NUM_RUNS)) 
    

    출력

    Device mapping: 
    /job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce GTX 1070, pci bus id: 0000:01:00.0, compute capability: 6.1 
    Random_A/sub: (Sub): /job:localhost/replica:0/task:0/device:GPU:0 
    Random_A/RandomUniform: (RandomUniform): /job:localhost/replica:0/task:0/device:GPU:0 
    Random_A/mul: (Mul): /job:localhost/replica:0/task:0/device:GPU:0 
    Random_A: (Add): /job:localhost/replica:0/task:0/device:GPU:0 
    Mul_Random: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0 
    Mul_Const: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0 
    Random_A/max: (Const): /job:localhost/replica:0/task:0/device:GPU:0 
    Random_A/min: (Const): /job:localhost/replica:0/task:0/device:GPU:0 
    Random_A/shape: (Const): /job:localhost/replica:0/task:0/device:GPU:0 
    Const_A: (Const): /job:localhost/replica:0/task:0/device:GPU:0 
    TF with const 2.9953213009994215 
    TF with random 0.513827863998813 
    
  • 답변

    0

    YMMV, 내 겸손 K1100M에 반대 결과를 얻을 수 있습니다.

    Device mapping: 
    /job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Quadro K1100M, pci bus id: 0000:01:00.0, compute capability: 3.0 
    Random_A/sub: (Sub): /job:localhost/replica:0/task:0/device:GPU:0 
    Random_A/RandomUniform: (RandomUniform): /job:localhost/replica:0/task:0/device:GPU:0 
    Random_A/mul: (Mul): /job:localhost/replica:0/task:0/device:GPU:0 
    Random_A: (Add): /job:localhost/replica:0/task:0/device:GPU:0 
    Mul_Random: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0 
    Mul_Const: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0 
    Random_A/max: (Const): /job:localhost/replica:0/task:0/device:GPU:0 
    Random_A/min: (Const): /job:localhost/replica:0/task:0/device:GPU:0 
    Random_A/shape: (Const): /job:localhost/replica:0/task:0/device:GPU:0 
    Const_A: (Const): /job:localhost/replica:0/task:0/device:GPU:0 
    TF with const 4.3167382130868175 
    TF with random 9.889055849542306 
    
    0

    tensorflow에서 session.run()을 처음 호출하는 것은 무리가 있습니다. 벤치마킹을 원할 경우 반복적으로 호출해야합니다.

    상수 폴딩을 비활성화하지 않는 한 상수의 경우 그래프가 상수를 가져 오므로 거의 시간을 보지 못할 것입니다.