2016-09-23 27 views
5

Tôi hiểu rằng tf.train.replica_device_setter có thể được sử dụng để tự động gán các biến luôn trên cùng một máy chủ tham số (PS) (sử dụng vòng tròn) và các nút tính toán chuyên sâu trên một công nhân."tf.train.replica_device_setter" hoạt động như thế nào?

Làm cách nào để các biến tương tự được sử dụng lại trên nhiều bản sao biểu đồ, do các công nhân khác nhau xây dựng? Máy chủ tham số có nhìn vào tên của biến mà một nhân viên yêu cầu không?

Điều này có nghĩa là các tác vụ không nên được sử dụng song song để thực hiện hai biểu đồ khác nhau nếu trong cả hai biểu đồ các biến được đặt tên giống nhau?

Trả lời

11

tf.train.replica_device_setter() là hành vi hoàn toàn đơn giản để gán thiết bị cho mỗi tf.Variable vì được tạo — theo kiểu vòng tròn trên các tác vụ của máy chủ tham số.

Trong phiên bản phân phối của TensorFlow, mỗi thiết bị (ví dụ "/job:ps/task:17/cpu:0") duy trì một bản đồ từ tên biến cho các biến được chia sẻ giữa tất cả các phiên sử dụng thiết bị này. Điều này có nghĩa là khi các bản sao công nhân khác nhau tạo một phiên sử dụng thiết bị đó, nếu họ gán cùng một biến tượng trưng (có cùng thuộc tính Variable.name) cho cùng một thiết bị, họ sẽ thấy các cập nhật của nhau.

Khi bạn làm "between-graph replication" trên nhiều bản sao, tf.train.replica_device_setter() cung cấp cách đơn giản, xác định để gán biến cho thiết bị. Nếu bạn xây dựng một biểu đồ giống nhau trên mỗi bản sao công nhân, mỗi biến sẽ được gán cho cùng một thiết bị và được chia sẻ thành công, mà không có bất kỳ sự phối hợp bên ngoài nào.

Lưu ý: Với lược đồ này, bản sao công nhân của bạn phải tạo một biểu đồ giống hệt nhau * và không có sự ngẫu nhiên trong cách xây dựng biểu đồ. Tôi đã từng thấy một vấn đề mà thứ tự tạo các biến được xác định bằng cách lặp qua các khóa của một Python dict, là not guaranteed to happen in the same order trên các quy trình. Điều này dẫn đến các biến được gán cho các thiết bị PS khác nhau bởi các công nhân khác nhau.

Như câu hỏi khác của bạn, bạn cần phải cẩn thận về các xung đột tên biến khi đào tạo nhiều mô hình bằng cùng một quy trình. Theo mặc định, tất cả các biến được chia sẻ trong một không gian tên chung, do đó, hai biến từ các mạng khác nhau có cùng tên sẽ xung đột. Một cách để giảm thiểu vấn đề này là bao bọc mỗi mô hình trong một khối with tf.container(name): (với các giá trị khác nhau cho name, ví dụ: "model_1""model_2") để đặt biến của bạn trong một không gian tên khác, được gọi là "vùng chứa" trong thuật ngữ TensorFlow. Bạn có thể nghĩ một vùng chứa làm tiền tố được thêm vào tên của tất cả các biến của bạn khi chúng được tìm kiếm trên thiết bị. Sự hỗ trợ cho các container trong API vẫn còn khá sơ bộ, nhưng có những kế hoạch để làm cho chúng hữu ích hơn trong tương lai.


  * Về mặt kỹ thuật, họ chỉ cần tạo các đối tượng tf.Variable trong cùng một chuỗi.

Các vấn đề liên quan