بستر و محیط

TensorFlow.js در مرورگر و Node.js کار می‌کند، و در هر دو پلتفرم پیکربندی‌های مختلف زیادی وجود دارد. هر پلتفرم دارای مجموعه ای منحصر به فرد از ملاحظات است که بر نحوه توسعه برنامه ها تأثیر می گذارد.

در مرورگر، TensorFlow.js از دستگاه های تلفن همراه و همچنین دستگاه های دسکتاپ پشتیبانی می کند. هر دستگاه دارای مجموعه خاصی از محدودیت ها است، مانند WebGL API های موجود، که به طور خودکار برای شما تعیین و پیکربندی می شوند.

در Node.js، TensorFlow.js از اتصال مستقیم به TensorFlow API یا اجرای با اجرای کندتر CPU vanilla پشتیبانی می کند.

محیط ها

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

Backends

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

برای پیدا کردن اینکه از کدام backend استفاده می کنید:

console.log(tf.getBackend());

اگر می خواهید به صورت دستی backend را تغییر دهید:

tf.setBackend('cpu');
console.log(tf.getBackend());

باطن WebGL

Backend WebGL، 'webgl'، در حال حاضر قدرتمندترین باطن برای مرورگر است. این باطن تا 100 برابر سریعتر از باطن CPU وانیلی است. تانسورها به عنوان بافت های WebGL ذخیره می شوند و عملیات ریاضی در سایه زن های WebGL پیاده سازی می شوند. در اینجا چند نکته مفید وجود دارد که هنگام استفاده از این باطن باید بدانید: \

از مسدود کردن رشته رابط کاربری خودداری کنید

هنگامی که یک عملیات فراخوانی می شود، مانند tf.matMul(a, b)، tf.Tensor حاصل به طور همزمان برگردانده می شود، اما محاسبه ضرب ماتریس ممکن است هنوز آماده نباشد. این بدان معنی است که tf.Tensor بازگشتی فقط یک دسته برای محاسبه است. هنگامی که شما پاسخ x.data() و یا x.array() ، ارزش حل و فصل خواهد شد زمانی که محاسبات در واقع تکمیل شده است. این امر مهم به استفاده از موتورهای آسنکرون x.data() و x.array() روش بیش از همتایان همزمان خود x.dataSync() و x.arraySync() برای جلوگیری از مسدود کردن موضوع UI در حالی که کامل محاسبات.

مدیریت حافظه

یکی از اخطارها هنگام استفاده از Backend WebGL نیاز به مدیریت صریح حافظه است. WebGLTextures، جایی که داده‌های Tensor در نهایت ذخیره می‌شوند، به‌طور خودکار زباله‌ای توسط مرورگر جمع‌آوری نمی‌شوند.

برای از بین بردن حافظه از یک tf.Tensor ، شما می توانید با استفاده از dispose() روش:

const a = tf.tensor([[1, 2], [3, 4]]);
a.dispose();

زنجیر کردن چندین عملیات با هم در یک برنامه بسیار رایج است. نگه داشتن ارجاع به همه متغیرهای میانی برای دفع آنها می تواند خوانایی کد را کاهش دهد. برای حل این مشکل، TensorFlow.js فراهم می کند یک tf.tidy() روشی است که پاک کردن تمام tf.Tensor بازدید کنندگان است که توسط یک تابع پس از اجرای آن بازگشت نیست، مشابه به راه متغیرهای محلی تمیز کردن زمانی که یک تابع اجرا شده است:

const a = tf.tensor([[1, 2], [3, 4]]);
const y = tf.tidy(() => {
  const result = a.square().log().neg();
  return result;
});
دقت، درستی

در دستگاه های تلفن همراه، WebGL ممکن است فقط از بافت های ممیز شناور 16 بیتی پشتیبانی کند. با این حال، بیشتر مدل‌های یادگیری ماشین با وزنه‌ها و فعال‌سازی‌های ممیز شناور ۳۲ بیتی آموزش داده می‌شوند. این می تواند مسائل دقت در هنگام انتقال یک مدل برای یک دستگاه تلفن همراه به عنوان اعداد شناور 16 بیتی فقط می توانید اعداد در محدوده باعث [0.000000059605, 65504] . یعنی باید مراقب باشید که وزن ها و فعال سازی های مدل شما از این محدوده فراتر نرود. برای بررسی اینکه آیا حمایت دستگاه 32 بافت کمی، بررسی ارزش tf.ENV.getBool('WEBGL_RENDER_FLOAT32_CAPABLE') ، اگر این غلط است و سپس دستگاه را تنها پشتیبانی از 16 بیتی بافت ممیز شناور. شما می توانید با استفاده از tf.ENV.getBool('WEBGL_RENDER_FLOAT32_ENABLED') برای بررسی اگر TensorFlow.js در حال حاضر از 32 بافت بیتی.

تلفیقی Shader و بارگذاری بافت

TensorFlow.js با اجرای برنامه های سایه زن WebGL عملیات روی GPU را اجرا می کند. هنگامی که کاربر درخواست اجرای عملیاتی را می‌کند، این سایه‌زن‌ها با تنبلی جمع‌آوری و کامپایل می‌شوند. کامپایل کردن یک سایه زن روی CPU روی رشته اصلی اتفاق می افتد و می تواند کند باشد. TensorFlow.js سایه‌بان‌های کامپایل‌شده را به‌طور خودکار ذخیره می‌کند، و دومین فراخوانی را با همان عملیات با تانسورهای ورودی و خروجی هم‌شکل بسیار سریع‌تر انجام می‌دهد. به طور معمول، برنامه های TensorFlow.js چندین بار در طول عمر برنامه از عملیات مشابه استفاده می کنند، بنابراین عبور دوم از یک مدل یادگیری ماشین بسیار سریعتر است.

TensorFlow.js همچنین داده های tf.Tensor را به عنوان WebGLTextures ذخیره می کند. هنگامی که یک tf.Tensor ایجاد شود، ما نمی فورا اطلاعات را به GPU آپلود، و نه ما از داده ها بر روی CPU بمانید تا tf.Tensor در عملیات استفاده می شود. اگر tf.Tensor استفاده شده است برای بار دوم، داده ها در حال حاضر در GPU با هزینه ای بسیار آپلود وجود دارد. در یک مدل یادگیری ماشین معمولی، این بدان معناست که وزن‌ها در طول اولین پیش‌بینی از طریق مدل بارگذاری می‌شوند و عبور دوم از مدل بسیار سریع‌تر خواهد بود.

اگر به عملکرد اولین پیش‌بینی از طریق مدل یا کد TensorFlow.js اهمیت می‌دهید، توصیه می‌کنیم قبل از استفاده از داده‌های واقعی، با ارسال یک تانسور ورودی به همان شکل، مدل را گرم کنید.

مثلا:

const model = await tf.loadLayersModel(modelUrl);

// Warmup the model before using real data.
const warmupResult = model.predict(tf.zeros(inputShape));
warmupResult.dataSync();
warmupResult.dispose();

// The second predict() will be much faster
const result = model.predict(userData);

Node.js TensorFlow باطن

در باطن TensorFlow Node.js، 'node'، TensorFlow C API برای تسریع عملیات استفاده می شود. این از شتاب سخت افزاری موجود دستگاه، مانند CUDA، در صورت وجود استفاده می کند.

در این باطن، درست مثل باطن از WebGL، عملیات بازگشت tf.Tensor ها همزمان. با این حال، برخلاف باطن WebGL، این عملیات قبل از بازگرداندن تانسور کامل می شود. این بدان معناست که یک تماس به tf.matMul(a, b) خواهد UI thread را مسدود کند.

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

برای اطلاعات بیشتر در مورد Node.js، این راهنما را ببینید.

باطن WASM

TensorFlow.js فراهم می کند یک باطن WebAssembly ( wasm )، که شتاب پیشنهادات CPU و می تواند به عنوان یک جایگزین برای جاوا اسکریپت CPU وانیل (مورد استفاده cpu ) و WebGL شتاب ( webgl ) پایانه (Backend). برای استفاده از آن:

// Set the backend to WASM and wait for the module to be ready.
tf.setBackend('wasm');
tf.ready().then(() => {...});

اگر سرور شما در حال خدمت به .wasm فایل در یک مسیر های مختلف و یا یک نام متفاوت، استفاده از setWasmPath قبل از مقداردهی اولیه باطن. مشاهده "با استفاده از Bundlers" بخش در README برای اطلاعات بیشتر:

import {setWasmPath} from '@tensorflow/tfjs-backend-wasm';
setWasmPath(yourCustomPath);
tf.setBackend('wasm');
tf.ready().then(() => {...});
چرا WASM؟

WASM در سال 2015 به عنوان یک فرمت جدید مبتنی بر وب باینری معرفی شد، ارائه برنامه های در جاوا اسکریپت، C، C ++، و غیره تلفیقی هدف برای حال اجرا بر روی وب نوشته شده است. WASM شده است پشتیبانی شده توسط کروم، سافاری، فایرفاکس، و لبه از 2017، و توسط پشتیبانی 90٪ از دستگاه در سراسر جهان.

کارایی

WASM باطن اهرم کتابخانه XNNPACK برای اجرای بهینه سازی شده از اپراتورهای شبکه های عصبی.

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

در مقابل از WebGL: از WebGL سریعتر از WASM برای اغلب مدل است، اما برای مدل های کوچک WASM می توانید بهتر از WebGL با توجه به هزینه های سربار ثابت اجرای سایهزنهای WebGL. بخش "چه زمانی باید از WASM استفاده کنم" در زیر به بحث اکتشافی برای تصمیم گیری می پردازد.

قابلیت حمل و پایداری

WASM دارای محاسبات شناور 32 بیتی قابل حمل است که برابری دقیقی را در همه دستگاه ها ارائه می دهد. از سوی دیگر، WebGL مختص سخت افزار است و دستگاه های مختلف می توانند دقت متفاوتی داشته باشند (مثلاً به شناورهای ۱۶ بیتی در دستگاه های iOS).

مانند WebGL، WASM به طور رسمی توسط همه مرورگرهای اصلی پشتیبانی می شود. برخلاف WebGL، WASM می تواند در Node.js اجرا شود و در سمت سرور بدون نیاز به کامپایل کتابخانه های بومی استفاده شود.

چه زمانی باید از WASM استفاده کنم؟

اندازه مدل و تقاضای محاسباتی

به طور کلی، WASM انتخاب خوبی است که مدل های کوچکتر هستند و یا شما در مورد دستگاه های پایان پایین تر که فاقد پشتیبانی از WebGL (مراقبت OES_texture_float پسوند) و یا GPU ها کمتر قدرتمند. جدول زیر نشان می دهد استنتاج بار (از TensorFlow.js 1.5.2) در Chrome در 2018 مک بوک پرو برای 5 از رسمی پشتیبانی ما مدل های سراسر از WebGL، WASM و پایانه (Backend) CPU:

مدل های کوچکتر

مدل WebGL WASM CPU حافظه
BlazeFace 22.5 میلی‌ثانیه 15.6 میلی‌ثانیه 315.2 میلی‌ثانیه .4 مگابایت
فیس مش 19.3 میلی‌ثانیه 19.2 میلی‌ثانیه 335 میلی‌ثانیه 2.8 مگابایت

مدل های بزرگتر

مدل WebGL WASM CPU حافظه
PoseNet 42.5 میلی‌ثانیه 173.9 میلی‌ثانیه 1514.7 میلی‌ثانیه 4.5 مگابایت
BodyPix 77 میلی‌ثانیه 188.4 میلی‌ثانیه 2683 میلی‌ثانیه 4.6 مگابایت
MobileNet نسخه 2 37 میلی‌ثانیه 94 میلی‌ثانیه 923.6 میلی‌ثانیه 13 مگابایت

جدول فوق نشان می دهد که WASM 10-30x سریع تر از دشت باطن JS CPU در سراسر مدل، و رقابتی با WebGL برای مدل های کوچکتر مانند BlazeFace است که بسیار سبک وزن و (400KB)، در عین حال دارای تعداد مناسبی از عملیات (~ 140). با توجه به اینکه برنامه های WebGL هزینه سربار ثابتی برای هر اجرای عملیات دارند، این توضیح می دهد که چرا مدل هایی مانند BlazeFace در WASM سریعتر هستند.

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

استنتاج در مقابل آموزش

برای پرداختن به اولیه مورد استفاده برای استقرار مدل های از پیش آموزش دیده، توسعه باطن WASM خواهد استنتاج بر آموزش پشتیبانی اولویت بندی کنید. مشاهده لیست تا به روز از عملیات پشتیبانی در WASM و به ما اطلاع دهید اگر مدل شما دارای یک op پشتیبانی نشده است. برای مدل‌های آموزشی، توصیه می‌کنیم از Node (TensorFlow C++) یا Backend WebGL استفاده کنید.

باطن CPU

باطن CPU، 'cpu'، کمترین عملکرد را دارد، با این حال ساده ترین است. عملیات ها همه در جاوا اسکریپت وانیلی پیاده سازی می شوند که باعث می شود کمتر موازی شوند. آنها همچنین رشته UI را مسدود می کنند.

این باطن می تواند برای آزمایش یا در دستگاه هایی که WebGL در دسترس نیست بسیار مفید باشد.

پرچم ها

TensorFlow.js دارای مجموعه ای از پرچم های محیطی است که به طور خودکار ارزیابی می شوند و بهترین پیکربندی را در پلت فرم فعلی تعیین می کنند. این پرچم‌ها بیشتر داخلی هستند، اما چند پرچم جهانی را می‌توان با API عمومی کنترل کرد.

  • tf.enableProdMode(): قادر می سازد حالت تولید، که اعتبار سنجی مدل، چک نان، و دیگر چک صحت به نفع عملکرد حذف خواهد شد.
  • tf.enableDebugMode() : را قادر می سازد در حالت اشکال زدایی، که به کنسول ورود هر عمل که اجرا می شود، و همچنین اطلاعات عملکرد زمان اجرا به مانند حافظه و کل زمان اجرای هسته خواهد کرد. توجه داشته باشید که این کار سرعت برنامه شما را بسیار کند می کند، از آن در تولید استفاده نکنید.