تاریخ را ذخیره کنید! Google I / O 18-20 مه بازمی گردد اکنون ثبت نام کنید
این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

هسته فدراسیون

این سند لایه هسته TFF که به عنوان یک پایه و اساس برای خدمت معرفی فدرال آموزش ، و آینده غیر الگوریتم های یادگیری فدرال امکان پذیر است.

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

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

بررسی اجمالی

اهداف ، موارد استفاده شده و دامنه

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

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

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

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

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

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

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

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

زبان

رابط پایتون

TFF از یک زبان داخلی برای نمایش محاسبات فدرال استفاده می کند ، نحو آن با نمایشگر قابل تنظیم در محاسبه تعریف می شود . کاربران FC API معمولاً نیازی به تعامل مستقیم با این زبان ندارند. در عوض ، ما یک Python 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.add یا tf.reduce_sum در بخشی از کد پایتون که نمودار tf.reduce_sum را تعریف می کند ، استفاده می کند. گرچه این کد از نظر فنی در پایتون بیان شده است ، اما هدف آن ساخت نمایشی قابل سریال سازی از یک tf.Graph است. نمودار در زیر آن ، و نمودار است ، نه کد پایتون که به طور داخلی توسط زمان اجرا TensorFlow اجرا می شود. به همین ترتیب ، می توان فکر کرد tff.federated_mean به عنوان درج یک عمل فدرال در یک محاسبه فدراسیون است که توسط get_average_temperature نشان داده شده است.

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

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

نوع سیستم

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

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

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

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

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

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

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

    علامت جمع و جور برای tuples های نامگذاری شده <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 است ، ما شما را تشویق می کنیم که برای تفسیر و مثالهای بیشتر به آموزش الگوریتم های سفارشی مراجعه کنید.

  • نوع قرارگیری این نوع جز در قالب 2 tff.SERVER و tff.CLIENTS هنوز در API عمومی در معرض دید قرار 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 نمایانگر <weights=float32[10,5],bias=float32[5]>@SERVER وزن و بایاس متناوب در سرور است. از آنجا که ما all_equal مجعد را رها کرده ایم ، این نشان می دهد که بیت all_equal تنظیم شده است ، یعنی فقط یک tuple وجود دارد (صرف نظر از اینکه تعداد کپی های سرور در یک خوشه میزبان این مقدار باشد).

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

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

این موارد انتزاعات برنامه نویسی زیر را که در حال حاضر در 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 ). بیان لامبدا در 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__ ). با استفاده از نحو استاندارد Python __call__ هرچیزی که نوع عملکردی داشته باشد فراخوانی می شود. فراخوانی عبارتی است که نوع آن همان نوع نتیجه عملکردی است که فراخوانی می شود.

    مثلا:

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

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

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