對于多 GPU 計算,TF-Replicator 依賴于"圖內復制"模式,其中每個設備的計算都在同一個 TensorFlow 圖中復制。設備之間的通信是通過連接設備相應子圖中的節點來實現的。在TF-Replicator中實現這一點具有挑戰性,因為通信可能發生在數據流圖中的任何點。因此,計算的構建順序至關重要。
我們的第一個想法是在單獨的Python線程中同時構建每個設備的子圖。當遇到通信基元時,線程會同步,主線程會插入所需的跨設備計算。之后,每個線程將繼續構建其設備的計算。然而,在我們考慮這種方法的時候,TensorFlow的圖構建API不是線程安全的,這使得在不同線程中同時構建子圖變得非常困難。相反,我們使用了圖形重寫在構建完所有設備的子圖后插入通信。構建子圖時,占位符入到需要通信的位置。然后,我們跨設備收集所有匹配的占位符,并用適當的跨設備計算替換它們。