نمایندگان GPU برای LiteRT

استفاده از واحدهای پردازش گرافیکی (GPU) برای اجرای مدل‌های یادگیری ماشین (ML) شما می‌تواند عملکرد مدل و تجربه کاربری برنامه‌های کاربردی مبتنی بر یادگیری ماشین شما را به طرز چشمگیری بهبود بخشد. LiteRT امکان استفاده از GPUها و سایر پردازنده‌های تخصصی را از طریق درایور سخت‌افزاری به نام delegates فراهم می‌کند. فعال کردن استفاده از GPUها با برنامه‌های کاربردی LiteRT ML شما می‌تواند مزایای زیر را ارائه دهد:

  • سرعت - پردازنده‌های گرافیکی (GPU) برای توان عملیاتی بالا در حجم‌های کاری موازی انبوه ساخته شده‌اند. این طراحی، آنها را برای شبکه‌های عصبی عمیق (Deep Neural Networks) که از تعداد زیادی عملگر تشکیل شده‌اند و هر کدام روی تانسورهای ورودی که می‌توانند به صورت موازی پردازش شوند، کار می‌کنند، بسیار مناسب می‌کند که معمولاً منجر به تأخیر کمتر می‌شود. در بهترین حالت، اجرای مدل شما روی یک پردازنده گرافیکی (GPU) ممکن است به اندازه کافی سریع باشد تا برنامه‌های بلادرنگ (Real-Time) که قبلاً امکان‌پذیر نبودند را فعال کند.
  • بهره‌وری انرژی - پردازنده‌های گرافیکی (GPU) محاسبات یادگیری ماشین (ML) را به شیوه‌ای بسیار کارآمد و بهینه انجام می‌دهند، معمولاً در مقایسه با همان کار که روی پردازنده‌های مرکزی (CPU) انجام می‌شود، انرژی کمتری مصرف می‌کنند و گرمای کمتری تولید می‌کنند.

این سند مروری بر پشتیبانی از پردازنده‌های گرافیکی (GPU) در LiteRT و برخی کاربردهای پیشرفته برای پردازنده‌های گرافیکی (GPU) ارائه می‌دهد. برای اطلاعات بیشتر در مورد پیاده‌سازی پشتیبانی از پردازنده‌های گرافیکی (GPU) در پلتفرم‌های خاص، به راهنماهای زیر مراجعه کنید:

پشتیبانی از عملیات یادگیری ماشین با پردازنده گرافیکی (GPU ML)

محدودیت‌هایی در مورد اینکه چه عملیات یادگیری ماشینی TensorFlow یا ops می‌توانند توسط نماینده LiteRT GPU تسریع شوند، وجود دارد. این نماینده از عملیات زیر با دقت اعشاری ۱۶ بیتی و ۳۲ بیتی پشتیبانی می‌کند:

  • ADD
  • AVERAGE_POOL_2D
  • CONCATENATION
  • CONV_2D
  • DEPTHWISE_CONV_2D v1-2
  • EXP
  • FULLY_CONNECTED
  • LOGICAL_AND
  • LOGISTIC
  • LSTM v2 (Basic LSTM only)
  • MAX_POOL_2D
  • MAXIMUM
  • MINIMUM
  • MUL
  • PAD
  • PRELU
  • RELU
  • RELU6
  • RESHAPE
  • RESIZE_BILINEAR v1-3
  • SOFTMAX
  • STRIDED_SLICE
  • SUB
  • TRANSPOSE_CONV

به طور پیش‌فرض، همه عملیات‌ها فقط در نسخه ۱ پشتیبانی می‌شوند. فعال کردن پشتیبانی کوانتیزاسیون ، نسخه‌های مناسب، به عنوان مثال، ADD v2 را فعال می‌کند.

عیب‌یابی پشتیبانی از پردازنده گرافیکی

اگر برخی از عملیات‌ها توسط نماینده GPU پشتیبانی نشوند، چارچوب فقط بخشی از نمودار را روی GPU و بخش باقیمانده را روی CPU اجرا می‌کند. با توجه به هزینه بالای هماهنگ‌سازی CPU/GPU، حالت اجرای تقسیم‌شده مانند این اغلب منجر به عملکرد کندتر نسبت به زمانی می‌شود که کل شبکه فقط روی CPU اجرا می‌شود. در این حالت، برنامه هشداری مانند موارد زیر ایجاد می‌کند:

WARNING: op code #42 cannot be handled by this delegate.

هیچ فراخوانی برای خرابی‌های از این نوع وجود ندارد، زیرا این یک خرابی واقعی در زمان اجرا نیست. هنگام آزمایش اجرای مدل خود با نماینده GPU، باید نسبت به این هشدارها هوشیار باشید. تعداد زیاد این هشدارها می‌تواند نشان دهد که مدل شما برای استفاده در شتاب‌دهی GPU مناسب نیست و ممکن است نیاز به بازسازی مدل داشته باشد.

مدل‌های نمونه

مدل‌های نمونه زیر برای بهره‌گیری از شتاب‌دهی GPU با LiteRT ساخته شده‌اند و برای مرجع و آزمایش ارائه شده‌اند:

بهینه‌سازی برای پردازنده‌های گرافیکی (GPU)

تکنیک‌های زیر می‌توانند به شما کمک کنند هنگام اجرای مدل‌ها روی سخت‌افزار GPU با استفاده از LiteRT GPU delegate، عملکرد بهتری داشته باشید:

  • عملیات تغییر شکل - برخی از عملیاتی که در CPU سریع هستند، ممکن است در دستگاه‌های تلفن همراه هزینه بالایی برای GPU داشته باشند. اجرای عملیات تغییر شکل به ویژه پرهزینه است، از جمله BATCH_TO_SPACE ، SPACE_TO_BATCH ، SPACE_TO_DEPTH و غیره. شما باید استفاده از عملیات تغییر شکل را به دقت بررسی کنید و در نظر داشته باشید که ممکن است فقط برای کاوش داده‌ها یا برای تکرارهای اولیه مدل شما اعمال شده باشد. حذف آنها می‌تواند عملکرد را به میزان قابل توجهی بهبود بخشد.

  • کانال‌های داده تصویر - در GPU، داده‌های تانسور به ۴ کانال تقسیم می‌شوند، و بنابراین محاسبه روی یک تانسور با شکل [B,H,W,5] تقریباً مشابه تانسور با شکل [B,H,W,8] انجام می‌شود، اما به طور قابل توجهی بدتر از [B,H,W,4] است. اگر سخت‌افزار دوربینی که استفاده می‌کنید از فریم‌های تصویر در RGBA پشتیبانی می‌کند، تغذیه آن ورودی ۴ کاناله به طور قابل توجهی سریع‌تر است، زیرا از کپی حافظه از RGB سه کاناله به RGBX چهار کاناله جلوگیری می‌کند.

  • مدل‌های بهینه‌سازی‌شده برای موبایل - برای بهترین عملکرد، باید آموزش مجدد طبقه‌بندی‌کننده خود را با معماری شبکه بهینه‌سازی‌شده برای موبایل در نظر بگیرید. بهینه‌سازی برای استنتاج روی دستگاه می‌تواند با بهره‌گیری از ویژگی‌های سخت‌افزاری موبایل، تأخیر و مصرف برق را به طرز چشمگیری کاهش دهد.

پشتیبانی پیشرفته از پردازنده گرافیکی

شما می‌توانید از تکنیک‌های پیشرفته و اضافی با پردازش GPU برای افزایش عملکرد مدل‌های خود، از جمله کوانتیزاسیون و سریال‌سازی، استفاده کنید. بخش‌های بعدی این تکنیک‌ها را با جزئیات بیشتر شرح می‌دهند.

استفاده از مدل‌های کوانتیزه شده

این بخش توضیح می‌دهد که چگونه نماینده GPU مدل‌های کوانتیزه شده ۸ بیتی، از جمله موارد زیر را شتاب می‌دهد:

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

این چطور کار می‌کند؟

از آنجایی که پردازنده گرافیکی (GPU backend) فقط از اجرای اعشاری پشتیبانی می‌کند، ما مدل‌های کوانتیزه شده را با دادن یک «نمای اعشاری» از مدل اصلی به آن اجرا می‌کنیم. در سطح بالا، این کار شامل مراحل زیر است:

  • تانسورهای ثابت (مانند وزن‌ها/بایاس‌ها) یک بار در حافظه GPU از حالت کوانتیزه خارج می‌شوند. این عملیات زمانی اتفاق می‌افتد که نماینده برای LiteRT فعال باشد.

  • ورودی‌ها و خروجی‌های برنامه‌ی GPU، در صورت کوانتیزه شدن ۸ بیتی، برای هر استنتاج (به ترتیب) کوانتیزه و غیرکوانتیزه می‌شوند. این عملیات با استفاده از هسته‌های بهینه‌شده‌ی LiteRT روی CPU انجام می‌شود.

  • شبیه‌سازهای کوانتیزاسیون بین عملیات‌ها قرار می‌گیرند تا رفتار کوانتیزه شده را تقلید کنند. این رویکرد برای مدل‌هایی ضروری است که در آن‌ها عملیات‌ها انتظار دارند فعال‌سازی‌ها از مرزهای آموخته شده در طول کوانتیزاسیون پیروی کنند.

برای اطلاعات بیشتر در مورد فعال کردن این ویژگی با نماینده GPU، به موارد زیر مراجعه کنید:

کاهش زمان اولیه‌سازی با سریال‌سازی

ویژگی نماینده GPU به شما امکان می‌دهد تا از کد هسته از پیش کامپایل شده و داده‌های مدل که از اجراهای قبلی سریال‌سازی و روی دیسک ذخیره شده‌اند، بارگیری کنید. این رویکرد از کامپایل مجدد جلوگیری می‌کند و می‌تواند زمان راه‌اندازی را تا 90٪ کاهش دهد. این بهبود با تبادل فضای دیسک برای صرفه‌جویی در زمان حاصل می‌شود. می‌توانید این ویژگی را با چند گزینه پیکربندی فعال کنید، همانطور که در مثال‌های کد زیر نشان داده شده است:

سی++

    TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default();
    options.experimental_flags |= TFLITE_GPU_EXPERIMENTAL_FLAGS_ENABLE_SERIALIZATION;
    options.serialization_dir = kTmpDir;
    options.model_token = kModelToken;

    auto* delegate = TfLiteGpuDelegateV2Create(options);
    if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
      

جاوا

    GpuDelegate delegate = new GpuDelegate(
      new GpuDelegate.Options().setSerializationParams(
        /* serializationDir= */ serializationDir,
        /* modelToken= */ modelToken));

    Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
      

هنگام استفاده از ویژگی سریال‌سازی، مطمئن شوید که کد شما با این قوانین پیاده‌سازی مطابقت دارد:

  • داده‌های سریال‌سازی را در دایرکتوری‌ای ذخیره کنید که برای سایر برنامه‌ها قابل دسترسی نباشد. در دستگاه‌های اندروید، از getCodeCacheDir() استفاده کنید که به مکانی اشاره می‌کند که برای برنامه فعلی خصوصی است.
  • توکن مدل باید برای هر مدل خاص، مختص به دستگاه باشد. شما می‌توانید با تولید یک اثر انگشت از داده‌های مدل با استفاده از کتابخانه‌هایی مانند farmhash::Fingerprint64 یک توکن مدل را محاسبه کنید.