কাস্টম ফেডারেটেড অ্যালগরিদম, পার্ট 1: ফেডারেটেড কোর এর ভূমিকা

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

এই টিউটোরিয়ালটি প্রমান করে যে কিভাবে TensorFlow ফেডারেটেড মধ্যে ফেডারেট আলগোরিদিম (TFF) ব্যবহার করে কাস্টম ধরনের বাস্তবায়ন দুই অংশ সিরিজ প্রথম অংশ ফেডারেটেড কোর (এফসি) - নিম্ন স্তরের ইন্টারফেস একটি সেট যে একটি ভিত্তি হিসেবে কাজ যার উপর আমরা চালু করেছি ফেডারেটেড শিক্ষণ (এফএল) স্তর।

এই প্রথম অংশটি আরও ধারণাগত; আমরা TFF-এ ব্যবহৃত কিছু মূল ধারণা এবং প্রোগ্রামিং বিমূর্ততা প্রবর্তন করি এবং আমরা তাপমাত্রা সেন্সরগুলির একটি বিতরণ করা বিন্যাসের সাথে একটি খুব সাধারণ উদাহরণে তাদের ব্যবহার প্রদর্শন করি। ইন এই সিরিজের দ্বিতীয় অংশ , আমরা প্রক্রিয়া আমরা পরিচয় করিয়ে এখানে ব্যবহার ফেডারেট প্রশিক্ষণ ও মূল্যায়ন আলগোরিদিম একটি সহজ সংস্করণ বাস্তবায়ন। একটি ফলো-আপ হিসেবে আমরা অধ্যয়ন করার জন্য উত্সাহিত করি বাস্তবায়ন মধ্যে ফেডারেট গড় এর tff.learning

এই সিরিজের শেষে, আপনি চিনতে সক্ষম হবেন যে ফেডারেটেড কোরের অ্যাপ্লিকেশনগুলি অগত্যা শেখার মধ্যে সীমাবদ্ধ নয়। আমরা যে প্রোগ্রামিং বিমূর্ততাগুলি অফার করি তা বেশ জেনেরিক, এবং ব্যবহার করা যেতে পারে, যেমন, বিতরণ করা ডেটার উপর বিশ্লেষণ এবং অন্যান্য কাস্টম ধরণের গণনা বাস্তবায়নের জন্য।

যদিও এই টিউটোরিয়াল স্বয়ংসম্পূর্ণ ডিজাইন করা হয়েছে, আমরা আপনার প্রথম পড়া টিউটোরিয়াল উত্সাহিত ইমেজ শ্রেণীবিন্যাস এবং টেক্সট প্রজন্ম TensorFlow ফেডারেটেড ফ্রেমওয়ার্ক এবং একটি উচ্চ পর্যায়ের এবং আরো মৃদু পরিচয়ের জন্য ফেডারেটেড শিক্ষণ API গুলি ( tff.learning ), যেমন এটি আপনাকে প্রেক্ষাপটে এখানে বর্ণনা করা ধারণাগুলি রাখতে সাহায্য করবে৷

উদ্দেশ্য ব্যবহার

সংক্ষেপে, সংযুক্ত কোর (এফসি) একটি উন্নয়ন পরিবেশের এটা সম্ভব কষে প্রোগ্রাম যুক্তিবিজ্ঞান প্রকাশ করার তোলে যে এই ধরনের যারা বিতরণ যোগাযোগ অপারেটর, যে ব্যবহার করা হয় সঙ্গে সম্মিলন TensorFlow কোড ফেডারেটেড গড় - কম্পিউটিং বিতরণ অঙ্কের, গড়, এবং অন্যান্য ধরনের সিস্টেমে ক্লায়েন্ট ডিভাইসগুলির একটি সেটের উপর বিতরণকৃত সমষ্টি, সেই ডিভাইসগুলির সম্প্রচার মডেল এবং পরামিতি ইত্যাদি।

আপনি সচেতন হতে পারে tf.contrib.distribute , এবং একটি প্রাকৃতিক প্রশ্ন এই সময়ে জিজ্ঞাসা করতে হতে পারে: কি উপায়ে এই ফ্রেমওয়ার্ক পৃথক? উভয় ফ্রেমওয়ার্কই সর্বোপরি, টেনসরফ্লো গণনাগুলি বিতরণ করার চেষ্টা করে।

ওয়ান ওয়ে এটা আমার মনে হয় যে, যেহেতু এর বিবৃত লক্ষ্য tf.contrib.distribute ব্যবহারকারীদের বিতরণ প্রশিক্ষণ সক্রিয় করতে ন্যূনতম পরিবর্তনের সঙ্গে বিদ্যমান মডেল এবং প্রশিক্ষণ কোড ব্যবহার করতে অনুমতি দেওয়া, এবং আরো অনেক ফোকাস কিভাবে বিতরণ করা অবকাঠামো সুবিধা গ্রহণ করতে হয় বিদ্যমান প্রশিক্ষণ কোডকে আরও দক্ষ করে তুলতে, TFF-এর ফেডারেটেড কোরের লক্ষ্য হল গবেষক এবং অনুশীলনকারীদের তাদের সিস্টেমে তারা যে বিতরণ করা যোগাযোগের নির্দিষ্ট প্যাটার্ন ব্যবহার করবে তার উপর সুস্পষ্ট নিয়ন্ত্রণ প্রদান করা। এফসি-তে ফোকাস বাস্তবায়িত বিতরণকৃত প্রশিক্ষণ ক্ষমতার একটি নির্দিষ্ট সেটের পরিবর্তে বিতরণ করা ডেটা ফ্লো অ্যালগরিদম প্রকাশের জন্য একটি নমনীয় এবং প্রসারিত ভাষা প্রদানের উপর।

TFF-এর FC API-এর প্রাথমিক লক্ষ্য শ্রোতাদের মধ্যে একটি হল গবেষক এবং অনুশীলনকারী যারা নতুন ফেডারেটেড লার্নিং অ্যালগরিদমগুলির সাথে পরীক্ষা করতে চান এবং সূক্ষ্ম নকশা পছন্দগুলির ফলাফলগুলি মূল্যায়ন করতে চান যা বিতরণ করা সিস্টেমে ডেটা প্রবাহের পদ্ধতিকে প্রভাবিত করে, তবুও সিস্টেম বাস্তবায়নের বিবরণ দ্বারা আবদ্ধ না পেয়ে. এফসি এপিআই যে বিমূর্ততার স্তরের জন্য লক্ষ্য করছে তা মোটামুটি সিউডোকোডের সাথে মিলে যায় যে কেউ একটি গবেষণা প্রকাশনায় একটি ফেডারেটেড লার্নিং অ্যালগরিদমের মেকানিক্স বর্ণনা করতে ব্যবহার করতে পারে - সিস্টেমে কী ডেটা বিদ্যমান এবং কীভাবে এটি রূপান্তরিত হয়, কিন্তু স্তরে না গিয়ে পৃথক পয়েন্ট-টু-পয়েন্ট নেটওয়ার্ক বার্তা বিনিময়।

TFF সামগ্রিকভাবে এমন পরিস্থিতিতে লক্ষ্য করে যেখানে ডেটা বিতরণ করা হয়, এবং এটি অবশ্যই থাকতে হবে, যেমন, গোপনীয়তার কারণে, এবং যেখানে একটি কেন্দ্রীভূত অবস্থানে সমস্ত ডেটা সংগ্রহ করা একটি কার্যকর বিকল্প হতে পারে না। এটি মেশিন লার্নিং অ্যালগরিদমগুলির বাস্তবায়নের উপর প্রভাব ফেলে যার জন্য একটি ডেটা সেন্টারে কেন্দ্রীভূত অবস্থানে সমস্ত ডেটা জমা করা যেতে পারে এমন পরিস্থিতির তুলনায় স্পষ্ট নিয়ন্ত্রণের একটি বর্ধিত মাত্রা প্রয়োজন।

আমরা শুরু করার আগে

আমরা কোডে ডুব দেওয়ার আগে, আপনার পরিবেশ সঠিকভাবে সেটআপ করা হয়েছে তা নিশ্চিত করতে দয়া করে নিম্নলিখিত "হ্যালো ওয়ার্ল্ড" উদাহরণটি চালানোর চেষ্টা করুন৷ এটা কাজ করে না, তাহলে পড়ুন দয়া ইনস্টলেশন নির্দেশাবলীর জন্য গাইড।

!pip install --quiet --upgrade tensorflow-federated-nightly
!pip install --quiet --upgrade nest-asyncio

import nest_asyncio
nest_asyncio.apply()
import collections

import numpy as np
import tensorflow as tf
import tensorflow_federated as tff
@tff.federated_computation
def hello_world():
  return 'Hello, World!'

hello_world()
b'Hello, World!'

ফেডারেটেড ডেটা

TFF এর পার্থক্য বৈশিষ্ট্য হল এটি আপনার কষে ফেডারেট ডেটার উপর TensorFlow ভিত্তিক কম্পিউটেশন প্রকাশ করার অনুমতি দেয়। আমরা এই টিউটোরিয়ালে মেয়াদ ফেডারেট ডেটা ব্যবহার বন্টিত ব্যবস্থা থাকা ডিভাইস একদল জুড়ে হোস্ট করা ডেটা আইটেমের একটি সংগ্রহ উল্লেখ করতে হবে। উদাহরণস্বরূপ, মোবাইল ডিভাইসে চলমান অ্যাপ্লিকেশনগুলি কেন্দ্রীভূত অবস্থানে আপলোড না করে ডেটা সংগ্রহ করতে এবং স্থানীয়ভাবে সংরক্ষণ করতে পারে। অথবা, বিতরণ করা সেন্সরগুলির একটি অ্যারে তাদের অবস্থানে তাপমাত্রা রিডিং সংগ্রহ এবং সঞ্চয় করতে পারে।

উপরের উদাহরণগুলোতে সেই হিসাবে TFF চিকিত্সা মত ফেডারেটেড ডেটা প্রথম শ্রেণীর নাগরিকদের , অর্থাত্, তারা পরামিতি এবং ফাংশন ফলাফল হিসাবে প্রদর্শিত হতে পারে, এবং তারা ধরনের আছে। এই ধারণা পুনরায় বলবৎ করার জন্য, আমরা ফেডারেট মূল্যবোধ, যেমন ফেডারেট ডেটা সেট বা ফেডারেট ধরনের মান হিসাবে পড়ুন হবে।

বোঝার গুরুত্বপূর্ণ বিষয় হল যে আমরা সমস্ত ডিভাইস জুড়ে ডেটা আইটেমগুলির সম্পূর্ণ সংগ্রহের মডেলিং করছি (যেমন, একটি বিতরণ করা অ্যারের সমস্ত সেন্সর থেকে সম্পূর্ণ সংগ্রহের তাপমাত্রা রিডিং) একক ফেডারেটেড মান হিসাবে।

উদাহরণ হিসেবে বলা যায়, এখানে কিভাবে এক TFF মধ্যে ক্লায়েন্ট ডিভাইস একটি গ্রুপ দ্বারা হোস্ট করা ফেডারেট ভাসা ধরণ নির্ধারণ হবে না। তাপমাত্রা রিডিংয়ের একটি সংগ্রহ যা বিতরণ করা সেন্সরগুলির একটি অ্যারে জুড়ে বাস্তবায়িত হয় এই ফেডারেটেড ধরণের মান হিসাবে মডেল করা যেতে পারে।

federated_float_on_clients = tff.type_at_clients(tf.float32)

আরো সাধারণভাবে, TFF একটি ফেডারেট প্রকার TYPE নির্দিষ্ট করে সংজ্ঞায়িত করা হয় T সদস্য উপাদানসমূহের - তথ্য আইটেম পৃথক ডিভাইসের উপর অবস্থিত এবং গ্রুপ G ডিভাইস যার উপর এই ধরনের ফেডারেট মান হোস্ট করা হয় (প্লাস এক তৃতীয়াংশ, তথ্যের ঐচ্ছিক বিট আমরা শীঘ্রই উল্লেখ করব)। গোষ্ঠী পড়ুন G মান বসানো একটি ফেডারেট মান হোস্টিং ডিভাইস। সুতরাং, tff.CLIENTS একটি বসানো একটি উদাহরণ।

str(federated_float_on_clients.member)
'float32'
str(federated_float_on_clients.placement)
'CLIENTS'

সঙ্গে সদস্য সংগঠকদের একজন ফেডারেট টাইপ T এবং স্থান G কষে হিসাবে প্রতিনিধিত্ব করা যেতে পারে {T}@G নিচের চিত্রের।

str(federated_float_on_clients)
'{float32}@CLIENTS'

কোঁকড়া ধনুর্বন্ধনী {} এই সংক্ষিপ্ত মধ্যে স্বরলিপি একটি অনুস্মারক হিসেবে পরিবেশন করা যে সদস্য সংগঠকদের (বিভিন্ন ডিভাইসের ডাটা আইটেম), ভিন্ন হতে পারে হিসাবে আপনি যেমন আশা তাপমাত্রা সেন্সর রিডিং এর, তাই দল হিসেবে ক্লায়েন্টদের যৌথভাবে একটি হোস্টিং করা হয় বহু -set এর T আইটেম একসঙ্গে ফেডারেট মান গঠন -typed।

এটা খেয়াল করা জরুরী গুরুত্বপূর্ণ যে একটি ফেডারেট মান সদস্য সংগঠকদের সাধারণত প্রোগ্রামার থেকে অস্বচ্ছ হয়, অর্থাত্, একটি ফেডারেট মান একটি সহজ হিসেবে দেখা উচিত নয় dict সিস্টেমের মধ্যে একটি ডিভাইসের একটি আইডেন্টিফায়ার দ্বারা অস্থির - এই মান উদ্দেশ্যে করা হয় সম্মিলিতভাবে শুধুমাত্র ফেডারেট অপারেটার যে abstractly (যেমন অ্যাগ্রিগেশন হিসাবে) বিতরণ করা হয়ে কমিউনিকেশন প্রটোকল এর বিভিন্ন ধরণের প্রতিনিধিত্ব দ্বারা রুপান্তরিত করা। যদি এটি খুব বিমূর্ত মনে হয়, চিন্তা করবেন না - আমরা শীঘ্রই এটিতে ফিরে আসব, এবং আমরা এটিকে সুনির্দিষ্ট উদাহরণ দিয়ে ব্যাখ্যা করব।

TFF-এ ফেডারেটেড প্রকারগুলি দুটি স্বাদে আসে: যেখানে একটি ফেডারেটেড মানের সদস্য উপাদানগুলি আলাদা হতে পারে (যেমনটি উপরে দেখা গেছে), এবং যেখানে তারা সবাই সমান বলে পরিচিত। এই তৃতীয়, ঐচ্ছিক দ্বারা নিয়ন্ত্রিত হয় all_equal মাপদণ্ড tff.FederatedType কন্সট্রাক্টর (নির্ধারিত লিঙ্ক False )।

federated_float_on_clients.all_equal
False

একটি বসানো সহ একটি ফেডারেট টাইপ G যা সব T -typed সদস্য সংগঠকদের সমান কষে হিসাবে প্রতিনিধিত্ব করা যাবে হিসেবে পরিচিত হয় T@G (যেমন বিরোধিতা {T}@G , কোঁকড়া ধনুর্বন্ধনী সঙ্গে যে প্রতিফলিত বাদ সত্য যে সদস্য উপাদানগুলির বহু-সেট একটি একক আইটেম নিয়ে গঠিত)।

str(tff.type_at_clients(tf.float32, all_equal=True))
'float32@CLIENTS'

এই ধরনের একটি ফেডারেটেড মানের একটি উদাহরণ যা ব্যবহারিক পরিস্থিতিতে দেখা দিতে পারে একটি হাইপারপ্যারামিটার (যেমন একটি শেখার হার, একটি ক্লিপিং আদর্শ, ইত্যাদি) যা একটি সার্ভার দ্বারা সম্প্রচার করা হয়েছে ডিভাইসগুলির একটি গ্রুপে যা ফেডারেটেড প্রশিক্ষণে অংশগ্রহণ করে।

আরেকটি উদাহরণ হল সার্ভারে পূর্ব-প্রশিক্ষিত একটি মেশিন লার্নিং মডেলের পরামিতিগুলির একটি সেট, যেগুলি পরে ক্লায়েন্ট ডিভাইসগুলির একটি গ্রুপে সম্প্রচার করা হয়েছিল, যেখানে সেগুলি প্রতিটি ব্যবহারকারীর জন্য ব্যক্তিগতকৃত হতে পারে।

উদাহরণ স্বরূপ, ধরুন আমরা একজোড়া আছে float32 পরামিতি a এবং b একটি সহজ এক-মাত্রিক রৈখিক রিগ্রেশনের মডেল জন্য। আমরা নিম্নরূপ TFF-এ ব্যবহারের জন্য এই ধরনের মডেলগুলির (নন-ফেডারেটেড) গঠন করতে পারি। কোণ ধনুর্বন্ধনী <> মুদ্রিত টাইপ স্ট্রিং নামকরণ বা নামহীন tuples জন্য একটি কম্প্যাক্ট TFF স্বরলিপি হয়।

simple_regression_model_type = (
    tff.StructType([('a', tf.float32), ('b', tf.float32)]))

str(simple_regression_model_type)
'<a=float32,b=float32>'

মনে রাখবেন আমরা কেবল উল্লেখ করা হয় dtype s এর উপরে। অ-স্কেলার প্রকারগুলিও সমর্থিত। উপরের কোড সালে tf.float32 আরও সাধারণ জন্য একটি শর্টকাট স্বরলিপি হয় tff.TensorType(dtype=tf.float32, shape=[])

যখন এই মডেলটি ক্লায়েন্টদের কাছে সম্প্রচার করা হয়, তখন ফলস্বরূপ ফেডারেটেড মানের প্রকারটি নীচে দেখানো হিসাবে উপস্থাপন করা যেতে পারে।

str(tff.type_at_clients(
    simple_regression_model_type, all_equal=True))
'<a=float32,b=float32>@CLIENTS'

প্রতি উপরে ফেডারেট ভাসা সঙ্গে প্রতিসাম্য, আমরা একটি ফেডারেট tuple যেমন একটি টাইপ পড়ুন হবে। আরো সাধারণভাবে, আমরা প্রায়ই একটি ফেডারেট মান যা সদস্য সংগঠকদের XYZ -একটি হয় উল্লেখ করতে শব্দটি ফেডারেট XYZ ব্যবহার করব। সুতরাং, আমরা ফেডারেট tuples, সংযুক্ত ক্রমের, সংযুক্ত মডেল, এবং আরো কিছু সম্পর্কে কথা বলতে হবে।

এখন, আসছে ফিরে float32@CLIENTS - যখন এটি একাধিক ডিভাইস জুড়ে প্রতিলিপি দেখা যায়, এটি আসলে একটি একক float32 , যেহেতু সমস্ত সদস্য একই। সাধারণভাবে, যদি আপনি কোন সব সমান ফেডারেট ধরনের, অর্থাত্, মনে হতে পারে ফর্ম এক T@G , একটি অ-ফেডারেট টাইপ isomorphic যেমন T , উভয় ক্ষেত্রেই, সেখানে আসলে যেহেতু শুধুমাত্র একটি একক (যদিও সম্ভাব্য প্রতিলিপি) আইটেমটি টাইপ T

মধ্যে isomorphism দেওয়া T এবং T@G , আপনি আশ্চর্য হতে পারেন কোন উদ্দেশ্যে, যদি থাকে, আধুনিক ধরনের পরিবেশন করা হতে পারে। পড়তে.

প্লেসমেন্ট

ডিজাইন ওভারভিউ

পূর্ববর্তী বিভাগে, আমরা এদেশের ধারণা চালু করেছি - সিস্টেম যে অংশগ্রহণকারীদের যৌথভাবে হতে পারে একটি ফেডারেট মান হোস্টিং দলের, এবং আমরা ব্যবহার প্রদর্শিত করেছি tff.CLIENTS একটি বসানো একটি উদাহরণ স্পেসিফিকেশন হিসাবে।

ব্যাখ্যা কেন একটি বসানো ধারণা তাই মৌলিক যে আমরা TFF টাইপ সিস্টেমের মধ্যে এটি নিগমবদ্ধ প্রয়োজন, প্রত্যাহার কি আমরা TFF এর অভিপ্রেত ব্যবহার সম্পর্কে কিছু এই টিউটোরিয়ালের শুরুতে উল্লেখ করেছে।

যদিও এই টিউটোরিয়ালে, আপনি কেবলমাত্র একটি সিমুলেটেড পরিবেশে স্থানীয়ভাবে TFF কোড কার্যকর করা দেখতে পাবেন, আমাদের লক্ষ্য হল TFF লেখার কোড সক্ষম করা যা আপনি একটি বিতরণ করা সিস্টেমে শারীরিক ডিভাইসের গ্রুপগুলিতে কার্যকর করার জন্য স্থাপন করতে পারেন, সম্ভাব্য মোবাইল বা এমবেডেড ডিভাইসগুলি সহ অ্যান্ড্রয়েড চলমান। সিস্টেমে এটি যে ভূমিকা পালন করে তার উপর নির্ভর করে (একটি শেষ-ব্যবহারকারী ডিভাইস, একটি কেন্দ্রীভূত সমন্বয়কারী, একটি মাল্টি-টায়ার আর্কিটেকচারে একটি মধ্যবর্তী স্তর, ইত্যাদি) স্থানীয়ভাবে চালানোর জন্য এই ডিভাইসগুলির প্রত্যেকটি নির্দেশাবলীর একটি পৃথক সেট পাবে। ডিভাইসের কোন উপসেটগুলি কোন কোডটি কার্যকর করে এবং কোথায় ডেটার বিভিন্ন অংশ শারীরিকভাবে বাস্তবায়িত হতে পারে সে সম্পর্কে যুক্তি দিতে সক্ষম হওয়া গুরুত্বপূর্ণ।

এটি বিশেষভাবে গুরুত্বপূর্ণ যখন মোবাইল ডিভাইসে অ্যাপ্লিকেশন ডেটা নিয়ে কাজ করা হয়। যেহেতু ডেটা ব্যক্তিগত এবং সংবেদনশীল হতে পারে, তাই আমাদের স্থিতিশীলভাবে যাচাই করার ক্ষমতা প্রয়োজন যে এই ডেটা কখনই ডিভাইসটি ছেড়ে যাবে না (এবং ডেটা কীভাবে প্রক্রিয়া করা হচ্ছে সে সম্পর্কে তথ্য প্রমাণ করবে)। প্লেসমেন্ট স্পেসিফিকেশন হল এটি সমর্থন করার জন্য ডিজাইন করা প্রক্রিয়াগুলির মধ্যে একটি।

TFF একটি ডাটা-কেন্দ্রিক প্রোগ্রামিং এনভায়রনমেন্ট হিসাবে ডিজাইন করা হয়েছে, এবং যেমন অসদৃশ বিদ্যমান অবকাঠামো যে অপারেশন উপর ফোকাস এবং যেখানে ঐ অপারেশন চালানো পারে, TFF ডেটা, যেখানে যে তথ্য materializes, এবং কিভাবে এটা রুপান্তরিত হচ্ছে উপর গুরুত্ত্ব দেয় কিছু। ফলস্বরূপ, প্লেসমেন্টকে ডেটার ক্রিয়াকলাপের সম্পত্তি হিসাবে না করে, TFF-এ ডেটার বৈশিষ্ট্য হিসাবে মডেল করা হয়। প্রকৃতপক্ষে, যেমন আপনি পরবর্তী বিভাগে দেখতে চলেছেন, কিছু TFF ক্রিয়াকলাপ সমস্ত অবস্থান জুড়ে বিস্তৃত এবং "নেটওয়ার্কের মধ্যে" চালায়, তাই বলতে গেলে, একটি একক মেশিন বা মেশিনের একটি গ্রুপ দ্বারা সম্পাদিত হওয়ার পরিবর্তে।

যেমন একটি নির্দিষ্ট মানের প্রকার প্রতিনিধিত্ব T@G বা {T}@G (শুধু বিরোধিতা T TFF লেখা প্রোগ্রামের একটি স্ট্যাটিক বিশ্লেষণের সঙ্গে) ডেটা বসানো সিদ্ধান্ত স্পষ্ট করে তোলে, এবং একসঙ্গে, এটা প্রদানের জন্য একটি ভিত্তি হিসেবে কাজ করতে পারে সংবেদনশীল অন-ডিভাইস ডেটার জন্য আনুষ্ঠানিক গোপনীয়তার গ্যারান্টি।

এই সময়ে নোট একটি গুরুত্বপূর্ণ জিনিস, তবে, যে যখন আমরা অংশগ্রহণকারী ডিভাইস গ্রুপ সম্পর্কে স্পষ্ট হতে TFF ব্যবহারকারীদের উৎসাহিত যে হোস্ট তথ্য (এদেশের), প্রোগ্রামার কাঁচা ডেটা বা ব্যক্তির অংশগ্রহণকারীদের পরিচয় সাথে মোকাবিলা করবে না হয় .

TFF কোডের শরীরের মধ্যে, নকশা দ্বারা, সেখানে ডিভাইস গ্রুপ দ্বারা প্রতিনিধিত্ব গঠন গনা কোন উপায় tff.CLIENTS অথবা দলের মধ্যে একটি নির্দিষ্ট ডিভাইসের অস্তিত্বের প্রোবের জন্য। ফেডারেটেড কোর এপিআই, আর্কিটেকচারাল অ্যাবস্ট্রাকশনের অন্তর্নিহিত সেট, বা সিমুলেশন সমর্থন করার জন্য আমরা যে মূল রানটাইম পরিকাঠামো সরবরাহ করি সেখানে কোথাও কোনও ডিভাইস বা ক্লায়েন্ট পরিচয়ের কোনও ধারণা নেই। আপনার লেখা সমস্ত গণনা যুক্তি সমগ্র ক্লায়েন্ট গ্রুপে অপারেশন হিসাবে প্রকাশ করা হবে।

রিকল এখানে কি আমরা ফেডারেট ধরনের পাইথন অসদৃশ হচ্ছে মান সম্পর্কে উল্লেখ করেছে আগে dict , যে এক কেবল তাদের সদস্য সংগঠকদের গনা করতে পারবে না। আপনার TFF প্রোগ্রাম লজিক পৃথক অংশগ্রহণকারীদের সাথে না করে, প্লেসমেন্ট (গ্রুপ) এর সাথে যুক্ত হওয়ার মতো মানগুলি নিয়ে ভাবুন।

অবস্থানগুলি সেইসাথে TFF একটি প্রথম শ্রেণীর নাগরিক হতে করার জন্য পরিকল্পিত, এবং পরামিতি এবং একটি ফলাফল হিসাবে প্রদর্শিত করতে পারেন placement প্রকার (দ্বারা প্রতিনিধিত্ব করা tff.PlacementType API এ)। ভবিষ্যতে, আমরা স্থান পরিবর্তন বা একত্রিত করার জন্য বিভিন্ন অপারেটর সরবরাহ করার পরিকল্পনা করছি, তবে এটি এই টিউটোরিয়ালের সুযোগের বাইরে। এখন জন্য, এটি মনে করার যথেষ্ট placement হিসাবে একটি অস্বচ্ছ আদিম বিল্ট-ইন TFF, অনুরূপ টাইপ কিভাবে int এবং bool অস্বচ্ছ বিল্ট-ইন করা হয় পাইথন ধরনের সঙ্গে tff.CLIENTS , এই ধরনের একটি ধ্রুবক আক্ষরিক হচ্ছে অসদৃশ না 1 টাইপ একটি ধ্রুবক আক্ষরিক হচ্ছে int

স্থান নির্দিষ্টকরণ

TFF দুটি মৌলিক বসানো লিটারেল, উপলব্ধ tff.CLIENTS এবং tff.SERVER (ব্যবহারিক পরিস্থিতিতে প্রাকৃতিকভাবে ক্লায়েন্ট-সার্ভার আর্কিটেকচারের হিসাবে স্থাপিত হয়, একাধিক ক্লায়েন্ট ডিভাইস সঙ্গে মোবাইল ফোন, এমবেডেড ডিভাইস, বিতরণ ডাটাবেস সমৃদ্ধ বিভিন্ন প্রকাশ করার সহজ এটি করা, , সেন্সর, ইত্যাদি) একটি একক কেন্দ্রীভূত সার্ভারের সমন্বয়কারী দ্বারা orchestrated। TFF কাস্টম প্লেসমেন্ট, একাধিক ক্লায়েন্ট গ্রুপ, মাল্টি-টায়ার্ড এবং অন্যান্য, আরও সাধারণ বিতরণ করা আর্কিটেকচারকে সমর্থন করার জন্য ডিজাইন করা হয়েছে, কিন্তু সেগুলি নিয়ে আলোচনা করা এই টিউটোরিয়ালের সুযোগের বাইরে।

TFF প্রচলিত ফরজ নয় কি পারেন tff.CLIENTS বা tff.SERVER আসলে প্রতিনিধিত্ব করে।

বিশেষ করে, tff.SERVER একটি একক ফিজিক্যাল ডিভাইস (ক Singleton দলের সদস্য) হতে পারে, কিন্তু এটা ঠিক যেমন ভাল একটি ফল্ট-সহিষ্ণু ক্লাস্টার চলমান রাষ্ট্র মেশিন রেপ্লিকেশন মধ্যে প্রতিলিপি একদল হতে পারে - আমরা কোনো বিশেষ স্থাপত্য না অনুমান বরং, আমরা ব্যবহার all_equal সত্য যে আমরা সাধারণত সার্ভার এ ডেটা শুধুমাত্র একটি একক আইটেম সঙ্গে লেনদেন করছেন প্রকাশ করার বিট পূর্ববর্তী অধ্যায় উল্লেখ করেছে।

অনুরূপভাবে, tff.CLIENTS কিছু অ্যাপ্লিকেশন সিস্টেম সমস্ত ক্লায়েন্ট প্রতিনিধিত্ব পারে - ফেডারেট লার্নিং আমরা মাঝে মাঝে জনসংখ্যা যেমন যেমন, মধ্যে উল্লেখ থাকলেও প্রেক্ষাপটে কি ফেডারেটেড গড় উৎপাদন বাস্তবায়নের একটি উপসেট -, এটি একটি দল প্রতিনিধিত্ব করতে পারে প্রশিক্ষণের একটি নির্দিষ্ট রাউন্ডে অংশগ্রহণের জন্য নির্বাচিত ক্লায়েন্টরা। বিমূর্তভাবে সংজ্ঞায়িত প্লেসমেন্টগুলিকে সুনির্দিষ্ট অর্থ দেওয়া হয় যখন একটি গণনা যেখানে তারা প্রদর্শিত হয় তা কার্যকর করার জন্য স্থাপন করা হয় (বা কেবল একটি সিমুলেটেড পরিবেশে পাইথন ফাংশনের মতো আহ্বান করা হয়, যেমনটি এই টিউটোরিয়ালে প্রদর্শিত হয়েছে)। আমাদের স্থানীয় সিমুলেশনে, ক্লায়েন্টদের গ্রুপ ইনপুট হিসাবে সরবরাহ করা ফেডারেটেড ডেটা দ্বারা নির্ধারিত হয়।

ফেডারেটেড গণনা

ফেডারেটেড গণনা ঘোষণা

TFF একটি দৃঢ়ভাবে টাইপ করা কার্যকরী প্রোগ্রামিং পরিবেশ হিসাবে ডিজাইন করা হয়েছে যা মডুলার উন্নয়ন সমর্থন করে।

যুক্তির একটি অধ্যায় যে ইনপুট হিসাবে ফেডারেট মান গ্রহণ এবং আউটপুট ফেডারেট মান আসতে পারে - TFF মধ্যে রফা মৌলিক একক একটি ফেডারেট গণনার হয়। আমাদের পূর্ববর্তী উদাহরণ থেকে সেন্সর অ্যারে দ্বারা রিপোর্ট করা তাপমাত্রার গড় গণনা করে এমন একটি গণনা আপনি কীভাবে সংজ্ঞায়িত করতে পারেন তা এখানে।

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

, উপরের কোড এ খুঁজছি এই বিন্দু আপনাকে জিজ্ঞাসা করা যেতে পারে এ - ইতিমধ্যেই নির্মান প্রসাধক নেই যেমন composable ইউনিট সংজ্ঞায়িত করতে tf.function TensorFlow, এবং যদি তাই হয়, কেন এখনও অন্য এক পরিচয় করিয়ে দিতে আর কীভাবে ভিন্ন?

সংক্ষিপ্ত উত্তর যে দ্বারা উত্পন্ন কোড tff.federated_computation এটা একটা অভ্যন্তরীণ প্ল্যাটফর্ম-স্বাধীন আঠালো ভাষায় বিতরণ ব্যবস্থার একটি স্পেসিফিকেশন নেই - মোড়কের তন্ন তন্ন TensorFlow হয়, না এটা পাইথন হয়। এই মুহুর্তে, এটি নিঃসন্দেহে রহস্যময় শোনাবে, তবে অনুগ্রহ করে একটি বিতরণ করা সিস্টেমের একটি বিমূর্ত স্পেসিফিকেশন হিসাবে একটি ফেডারেটেড গণনার এই স্বজ্ঞাত ব্যাখ্যাটি মনে রাখবেন। আমরা এক মিনিটের মধ্যে এটি ব্যাখ্যা করব।

প্রথমত, সংজ্ঞাটি নিয়ে একটু খেলা করা যাক। TFF কম্পিউটেশনগুলি সাধারণত ফাংশন হিসাবে মডেল করা হয় - প্যারামিটার সহ বা ছাড়া, কিন্তু ভাল-সংজ্ঞায়িত টাইপ স্বাক্ষর সহ। আপনি তার অনুসন্ধান করে কম্পিউটেশন ধরণ স্বাক্ষর মুদ্রণ করতে পারেন type_signature নিচের চিত্রের, সম্পত্তি।

str(get_average_temperature.type_signature)
'({float32}@CLIENTS -> float32@SERVER)'

টাইপ স্বাক্ষর আমাদের বলে যে গণনা ক্লায়েন্ট ডিভাইসে বিভিন্ন সেন্সর রিডিংয়ের একটি সংগ্রহ গ্রহণ করে এবং সার্ভারে একটি একক গড় ফেরত দেয়।

আগে আমরা কোনও যান, এর এক মিনিটের জন্য এই প্রতিফলিত করি - ইনপুট এবং এই গণনার আউটপুট (চালু বিভিন্ন জায়গায় যে CLIENTS এ বনাম SERVER )। রিকল কি আমরা কিভাবে TFF অপারেশন অবস্থানে জুড়ে জুড়ে পারে, এবং নেটওয়ার্কের মধ্যে চালানোর জন্য, এবং কি আমরা ঠিক বিতরণ ব্যবস্থা বিমূর্ত নির্দিষ্টকরণের প্রতিনিধিত্ব ফেডারেট কম্পিউটেশন সম্পর্কে বলেন সম্পর্কে এদেশের উপর পূর্ববর্তী বিভাগে বলেন। আমাদের কাছে এইরকম একটি সংজ্ঞায়িত একটি গণনা রয়েছে - একটি সাধারণ বিতরণ করা সিস্টেম যেখানে ক্লায়েন্ট ডিভাইসগুলিতে ডেটা ব্যবহার করা হয় এবং সার্ভারে মোট ফলাফল আবির্ভূত হয়।

অনেক ব্যবহারিক পরিস্থিতিতে, কম্পিউটেশন যে টপ লেভেল কর্ম প্রতিনিধিত্ব তাদের ইনপুট গ্রহণ এবং সার্ভার তাদের আউটপুট রিপোর্ট করতে থাকে - এই ধারণা যে কম্পিউটেশন প্রশ্ন যা উদ্ভূত এবং সার্ভারে বিনষ্ট দ্বারা আলোড়ন সৃষ্টি করা যেতে পারে প্রতিফলিত করে।

যাইহোক, এফসি এপিআই এই ধৃষ্টতা আরোপ করে না, এবং বিল্ডিং ব্লক অনেক আমরা অভ্যন্তরীণভাবে ব্যবহার করুন (অনেক সহ tff.federated_... অপারেটার আপনি API এ খুঁজে পেতে পারেন), তাই সাধারণভাবে, আপনি উচিত ইনপুট এবং স্বতন্ত্র এদেশের সঙ্গে আউটপুট আছে এমন কিছু বিষয় যা সার্ভারে সঞ্চালিত হয় বা সার্ভার দ্বারা মৃত্যুদন্ড কার্যকর করা হয় হিসাবে একটি ফেডারেট গণনার আমার মনে হয় না। সার্ভার হল ফেডারেটেড কম্পিউটেশনে এক ধরনের অংশগ্রহণকারী। এই ধরনের কম্পিউটেশনের মেকানিক্স সম্পর্কে চিন্তা করার ক্ষেত্রে, একটি একক কেন্দ্রীভূত সমন্বয়কারীর দৃষ্টিকোণ না করে সর্বদা বিশ্বব্যাপী নেটওয়ার্ক-ওয়াইড পরিপ্রেক্ষিতে ডিফল্ট হওয়া ভাল।

সাধারণভাবে, ক্রিয়ামূলক টাইপ স্বাক্ষর কষে হিসাবে প্রতিনিধিত্ব করা হয় (T -> U) ধরনের জন্য T এবং U ইনপুট এবং আউটপুট যথাক্রমে করুন। ফর্ম্যাল প্যারামিটার ধরণ (যেমন sensor_readings এই ক্ষেত্রে) প্রসাধক থেকে আর্গুমেন্ট হিসাবে উল্লেখ করা হয়। আপনাকে ফলাফলের ধরণ নির্দিষ্ট করতে হবে না - এটি স্বয়ংক্রিয়ভাবে নির্ধারিত হয়।

যদিও TFF পলিমরফিজমের সীমিত রূপগুলি অফার করে, প্রোগ্রামারদের দৃঢ়ভাবে উত্সাহিত করা হয় যে তারা যে ধরনের ডেটা নিয়ে কাজ করে সে সম্পর্কে স্পষ্ট হতে, কারণ এটি আপনার কোডের বৈশিষ্ট্যগুলি বোঝা, ডিবাগিং এবং আনুষ্ঠানিকভাবে যাচাই করা সহজ করে তোলে। কিছু ক্ষেত্রে, স্পষ্টভাবে প্রকারগুলি নির্দিষ্ট করা একটি প্রয়োজনীয়তা (যেমন, পলিমরফিক গণনাগুলি বর্তমানে সরাসরি কার্যকর করা যায় না)।

ফেডারেটেড গণনা নির্বাহ করা হচ্ছে

উন্নয়ন এবং ডিবাগিং সমর্থন করার জন্য, TFF আপনাকে পাইথন ফাংশন হিসাবে এইভাবে সংজ্ঞায়িত গণনাগুলিকে সরাসরি আহ্বান করতে দেয়, যেমনটি নীচে দেখানো হয়েছে। কোথায় গণনার সঙ্গে একটি ফেডারেট ধরনের একটি মান আশা all_equal করার বিট সেট False , আপনি এটি একটি প্লেইন হিসাবে ফিড পারেন list পাইথন, এবং সঙ্গে ফেডারেট ধরনের জন্য all_equal করার বিট সেট True , আপনি শুধু সরাসরি খাওয়াতে পারেন (একক) সদস্য উপাদান। এইভাবে ফলাফলগুলি আপনাকে আবার রিপোর্ট করা হয়।

get_average_temperature([68.5, 70.3, 69.8])
69.53334

সিমুলেশন মোডে এইভাবে কম্পিউটেশন চালানোর সময়, আপনি একটি সিস্টেম-ওয়াইড ভিউ সহ একজন বাহ্যিক পর্যবেক্ষক হিসাবে কাজ করেন, যিনি নেটওয়ার্কের যেকোনো অবস্থানে ইনপুট সরবরাহ করতে এবং আউটপুট গ্রহণ করার ক্ষমতা রাখেন, যেমনটি এখানে বাস্তবিকই - আপনি ক্লায়েন্ট মান সরবরাহ করেছেন ইনপুট এ, এবং সার্ভার ফলাফল গ্রাস.

এখন, একটি নোট যাক ফিরে আমরা যে বিষয়ে আগে তৈরি tff.federated_computation প্রসাধক একটি আঠালো ভাষায় কোড emitting। যদিও TFF কম্পিউটেশন যুক্তিবিজ্ঞান পাইথন মধ্যে সাধারণ ফাংশন হিসাবে প্রকাশ করা যেতে পারে (আপনি শুধু তাদের সাথে সাজাইয়া রাখা প্রয়োজন tff.federated_computation এবং আপনি পাইথন আর্গুমেন্ট শুধু এই অন্য কোন পাইথন ফাংশন মত তাদের ডাকা সরাসরি পারেন হিসাবে আমরা উপরোক্ত কাজ করেছি), নোটবুক, লোকচক্ষুর অন্তরালে, আমরা আগে উল্লেখ করা হয়েছে, TFF কম্পিউটেশন আসলে না পাইথন হয়।

আমরা কি এই দ্বারা মানে যখন পাইথন ইন্টারপ্রেটার একটি ফাংশন দিয়ে সাজানো encounters হয় tff.federated_computation , এটা একবার (সংজ্ঞা সময়ে) এই ফাংশন শরীরে বিবৃতি ট্র্যাকও এবং তারপর একটি নির্মান ধারাবাহিকভাবে উপস্থাপনা ভবিষ্যতে ব্যবহারের জন্য গণনার এর যুক্তি - কিনা সম্পাদনের জন্য, বা অন্য গণনার মধ্যে একটি উপ-উপাদান হিসাবে অন্তর্ভুক্ত করা।

আপনি নিম্নরূপ একটি প্রিন্ট বিবৃতি যোগ করে এটি যাচাই করতে পারেন:

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

  print ('Getting traced, the argument is "{}".'.format(
      type(sensor_readings).__name__))

  return tff.federated_mean(sensor_readings)
Getting traced, the argument is "ValueImpl".

আপনি পাইথন কোডের কথা ভাবতে পারেন যা একটি ফেডারেটেড কম্পিউটেশনকে সংজ্ঞায়িত করে একইভাবে আপনি পাইথন কোডের কথা ভাববেন যা একটি অ-আগ্রহী প্রেক্ষাপটে একটি টেনসরফ্লো গ্রাফ তৈরি করে (যদি আপনি টেনসরফ্লো-এর অ-আগ্রহী ব্যবহারগুলির সাথে পরিচিত না হন তবে আপনার মনে করুন পাইথন কোড পরবর্তীতে সম্পাদিত অপারেশনগুলির একটি গ্রাফ সংজ্ঞায়িত করে, কিন্তু আসলে সেগুলিকে ফ্লাইতে চালায় না)। TensorFlow-এ অ-আগ্রহী গ্রাফ-বিল্ডিং কোড হল পাইথন, কিন্তু এই কোড দ্বারা নির্মিত TensorFlow গ্রাফটি প্ল্যাটফর্ম-স্বাধীন এবং ক্রমিক।

অনুরূপভাবে, TFF কম্পিউটেশন পাইথন সংজ্ঞায়িত করা হয়, কিন্তু যেমন তাদের মৃতদেহ মধ্যে পাইথন বিবৃতি tff.federated_mean উদাহরণে শুধু দেখানো weve, ফণা অধীন একটি পোর্টেবল এবং প্ল্যাটফর্ম-স্বাধীন serializable উপস্থাপনা মধ্যে কম্পাইল করা হয়।

একজন বিকাশকারী হিসাবে, আপনাকে এই উপস্থাপনার বিশদ বিবরণের সাথে নিজেকে উদ্বিগ্ন করার দরকার নেই, কারণ আপনাকে এটির সাথে সরাসরি কাজ করার প্রয়োজন হবে না, তবে আপনার এটির অস্তিত্ব সম্পর্কে সচেতন হওয়া উচিত, এই সত্য যে TFF গণনাগুলি মৌলিকভাবে অ-আগ্রহী, এবং নির্বিচারে পাইথন অবস্থা ক্যাপচার করতে পারে না। একটি TFF গণনার লাশ অন্তর্ভুক্ত পাইথন কোড, সংজ্ঞা সময়ে মৃত্যুদন্ড কার্যকর যখন পাইথন ফাংশন দিয়ে সাজানো লাশ হয় tff.federated_computation ধারাবাহিকভাবে পেয়ে সামনে আঁকা হয়। আমন্ত্রণের সময় এটি আবার ফিরে পাওয়া যায় না (ফাংশনটি পলিমরফিক হলে; বিস্তারিত জানার জন্য অনুগ্রহ করে ডকুমেন্টেশন পৃষ্ঠাগুলি দেখুন)।

আপনি ভাবতে পারেন কেন আমরা একটি ডেডিকেটেড অভ্যন্তরীণ নন-পাইথন উপস্থাপনা চালু করতে বেছে নিয়েছি। একটি কারণ হল যে শেষ পর্যন্ত, TFF গণনাগুলি বাস্তব শারীরিক পরিবেশে স্থাপনযোগ্য এবং মোবাইল বা এমবেডেড ডিভাইসে হোস্ট করা হয়, যেখানে পাইথন উপলব্ধ নাও হতে পারে।

আরেকটি কারণ হল যে TFF গণনাগুলি বিতরণ করা সিস্টেমের বিশ্বব্যাপী আচরণ প্রকাশ করে, পাইথন প্রোগ্রামগুলির বিপরীতে যা পৃথক অংশগ্রহণকারীদের স্থানীয় আচরণ প্রকাশ করে। আপনি উপরের সহজ উদাহরণে দেখতে পারেন, বিশেষ অপারেটর সঙ্গে tff.federated_mean যে ক্লায়েন্ট ডিভাইস ডেটা কিন্তু আমানত সার্ভারে ফলাফল গ্রহণ করে।

অপারেটর tff.federated_mean সহজে, পাইথন মধ্যে একজন সাধারণ অপারেটর হিসাবে স্থাপিত করা যাবে না যেহেতু এটি স্থানীয়ভাবে চালানো না - যেমন তার আগে লক্ষনীয়, এটি একটি বন্টিত ব্যবস্থা উপস্থাপন করে এমন স্থানাঙ্ক একাধিক সিস্টেম অংশগ্রহণকারীদের আচরণ। আমরা ফেডারেট অপারেটার যেমন অপারেটার পড়ুন হবে তাদের পাইথন মধ্যে সাধারণ (স্থানীয়) অপারেটরদের থেকে পৃথক করা হয়।

TFF টাইপ সিস্টেম, এবং TFF-এর ভাষায় সমর্থিত ক্রিয়াকলাপের মৌলিক সেট, এইভাবে পাইথনের থেকে উল্লেখযোগ্যভাবে বিচ্যুত হয়, একটি ডেডিকেটেড উপস্থাপনা ব্যবহার করার প্রয়োজন হয়।

ফেডারেটেড গণনা রচনা করা

উপরে উল্লিখিত হিসাবে, ফেডারেটেড কম্পিউটেশন এবং তাদের উপাদানগুলিকে বিতরণ করা সিস্টেমের মডেল হিসাবে সবচেয়ে ভাল বোঝা যায়, এবং আপনি ফেডারেটেড কম্পিউটেশনগুলিকে সহজতর থেকে আরও জটিল বিতরণ সিস্টেমগুলি রচনা করার কথা ভাবতে পারেন। আপনি মনে করতে পারেন tff.federated_mean বিল্ট-ইন টেমপ্লেট ফেডারেট গণনার একটি টাইপ স্বাক্ষর সহ এক ধরনের হিসাবে অপারেটর ({T}@CLIENTS -> T@SERVER) (প্রকৃতপক্ষে, শুধু কম্পিউটেশন মত আপনি লিখতে, এই অপারেটর একটি জটিল হয়েছে কাঠামো - হুডের নীচে আমরা এটিকে সহজ অপারেটরে ভেঙে দিই)।

ফেডারেটেড কম্পিউটেশন রচনার ক্ষেত্রেও একই কথা। গণনার get_average_temperature অন্য পাইথন ফাংশন দিয়ে সাজানো একটি শরীরের মধ্যে আহ্বান করা যেতে পারে tff.federated_computation - তাই করছেন, কারণ হবে এটা পিতা বা মাতা লাশ এমবেড করা একই ভাবে tff.federated_mean নিজস্ব শরীর আগের এমবেড করা হয়।

একটি গুরুত্বপূর্ণ সীমাবদ্ধতা হল দিয়ে সাজানো পাইথন ফাংশন লাশ হয় সচেতন হতে হবে tff.federated_computation শুধুমাত্র ফেডারেট অপারেটরদের, অর্থাত্ গঠিত, তারা সরাসরি TensorFlow অপারেশন থাকতে পারে না উচিত নয়। উদাহরণস্বরূপ, যদি আপনি সরাসরি ব্যবহার করতে পারবেন না tf.nest ফেডারেট মান একজোড়া যোগ করার জন্য ইন্টারফেসগুলি। TensorFlow কোড একটি দিয়ে সাজানো কোডের ব্লক সীমাবদ্ধ করা আবশ্যক tff.tf_computation নিম্নলিখিত বিভাগে আলোচনা করেছেন। শুধুমাত্র যখন এই পদ্ধতিতে আবৃত আবৃত TensorFlow কোড একটি দেহের প্রার্থনা করা যেতে পারে tff.federated_computation

এই বিচ্ছিন্নতা কারণ প্রযুক্তিগত হয় (এটা যেমন অপারেটার রত করা কঠিন tf.add স্থাপত্য সেইসাথে অ tensors সঙ্গে কাজ করার)। ফেডারেট কম্পিউটেশন ভাষা (অর্থাত, যুক্তি দিয়ে সজ্জিত পাইথন ফাংশন ধারাবাহিকভাবে মৃতদেহ থেকে নির্মাণ tff.federated_computation ) একটি প্ল্যাটফর্ম-স্বাধীন আঠালো ভাষা হিসেবে সেবা করার জন্য ডিজাইন করা হয়। এই আঠালো ভাষা বর্তমানে TensorFlow কোড (সীমাবদ্ধ এর এমবেডেড বিভাগ থেকে সিস্টেম বিল্ড বিতরণ করতে ব্যবহার করা হয় tff.tf_computation ব্লক)। সময় পূর্ণতা, আমরা এই ধরনের রিলেশনাল ডাটাবেস প্রশ্নের যে ইনপুট পাইপলাইনগুলি উপস্থাপন করা হতে পারে হিসাবে অন্যান্য, অ-TensorFlow যুক্তি এম্বেড বিভাগে, এর প্রয়োজন নেই, সব একসাথে সংযুক্ত একই আঠালো ভাষা (ব্যবহার কহা tff.federated_computation ব্লক)।

টেনসরফ্লো যুক্তি

টেনসরফ্লো গণনা ঘোষণা করা হচ্ছে

TFF TensorFlow এর সাথে ব্যবহারের জন্য ডিজাইন করা হয়েছে। যেমন, TFF-এ আপনি যে কোডটি লিখবেন তার বেশিরভাগই সাধারণ (যেমন, স্থানীয়ভাবে কার্যকর) টেনসরফ্লো কোড হতে পারে। অর্ডার TFF দিয়ে এত কোড ব্যবহার করার জন্য, যেমন উপরে উল্লিখিত, এটা ঠিক দিয়ে সাজানো হবে tff.tf_computation

উদাহরণস্বরূপ, এখানে কিভাবে আমরা একটি ফাংশন যা একটি সংখ্যা নেয় এবং যোগ বাস্তবায়ন পারে 0.5 এটি।

@tff.tf_computation(tf.float32)
def add_half(x):
  return tf.add(x, 0.5)

আবার, এই সময়ে খুঁজছি, আপনি হতাশ হতে পারে কেন আমরা অন্য প্রসাধক সংজ্ঞায়িত করা উচিত tff.tf_computation কেবল যেমন একটি বিদ্যমান প্রক্রিয়া ব্যবহার পরিবর্তে tf.function । পূর্ববর্তী বিভাগে ভিন্ন, এখানে আমরা TensorFlow কোডের একটি সাধারণ ব্লক নিয়ে কাজ করছি।

এর জন্য কয়েকটি কারণ রয়েছে, যার সম্পূর্ণ চিকিত্সা এই টিউটোরিয়ালের সুযোগের বাইরে চলে যায়, তবে এটি মূলটির নামকরণ করা মূল্যবান:

  • ফেডারেটেড কম্পিউটেশনের বডিতে টেনসরফ্লো কোড ব্যবহার করে বাস্তবায়িত পুনঃব্যবহারযোগ্য বিল্ডিং ব্লকগুলিকে এম্বেড করার জন্য, তাদের নির্দিষ্ট বৈশিষ্ট্যগুলি পূরণ করতে হবে - যেমন সংজ্ঞার সময়ে ট্রেস করা এবং সিরিয়ালাইজ করা, টাইপ স্বাক্ষর থাকা ইত্যাদি। এর জন্য সাধারণত কিছু ধরণের ডেকোরেটরের প্রয়োজন হয়।

সাধারণভাবে, আমরা যেমন রচনা জন্য TensorFlow এর নেটিভ মেকানিজম ব্যবহার করার প্রস্তাব tf.function , যেখানে সম্ভব, যেমন সঠিক পদ্ধতিতে আগ্রহী ফাংশন সঙ্গে TFF এর প্রসাধক মিথস্ক্রিয়া আশা করা যেতে পারে অভিব্যক্ত।

এখন, উদাহরণ কোড আসছে ফিরে উপরে snippet, কম্পিউটেশন add_half আমরা শুধু সংজ্ঞায়িত শুধু অন্য কোন TFF গণনার মত TFF দ্বারা সারিয়ে তোলা যায়। বিশেষ করে, এটিতে একটি TFF টাইপ স্বাক্ষর রয়েছে।

str(add_half.type_signature)
'(float32 -> float32)'

মনে রাখবেন এই ধরনের স্বাক্ষরে বসানো নেই। TensorFlow গণনাগুলি ফেডারেটেড প্রকারগুলিকে গ্রাস করতে বা ফেরত দিতে পারে না।

এছাড়াও আপনি এখান থেকে ব্যবহার করতে পারেন add_half অন্যান্য কম্পিউটেশন একটি বিল্ডিং ব্লক হিসেবে। উদাহরণ হিসেবে বলা যায়, এখানে কিভাবে আপনি ব্যবহার করতে পারেন tff.federated_map আবেদন করতে অপারেটর add_half ক্লায়েন্ট ডিভাইসসমূহের একটি ফেডারেট ভাসা সব সদস্য সংগঠকদের কাছে pointwise।

@tff.federated_computation(tff.type_at_clients(tf.float32))
def add_half_on_clients(x):
  return tff.federated_map(add_half, x)
str(add_half_on_clients.type_signature)
'({float32}@CLIENTS -> {float32}@CLIENTS)'

TensorFlow গণনা নির্বাহ করা হচ্ছে

সংজ্ঞায়িত কম্পিউটেশন এক্সেকিউশন tff.tf_computation ঐ আমরা জন্য বর্ণনা অনুযায়ী একই নিয়ম অনুসরণ করে tff.federated_computation । সেগুলিকে নিম্নরূপ পাইথনে সাধারণ কলেবল হিসাবে আহ্বান করা যেতে পারে।

add_half_on_clients([1.0, 3.0, 2.0])
[<tf.Tensor: shape=(), dtype=float32, numpy=1.5>,
 <tf.Tensor: shape=(), dtype=float32, numpy=3.5>,
 <tf.Tensor: shape=(), dtype=float32, numpy=2.5>]

আবার, এটা লক্ষণীয় যে, গণনার invoking মূল্য add_half_on_clients এই পদ্ধতিতে একটি বিতরণ প্রক্রিয়া simulates। ক্লায়েন্টদের উপর ডেটা ব্যবহার করা হয় এবং ক্লায়েন্টদের উপর ফেরত দেওয়া হয়। প্রকৃতপক্ষে, এই গণনার প্রতিটি ক্লায়েন্ট একটি স্থানীয় ক্রিয়া সম্পাদন করে। সেখানে নেই tff.SERVER স্পষ্টভাবে এই সিস্টেম এ উল্লিখিত (এমনকি বাস্তবে যদি এমন প্রক্রিয়াকরণ পরিকল্পনার এক জড়িত পারে)। একটি হিসাব করার ধারণার দিক থেকে অনুরূপ যেমন এই ভাবে সংজ্ঞায়িত চিন্তা Map মঞ্চে MapReduce

এছাড়াও, যে কি আমরা সম্পর্কে TFF কম্পিউটেশন সংজ্ঞা সময়ে ধারাবাহিকভাবে পেয়ে পূর্ববর্তী অধ্যায় বলেন জন্য অবশেষ সত্য মনে রাখা tff.tf_computation এর পাইথন শরীর - সেইসাথে কোড add_half_on_clients সংজ্ঞা সময়ে একবার আঁকা হয়। পরবর্তী আহ্বানে, TFF তার ক্রমিক উপস্থাপনা ব্যবহার করে।

পাইথন পদ্ধতি দিয়ে সাজানো মধ্যে একমাত্র পার্থক্য tff.federated_computation এবং দিয়ে সাজানো সেই tff.tf_computation যে আধুনিক TensorFlow গ্রাফ হিসাবে ধারাবাহিকভাবে হয় (যেহেতু সাবেক সরাসরি তাদের এমবেড TensorFlow কোড সম্বলিত অনুমতি দেওয়া হয় না) হয়।

ফণা অধীনে, প্রতিটি পদ্ধতির দিয়ে সাজানো tff.tf_computation সাময়িকভাবে অর্ডার গণনার গঠন বন্দী করার অনুমতি মধ্যে উৎসুক সঞ্চালনের অক্ষম করে। আকাঙ্খিত সম্পাদন স্থানীয়ভাবে অক্ষম থাকাকালীন, আপনি আগ্রহী TensorFlow, AutoGraph, TensorFlow 2.0 কনস্ট্রাক্ট, ইত্যাদি ব্যবহার করতে স্বাগত জানাই, যতক্ষণ না আপনি আপনার গণনার যুক্তি এমনভাবে লিখবেন যাতে এটি সঠিকভাবে সিরিয়াল করা যায়।

উদাহরণস্বরূপ, নিম্নলিখিত কোড ব্যর্থ হবে:

try:

  # Eager mode
  constant_10 = tf.constant(10.)

  @tff.tf_computation(tf.float32)
  def add_ten(x):
    return x + constant_10

except Exception as err:
  print (err)
Attempting to capture an EagerTensor without building a function.

উপরে ব্যর্থ কারণ constant_10 ইতিমধ্যে গ্রাফ বাইরে যে নির্মাণ করা হয়েছে tff.tf_computation দেহের অভ্যন্তরীণভাবে নির্মান add_ten ধারাবাহিকতাতে প্রক্রিয়ার সময়।

অন্যদিকে, পাইথন ফাংশন বর্তমান গ্রাফ যখন একটি ভিতরে নামক সংশোধন যে invoking tff.tf_computation জরিমানা:

def get_constant_10():
  return tf.constant(10.)

@tff.tf_computation(tf.float32)
def add_ten(x):
  return x + get_constant_10()

add_ten(5.0)
15.0

উল্লেখ্য যে TensorFlow-এ সিরিয়ালাইজেশন মেকানিজমগুলি বিকশিত হচ্ছে এবং আমরা আশা করি যে কীভাবে TFF কম্পিউটেশনকে ক্রমিকভাবে বিকশিত করবে তার বিশদ বিবরণ।

নিয়ে কাজ করা tf.data.Dataset গুলি

আগে যেমন উল্লেখ করা, একটি অনন্য বৈশিষ্ট্য tff.tf_computation গুলি যে, তারা এর সাথে কাজ করা আপনি অনুমতি দেয় tf.data.Dataset গুলি আপনার কোড দ্বারা আনুষ্ঠানিক প্যারামিটার হিসেবে abstractly সংজ্ঞায়িত। পরামিতি TensorFlow মধ্যে প্রতিনিধিত্ব করা যেমন ডেটা সেট ব্যবহার ঘোষিত করা প্রয়োজন tff.SequenceType কন্সট্রাকটর।

উদাহরণস্বরূপ, যদি আপনি স্পেসিফিকেশন tff.SequenceType(tf.float32) TFF মধ্যে ভাসা উপাদানের একটি বিমূর্ত ক্রম সংজ্ঞায়িত করে। সিকোয়েন্সে হয় টেনসর বা জটিল নেস্টেড স্ট্রাকচার থাকতে পারে (আমরা সেগুলির উদাহরণ পরে দেখব)। একটি ক্রম সংক্ষিপ্ত উপস্থাপনা T আইটেম -typed হয় T*

float32_sequence = tff.SequenceType(tf.float32)

str(float32_sequence)
'float32*'

Suppose that in our temperature sensor example, each sensor holds not just one temperature reading, but multiple. Here's how you can define a TFF computation in TensorFlow that calculates the average of temperatures in a single local data set using the tf.data.Dataset.reduce operator.

@tff.tf_computation(tff.SequenceType(tf.float32))
def get_local_temperature_average(local_temperatures):
  sum_and_count = (
      local_temperatures.reduce((0.0, 0), lambda x, y: (x[0] + y, x[1] + 1)))
  return sum_and_count[0] / tf.cast(sum_and_count[1], tf.float32)
str(get_local_temperature_average.type_signature)
'(float32* -> float32)'

In the body of a method decorated with tff.tf_computation , formal parameters of a TFF sequence type are represented simply as objects that behave like tf.data.Dataset , ie, support the same properties and methods (they are currently not implemented as subclasses of that type - this may change as the support for data sets in TensorFlow evolves).

You can easily verify this as follows.

@tff.tf_computation(tff.SequenceType(tf.int32))
def foo(x):
  return x.reduce(np.int32(0), lambda x, y: x + y)

foo([1, 2, 3])
6

Keep in mind that unlike ordinary tf.data.Dataset s, these dataset-like objects are placeholders. They don't contain any elements, since they represent abstract sequence-typed parameters, to be bound to concrete data when used in a concrete context. Support for abstractly-defined placeholder data sets is still somewhat limited at this point, and in the early days of TFF, you may encounter certain restrictions, but we won't need to worry about them in this tutorial (please refer to the documentation pages for details).

When locally executing a computation that accepts a sequence in a simulation mode, such as in this tutorial, you can feed the sequence as Python list, as below (as well as in other ways, eg, as a tf.data.Dataset in eager mode, but for now, we'll keep it simple).

get_local_temperature_average([68.5, 70.3, 69.8])
69.53333

Like all other TFF types, sequences like those defined above can use the tff.StructType constructor to define nested structures. For example, here's how one could declare a computation that accepts a sequence of pairs A , B , and returns the sum of their products. We include the tracing statements in the body of the computation so that you can see how the TFF type signature translates into the dataset's output_types and output_shapes .

@tff.tf_computation(tff.SequenceType(collections.OrderedDict([('A', tf.int32), ('B', tf.int32)])))
def foo(ds):
  print('element_structure = {}'.format(ds.element_spec))
  return ds.reduce(np.int32(0), lambda total, x: total + x['A'] * x['B'])
element_structure = OrderedDict([('A', TensorSpec(shape=(), dtype=tf.int32, name=None)), ('B', TensorSpec(shape=(), dtype=tf.int32, name=None))])
str(foo.type_signature)
'(<A=int32,B=int32>* -> int32)'
foo([{'A': 2, 'B': 3}, {'A': 4, 'B': 5}])
26

The support for using tf.data.Datasets as formal parameters is still somewhat limited and evolving, although functional in simple scenarios such as those used in this tutorial.

Putting it all together

Now, let's try again to use our TensorFlow computation in a federated setting. Suppose we have a group of sensors that each have a local sequence of temperature readings. We can compute the global temperature average by averaging the sensors' local averages as follows.

@tff.federated_computation(
    tff.type_at_clients(tff.SequenceType(tf.float32)))
def get_global_temperature_average(sensor_readings):
  return tff.federated_mean(
      tff.federated_map(get_local_temperature_average, sensor_readings))

Note that this isn't a simple average across all local temperature readings from all clients, as that would require weighing contributions from different clients by the number of readings they locally maintain. We leave it as an exercise for the reader to update the above code; the tff.federated_mean operator accepts the weight as an optional second argument (expected to be a federated float).

Also note that the input to get_global_temperature_average now becomes a federated float sequence . Federated sequences is how we will typically represent on-device data in federated learning, with sequence elements typically representing data batches (you will see examples of this shortly).

str(get_global_temperature_average.type_signature)
'({float32*}@CLIENTS -> float32@SERVER)'

Here's how we can locally execute the computation on a sample of data in Python. Notice that the way we supply the input is now as a list of list s. The outer list iterates over the devices in the group represented by tff.CLIENTS , and the inner ones iterate over elements in each device's local sequence.

get_global_temperature_average([[68.0, 70.0], [71.0], [68.0, 72.0, 70.0]])
70.0

This concludes the first part of the tutorial... we encourage you to continue on to the second part .