درس دوم: آشنایی با چارچوب یادگیری عمیق تنسورفلو

مقدمه

TensorFlow یک کتابخانه نرم افزاری منبع باز قدرتمند برای محاسبات عددی است، که به طور خاص برای یادگیری ماشین در مقیاس بزرگ، ارائه و تنظیم شده است. اصل اساسی آن ساده است: شما در ابتدا درپایتون یک نمودار از محاسباتی که باید انجام شود، تعریف می کنید (برای مثال شکل زیر)، و سپس تنسورفلو آن نمودار را می گیرد و آن را با استفاده از کد بهینه سازی شده C++ اجرا می کند. مهمتر از همه این که می توان نمودار را به چند تکه شکست و آنها را به صورت موازی بر روی چند CPU یا GPU  اجرا کرد. تنسورفلو از محاسبات توزیع شده نیز پشتیبانی میکند به طوری که شما می توانید با تقسیم محاسبات در صدها سرور، شبکه های عصبی عظیم را روی مجموعه های آموزش بسیار بزرگ در مدت زمانی معقول آموزش دهید. TensorFlow می تواند یک شبکه با میلیون ها پارامتر را  روی یک مجموعه آموزشی متشکل از میلیاردها نمونه هر یک با میلیونها ویژگی، آموزش دهد. این جای تعجب ندارد، چرا که TensorFlow توسط تیم Google Brain توسعه داده شده و از قدرت بسیاری از سرویسهای بزرگ مقیاس گوگل، مانند Google Cloud Speech ، Google Photos وGoogle Search  بهره می­برد.

هنگامی که TensorFlow در ماه نوامبر سال ۲۰۱۵ منبع باز اعلام شد، تقریبا تعداد قابل توجهی کتابخانه معروف منبع باز برای یادگیری عمیق (شکل بالا) وجود داشت و با نگاهی عادلانه، بسیاری از ویژگی های تنسورفلو پیش از این در یک کتابخانه و یا دیگری وجود داشته است. با این وجود، طراحی تمیز TensorFlow، مقیاس پذیری، انعطاف پذیری و اسناد جامع و کامل آن (بدون در نظر گرفتن نام گوگل) به سرعت آن را به بالای لیست رساند.

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

در اینجا به برخی نکات برجسته تنسورفلو اشاره می­کنیم:

  • این کتابخانه نه تنها روی ویندوز، لینوکس و MacOS اجرا می­شود، بلکه روی دستگاه های تلفن همراه، از جمله iOS و اندروید نیز قابل اجراست.
  • این کتابخانه یک API پایتون بسیار ساده به نام TF.Learn۲ (tensorflow.contrib.learn) ارائه می­دهد که با Scikit-Learn سازگار است.  همانطور که خواهید دید، شما می توانید از آن برای آموزش انواع مختلف شبکه های عصبی فقط در چند خط کد استفاده کنید.
  • اینها قبلا یک پروژه مستقل به نام Scikit Flow (یا skflow) بود. این کتابخانه همچنین یک API ساده دیگر به نام TF-slim (tensorflow.contrib.slim برای ساده سازی build کردن، آموزش و ارزیابی شبکه های عصبی ارائه می دهد.  چند API سطح بالای دیگرر نیز مانند Keras یا Pretty Tensor ، به طور مستقل در ارتباط با تنسورفلو ، ساخته شده است.

اصلی ترین API پایتون  این کتابخانه، انعطاف پذیری بسیار بیشتری (البته با پیچیدگی بیشتر) ارائه می دهد که برای انواع محاسبات، در هر نوعی از  معماری شبکه های عصبی که فکرش را می کنید، مناسب است. این کتابخانه شامل پیاده سازی C++ بسیار کارآمد عملگرهای یادگیری ماشین است که برای ساخت شبکه های عصبی به کار می­روند. همچنین یک C++ API  وجود دارد به خصوص برای کسانی که می خواهند عملیات high-performance  مختص به خودشان را تعریف کنند. این رابط کاربری چندین گره بهینه سازی پیشرفته، برای جستجوی تابع پارامتری ارائه می­دهد. های که به حداقل رساندن یک تابع هزینه. استفاده از این ویژگی بسیار آسان است زیرا تنسورفلو به طور خودکار هزینه مشتق گیری را با توجه به نوع تابع تعریف شده، کاهش می­دهد. این کار افتراق اتوماتیک (یا autodiff) نامیده می شود. این کتابخانه همچنین با یک ابزار تجسم فوق العاده به نام TensorBoard همراه است که اجازه می دهد نمودار  محاسباتی، منحنی های یادگیری و … را مشاهده کنید و به جست و جو در میان آنها بپردازید.

گوگل همچنین یک سرویس ابری برای اجرای نمودارهای TensorFlow راه اندازی کرده است. در آخر باید گفت، این کتابخانه یک تیم اختصاصی از توسعه دهندگان پرشور و حرفه ای  و یک جامعه رو به رشد دارد که به بهبود آن کمک می­کنند و یکی از محبوب ترین پروژه های منبع باز درر GitHub است و هر روز پروژه های بزرگ بیشتر و بیشتری بر مبنای آن ساخته می­شود

واحد پردازش تانسور (TPU)

در می ۲۰۱۶، گوگل از «واحد پردازش تانسور» (Tensor Processing Unit | TPU) خود پرده‌برداری کرد که یک «مدار مجتمع با کاربرد خاص» (Application-Specific Integrated Circuit) (یک تراشه کامپیوتری) است. این تراشه، برای کاربردهای یادگیری ماشین و تنسورفلو طراحی شده بود. TPU یک «شتاب‌دهنده هوش مصنوعی» (AI accelerator) قابل برنامه‌ریزی است که برای فراهم کردن «توان عملیاتی» (Throughput) بالا برای «محاسبات دقت پایین» (Low-Precision Arithmetic) (برای مثال ۸ بیتی) طراحی شده است؛ این شتاب‌دهنده، امکان ارائه مرتبه بزرگی بهتر بهینه شده «توان به ازای وات» (Performance Per Watt) را برای یادگیری ماشین می‌دهد.

در می ۲۰۱۷، گوگل انتشار نسل دوم  TPU‌ها را اعلام کرد که برای «موتور محاسبه گوگل» (Google Compute Engine) ارائه شده بودند. TPU‌های نسل دوم، کارایی تا ۱۸۰ «ترافلاپس» (Teraflops) را فراهم می‌کردند و هنگامی که در خوشه‌های ۶۴ TPU‌یی قرار می‌گرفتند، تا ۱۱.۵ «پتافلاپس» (petaflops) کارایی را رقم می‌زدند. در فوریه ۲۰۱۸، گوگل اعلام کرد که در حال ساخت نسخه TPU برای «پلتفرم گوگل کلود» (Google Cloud Platform) هستند. در جولای ۲۰۱۸، Edge TPU منتشر شد. Edge TPU، یک تراشه «ایسیک» (ASIC) ساخته شده برای هدف خاص است که برای اجرا روی مدل‌های یادگیری ماشین TensorFlow Lite در دستگاه‌های محاسباتی کوچک مانند گوشی‌های هوشمند کوچک طراحی شده است؛ این موضوع با عنوان «رایانش لبه‌ای» (Edge Computing) شناخته شده است.

تنسورفلو لایت

در می ۲۰۱۷، گوگل یک «پشته نرم‌افزاری» (Software Stack) با عنوان «تنسورفلو لایت» (TensorFlow Lite) را به طور ویژه برای توسعه موبایل معرفی کرد. در ژوئن ۲۰۱۹، تیم تنسورفلو یک نسخه ویژه توسعه‌دهندگان از موتور استنتاج GPU موبایل OpenGL ES 3.1 Compute Shaders را روی دستگاه‌های اندرویدی و Metal Compute Shaders را روی دستگاه‌های iOS منتشر کرد.

«پیکسل ویژوال کور» (PVC)

در اکتبر ۲۰۱۷، «گوگل پیکسل ۲» (Google Pixel 2) منتشر شد که دارای ویژگی «پیکسل ویژوال کور» (Pixel Visual Core | PVC) است که یک «واحد پردازش تصویر» (Image Processing Unit | IPU)، «واحد پردازش بینایی» (Vision Processing Unit | VPU) و «پردازنده هوش مصنوعی» (AI Processor) برای دستگاه‌های موبایل به شمار می‌آید. PVC از تنسورفلو برای یادگیری ماشین (و «زبان برنامه‌نویسی» (Halide ) برای پردازش تصویر) پشتیبانی می‌کند.

تنسورفلو ۲.۰

«تنسورفلو دِو سامیت» (TensorFlow Dev Summit) گردهمایی است که هر سال فعالان حوزه یادگیری ماشین را از سراسر جهان به مدت دو روز گردهم می‌آورد. در این رویداد، شرکت‌کنندگان به گفتگوهای فنی سطح بالا، ارائه دموها و گفتگو با تیم و جامعه تنسورفلو می‌پردازند. در رویداد سال ۲۰۱۹، گوگل نسخه آلفا از تنسورفلو ۲.۰ را معرفی کرد. نسخه جدید با تمرکز بر افزایش بهره‌وری توسعه‌دهندگان، سادگی و سهولت استفاده طراحی شده است. تغییراتی در تنسورفلو ۲.۰ به وقوع پیوسته که موجب افزایش بهره‌وری کاربران آن می‌شود. همچنین، تغییرات متعددی در API آن انجام شده که از آن جمله می‌توان به مرتب‌سازی مجدد آرگومان‌ها، حذف API‌های زائد، تغییر نام سمبل‌ها و تغییر مقادیر پیش‌فرض برای پارامترها اشاره کرد. در ادامه برخی از مهم‌ترین تغییرات به وقوع پیوسته در تنسورفلو ۲.۰ بیان می‌شوند.

نصب تنسورفلو ۲.۰ آلفا

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

# CPU version
pip install tensorflow==2.0.0-alpha0
# GPU version
pip install tensorflow-gpu==2.0.0-alpha0

برای اطمینان حاصل کردن از اینکه تنسورفلو ۲.۰ با استفاده از دستورات بالا به درستی نصب شده است، دستور زیر را می‌توان در ترمینال اجرا کرد.

import tensorflow as tf
print(tf.__version__)

همچنین، می‌توان از Google Colaboratory [+] استفاده کرد که امکان راه‌اندازی نوت‌بوک‌های پایتون را در محیط ابری به راحتی فراهم می‌کند. همچنین، دسترسی رایگان به GPU را به مدت ۱۲ ساعت برای یک بار ارائه می‌دهد. Colab به سرعت توانسته جایگاه خوبی را در میان کارشناسان یادگیری ماشین به عنوان یک پلتفرم ابری یادگیری ماشین کسب کند. در صورتی که کاربر تنسورفلو ۲.۰ نسخه GPU را روی Colab نصب کرده، مجددا باید بررسی کند که زمان اجرا «GPU» را به عنوان شتاب‌دهنده زمان اجرا دارد. این کار با رفتن به مسیر Edit>Notebook settings امکان‌پذیر است.

هنگام نصب TF 2.0 روی Colab، این امکان وجود دارد که از کاربر خواسته شود زمان اجرا (runtime) را بازنشانی کند. بنابراین، باید مراحل را ادامه و بازنشانی را حتما انجام دهد.

اسکرول به بالا