Tổng quan
Tài liệu này giới thiệu các giao diện hỗ trợ các nhiệm vụ học liên kết, chẳng hạn như đào tạo hoặc đánh giá liên kết với các mô hình học máy hiện có được triển khai trong TensorFlow. Khi thiết kế các giao diện này, mục tiêu chính của chúng tôi là làm cho nó có thể thử nghiệm học tập liên kết mà không yêu cầu kiến thức về cách thức hoạt động của nó và đánh giá các thuật toán học tập liên kết đã triển khai trên nhiều mô hình và dữ liệu hiện có. Chúng tôi khuyến khích bạn đóng góp trở lại nền tảng. TFF đã được thiết kế có tính đến khả năng mở rộng và tổng hợp và chúng tôi hoan nghênh những đóng góp; chúng tôi rất vui mừng được xem những gì bạn nghĩ ra!
Các giao diện được cung cấp bởi lớp này bao gồm ba phần chính sau:
Người mẫu . Các lớp và hàm trợ giúp cho phép bạn gói các mô hình hiện có của mình để sử dụng với TFF. Việc gói một mô hình có thể đơn giản như gọi một hàm gói duy nhất (ví dụ:
tff.learning.models.from_keras_model
) hoặc xác định một lớp con của giao diệntff.learning.models.VariableModel
để có khả năng tùy chỉnh hoàn toàn.Nhà xây dựng tính toán liên kết . Các hàm trợ giúp xây dựng các phép tính liên kết để đào tạo hoặc đánh giá bằng cách sử dụng các mô hình hiện có của bạn.
Bộ dữ liệu . Bộ sưu tập dữ liệu được soạn trước mà bạn có thể tải xuống và truy cập bằng Python để sử dụng trong việc mô phỏng các tình huống học tập liên kết. Mặc dù học tập liên kết được thiết kế để sử dụng với dữ liệu phi tập trung không thể tải xuống một cách đơn giản tại một địa điểm tập trung, nhưng ở giai đoạn nghiên cứu và phát triển, việc tiến hành các thử nghiệm ban đầu bằng cách sử dụng dữ liệu có thể được tải xuống và thao tác cục bộ thường rất thuận tiện, đặc biệt đối với các nhà phát triển có thể mới về cách tiếp cận.
Các giao diện này được xác định chủ yếu trong không gian tên tff.learning
, ngoại trừ các bộ dữ liệu nghiên cứu và các khả năng liên quan đến mô phỏng khác đã được nhóm trong tff.simulation
. Lớp này được triển khai bằng cách sử dụng các giao diện cấp thấp hơn do Federated Core (FC) cung cấp, giao diện này cũng cung cấp môi trường thời gian chạy.
Trước khi tiếp tục, chúng tôi khuyên bạn trước tiên nên xem lại các hướng dẫn về phân loại hình ảnh và tạo văn bản vì chúng giới thiệu hầu hết các khái niệm được mô tả ở đây bằng các ví dụ cụ thể. Nếu bạn muốn tìm hiểu thêm về cách hoạt động của TFF, bạn có thể muốn lướt qua hướng dẫn về thuật toán tùy chỉnh như phần giới thiệu về các giao diện cấp thấp hơn mà chúng tôi sử dụng để thể hiện logic của các tính toán liên kết và nghiên cứu cách triển khai hiện có của giao diện tff.learning
.
Người mẫu
Giả định kiến trúc
Tuần tự hóa
TFF nhằm mục đích hỗ trợ nhiều tình huống học tập phân tán trong đó mã mô hình học máy bạn viết có thể đang thực thi trên một số lượng lớn máy khách không đồng nhất với khả năng đa dạng. Mặc dù ở một đầu của quang phổ, trong một số ứng dụng, những máy khách đó có thể là máy chủ cơ sở dữ liệu mạnh mẽ, nhưng nhiều mục đích sử dụng quan trọng mà nền tảng của chúng tôi dự định hỗ trợ liên quan đến thiết bị di động và thiết bị nhúng có nguồn lực hạn chế. Chúng tôi không thể cho rằng các thiết bị này có khả năng lưu trữ thời gian chạy Python; điều duy nhất chúng ta có thể giả định vào thời điểm này là chúng có khả năng lưu trữ thời gian chạy TensorFlow cục bộ. Do đó, giả định kiến trúc cơ bản mà chúng tôi đưa ra trong TFF là mã mô hình của bạn phải có khả năng tuần tự hóa dưới dạng biểu đồ TensorFlow.
Bạn có thể (và nên) vẫn phát triển mã TF của mình theo các phương pháp hay nhất mới nhất như sử dụng chế độ háo hức. Tuy nhiên, mã cuối cùng phải có khả năng tuần tự hóa (ví dụ: có thể được gói dưới dạng tf.function
cho mã chế độ háo hức). Điều này đảm bảo rằng mọi trạng thái Python hoặc luồng điều khiển cần thiết tại thời điểm thực thi đều có thể được tuần tự hóa (có thể với sự trợ giúp của Autograph ).
Hiện tại, TensorFlow chưa hỗ trợ đầy đủ việc tuần tự hóa và giải tuần tự hóa TensorFlow ở chế độ háo hức. Do đó, việc xê-ri hóa trong TFF hiện tuân theo mẫu TF 1.0, trong đó tất cả mã phải được xây dựng bên trong tf.Graph
mà TFF điều khiển. Điều này có nghĩa là hiện tại TFF không thể sử dụng mô hình đã được xây dựng sẵn; thay vào đó, logic định nghĩa mô hình được đóng gói trong một hàm không có đối số trả về tff.learning.models.VariableModel
. Hàm này sau đó được TFF gọi để đảm bảo tất cả các thành phần của mô hình được tuần tự hóa. Ngoài ra, là môi trường được định kiểu mạnh, TFF sẽ yêu cầu một chút siêu dữ liệu bổ sung, chẳng hạn như thông số kỹ thuật về loại đầu vào của mô hình của bạn.
Tổng hợp
Chúng tôi thực sự khuyên hầu hết người dùng nên xây dựng mô hình bằng Keras, hãy xem phần Bộ chuyển đổi cho Keras bên dưới. Các trình bao bọc này tự động xử lý việc tổng hợp các bản cập nhật mô hình cũng như mọi số liệu được xác định cho mô hình. Tuy nhiên, vẫn có thể hữu ích khi hiểu cách xử lý tổng hợp cho một tff.learning.models.VariableModel
chung.
Luôn có ít nhất hai lớp tổng hợp trong học tập liên kết: tổng hợp trên thiết bị cục bộ và tổng hợp trên nhiều thiết bị (hoặc liên kết):
Tổng hợp cục bộ . Mức độ tổng hợp này đề cập đến việc tổng hợp trên nhiều lô mẫu thuộc sở hữu của một khách hàng riêng lẻ. Nó áp dụng cho cả các tham số mô hình (các biến), tiếp tục phát triển tuần tự khi mô hình được đào tạo cục bộ, cũng như số liệu thống kê bạn tính toán (chẳng hạn như tổn thất trung bình, độ chính xác và các số liệu khác) mà mô hình của bạn sẽ cập nhật lại cục bộ khi nó lặp lại luồng dữ liệu cục bộ của từng khách hàng.
Việc thực hiện tổng hợp ở cấp độ này là trách nhiệm của mã mô hình của bạn và được thực hiện bằng cách sử dụng các cấu trúc TensorFlow tiêu chuẩn.
Cấu trúc chung của quá trình xử lý như sau:
Đầu tiên, mô hình xây dựng
tf.Variable
để chứa các tập hợp, chẳng hạn như số lô hoặc số mẫu được xử lý, tổng tổn thất trên mỗi lô hoặc trên mỗi mẫu, v.v.TFF gọi phương thức
forward_pass
trênModel
của bạn nhiều lần, tuần tự trên các lô dữ liệu khách hàng tiếp theo, cho phép bạn cập nhật các biến chứa các tập hợp khác nhau như một tác dụng phụ.Cuối cùng, TFF gọi phương thức
report_local_unfinalized_metrics
trên Mô hình của bạn để cho phép mô hình của bạn tổng hợp tất cả số liệu thống kê tóm tắt mà nó đã thu thập thành một tập hợp số liệu nhỏ gọn để khách hàng xuất. Ví dụ: đây là nơi mã mô hình của bạn có thể chia tổng tổn thất cho số mẫu được xử lý để xuất tổn thất trung bình, v.v.
Tổng hợp liên kết . Mức độ tổng hợp này đề cập đến việc tổng hợp trên nhiều máy khách (thiết bị) trong hệ thống. Một lần nữa, nó áp dụng cho cả các tham số (biến) mô hình đang được tính trung bình trên các máy khách cũng như các số liệu mà mô hình của bạn đã xuất do tổng hợp cục bộ.
Thực hiện tổng hợp ở cấp độ này là trách nhiệm của TFF. Tuy nhiên, với tư cách là người tạo mô hình, bạn có thể kiểm soát quá trình này (xem thêm về điều này bên dưới).
Cấu trúc chung của quá trình xử lý như sau:
Mô hình ban đầu và mọi tham số cần thiết cho quá trình đào tạo sẽ được máy chủ phân phối cho một tập hợp con khách hàng sẽ tham gia vào một vòng đào tạo hoặc đánh giá.
Trên mỗi máy khách, độc lập và song song, mã mô hình của bạn được gọi liên tục trên luồng dữ liệu cục bộ để tạo ra một tập hợp tham số mô hình mới (khi huấn luyện) và một tập hợp số liệu cục bộ mới, như được mô tả ở trên (đây là tập hợp cục bộ tổng hợp).
TFF chạy giao thức tổng hợp phân tán để tích lũy và tổng hợp các tham số mô hình cũng như số liệu được xuất cục bộ trên toàn hệ thống. Logic này được thể hiện theo cách khai báo bằng ngôn ngữ tính toán liên kết của chính TFF (không phải trong TensorFlow). Xem hướng dẫn về thuật toán tùy chỉnh để biết thêm về API tổng hợp.
Giao diện trừu tượng
Giao diện siêu dữ liệu + hàm tạo cơ bản này được thể hiện bằng giao diện tff.learning.models.VariableModel
, như sau:
Các phương thức khởi tạo,
forward_pass
vàreport_local_unfinalized_metrics
tương ứng sẽ xây dựng các biến mô hình, chuyển tiếp và số liệu thống kê mà bạn muốn báo cáo. TensorFlow được xây dựng bằng các phương thức đó phải có khả năng tuần tự hóa, như đã thảo luận ở trên.Thuộc tính
input_spec
, cũng như 3 thuộc tính trả về các tập hợp con của các biến có thể huấn luyện, không thể huấn luyện và biến cục bộ đại diện cho siêu dữ liệu. TFF sử dụng thông tin này để xác định cách kết nối các phần trong mô hình của bạn với các thuật toán tối ưu hóa liên kết và xác định chữ ký loại nội bộ nhằm hỗ trợ xác minh tính chính xác của hệ thống được xây dựng (để mô hình của bạn không thể được khởi tạo trên dữ liệu không khớp với những gì mô hình được thiết kế để tiêu dùng).
Ngoài ra, giao diện trừu tượng tff.learning.models.VariableModel
hiển thị một thuộc tính metric_finalizers
nhận các giá trị chưa cuối cùng của số liệu (được trả về bởi report_local_unfinalized_metrics()
) và trả về các giá trị số liệu cuối cùng. Phương metric_finalizers
và report_local_unfinalized_metrics()
sẽ được sử dụng cùng nhau để xây dựng trình tổng hợp số liệu giữa các khách hàng khi xác định quy trình đào tạo liên kết hoặc tính toán đánh giá. Ví dụ: trước tiên, một trình tổng hợp tff.learning.metrics.sum_then_finalize
đơn giản sẽ tính tổng các giá trị chỉ số chưa hoàn thiện từ máy khách, sau đó gọi các hàm hoàn thiện tại máy chủ.
Bạn có thể tìm thấy các ví dụ về cách xác định tff.learning.models.VariableModel
tùy chỉnh của riêng mình trong phần thứ hai của hướng dẫn phân loại hình ảnh của chúng tôi, cũng như trong các mô hình mẫu mà chúng tôi sử dụng để thử nghiệm trong model_examples.py
.
Bộ chuyển đổi cho Keras
Gần như tất cả thông tin mà TFF yêu cầu đều có thể được lấy bằng cách gọi các giao diện tf.keras
, vì vậy nếu bạn có mô hình Keras, bạn có thể dựa vào tff.learning.models.from_keras_model
để xây dựng một tff.learning.models.VariableModel
.
Lưu ý rằng TFF vẫn muốn bạn cung cấp một hàm tạo - một hàm mô hình không có đối số, chẳng hạn như sau:
def model_fn():
keras_model = ...
return tff.learning.models.from_keras_model(keras_model, sample_batch, loss=...)
Ngoài chính mô hình, bạn còn cung cấp một loạt dữ liệu mẫu mà TFF sử dụng để xác định loại và hình dạng đầu vào của mô hình của bạn. Điều này đảm bảo rằng TFF có thể khởi tạo chính xác mô hình cho dữ liệu sẽ thực sự có trên thiết bị khách (vì chúng tôi cho rằng dữ liệu này thường không có sẵn tại thời điểm bạn đang xây dựng TensorFlow để được tuần tự hóa).
Việc sử dụng trình bao bọc Keras được minh họa trong hướng dẫn tạo văn bản và phân loại hình ảnh của chúng tôi.
Nhà xây dựng tính toán liên kết
Gói tff.learning
cung cấp một số trình tạo cho tff.Computation
thực hiện các nhiệm vụ liên quan đến học tập; chúng tôi hy vọng tập hợp các tính toán như vậy sẽ mở rộng trong tương lai.
Giả định kiến trúc
Thi hành
Có hai giai đoạn riêng biệt khi chạy tính toán liên kết.
Biên dịch : TFF trước tiên biên dịch các thuật toán học liên kết thành một biểu diễn tuần tự trừu tượng của toàn bộ tính toán phân tán. Đây là lúc quá trình tuần tự hóa TensorFlow diễn ra, nhưng các chuyển đổi khác có thể xảy ra để hỗ trợ thực thi hiệu quả hơn. Chúng tôi gọi biểu diễn được tuần tự hóa do trình biên dịch phát ra là tính toán liên kết .
Thực thi TFF cung cấp các cách để thực hiện các tính toán này. Hiện tại, việc thực thi chỉ được hỗ trợ thông qua mô phỏng cục bộ (ví dụ: trong sổ ghi chép sử dụng dữ liệu phi tập trung được mô phỏng).
Tính toán liên kết được tạo bởi API học tập liên kết của TFF, chẳng hạn như thuật toán đào tạo sử dụng tính trung bình của mô hình liên kết hoặc đánh giá liên kết, bao gồm một số yếu tố, đáng chú ý nhất là:
Một dạng mã mô hình được tuần tự hóa cũng như mã TensorFlow bổ sung được xây dựng bởi khung Học tập Liên kết để thúc đẩy vòng lặp đào tạo/đánh giá mô hình của bạn (chẳng hạn như xây dựng trình tối ưu hóa, áp dụng các bản cập nhật mô hình, lặp qua
tf.data.Dataset
và các số liệu tính toán, và áp dụng bản cập nhật tổng hợp trên máy chủ, v.v.).Đặc tả khai báo về giao tiếp giữa máy khách và máy chủ (thường là các dạng tổng hợp khác nhau trên các thiết bị máy khách và phát sóng từ máy chủ đến tất cả máy khách) và cách giao tiếp phân tán này được xen kẽ với việc thực thi máy khách cục bộ hoặc máy chủ cục bộ của mã TensorFlow.
Các tính toán liên kết được biểu thị ở dạng tuần tự này được thể hiện bằng ngôn ngữ nội bộ độc lập với nền tảng, khác biệt với Python, nhưng để sử dụng API Học tập Liên kết, bạn sẽ không cần phải quan tâm đến các chi tiết của cách trình bày này. Các tính toán được biểu diễn trong mã Python của bạn dưới dạng các đối tượng thuộc loại tff.Computation
, trong hầu hết các phần bạn có thể coi là các đối tượng callable
trong Python mờ.
Trong phần hướng dẫn, bạn sẽ gọi các phép tính liên kết đó như thể chúng là các hàm Python thông thường, được thực thi cục bộ. Tuy nhiên, TFF được thiết kế để thể hiện các tính toán liên kết theo cách không phụ thuộc vào hầu hết các khía cạnh của môi trường thực thi, sao cho chúng có thể triển khai được, chẳng hạn như các nhóm thiết bị chạy Android
hoặc các cụm trong trung tâm dữ liệu. Một lần nữa, hậu quả chính của việc này là những giả định chắc chắn về việc tuần tự hóa . Đặc biệt, khi bạn gọi một trong các phương thức build_...
được mô tả bên dưới thì quá trình tính toán được tuần tự hóa hoàn toàn.
Trạng thái mô hình hóa
TFF là một môi trường lập trình chức năng, tuy nhiên nhiều quá trình quan tâm trong học tập liên kết có trạng thái. Ví dụ: một vòng lặp huấn luyện bao gồm nhiều vòng lấy trung bình của mô hình liên kết là một ví dụ về những gì chúng ta có thể phân loại là một quy trình có trạng thái . Trong quá trình này, trạng thái phát triển từ vòng này sang vòng khác bao gồm tập hợp các tham số mô hình đang được huấn luyện và có thể là trạng thái bổ sung được liên kết với trình tối ưu hóa (ví dụ: vectơ động lượng).
Vì TFF là chức năng nên các quy trình có trạng thái được mô hình hóa trong TFF dưới dạng các tính toán chấp nhận trạng thái hiện tại làm đầu vào và sau đó cung cấp trạng thái cập nhật làm đầu ra. Để xác định đầy đủ một quy trình có trạng thái, người ta cũng cần chỉ định trạng thái ban đầu đến từ đâu (nếu không chúng ta không thể khởi động quy trình). Điều này được ghi lại trong định nghĩa của lớp trợ giúp tff.templates.IterativeProcess
, với 2 thuộc tính initialize
và next
tương ứng với khởi tạo và lặp lại.
Trình xây dựng có sẵn
Hiện tại, TFF cung cấp nhiều chức năng xây dựng khác nhau để tạo ra các tính toán liên kết cho quá trình đào tạo và đánh giá liên kết. Hai ví dụ đáng chú ý bao gồm:
tff.learning.algorithms.build_weighted_fed_avg
, lấy đầu vào là một hàm mô hình và một trình tối ưu hóa máy khách , đồng thời trả về mộttff.learning.templates.LearningProcess
có trạng thái (phân lớp nàytff.templates.IterativeProcess
).tff.learning.build_federated_evaluation
nhận một hàm mô hình và trả về một phép tính liên kết duy nhất để đánh giá các mô hình được liên kết, vì đánh giá không có trạng thái.
Bộ dữ liệu
Giả định kiến trúc
Lựa chọn khách hàng
Trong kịch bản học liên kết điển hình, chúng tôi có một lượng lớn hàng trăm triệu thiết bị khách, trong đó chỉ một phần nhỏ có thể hoạt động và sẵn sàng để đào tạo tại bất kỳ thời điểm nào (ví dụ: điều này có thể được giới hạn ở các khách hàng được cắm vào nguồn điện, không phải trên mạng có đồng hồ đo và nếu không thì không hoạt động). Nói chung, nhóm khách hàng có sẵn để tham gia đào tạo hoặc đánh giá nằm ngoài tầm kiểm soát của nhà phát triển. Hơn nữa, vì việc điều phối hàng triệu khách hàng là không thực tế nên một vòng đào tạo hoặc đánh giá thông thường sẽ chỉ bao gồm một phần nhỏ khách hàng có sẵn và có thể được lấy mẫu ngẫu nhiên .
Hậu quả chính của việc này là các tính toán liên kết, theo thiết kế, được thể hiện theo cách mà nhóm người tham gia chính xác không biết; tất cả quá trình xử lý được thể hiện dưới dạng các hoạt động tổng hợp trên một nhóm trừu tượng gồm các khách hàng ẩn danh và nhóm đó có thể thay đổi tùy theo từng đợt đào tạo. Do đó, ràng buộc thực tế của tính toán với những người tham gia cụ thể và do đó với dữ liệu cụ thể mà họ đưa vào tính toán, do đó được mô hình hóa bên ngoài chính tính toán.
Để mô phỏng việc triển khai thực tế mã học tập liên kết của bạn, thông thường bạn sẽ viết một vòng lặp đào tạo trông như thế này:
trainer = tff.learning.algorithms.build_weighted_fed_avg(...)
state = trainer.initialize()
federated_training_data = ...
def sample(federate_data):
return ...
while True:
data_for_this_round = sample(federated_training_data)
result = trainer.next(state, data_for_this_round)
state = result.state
Để tạo điều kiện thuận lợi cho việc này, khi sử dụng TFF trong mô phỏng, dữ liệu liên kết được chấp nhận dưới dạng list
Python, với một phần tử cho mỗi thiết bị khách tham gia để biểu thị tf.data.Dataset
cục bộ của thiết bị đó.
Giao diện trừu tượng
Để chuẩn hóa việc xử lý các tập dữ liệu liên kết được mô phỏng, TFF cung cấp một giao diện trừu tượng tff.simulation.datasets.ClientData
, cho phép liệt kê tập hợp các máy khách và xây dựng một tf.data.Dataset
chứa dữ liệu của một tập hợp cụ thể khách hàng. Những tf.data.Dataset
đó có thể được cung cấp trực tiếp làm đầu vào cho các phép tính liên kết được tạo ở chế độ háo hức.
Cần lưu ý rằng khả năng truy cập danh tính khách hàng là một tính năng chỉ được cung cấp bởi các bộ dữ liệu để sử dụng trong mô phỏng, trong đó có thể cần có khả năng đào tạo dữ liệu từ các tập hợp con cụ thể của khách hàng (ví dụ: để mô phỏng tính khả dụng hàng ngày của các nhóm khách hàng khác nhau). các loại khách hàng). Các tính toán được biên dịch và thời gian chạy cơ bản không liên quan đến bất kỳ khái niệm nào về danh tính khách hàng. Khi dữ liệu từ một tập hợp con khách hàng cụ thể đã được chọn làm đầu vào, ví dụ: trong lệnh gọi tới tff.templates.IterativeProcess.next
, danh tính khách hàng sẽ không còn xuất hiện trong đó nữa.
Bộ dữ liệu có sẵn
Chúng tôi đã dành riêng không gian tên tff.simulation.datasets
cho các bộ dữ liệu triển khai giao diện tff.simulation.datasets.ClientData
để sử dụng trong mô phỏng và đưa vào đó các bộ dữ liệu để hỗ trợ hướng dẫn phân loại hình ảnh và tạo văn bản . Chúng tôi muốn khuyến khích bạn đóng góp bộ dữ liệu của riêng bạn cho nền tảng.