هسته فدرال

این سند لایه اصلی TFF را معرفی می کند که به عنوان پایه ای برای یادگیری فدرال عمل می کند و الگوریتم های فدرال غیر یادگیری احتمالی آینده را معرفی می کند.

برای آشنایی ملایم با هسته مرکزی، لطفاً آموزش‌های زیر را بخوانید، زیرا برخی از مفاهیم اساسی را با مثال معرفی می‌کنند و گام به گام ساخت یک الگوریتم میانگین‌گیری فدرال ساده را نشان می‌دهند.

همچنین شما را تشویق می‌کنیم که با یادگیری فدرال و آموزش‌های مرتبط در طبقه‌بندی تصاویر و تولید متن آشنا شوید، زیرا استفاده از API هسته مرکزی (FC API) برای یادگیری فدرال زمینه مهمی را برای برخی از انتخاب‌هایی که ما انجام داده‌ایم فراهم می‌کند. طراحی این لایه

بررسی اجمالی

اهداف، کاربردهای مورد نظر و دامنه

هسته فدرال (FC) به عنوان یک محیط برنامه نویسی برای اجرای محاسبات توزیع شده، به عنوان مثال، محاسباتی که شامل چندین رایانه (تلفن های همراه، تبلت ها، دستگاه های تعبیه شده، رایانه های رومیزی، حسگرها، سرورهای پایگاه داده، و غیره) است که ممکن است هر کدام غیر از آنها را انجام دهند، شناخته می شود. پردازش بی اهمیت به صورت محلی، و ارتباط در سراسر شبکه برای هماهنگ کردن کار خود.

اصطلاح توزیع شده بسیار عمومی است و TFF همه انواع الگوریتم های توزیع شده ممکن را هدف قرار نمی دهد، بنابراین ما ترجیح می دهیم از عبارت کمتر عمومی محاسبات فدرال برای توصیف انواع الگوریتم هایی که می توانند در این چارچوب بیان شوند استفاده کنیم.

در حالی که تعریف اصطلاح محاسبات فدرال به شیوه ای کاملاً رسمی خارج از محدوده این سند است، به انواع الگوریتم هایی فکر کنید که ممکن است در یک نشریه تحقیقاتی که یک الگوریتم یادگیری توزیع شده جدید را توصیف می کند در شبه کد بیان شده است.

هدف FC، به طور خلاصه، فعال کردن نمایش فشرده مشابه، در سطح انتزاع شبه کد مانند، از منطق برنامه است که شبه کد نیست ، بلکه در محیط های مختلف هدف قابل اجرا است.

مشخصه کلیدی تعریف انواع الگوریتم هایی که FC برای بیان آنها طراحی شده است این است که اقدامات شرکت کنندگان سیستم به صورت جمعی توصیف می شود. بنابراین، ما تمایل داریم در مورد هر دستگاهی صحبت کنیم که داده‌ها را به صورت محلی تغییر می‌دهد، و دستگاه‌هایی که کار را توسط یک هماهنگ‌کننده متمرکز پخش ، جمع‌آوری یا جمع‌آوری نتایج خود را هماهنگ می‌کنند.

در حالی که TFF به گونه ای طراحی شده است که بتواند از معماری های ساده کلاینت-سرور فراتر رود، مفهوم پردازش جمعی اساسی است. این به دلیل خاستگاه TFF در یادگیری فدرال است، فناوری که در اصل برای پشتیبانی از محاسبات روی داده‌های بالقوه حساس طراحی شده بود که تحت کنترل دستگاه‌های مشتری باقی می‌ماند و ممکن است به دلایل حفظ حریم خصوصی به سادگی در یک مکان متمرکز دانلود نشود. در حالی که هر مشتری در چنین سیستم‌هایی به داده‌ها و قدرت پردازشی برای محاسبه نتیجه توسط سیستم کمک می‌کند (نتیجه‌ای که معمولاً انتظار داریم برای همه شرکت‌کنندگان ارزشمند باشد)، ما همچنین در حفظ حریم خصوصی و ناشناس بودن هر مشتری تلاش می‌کنیم.

بنابراین، در حالی که اکثر چارچوب‌ها برای محاسبات توزیع‌شده برای بیان پردازش از دیدگاه تک تک شرکت‌کنندگان طراحی شده‌اند - یعنی در سطح مبادلات پیام نقطه‌به‌نقطه فردی، و وابستگی متقابل انتقال وضعیت محلی شرکت‌کننده با پیام‌های ورودی و خروجی. هسته فدرال TFF برای تشریح رفتار سیستم از منظر سراسری سیستم طراحی شده است (مثلاً به عنوان مثال MapReduce ).

در نتیجه، در حالی که چارچوب های توزیع شده برای اهداف عمومی ممکن است عملیات هایی مانند ارسال و دریافت را به عنوان بلوک های سازنده ارائه دهند، FC بلوک های ساختمانی مانند tff.federated_sum ، tff.federated_reduce ، یا tff.federated_broadcast را ارائه می دهد که پروتکل های توزیع شده ساده را در بر می گیرند.

زبان

رابط پایتون

TFF از یک زبان داخلی برای نشان دادن محاسبات فدرال استفاده می کند که نحو آن با نمایش قابل سریال در computation.proto تعریف می شود. با این حال، کاربران FC API معمولاً نیازی به تعامل مستقیم با این زبان ندارند. در عوض، ما یک API Python ( فضای نام tff ) ارائه می کنیم که به عنوان راهی برای تعریف محاسبات اطراف آن را می پوشاند.

به طور خاص، TFF تزیین‌کننده‌های تابع پایتون مانند tff.federated_computation را فراهم می‌کند که بدنه‌های توابع تزئین‌شده را ردیابی می‌کند و نمایش‌های سریالی منطق محاسباتی فدرال را در زبان TFF تولید می‌کند. تابعی که با tff.federated_computation تزئین شده است به عنوان حامل چنین نمایش سریالی عمل می کند و می تواند آن را به عنوان یک بلوک ساختمانی در بدنه محاسبات دیگری جاسازی کند یا در صورت فراخوانی آن را در صورت درخواست اجرا کند.

در اینجا فقط یک مثال وجود دارد. نمونه های بیشتری را می توان در آموزش های الگوریتم های سفارشی یافت.

@tff.federated_computation(tff.FederatedType(np.float32, tff.CLIENTS))
def get_average_temperature(sensor_readings):
  return tff.federated_mean(sensor_readings)

خوانندگانی که با TensorFlow غیر مشتاق آشنا هستند، این رویکرد را مشابه نوشتن کد پایتون می یابند که از توابعی مانند tf.add یا tf.reduce_sum در بخشی از کد پایتون استفاده می کند که یک گراف TensorFlow را تعریف می کند. اگرچه کد از نظر فنی در پایتون بیان شده است، اما هدف آن ساخت یک نمایش سریال‌سازی از یک tf.Graph در زیر آن است، و این گراف است، نه کد پایتون، که به صورت داخلی توسط زمان اجرا TensorFlow اجرا می‌شود. به همین ترتیب، می‌توان tff.federated_mean را به‌عنوان درج یک عملیات فدرال در یک محاسبات فدرال که با get_average_temperature نمایش داده می‌شود، در نظر گرفت.

بخشی از دلیل FC برای تعریف یک زبان به این واقعیت مربوط می شود که همانطور که در بالا ذکر شد، محاسبات فدرال رفتارهای جمعی توزیع شده را مشخص می کنند و به این ترتیب، منطق آنها غیر محلی است. به عنوان مثال، TFF اپراتورهایی را ارائه می دهد که ورودی و خروجی آنها ممکن است در مکان های مختلف شبکه وجود داشته باشد.

این نیاز به یک زبان و یک سیستم نوع دارد که مفهوم توزیع را در بر بگیرد.

سیستم را تایپ کنید

هسته فدرال دسته بندی های زیر را ارائه می دهد. در توصیف این انواع، ما به سازنده‌های نوع اشاره می‌کنیم و همچنین یک نماد فشرده را معرفی می‌کنیم، زیرا روشی مفید یا توصیف انواع محاسبات و عملگرها است.

اول، در اینجا دسته بندی هایی از انواعی که از نظر مفهومی مشابه آنهایی هستند که در زبان های رایج موجود وجود دارد، آمده است:

  • انواع تانسور ( tff.TensorType ). درست مانند TensorFlow، اینها دارای dtype و shape هستند. تنها تفاوت این است که اشیاء از این نوع محدود به نمونه‌های tf.Tensor در پایتون نیستند که خروجی‌های عملیات TensorFlow را در یک گراف TensorFlow نشان می‌دهند، بلکه ممکن است شامل واحدهایی از داده‌هایی باشند که می‌توانند تولید شوند، به عنوان مثال، به عنوان خروجی یک توزیع توزیع شده. پروتکل تجمع بنابراین، نوع تانسور TFF به سادگی یک نسخه انتزاعی از یک نمایش فیزیکی عینی از این نوع در پایتون یا تنسورفلو است.

    TensorTypes TFF می توانند در برخورد (ایستا) با اشکال سخت تر از TensorFlow باشند. به عنوان مثال، سیستم نوع TFF یک تانسور با رتبه ناشناخته را به عنوان قابل انتساب از هر تانسور دیگری با همان dtype تلقی می کند، اما قابل انتساب به هیچ تانسوری با رتبه ثابت نیست. این درمان از خرابی‌های زمان اجرا خاصی جلوگیری می‌کند (مثلا تلاش برای تغییر شکل یک تانسور با رتبه ناشناخته به شکلی با تعداد عناصر نادرست)، به قیمت سخت‌گیری بیشتر در محاسباتی که TFF آن را معتبر می‌پذیرد.

    نماد فشرده برای انواع تانسور dtype یا dtype[shape] است. برای مثال int32 و int32[10] به ترتیب انواع اعداد صحیح و int بردار هستند.

  • انواع توالی ( tff.SequenceType ). اینها معادل انتزاعی TFF از مفهوم عینی TensorFlow از tf.data.Dataset s هستند. عناصر دنباله ها را می توان به صورت متوالی مصرف کرد و می تواند شامل انواع پیچیده باشد.

    نمایش فشرده انواع توالی T* است که T نوع عناصر است. به عنوان مثال int32* یک دنباله عدد صحیح را نشان می دهد.

  • انواع تاپل نامگذاری شده ( tff.StructType ). اینها روش TFF برای ساختن تاپل ها و ساختارهای دیکشنری مانند هستند که دارای تعداد از پیش تعریف شده عناصر با انواع خاص، با نام یا بی نام هستند. نکته مهم این است که مفهوم تاپل نام‌گذاری شده TFF معادل انتزاعی تاپل‌های استدلال پایتون را در بر می‌گیرد، یعنی مجموعه‌ای از عناصر که برخی از آنها نامگذاری شده‌اند، اما نه همه، و برخی موقعیتی هستند.

    نماد فشرده برای تاپل های نامگذاری شده <n_1=T_1, ..., n_k=T_k> است، که در آن n_k نام های اختیاری عناصر و T_k انواع عناصر هستند. به عنوان مثال، <int32,int32> یک نماد فشرده برای یک جفت اعداد صحیح بدون نام است، و <X=float32,Y=float32> یک نماد فشرده برای یک جفت شناور به نام X و Y است که ممکن است یک نقطه در یک صفحه را نشان دهد. . تاپل ها را می توان تو در تو و همچنین با انواع دیگر مخلوط کرد، به عنوان مثال، <X=float32,Y=float32>* یک نماد فشرده برای دنباله ای از نقاط خواهد بود.

  • انواع توابع ( tff.FunctionType ). TFF یک چارچوب برنامه نویسی تابعی است که با توابع به عنوان مقادیر درجه یک رفتار می شود. توابع حداکثر یک آرگومان و دقیقاً یک نتیجه دارند.

    نماد فشرده برای توابع (T -> U) است، که در آن T نوع آرگومان است، و U نوع نتیجه است، یا ( -> U) اگر آرگومان وجود نداشته باشد (اگرچه توابع بدون آرگومان منحط هستند. مفهومی که بیشتر فقط در سطح پایتون وجود دارد). به عنوان مثال (int32* -> int32) نمادی برای یک نوع توابع است که یک دنباله عدد صحیح را به یک مقدار صحیح کاهش می دهد.

انواع زیر به جنبه سیستم های توزیع شده محاسبات TFF می پردازند. از آنجایی که این مفاهیم تا حدودی منحصر به TFF هستند، ما شما را تشویق می کنیم که برای توضیحات و مثال های اضافی به آموزش الگوریتم های سفارشی مراجعه کنید.

  • نوع قرارگیری . این نوع هنوز در API عمومی نمایش داده نشده است به جز به صورت 2 literal tff.SERVER و tff.CLIENTS که می توانید به عنوان ثابت هایی از این نوع در نظر بگیرید. با این حال، به صورت داخلی استفاده می شود و در نسخه های بعدی در API عمومی معرفی خواهد شد. نمایش فشرده این نوع placement است.

    یک مکان نشان دهنده مجموعه ای از شرکت کنندگان سیستم است که نقش خاصی را ایفا می کنند. نسخه اولیه محاسبات مشتری-سرور را هدف قرار می دهد، که در آن 2 گروه از شرکت کنندگان وجود دارد: مشتریان و یک سرور (شما می توانید دومی را به عنوان یک گروه تک نفره در نظر بگیرید). با این حال، در معماری‌های پیچیده‌تر، نقش‌های دیگری مانند تجمیع‌کننده‌های میانی در یک سیستم چند لایه وجود دارد که ممکن است انواع مختلفی از تجمیع را انجام دهند، یا از انواع مختلفی از فشرده‌سازی/فشرده‌سازی داده‌ها نسبت به موارد استفاده شده توسط سرور یا استفاده کنند. مشتریان

    هدف اصلی از تعریف مفهوم مکان‌یابی، مبنایی برای تعریف انواع فدرال است.

  • انواع فدرال ( tff.FederatedType ). یک مقدار از نوع فدرال، مقداری است که توسط گروهی از شرکت‌کنندگان سیستم که توسط یک مکان خاص (مانند tff.SERVER یا tff.CLIENTS ) تعریف شده‌اند میزبانی می‌شود. یک نوع فدرال با مقدار مکان (بنابراین، یک نوع وابسته است)، نوع اجزای عضو (هر یک از شرکت‌کنندگان به صورت محلی میزبان چه نوع محتوایی هستند) و بیت اضافی all_equal که مشخص می‌کند آیا همه شرکت‌کنندگان به صورت محلی هستند تعریف می‌شود. میزبانی همان مورد

    نماد فشرده برای نوع فدرال مقادیر که شامل موارد (مواد تشکیل دهنده اعضا) از نوع T است که هر کدام توسط گروه (محل قرارگیری) G میزبانی می شوند، به ترتیب T@G یا {T}@G با بیت all_equal مجموعه یا تنظیم نشده است.

    مثلا:

    • {int32}@CLIENTS یک مقدار فدرال را نشان می‌دهد که از مجموعه‌ای از اعداد صحیح بالقوه متمایز تشکیل شده است، یک عدد در هر دستگاه مشتری. توجه داشته باشید که ما در مورد یک مقدار یکپارچه صحبت می کنیم که شامل چندین آیتم داده است که در چندین مکان در سراسر شبکه ظاهر می شوند. یکی از راه‌هایی که می‌توان در مورد آن فکر کرد، نوعی تانسور با بعد «شبکه» است، اگرچه این قیاس کامل نیست زیرا TFF اجازه دسترسی تصادفی به اجزای عضو با یک مقدار فدرال را نمی‌دهد.

    • {<X=float32,Y=float32>*}@CLIENTS یک مجموعه داده فدرال را نشان می‌دهد، مقداری که از چندین توالی مختصات XY ، یک دنباله در هر دستگاه مشتری تشکیل شده است.

    • <weights=float32[10,5],bias=float32[5]>@SERVER یک مجموعه نام‌گذاری شده از تانسورهای وزن و بایاس را در سرور نشان می‌دهد. از آنجایی که پرانتزهای فرفری را رها کرده‌ایم، این نشان می‌دهد که بیت all_equal تنظیم شده است، یعنی فقط یک تاپل وجود دارد (صرف نظر از اینکه چه تعداد کپی سرور ممکن است در خوشه‌ای که این مقدار را میزبانی می‌کند وجود داشته باشد).

بلوک های ساختمان

زبان هسته مرکزی شکلی از حساب لامبدا است که دارای چند عنصر اضافی است.

این انتزاعات برنامه نویسی زیر را ارائه می دهد که در حال حاضر در API عمومی در معرض دید قرار گرفته اند:

  • محاسبات TensorFlow ( tff.tensorflow.computation ). اینها بخش هایی از کد TensorFlow هستند که به عنوان اجزای قابل استفاده مجدد در TFF با استفاده از تزئین کننده tff.tensorflow.computation پیچیده شده اند. آنها همیشه دارای انواع تابعی هستند و بر خلاف توابع در TensorFlow، می توانند پارامترهای ساختاریافته را بگیرند یا نتایج ساختاریافته یک نوع دنباله را برگردانند.

    در اینجا یک مثال، یک محاسبه TF از نوع (int32* -> int) است که از عملگر tf.data.Dataset.reduce برای محاسبه مجموع اعداد صحیح استفاده می کند:

    @tff.tensorflow.computation(tff.SequenceType(np.int32))
    def add_up_integers(x):
      return x.reduce(np.int32(0), lambda x, y: x + y)
    
  • عملگرهای ذاتی یا فدرال ( tff.federated_... ). این کتابخانه ای از توابع مانند tff.federated_sum یا tff.federated_broadcast است که بخش عمده ای از FC API را تشکیل می دهد، که اکثر آنها اپراتورهای ارتباطی توزیع شده را برای استفاده با TFF نشان می دهند.

    ما به اینها به عنوان ذاتی اشاره می کنیم زیرا، تا حدودی مانند توابع ذاتی ، مجموعه ای باز و توسعه پذیر از عملگرها هستند که توسط TFF درک می شوند و در کدهای سطح پایین کامپایل می شوند.

    اکثر این عملگرها دارای پارامترها و نتایج انواع فدرال هستند و اکثر آنها الگوهایی هستند که می توانند برای انواع مختلف داده اعمال شوند.

    به عنوان مثال، tff.federated_broadcast را می توان به عنوان یک اپراتور الگو از نوع عملکردی T@SERVER -> T@CLIENTS در نظر گرفت.

  • عبارات لامبدا ( tff.federated_computation ). عبارت lambda در TFF معادل lambda یا def در پایتون است. این شامل نام پارامتر و بدنه ای (عبارت) است که حاوی ارجاعاتی به این پارامتر است.

    در کد پایتون، اینها را می توان با تزئین توابع پایتون با tff.federated_computation و تعریف یک آرگومان ایجاد کرد.

    در اینجا نمونه ای از عبارت لامبدا است که قبلاً ذکر کردیم:

    @tff.federated_computation(tff.FederatedType(np.float32, tff.CLIENTS))
    def get_average_temperature(sensor_readings):
      return tff.federated_mean(sensor_readings)
    
  • حروف قرار دادن . در حال حاضر، فقط tff.SERVER و tff.CLIENTS امکان تعریف محاسبات ساده کلاینت-سرور را فراهم می کنند.

  • فراخوانی تابع ( __call__ ). هر چیزی که دارای یک نوع تابعی باشد را می توان با استفاده از نحو استاندارد پایتون __call__ فراخوانی کرد. Invocation عبارتی است که نوع آن با نوع نتیجه تابع فراخوانی شده یکسان است.

    مثلا:

    • add_up_integers(x) یک فراخوانی از محاسبات TensorFlow را نشان می دهد که قبلاً روی آرگومان x تعریف شده بود. نوع این عبارت int32 است.

    • tff.federated_mean(sensor_readings) فراخوانی عملگر میانگین‌گیری فدرال روی sensor_readings را نشان می‌دهد. نوع این عبارت float32@SERVER (با فرض زمینه از مثال بالا) است.

  • تشکیل تاپل ها و انتخاب عناصر آنها. عبارات پایتون به شکل [x, y] ، x[y] یا xy که در بدنه توابع تزئین شده با tff.federated_computation ظاهر می شوند.