هسته فدرال

با مجموعه‌ها، منظم بمانید ذخیره و دسته‌بندی محتوا براساس اولویت‌های شما.

این سند لایه اصلی 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 پایتون (فضای نام tff ) ارائه می‌کنیم که به عنوان راهی برای تعریف محاسبات اطراف آن را می‌پیچد.

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

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

@tff.federated_computation(tff.type_at_clients(tf.float32))
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.tf_computation ). اینها بخش هایی از کد TensorFlow هستند که به عنوان اجزای قابل استفاده مجدد در TFF با استفاده از دکوراتور tff.tf_computation شده اند. آنها همیشه دارای انواع تابعی هستند و برخلاف توابع در TensorFlow، می توانند پارامترهای ساختاریافته را بگیرند یا نتایج ساختاریافته یک نوع دنباله را برگردانند.

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

    @tff.tf_computation(tff.SequenceType(tf.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.type_at_clients(tf.float32))
    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 می شوند.