2017-01-05 1 views
0

현재 GTX 1070에서 tensorflow로 신경망을 개발하고 프로파일 링하고 있습니다. 비싼 FFT 연산으로 인해 첫 번째 구현이 다소 비효율적이었습니다. 첨부 된 그림의 상단 타임 라인은 한 번의 교육 단계에서 약 115ms 걸리는 것으로 나타났습니다. 두 번째 (수학적으로 동등한) 구현은 훨씬 적은 시간을 소비하는 것처럼 보입니다. 한 단계는 10ms 미만입니다. Tensorflow 프로파일 링 타임 라인이 벽 시간과 일치하지 않습니다.

timelines

는 놀랍게도 두 가지 방법이 약 걸릴 (미안 해요, 난 아직 사진을 게시 할 수 있지 않다). 를 통해 파이썬에서 측정 된 동일한 시간 : 100 개 실행 걸릴 두 경우 모두

build model, get train_op... 
sess = tf.Session() 

import timeit 
t = timeit.default_timer() 
for i in range(100): 
    sess.run(train_op) 
dt = timeit.default_timer() - t 
print(dt) 

~ 17S> 내가 파이썬 오버 헤드에서 기대할 수있는 것보다 더 많은 100 * 115ms> 100 * 10ms의. 네트워크는 대기열을 사용하여 공급되지만 결과는 숫자가있는 배열을 그래프에 직접 입력하는 것과 동일하므로 empyt 대기열은 병목 현상이 될 수 없다고 결론을 냈습니다.

build model, get train_op... 
sess = tf.Session() 

def write_timeline(path): 
    from tensorflow.python.client import timeline 
    run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) 
    run_metadata = tf.RunMetadata() 
    sess.run(train_op, options=run_options, run_metadata=run_metadata) 

    # Create the Timeline object, and write it to a json 
    tl = timeline.Timeline(run_metadata.step_stats) 
    ctf = tl.generate_chrome_trace_format() 
    with open(path, 'w') as f: 
     f.write(ctf) 

write_timeline('timeline_1st_run.json') 
write_timeline('timeline_2nd_run.json') 

첫 번째 실행은 항상 tensorflow 여기에 몇 가지 최적화를 수행하거나 메모리를 할당되어 더 이상 해당 다음 실행 이상 걸릴 :

타임 라인은 내가 2 실점을 측정하는 차이로 기록 된 원칙에 처음으로?

timelines_first_runs

사람이 inconistent 결과를 설명 할 수 있습니까? 프로파일 링 타임 라인에서 훨씬 빨라야한다는 것을 보여주는 두 번째 구현은 파이썬에서 측정 한 동일한 시간이 걸리는 이유는 무엇입니까?

답변

0

전역 메모리 풀 증가, PTX 컴파일 및 최적화로 인해 첫 실행이 더 오래 걸릴 수 있습니다.

sess = tf.Session(config=tf.ConfigProto(graph_options=tf.GraphOptions(optimizer_options=tf.OptimizerOptions(opt_level=tf.OptimizerOptions.L0))) 

그러나, PTX 컴파일 여전히 첫 번째 실행에 1 ~ 2 초가 추가 할 수 있습니다 다음과 같이

당신은 최적화의 일부를 해제 할 수 있습니다. 따라서 프로파일 링 목적을 위해 사람들은 일반적으로 프로파일 링하기 전에 동일한 계산을 실행하기 위해 "예열"실행을 포함합니다.

또한 train_opassign 또는 assign_add 인 경우 train_op을 실행하면 결과가 다시 파이썬으로 반입됩니다. Python < -> TensorFlow 메모리 전송이 타임 라인에 반영되지 않았습니다 (grpc 전송도 누락되어 추적 issue). 목적 프로파일의 경우에는 연산을 실행하고 약간의 첫 번째 실행 속도를 높여 참으로 최적화를 해제

sess.run(train_op.op) 
+0

을 다음과 같은 조금 느리게 실행 만들면서 파이썬 전송을 생략 할 수있다. 내 train_op은'tf.train.Optimizer.minimize (loss)'에 의해 생성되는데, 내부적으로'assign '과 같은 것을 확실히합니다. 'sess.run (train_op)'은'None'을 반환합니다.이 규칙이 파이썬을 배제한다는 것이 맞습니까? <-> TensorFlow 메모리가 문제로 전송됩니까? 'sess.run ([loss, train_op]) 호출하는 데 약간 시간이 걸립니다. 두 구현이 동일한 월 시간을 갖는 또 다른 이유가있을 수 있습니까? – sejanDee

+0

'None'을 반환하면 파이썬 메모리 전송이 문제가 될 수 있습니다.효율적인 대 비효율적 인 구현은 타임 라인 (500 ~ 700 밀리 초)에서 비슷한 시간이 걸리는 것처럼 보이며 예열 후 벽 시계 시간에 얼마나 차이가 있습니까? –

+0

위에서 첫 번째 타임 라인은 실제로 예열됩니다 (10ms 대 110ms). 예열 된 벽시계 시간은 160ms와 170ms이며, 측정은 평균 1000 회 실행됩니다. – sejanDee