2016-08-03 16 views
7

Tôi đang cố gắng hiểu vai trò chính xác của dịch vụ chính và nhân viên trong TensorFlow.TensorFlow Master and Worker Service

Cho đến nay tôi hiểu rằng mỗi tác vụ TensorFlow mà tôi bắt đầu được liên kết với một cá thể tf.train.Server. trường hợp này xuất khẩu một "bậc thầy dịch vụ" và "dịch vụ người lao động" bằng cách thực hiện các giao diện tensorflow::Session"(master) và worker_service.proto (công nhân)

Câu hỏi 1:. Tôi có quyền rằng điều này có nghĩa, rằng ONE nhiệm vụ chỉ được liên kết với ONE nhân


Hơn nữa, tôi hiểu ...

... về sư Phụ:? Đó là phạm vi t ông chủ dịch vụ ...

(1) ... để cung cấp chức năng cho khách hàng để khách hàng có thể chạy phiên chẳng hạn.

(2) ... để phân công công việc cho những người lao động hiện có để tính toán một phiên chạy.

Câu hỏi thứ hai: Trong trường hợp chúng tôi thực thi biểu đồ được phân phối bằng nhiều tác vụ, chỉ có một dịch vụ chính được sử dụng?

Câu hỏi thứ ba: Nên tf.Session.run chỉ được gọi một lần?

Đây là ít nhất làm thế nào tôi giải thích con số này từ the whitepaper:

enter image description here


... về Worker: Đó là phạm vi của dịch vụ lao động ...

(1) để thực hiện các nút (được ủy quyền cho anh ta bởi dịch vụ chính) trên các thiết bị mà nhân viên quản lý.

Câu hỏi thứ tư: Làm cách nào một nhân viên sử dụng nhiều thiết bị? Người lao động có quyết định tự động cách phân phối các hoạt động đơn lẻ không?


Cũng vui lòng sửa lỗi trong trường hợp tôi phát hiện ra câu lệnh sai! Cảm ơn bạn trước !!

+0

cho phần 4, trong các phiên bản trước nó sẽ xoay vòng trên các thiết bị GPU, trong các phiên bản sau có vẻ như đặt mọi thứ trên GPU: 0, vì vậy bạn cần vị trí thủ công cho cấu hình đa GPU –

Trả lời

8

Câu hỏi thứ nhất: Tôi có đúng là điều này có nghĩa là, nhiệm vụ ONE đó chỉ là được liên kết với MỘT công nhân?

Đây là cấu hình điển hình, vâng. Mỗi cá thể tf.train.Server chứa thời gian chạy TensorFlow đầy đủ và cấu hình mặc định giả định rằng thời gian chạy này có quyền truy cập độc quyền vào máy (về số lượng bộ nhớ mà nó phân bổ trên GPU, v.v.).

Lưu ý rằng bạn có thể tạo nhiều trường hợp tf.train.Server trong cùng một quá trình (và đôi khi chúng tôi thực hiện điều này for testing). Tuy nhiên, có ít sự cách ly tài nguyên giữa các trường hợp này, do đó, chạy nhiều phiên bản trong một tác vụ duy nhất không có khả năng mang lại hiệu suất tốt (với phiên bản hiện tại).

Câu hỏi thứ hai: Trong trường hợp chúng tôi thực thi biểu đồ được phân phối sử dụng hơn một nhiệm vụ, chỉ có một dịch vụ chính được sử dụng?

Tùy thuộc vào số form of replication bạn đang sử dụng. Nếu bạn sử dụng "sao chép trong đồ thị", bạn có thể sử dụng một dịch vụ chính duy nhất biết về tất cả các bản sao của mô hình (tức là các công việc của người lao động). Nếu bạn sử dụng "sao chép giữa các biểu đồ", bạn sẽ sử dụng nhiều dịch vụ chính, mỗi dịch vụ đều biết về một bản sao duy nhất của mô hình và thường được phân bổ bằng tác vụ của nhân viên mà nó chạy. Nói chung, chúng tôi đã tìm thấy nó hiệu quả hơn để sử dụng bản sao giữa các biểu đồ và thư viện tf.train.Supervisor được thiết kế để đơn giản hóa hoạt động ở chế độ này.

Câu hỏi thứ ba: Nên tf.Session.run() chỉ được gọi một lần?

(Tôi giả định này có nghĩa là "một lần cho mỗi bước đào tạo". Một chương trình TensorFlow đơn giản để đào tạo một mô hình sẽ gọi tf.Session.run() trong một vòng lặp.)

này phụ thuộc vào hình thức sao chép bạn đang sử dụng , sự phối hợp bạn muốn giữa các bản cập nhật đào tạo.

  • Sử dụng trong đồ thị dưới sao chép, bạn có thể thực hiện đồng bộ cập nhật bằng cách tập hợp những tổn thất hoặc gradient trong một đơn tf.train.Optimizer, mang đến cho một đơn train_op để chạy. Trong trường hợp này, bạn chỉ cần gọi tf.Session.run(train_op) một lần cho mỗi bước đào tạo.

  • Sử dụng trong đồ thị dưới nhân rộng, bạn thực hiện không đồng bộ cập nhật bằng cách định nghĩa một tf.train.Optimizer mỗi bản sao, mang đến cho nhiều train_op hoạt động để chạy. Trong trường hợp này, bạn thường gọi mỗi tf.Session.run(train_op[i]) từ một chủ đề khác, đồng thời.

  • Sử dụng giữa các đồ thị nhân rộng, bạn thực hiện đồng bộ cập nhật bằng cách sử dụng tf.train.SyncReplicasOptimizer, được xây dựng riêng trong mỗi bản sao. Mỗi bản sao có vòng lặp đào tạo riêng để thực hiện một cuộc gọi đến tf.Session.run(train_op) và điều chỉnh các tọa độ SyncReplicasOptimizer để các bản cập nhật được áp dụng đồng bộ (theo chuỗi nền trong một trong các công nhân).

  • Sử dụng giữa các đồ thị nhân rộng, bạn thực hiện không đồng bộ cập nhật bằng cách sử dụng khác tf.train.Optimizer lớp con (trừ tf.train.SyncReplicasOptimizer), sử dụng một vòng lặp đào tạo tương tự như trường hợp đồng bộ, nhưng nếu không có sự phối hợp nền.

Câu hỏi 4: Làm thế nào để một người lao động tận dụng nhiều thiết bị? Nhân viên có tự động quyết định cách phân phối các hoạt động đơn lẻ hay không ...?

Mỗi nhân viên chạy cùng một thuật toán vị trí được sử dụng trong một quá trình TensorFlow. Trừ khi được hướng dẫn khác, trình gỡ rối sẽ đặt các hoạt động trên GPU nếu có sẵn (và có triển khai tăng tốc GPU), nếu không nó sẽ quay trở lại CPU. Chức năng thiết bị tf.train.replica_device_setter() có thể được sử dụng để phân tích các biến trên các tác vụ hoạt động như "máy chủ tham số". Nếu bạn có yêu cầu phức tạp hơn (ví dụ: nhiều GPU, biến cục bộ trên công nhân, v.v.), bạn có thể sử dụng các khối with tf.device(...): rõ ràng để gán biểu đồ con cho một thiết bị cụ thể.