2016-11-20 3 views
3

tensorflow 용지 상태로 Tensorflow의 교차 장치 통신은 "수신 노드"와 "전송 노드"를 장치에 추가하여 이루어집니다.Tensorflow 교차 장치 통신

제 생각에 장치 (CPU 장치 만 고려하십시오)는 연산 계산을 담당합니다. 그러나 데이터 (예 : 작업에서 생성 된 Tensor, 가변 버퍼)는 메모리에 상주합니다. 한 장치에서 다른 장치로 데이터를 전송하는 방법이 실제로 인 방법을 모르겠습니다. 나는 데이터 전송이 공유 메모리에 의해 이루어진다 고 생각한다. 그게 맞습니까?

데이터 전송 방법에 대한 설명/해당 코드를 이해할 수 있습니다. PS : TensorFlow paper link, 그림 4는 장치 간 통신 메커니즘을 보여줍니다.

답변

5

TensorFlow에서 장치 간 통신은 구현에 따라 구현이 다른 Rendezvous 인터페이스를 사용하여 구현됩니다. 해당 인터페이스에 대한 댓글이 일반적인 생각 설명 : 당신이 당신의 질문에서 언급 한 바와 같이

// A Rendezvous is an abstraction for passing a Tensor 
// from a producer to a consumer, where the consumer may safely 
// request the Tensor before or after it has been produced. A 
// producer never blocks when using a Rendezvous. A consumer has the 
// choice of making a blocking call or providing a callback: in either 
// case, the consumer receives the Tensor as soon as it is available. 

을 TensorFlow 그래프가 장치에 걸쳐 분할되어 자동으로 그래프에 추가됩니다 SendRecv 작전을 사용하여 플로우 그래프의 통신을 나타냅니다 . 서로 다른 디바이스에 소스와 목적지가있는 각 에지에 대해 그래프 파티셔는 SendRecv 연산 쌍을 삽입하여 동일한 "랑데부 키"(랑데뷰 인덱스에서 키로 사용되는 자동 생성 문자열 이름)를 공유합니다. 계류중인 텐서스). implementation of the Send op은 간단합니다. Rendezvous::Send()을 호출하고 랑데뷰 키와 단일 입력 텐서를 전달한 다음 차단하지 않고 즉시 반환합니다. implementation of the Recv op은 약간 더 복잡합니다. 특정 키가있는 텐서가 사용 가능 해지면 호출 될 콜백을 등록합니다. 그 callbackRecv op의 출력을 "생성"하고 후속 계산을 차단합니다.

  • IntraProcessRendezvous 같은 프로세스에서 디바이스 간의 데이터 전송을 처리

    Rendezvous

    구현하여 데이터를 전송하는 실제 작업을 수행한다. (있을 법하지 않은) 동일한 프로세스에서 두 CPU 장치간에 전송하는 경우에는 simple Tensor assignment으로 전송할 수 있습니다. 그렇지 않은 경우 TensorFlow kicks off은 CPU와 GPU 장치간에 데이터를 전송하는 장치 별 DMA 루틴입니다.

  • 클래스 및 하위 클래스는 보내기 및 수신자가 서로 다른 프로세스에있을 수있는 경우 교차 장치 통신을 처리합니다. 이 클래스의 주요 구현은 RpcRemoteRendezvous이며 원격 전송을 처리하는 uses gRPC입니다.

+0

대단히 감사합니다. @mrry – kz28

+0

@mrry 매우 구체적인 지침 –

관련 문제