Nó phụ thuộc một chút vào quan điểm mà bạn nhìn vào nó. Trong bất kỳ thiết lập đa điểm nào, đa GPU hoặc đa máy, bạn cần quyết định cách chia nhỏ tính toán của mình trên các tài nguyên song song. Trong một thiết lập nhiều nút, đa GPU, có hai lựa chọn rất hợp lý:
(1) Mô hình song song trong mô hình. Nếu một mô hình có đường dẫn tính toán dài, độc lập, thì bạn có thể chia mô hình trên nhiều GPU và có tính toán từng phần của nó. Điều này đòi hỏi sự hiểu biết cẩn thận về mô hình và các phụ thuộc tính toán.
(2) Đào tạo được nhân rộng. Khởi động nhiều bản sao của mô hình, đào tạo chúng, và sau đó đồng bộ hóa việc học của chúng (gradient được áp dụng cho trọng số của chúng & thành kiến).
released Inception model của chúng tôi có một số biểu đồ tốt trong readme cho biết cách hoạt động của cả hai GPU và phân phối.
Nhưng để tl; dr nguồn đó: Trong thiết lập đa GPU, tốt nhất là nên cập nhật đồng bộ mô hình bằng cách lưu trữ trọng số trên CPU (tốt, trong DRAM đính kèm). Nhưng trong một thiết lập đa máy, chúng tôi thường sử dụng một "máy chủ tham số" riêng biệt lưu trữ và truyền bá các bản cập nhật trọng lượng. Để mở rộng quy mô đó đến nhiều bản sao, bạn có thể phân tích các thông số trên nhiều máy chủ tham số.
Với GPU và máy chủ thông số nhiều, bạn sẽ thấy mình cẩn thận hơn về vị trí thiết bị sử dụng các cấu trúc như with tf.device('/gpu:1')
, hoặc đặt trọng trên các máy chủ sử dụng tham số tf.train.replica_device_setter
để gán nó vào /job:ps
hoặc /job:worker
. Nói chung, việc đào tạo trên một bó GPU trong một máy đơn giản hơn nhiều - phải mất hơn 16 GPU phân tán tương đương với hiệu suất của 8 GPU trong một máy - nhưng việc đào tạo được phân phối cho phép bạn mở rộng thậm chí con số lớn hơn và khai thác nhiều CPU hơn.
Cảm ơn bạn rất nhiều vì đã giải thích! – xyd
Liên kết khởi động bị hỏng. [Ở đây] (https://github.com/tensorflow/models/blob/16e4679834e1bf3e805703b197d377e35504fa09/tutorials/image/cifar10/cifar10_multi_gpu_train.py) là một ví dụ khác. – Albert