Google I / O là một kết quả hoàn hảo! Cập nhật các phiên TensorFlow Xem phiên

Lõi liên kết

Tài liệu này giới thiệu các lớp lõi của TFF phục vụ như là một nền tảng cho Federated Learning , và tương lai phi học thuật toán liên càng tốt.

Để có phần giới thiệu nhẹ nhàng về Federated Core, vui lòng đọc các hướng dẫn sau, vì chúng giới thiệu một số khái niệm cơ bản bằng ví dụ và minh họa từng bước việc xây dựng một thuật toán tính trung bình liên kết đơn giản.

Chúng tôi cũng sẽ khuyến khích bạn tự làm quen với Federated Learning và các hướng dẫn liên quan về phân loại hình ảnhthế hệ văn bản , như việc sử dụng các API Federated Core (FC API) cho học tập liên cung cấp bối cảnh quan trọng đối với một số các lựa chọn mà chúng đã thực hiện trong thiết kế lớp này.

Tổng quat

Mục tiêu, Mục đích sử dụng và Phạm vi

Federated Core (FC) được hiểu rõ nhất là một môi trường lập trình để thực hiện các phép tính phân tán, tức là các phép tính liên quan đến nhiều máy tính (điện thoại di động, máy tính bảng, thiết bị nhúng, máy tính để bàn, cảm biến, máy chủ cơ sở dữ liệu, v.v.) mà mỗi máy tính có thể thực hiện không xử lý cục bộ tầm thường và giao tiếp trên mạng để điều phối công việc của họ.

Thuật ngữ phân phối là rất chung chung, và TFF không nhắm mục tiêu tất cả các loại có thể có của các thuật toán phân tán trên mạng, vì vậy chúng tôi thích sử dụng các tính toán ít thuật ngữ chung chung liên để mô tả các loại thuật toán có thể được thể hiện trong khuôn khổ này.

Trong khi xác định các tính toán liên hạn một cách đầy đủ chính thức nằm ngoài phạm vi của tài liệu này, hãy nghĩ về các loại thuật toán bạn có thể thấy trình bày bằng giả trong một ấn phẩm nghiên cứu mô tả một thuật toán học phân phối mới.

Mục tiêu của FC, trong một nusthell, là cho phép đại diện nhỏ gọn tương tự, ở một mức độ giả giống như tương tự trừu tượng, của logic chương trình đó không phải là giả, nhưng đúng hơn, đó là thực thi trong một loạt các môi trường mục tiêu.

Đặc điểm xác định chính của các loại thuật toán mà FC được thiết kế để thể hiện là các hành động của những người tham gia hệ thống được mô tả theo cách thức tập thể. Do đó, chúng ta có xu hướng nói về mỗi thiết bị tại địa phương chuyển dữ liệu, và các thiết bị điều phối công việc của một phát thanh truyền hình điều phối tập trung, thu thập hoặc tập hợp kết quả của họ.

Trong khi TFF đã được thiết kế để có thể vượt qua kiến trúc client-server đơn giản, khái niệm về xử lý tập thể là nền tảng. Điều này là do nguồn gốc của TFF trong học tập liên kết, một công nghệ ban đầu được thiết kế để hỗ trợ tính toán trên dữ liệu nhạy cảm tiềm ẩn vẫn nằm trong tầm kiểm soát của các thiết bị khách và có thể không chỉ được tải xuống một vị trí tập trung vì lý do bảo mật. Mặc dù mỗi khách hàng trong các hệ thống như vậy đóng góp dữ liệu và khả năng xử lý theo hướng tính toán kết quả của hệ thống (kết quả mà chúng tôi thường mong đợi là có giá trị cho tất cả những người tham gia), chúng tôi cũng cố gắng duy trì sự riêng tư và ẩn danh của mỗi khách hàng.

Do đó, trong khi hầu hết các khuôn khổ cho máy tính phân tán được thiết kế để thể hiện quá trình xử lý từ quan điểm của từng người tham gia - nghĩa là, ở cấp độ trao đổi thông điệp điểm-điểm cá nhân và sự phụ thuộc lẫn nhau của các chuyển đổi trạng thái cục bộ của người tham gia với các thông điệp đến và đi , Federated lõi TFF được thiết kế để mô tả hành vi của hệ thống từ quan điểm trên toàn hệ thống toàn cầu (tương tự như, ví dụ, MapReduce ).

Do đó, trong khi các khung phân phối cho các mục đích chung có thể đưa ra các hoạt động như gửinhận như các khối xây dựng, FC cung cấp các khối xây dựng như tff.federated_sum , tff.federated_reduce , hoặc tff.federated_broadcast mà gói gọn đơn giản giao thức phân phối.

Ngôn ngữ

Giao diện Python

TFF sử dụng một ngôn ngữ nội bộ để đại diện cho tính liên kết, cú pháp trong số đó được xác định bởi các đại diện serializable trong computation.proto . Tuy nhiên, người dùng FC API nói chung sẽ không cần phải tương tác trực tiếp với ngôn ngữ này. Thay vào đó, chúng tôi cung cấp một API Python (các tff namespace) rằng liệu pháp quấn quanh nó như một cách để xác định tính.

Cụ thể, TFF cung cấp chức năng Python trang trí như tff.federated_computation rằng dấu vết các cơ quan chức năng trang trí, sản xuất và cơ quan đại diện đăng của logic tính toán liên trong ngôn ngữ của TFF. Một chức năng trang trí với tff.federated_computation đóng vai trò như một tàu sân bay của đại diện tuần tự như vậy, và có thể nhúng nó như là một khối xây dựng trong cơ thể tính toán khác, hoặc thực hiện nó theo yêu cầu khi gọi.

Đây chỉ là một ví dụ; nhiều ví dụ có thể được tìm thấy trong các thuật toán tùy chỉnh hướng dẫn.

@tff.federated_computation(tff.type_at_clients(tf.float32))
def get_average_temperature(sensor_readings):
  return tff.federated_mean(sensor_readings)

Độc giả quen thuộc với TensorFlow phi háo hức sẽ tìm thấy phương pháp này tương tự như viết mã Python sử dụng các chức năng như tf.add hoặc tf.reduce_sum trong một phần của mã Python định nghĩa một đồ thị TensorFlow. Mặc dù các mã được thể hiện về mặt kỹ thuật trong Python, mục đích của nó là để xây dựng một đại diện serializable của một tf.Graph bên dưới, và nó là đồ thị, không phải là mã Python, đó là nội bộ được thực hiện bởi bộ thực thi TensorFlow. Tương tự như vậy, người ta có thể nghĩ về tff.federated_mean như chèn một op liên thành một tính toán liên đại diện bởi get_average_temperature .

Một phần lý do khiến FC xác định ngôn ngữ liên quan đến thực tế là, như đã lưu ý ở trên, các phép tính liên hợp chỉ định các hành vi tập thể phân tán và do đó, logic của chúng là không cục bộ. Ví dụ, TFF cung cấp các nhà khai thác, đầu vào và đầu ra của chúng có thể tồn tại ở những nơi khác nhau trong mạng.

Điều này đòi hỏi một ngôn ngữ và một hệ thống kiểu nắm bắt được khái niệm về tính phân tán.

Loại hệ thống

Federated Core cung cấp các danh mục loại sau. Khi mô tả các kiểu này, chúng tôi chỉ đến các hàm tạo kiểu cũng như giới thiệu một ký hiệu nhỏ gọn, vì đó là một cách tiện dụng hoặc mô tả các kiểu tính toán và toán tử.

Đầu tiên, đây là danh mục các loại tương tự về mặt khái niệm với các loại được tìm thấy trong các ngôn ngữ chính thống hiện có:

  • Loại tensor ( tff.TensorType ). Cũng như trong TensorFlow, những có dtypeshape . Sự khác biệt duy nhất là các đối tượng của loại hình này không chỉ giới hạn tf.Tensor trường bằng Python mà đại diện cho kết quả đầu ra của ops TensorFlow trong một đồ thị TensorFlow, nhưng cũng có thể bao gồm các đơn vị dữ liệu có thể được sản xuất, ví dụ như một sản phẩm của một phân phối giao thức tổng hợp. Do đó, kiểu tensor TFF chỉ đơn giản là một phiên bản trừu tượng của một biểu diễn vật lý cụ thể của kiểu như vậy trong Python hoặc TensorFlow.

    TFF của TensorTypes có thể chặt chẽ hơn trong (tĩnh) của họ xử lý các hình dạng hơn TensorFlow. Ví dụ, TFF xử lý hệ thống kiểu một tensor với thứ hạng chưa biết khi chuyển nhượng từ bất kỳ tensor khác của cùng một dtype , nhưng không thể chuyển nhượng cho bất kỳ tensor với cấp bậc cố định. Phương pháp xử lý này ngăn chặn một số lỗi thời gian chạy nhất định (ví dụ: cố gắng định hình lại một tensor có thứ hạng không xác định thành một hình dạng có số phần tử không chính xác), với cái giá phải trả là sự nghiêm ngặt hơn trong những gì tính toán mà TFF chấp nhận là hợp lệ.

    Các ký hiệu nhỏ gọn với nhiều loại tensor là dtype hoặc dtype[shape] . Ví dụ, int32int32[10] là các loại số nguyên và int vectơ, tương ứng.

  • Loại chuỗi ( tff.SequenceType ). Đây là tương đương trừu tượng TFF của khái niệm bê tông TensorFlow của tf.data.Dataset s. Các phần tử của chuỗi có thể được tiêu thụ theo cách tuần tự, và có thể bao gồm các loại phức tạp.

    Các đại diện nhỏ gọn của các loại chuỗi là T* , nơi T là loại yếu tố. Ví dụ int32* đại diện cho một chuỗi số nguyên.

  • Loại tuple tên ( tff.StructType ). Đây là cách để xây dựng bộ dữ liệu và từ điển giống như cấu trúc có một số được xác định trước của các yếu tố với các loại cụ thể, đặt tên hoặc không có tên của TFF. Quan trọng là, khái niệm tuple được đặt tên của TFF bao gồm tương đương trừu tượng của các bộ đối số của Python, tức là tập hợp các phần tử trong đó một số, nhưng không phải tất cả đều được đặt tên và một số có vị trí.

    Các ký hiệu nhỏ gọn cho các bộ tên là <n_1=T_1, ..., n_k=T_k> , nơi n_k là tên nguyên tố tùy chọn, và T_k nhiều loại yếu tố. Ví dụ, <int32,int32> là một ký hiệu nhỏ gọn cho một cặp số nguyên giấu tên, và <X=float32,Y=float32> là một ký hiệu nhỏ gọn cho một cặp nổi tên là XY có thể đại diện cho một điểm trên một mặt phẳng . Tuples có thể được lồng vào nhau cũng như hỗn hợp với các loại khác, ví dụ như, <X=float32,Y=float32>* sẽ là một ký hiệu nhỏ gọn cho một chuỗi các điểm.

  • Loại chức năng ( tff.FunctionType ). TFF là một khung lập trình chức năng, với các chức năng xử lý như giá trị hạng nhất . Các hàm có nhiều nhất một đối số và chính xác một kết quả.

    Các ký hiệu nhỏ gọn cho các chức năng là (T -> U) , nơi T là loại một cuộc tranh cãi, và U là loại kết quả, hoặc ( -> U) nếu không có tranh cãi (mặc dù chức năng không có đối số là một thoái hóa khái niệm hầu như chỉ tồn tại ở cấp Python). Ví dụ (int32* -> int32) là một ký hiệu cho một loại chức năng làm giảm một chuỗi số nguyên cho một giá trị số nguyên duy nhất.

Các loại sau giải quyết khía cạnh hệ thống phân tán của tính toán TFF. Như những khái niệm có phần độc đáo để TFF, chúng tôi khuyến khích bạn tham khảo các thuật toán tùy chỉnh hướng dẫn cho bình luận bổ sung và các ví dụ.

  • Loại vị trí. Đây là loại chưa được tiếp xúc trong API công cộng khác so với hình thức 2 literals tff.SERVERtff.CLIENTS mà bạn có thể nghĩ là hằng số thuộc loại này. Tuy nhiên, nó được sử dụng nội bộ và sẽ được giới thiệu trong API công khai trong các bản phát hành trong tương lai. Các đại diện nhỏ gọn của loại này là placement .

    Một vị trí đại diện cho một tập thể của những người tham gia hệ thống mà đóng một vai trò đặc biệt. Việc phát hành ban đầu được nhắm mục tiêu tính toán client-server, trong đó có 2 nhóm người tham gia: khách hàng và một máy chủ (bạn có thể nghĩ về sau này như một nhóm singleton). Tuy nhiên, trong các kiến ​​trúc phức tạp hơn, có thể có các vai trò khác, chẳng hạn như trình tổng hợp trung gian trong hệ thống nhiều tầng, người có thể thực hiện các kiểu tổng hợp khác nhau hoặc sử dụng các kiểu nén / giải nén dữ liệu khác với kiểu được sử dụng bởi máy chủ hoặc các khách hàng.

    Mục đích chính của việc xác định khái niệm về vị trí là làm căn cứ để xác định loại liên.

  • Loại Federated ( tff.FederatedType ). Một giá trị của một loại liên là một trong đó được tổ chức bởi một nhóm người tham gia hệ thống xác định bởi một vị trí cụ thể (chẳng hạn như tff.SERVER hoặc tff.CLIENTS ). Một loại liên được xác định bởi giá trị vị trí (do đó, nó là một loại phụ thuộc ), các loại thành phần thành viên (loại nội dung mỗi người tham gia tại địa phương lưu trữ), và các bit thêm all_equal chỉ rõ liệu tất cả những người tham gia là tại địa phương lưu trữ cùng một mục.

    Các ký hiệu nhỏ gọn cho loại hình liên hợp các giá trị bao gồm các mặt hàng (thành viên) của loại T , mỗi tổ chức bởi nhóm (vị trí) GT@G hoặc {T}@G với all_equal set bit hoặc không được thiết lập, tương ứng.

    Ví dụ:

    • {int32}@CLIENTS đại diện cho một giá trị liên mà bao gồm một tập hợp các số nguyên có khả năng riêng biệt, một cho mỗi thiết bị của khách hàng. Lưu ý rằng chúng ta đang nói về một giá trị liên duy nhất là bao gồm nhiều mục dữ liệu xuất hiện tại nhiều địa điểm trên mạng. Một cách để nghĩ về nó là như một loại tensor với một "mạng" kích thước, mặc dù sự giống nhau là không hoàn hảo bởi vì TFF không cho phép truy cập ngẫu nhiên để thành thành viên của một giá trị liên.

    • {<X=float32,Y=float32>*}@CLIENTS đại diện cho một tập dữ liệu liên kết, một giá trị bao gồm nhiều chuỗi XY tọa độ, một chuỗi cho mỗi thiết bị của khách hàng.

    • <weights=float32[10,5],bias=float32[5]>@SERVER đại diện cho một tuple tên của trọng lượng và thiên vị tensors tại máy chủ. Kể từ khi chúng tôi đã bỏ dấu ngoặc nhọn, điều này cho thấy các all_equal bit được thiết lập, tức là chỉ có một tuple đơn (không phân biệt có bao nhiêu máy chủ bản sao có thể có trong một cluster lưu trữ giá trị này).

Khu nhà

Ngôn ngữ của Federated Core là một hình thức lambda-calculus , với một vài yếu tố bổ sung.

Nó cung cấp các phần tóm tắt lập trình sau đây hiện được hiển thị trong API công khai:

  • TensorFlow tính toán ( tff.tf_computation ). Đây là những phần của mã TensorFlow bọc như các thành phần tái sử dụng trong TFF sử dụng tff.tf_computation trang trí. Chúng luôn có các loại chức năng và không giống như các hàm trong TensorFlow, chúng có thể nhận các tham số có cấu trúc hoặc trả về kết quả có cấu trúc của một loại trình tự.

    Dưới đây là một ví dụ, một tính toán TF loại (int32* -> int) có sử dụng các tf.data.Dataset.reduce điều hành để tính toán một khoản số nguyên:

    @tff.tf_computation(tff.SequenceType(tf.int32))
    def add_up_integers(x):
      return x.reduce(np.int32(0), lambda x, y: x + y)
    
  • Intrinsics hoặc nhà khai thác liên ( tff.federated_... ). Đây là một thư viện các chức năng như tff.federated_sum hoặc tff.federated_broadcast tạo thành phần lớn các FC API, hầu hết trong số đó đại diện cho phân phối khai thác thông tin liên lạc để sử dụng với TFF.

    Chúng tôi đề cập đến điều này như intrinsics bởi vì, phần nào giống như chức năng nội tại , họ là một, bộ mở rộng mở kết thúc của các nhà khai thác được hiểu bởi TFF, và biên soạn thành mã cấp thấp hơn.

    Hầu hết các toán tử này có các tham số và kết quả của các kiểu liên kết và hầu hết là các mẫu có thể được áp dụng cho các loại dữ liệu khác nhau.

    Ví dụ, tff.federated_broadcast có thể được coi như một mẫu nhà điều hành của một loại chức năng T@SERVER -> T@CLIENTS .

  • Biểu thức lambda ( tff.federated_computation ). Một biểu thức lambda trong TFF là tương đương với một lambda hoặc def bằng Python; nó bao gồm tên tham số và nội dung (biểu thức) có chứa các tham chiếu đến tham số này.

    Trong mã Python, chúng có thể được tạo ra bởi trang trí chức năng Python với tff.federated_computation và xác định một cuộc tranh cãi.

    Đây là một ví dụ về biểu thức lambda mà chúng tôi đã đề cập trước đó:

    @tff.federated_computation(tff.type_at_clients(tf.float32))
    def get_average_temperature(sensor_readings):
      return tff.federated_mean(sensor_readings)
    
  • Literals vị trí. Còn bây giờ, chỉ tff.SERVERtff.CLIENTS cho phép để xác định đơn giản tính toán client-server.

  • Lời gọi function ( __call__ ). Bất cứ điều gì mà có một loại chức năng có thể được gọi bằng cách sử dụng Python chuẩn __call__ cú pháp. Lời gọi là một biểu thức, kiểu của nó giống như kiểu của kết quả của hàm đang được gọi.

    Ví dụ:

    • add_up_integers(x) đại diện cho một lời gọi của việc tính toán TensorFlow được xác định trước đây về một cuộc tranh cãi x . Các loại biểu hiện này là int32 .

    • tff.federated_mean(sensor_readings) đại diện cho một lời gọi của các nhà điều hành trung bình liên trên sensor_readings . Các loại biểu hiện này là float32@SERVER (giả định bối cảnh từ ví dụ trên).

  • Hình thành các bộchọn các yếu tố của họ. Python biểu thức có dạng [x, y] , x[y] , hoặc xy xuất hiện trong các cơ quan chức năng trang trí với tff.federated_computation .