2017-11-21 4 views
0

TensorFlow의 실행 모델과 관련하여 CPU 장치 만 있고 네트워크가 추론을 위해서만 사용되는 경우 (예 : 이미지 인식 (https://www.tensorflow.org/tutorials/image_recognition) C++ 멀티 코어 플랫폼 예제.TensorFlow 단일 (멀티 코어) CPU 장치에서 실행

다음은 몇 가지 질문을하면서 이해 한 내용을 요약하려고합니다.

세션 -> 실행() (파일 direct_session.cc)은 ExecutionState :: RynAsynch를 호출합니다. ExecutorState :: RynAsynch는 루트 노드로 TensorFlow 준비 대기열을 초기화합니다. 이어서

, 명령

runner_([=]() { Process(tagged_node, scheduled_usec); }); (executor.cc, function ScheduleReady, line 2088) 

는 inter_op 풀 쓰레드에 노드 (따라서 관련된 동작)을 할당한다. 그러나 어떻게 작동하는지 완전히 이해하지 못합니다. 예를 들어, ScheduleReady가 inter_op 풀의 크기보다 많은 작업을 할당하려는 경우 작업이 대기열에 추가되는 방법 (FIFO 순서?) 풀의 각 스레드에 작업 대기열이 있거나 공유 대기열? 어디에서 코드를 찾을 수 있습니까? 풀의 각 스레드의 본문은 어디에서 찾을 수 있습니까?

또 다른 질문은 inline_ready가 관리하는 노드에 관한 것입니다. 이러한 (값이 싼 또는 죽은) 노드의 실행이 다른 노드의 실행과 어떻게 다릅니 까?

그럼에도 불구하고 (여전히 내 이해에 따라) 실행 흐름은 동기 및 비동기 작업을 구별하는 작업을 실행하는 ExecutorState :: Process에서 계속됩니다. 동기 및 비동기 작업이 실행 측면에서 어떻게 다른가요?

조작이 실행되면 PropagateOutputs (ActivateNodes 호출)는 현재 노드 (선행자) 실행으로 인해 준비된 모든 후속 노드를 준비 대기열에 추가합니다.

마지막으로 NodeDone()은 현재 TensorFlow 준비 대기열에있는 노드를 처리하는 ScheduleReady()를 호출합니다.

반대로 intra_op 스레드 풀이 관리되는 방식은 특정 커널에 따라 다릅니다. 맞습니까? 커널이 intra_op 쓰레드 풀 크기보다 더 많은 연산을 요구할 가능성이 있습니까? 예인 경우 어떤 종류의 주문을 대기열에 추가합니까? (FIFO?)

작업이 풀의 스레드에 할당되면 해당 운영 체제의 스케줄링이 기본 운영 체제에 맡겨 지거나 TensorFlow가 일종의 스케줄링 정책을 적용합니까?

문서에서 실행 모델의이 부분에 대해 거의 아무것도 찾지 못했기 때문에 여기에서 묻습니다. 일부 문서를 놓친 경우 모두 나를 가리켜주십시오.

답변

0

Re ThreadPool : Tensorflow가 DirectSession을 사용하는 경우 (귀하의 경우처럼) Eigen의 ThreadPool을 사용합니다. TensorFlow에서 사용 된 Eigen의 공식 버전에 대한 웹 링크를 얻을 수 없었지만 여기 스레드 풀 code에 대한 링크가 있습니다. 이 스레드 풀은이 큐 구현 RunQueue을 사용 중입니다. 스레드 당 하나의 대기열이 있습니다.

인 인라인 _ : Executor:Process 일부 고유 스레드에 예약됩니다. 실행되면 노드를 실행합니다.이 노드가 완료되면 다른 노드 (텐서 흐름 연산)가 준비됩니다. 이 노드 중 일부는 비싸지 않습니다. 그들은 inline_ready에 추가되고 항복하지 않고 같은 스레드에서 실행됩니다. 다른 노드는 비싸고 동일한 스레드에서 "즉시"실행되지 않습니다. 실행은 Eigen 스레드 풀을 통해 스케줄됩니다.

재 동기화/비동기 커널 : Tensorflow 작업은 동기식 (대부분의 CPU 커널) 또는 비동기식 커널 (대부분의 GPU 커널)로 백업 할 수 있습니다. 동기식 커널은 Process을 실행하는 스레드에서 실행됩니다. 비동기 커널은 장치 (일반적으로 GPU)에 보내져 실행됩니다. 비동기 커널이 완료되면 NodeDone 메소드가 호출됩니다.

Re Intra Op ThreadPool : 인트라 연산 스레드 풀은 계산을 병렬로 실행하기 위해 커널에서 사용할 수 있습니다. 대부분의 CPU 커널은 그것을 사용하지 않고 GPU 커널을 GPU로 보내고 Compute 메서드를 호출 한 스레드에서 동 기적으로 실행합니다. 구성에 따라 모든 장치 (CPU)에서 공유하는 하나의 intra-op 스레드 풀이 있거나 각 장치마다 자체 장치가 있습니다. 커널은 단순히이 스레드 풀에서 작업을 예약합니다. 여기에 kernel과 같은 예가 있습니다. 스레드보다 많은 작업이있는 경우에는 지정되지 않은 순서로 예약되고 실행됩니다. 다음은 커널에 노출 된 ThreadPool interface입니다.

tensorflow가 OS 스레드의 스케줄링에 어떤 영향을 주는지 모르겠습니다. 대기 시간을 최소화하기 위해 (OS 스케줄링을 통해) 약간의 회전 (즉, OS에 스레드를 생성하지 않음)을 요청할 수는 있지만 그 정도입니다.

이러한 내부 정보는 변경 될 수 있으므로 가능한 한 문서화되지 않았습니다. Python API를 통해 tensorflow를 사용한다면 입력이 준비 될 때 연산이 실행된다는 것을 알아야합니다. 사용자 정의 CPU 커널을 작성하는 경우

with tf.control_dependencies(<tensors_that_you_want_computed_before_the_ops_inside_this_block>): 
    tf.foo_bar(...) 

하고, 그 안에 병렬 처리 (일반적으로 매우 비싼 커널에 대한 거의 필요하지)를 수행하는 스레드 풀 인터페이스를 원하는 :이 넘어 어떤 순서를 적용하려면 사용해야합니다 위에 링크 된 것은 당신이 의지 할 수있는 것입니다.

+0

대단히 감사합니다. – Dan

+0

@Dan Glad 내가 도울 수있다. – iga

관련 문제