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 tập có liên kết, chẳng hạn như đào tạo hoặc đánh giá có liên kết với các mô hình máy học 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à có thể thử nghiệm học 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 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 lại cho nền tảng. TFF đã được thiết kế có lưu ý đến khả năng mở rộng và khả năng kết hợp, và chúng tôi hoan nghênh các đóng góp; chúng tôi rất vui khi thấy 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 bọc các mô hình hiện có của mình để sử dụng với TFF. Gói một mô hình có thể đơn giản như gọi một hàm gói đơn (ví dụ:
tff.learning.from_keras_model
) hoặc xác định một lớp con của giao diệntff.learning.models.VariableModel
để có thể tùy chỉnh đầy đủ.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á, 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 đóng hộp 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 có 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ể tải xuống và thao tác cục bộ thường thuận tiện, đặc biệt đối với các nhà phát triển có thể là mới đối với 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 tập 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ác giao diện cấp thấp hơn do Lõi liên kết (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 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 trước, 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 thức hoạt động của TFF, bạn có thể muốn đọc lướt qua phần hướng dẫn thuật toán tùy chỉnh như một 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 phép tính 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 máy học mà 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 các 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ẽ, 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ó tài nguyên 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 đó, một 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 tuần tự hóa dưới dạng biểu đồ TensorFlow.
Bạn vẫn có thể (và nê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 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 không 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 tuần tự 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 một tf.Graph
mà TFF điều khiển. Điều này có nghĩa là TFF hiện tại không thể sử dụng một mô hình đã được xây dựng; 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
. Chức năng này sau đó được gọi bởi TFF để đảm bảo tất cả các thành phần của mô hình được đánh số thứ tự. Ngoài ra, là một môi trường được nhập 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 của loại đầu vào mô hình của bạn.
tổng hợp
Chúng tôi đặc biệt khuyến nghị hầu hết người dùng xây dựng các mô hình bằng Keras, xem phần Bộ chuyển đổi cho Keras bên dưới. Các trình bao bọc này xử lý việc tổng hợp các bản cập nhật mô hình cũng như bất kỳ số liệu nào được xác định cho mô hình một cách tự động. Tuy nhiên, vẫn có thể hữu ích khi hiểu cách tổng hợp được xử lý cho 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ô ví dụ do một khách hàng cá nhân sở hữu. Nó áp dụng cho cả tham số mô hình (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ư 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 chỉ số khác), mà mô hình của bạn sẽ cập nhật lại cục bộ khi nó lặp qua 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 hoàn thành 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
s để giữ các tập hợp, chẳng hạn như số đợt hoặc số lượng mẫu được xử lý, tổng tổn thất trên mỗi đợt hoặc 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ự qua các đợt 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 dưới dạng 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 biên dịch tất cả 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ập 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ố mô hình (biến), đang được tính trung bình trên các máy khách, cũng như các chỉ số 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 (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 đào tạo, được máy chủ phân phối cho một nhóm nhỏ 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 lô dữ liệu cục bộ để tạo ra một tập hợp tham số mô hình mới (khi đào tạo) và một tập hợp chỉ số cục bộ mới, như được mô tả ở trên (đây là cục bộ tập hợp).
TFF chạy một 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 và các chỉ số đượ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 riêng của TFF (không phải trong TensorFlow). Xem hướng dẫn 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 hàm tạo + siêu dữ liệu cơ bản này được biểu thị bằng giao diện tff.learning.models.VariableModel
, như sau:
Các phương thức hàm tạo,
forward_pass
vàreport_local_unfinalized_metrics
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 tương ứng. TensorFlow được xây dựng bằng các phương pháp đó phải được 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ề tập hợp con của các biến cục bộ có thể đào tạo, không thể đào tạo và 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 thuật toán tối ưu hóa được liên kết và để xác định chữ ký loại bên trong 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 thụ).
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 hoàn thiện của chỉ số (được trả về bởi report_local_unfinalized_metrics()
) và trả về các giá trị chỉ số đã hoàn thiện. Phương pháp metric_finalizers
và report_local_unfinalized_metrics()
sẽ được sử dụng cùng nhau để xây dựng bộ tổng hợp chỉ số giữa nhiều khách hàng khi xác định quy trình đào tạo được liên kết hoặc tính toán đánh giá. Ví dụ: một công cụ tổng hợp tff.learning.metrics.sum_then_finalize
đơn giản trước tiê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 trình tổng kết 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 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.from_keras_model
để tạo 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.from_keras_model(keras_model, sample_batch, loss=...)
Ngoài bản thân mô hình, bạ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 của đầu vào mô hình của bạn. Điều này đảm bảo rằng TFF có thể khởi tạo đúng mô hình cho dữ liệu sẽ thực sự có mặt trên các 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 xây dựng TensorFlow để được đánh số thứ tự).
Việc sử dụng trình bao bọc Keras được minh họa trong các 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
s để thực hiện các tác 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
Chấp hành
Có hai giai đoạn riêng biệt trong việc chạy một phép tính liên hợp.
Biên dịch : Đầu tiên, TFF 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ự hóa 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 xảy ra, nhưng các phép biến đổi khác có thể xảy ra để hỗ trợ thực thi hiệu quả hơn. Chúng tôi đề cập đến biểu diễn được tuần tự hóa do trình biên dịch phát ra dưới dạng tính toán liên hợp .
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 có liên kết được tạo bởi API Học tập có 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 có liên kết hoặc đánh giá có liên kết, bao gồm một số yếu tố, đáng chú ý nhất là:
Một dạng tuần tự hóa của mã mô hình của bạn 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 đánh giá/đào tạo 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 lại trên
tf.data.Dataset
s và các chỉ số điện toán, và áp dụng bản cập nhật tổng hợp trên máy chủ, để kể tên một số).Thông số kỹ thuậ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 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 thực thi máy khách-cục bộ hoặc máy chủ-cục bộ của mã TensorFlow.
Các phép tính liên kết được trình bày ở dạng tuần tự hóa 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 với Python, nhưng để sử dụng API Học tập Liên kết, bạn sẽ không cần quan tâm đến các chi tiết của biểu diễn này. Các tính toán được thể hiện trong mã Python của bạn dưới dạng các đối tượng thuộc loại tff.Computation
, mà phần lớn bạn có thể coi là các Python callable
s mờ đục.
Trong 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 được liên kết theo cách bất khả tri đối với hầu hết các khía cạnh của môi trường thực thi, để chúng có khả năng được triển khai tới, ví dụ: các nhóm thiết bị chạy Android
hoặc tới các cụm trong trung tâm dữ liệu. Một lần nữa, hệ quả chính của việc này là các giả định mạnh mẽ về việc tuần tự hóa . Cụ thể, khi bạn gọi một trong các phương thức build_...
được mô tả bên dưới, 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 đến việc học liên kết có trạng thái. Ví dụ: một vòng huấn luyện bao gồm nhiều vòng tính 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 đào tạo 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 trạng thái được mô hình hóa trong TFF dưới dạng 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 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 nắm bắt trong định nghĩa của lớp trình 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.
nhà xây dựng có sẵn
Hiện tại, TFF cung cấp các hàm xây dựng khác nhau tạo ra các phép tính liên kết để đà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à hàm mô hình và trình tối ưu hóa ứng dụng khách , đồng thời trả về trạng tháitff.learning.templates.LearningProcess
(phân lớptff.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á liên kết các mô hình, 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 tập liên kết điển hình, chúng tôi có một lượng lớn thiết bị khách có khả năng lên tới hàng trăm triệu thiết bị, 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ể bị giới hạn đối với những khách hàng đang đượ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 đợt đào tạo hoặc đánh giá điển hình sẽ chỉ bao gồm một phần nhỏ khách hàng có sẵn, có thể được lấy mẫu ngẫu nhiên .
Hậu quả chính của điều này là các tính toán liên kết, theo thiết kế, được thể hiện theo cách không cần biết đến tập hợp chính xác của những người tham gia; 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 khách hàng ẩn danh trừu tượng và nhóm đó có thể thay đổi từ vòng đào tạo này sang vòng đào tạo khác. Liên kết 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 bản thân tính toán.
Để mô phỏng việc triển khai thực tế mã học tập được 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 giống như sau:
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 được liên kết được chấp nhận dưới dạng Python list
s, với một phần tử trên 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
Để tiêu 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 một người 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
s đó có thể được cung cấp trực tiếp dưới dạng đầ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 bộ dữ liệu để sử dụng trong mô phỏng, nơi có thể cần 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 máy khách khác nhau). 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 cụ thể của các máy khách đã được chọn làm đầu vào, ví dụ: trong lệnh gọi tff.templates.IterativeProcess.next
, danh tính máy khách 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 các mô phỏng và thêm 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.