LiteRT-এর জন্য GPU প্রতিনিধি

আপনার মেশিন লার্নিং (ML) মডেলগুলি চালানোর জন্য গ্রাফিক্স প্রসেসিং ইউনিট (GPUs) ব্যবহার করা আপনার মডেলের কর্মক্ষমতা এবং আপনার ML-সক্ষম অ্যাপ্লিকেশনগুলির ব্যবহারকারীর অভিজ্ঞতাকে নাটকীয়ভাবে উন্নত করতে পারে। LiteRT প্রতিনিধি নামক হার্ডওয়্যার ড্রাইভারের মাধ্যমে GPU এবং অন্যান্য বিশেষায়িত প্রসেসরের ব্যবহার সক্ষম করে। আপনার LiteRT ML অ্যাপ্লিকেশানগুলির সাথে GPU গুলির ব্যবহার সক্ষম করা নিম্নলিখিত সুবিধাগুলি প্রদান করতে পারে:

  • গতি - GPU গুলি ব্যাপক সমান্তরাল কাজের চাপের উচ্চ থ্রুপুটের জন্য তৈরি করা হয়েছে। এই নকশাটি তাদের গভীর নিউরাল নেটগুলির জন্য উপযুক্ত করে তোলে, যার মধ্যে বিপুল সংখ্যক অপারেটর থাকে, প্রতিটি ইনপুট টেনসরে কাজ করে যা সমান্তরালভাবে প্রক্রিয়া করা যেতে পারে, যার ফলে সাধারণত কম লেটেন্সি হয়। সর্বোত্তম পরিস্থিতিতে, একটি GPU-তে আপনার মডেল চালানোর ফলে রিয়েল-টাইম অ্যাপ্লিকেশনগুলি সক্ষম করার জন্য যথেষ্ট দ্রুত চলতে পারে যা আগে সম্ভব ছিল না।
  • পাওয়ার দক্ষতা - জিপিইউগুলি খুব দক্ষ এবং অপ্টিমাইজড পদ্ধতিতে এমএল গণনা করে, সাধারণত কম শক্তি খরচ করে এবং সিপিইউতে চলমান একই কাজ থেকে কম তাপ উৎপন্ন করে।

এই নথিটি LiteRT-এ GPUs সমর্থনের একটি ওভারভিউ প্রদান করে, এবং GPU প্রসেসরের জন্য কিছু উন্নত ব্যবহার। নির্দিষ্ট প্ল্যাটফর্মগুলিতে GPU সমর্থন বাস্তবায়ন সম্পর্কে আরও নির্দিষ্ট তথ্যের জন্য, নিম্নলিখিত নির্দেশিকাগুলি দেখুন:

GPU ML অপারেশন সমর্থন

LiteRT GPU প্রতিনিধি দ্বারা TensorFlow ML ক্রিয়াকলাপ, বা ops , ত্বরান্বিত করা যেতে পারে তার কিছু সীমাবদ্ধতা রয়েছে৷ প্রতিনিধি 16-বিট এবং 32-বিট ফ্লোট নির্ভুলতায় নিম্নলিখিত অপ্স সমর্থন করে:

  • 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

ডিফল্টরূপে, সমস্ত অপ্স শুধুমাত্র সংস্করণ 1 এ সমর্থিত । কোয়ান্টাইজেশন সমর্থন সক্রিয় করা উপযুক্ত সংস্করণগুলিকে সক্ষম করে, উদাহরণস্বরূপ, ADD v2।

GPU সমর্থন সমস্যা সমাধান করা

যদি কিছু অপ্স GPU প্রতিনিধি দ্বারা সমর্থিত না হয়, ফ্রেমওয়ার্ক শুধুমাত্র GPU-এ গ্রাফের একটি অংশ এবং CPU-তে অবশিষ্ট অংশ চালাবে। সিপিইউ/জিপিইউ সিঙ্ক্রোনাইজেশনের উচ্চ খরচের কারণে, এই ধরনের একটি বিভক্ত এক্সিকিউশন মোড প্রায়শই যখন পুরো নেটওয়ার্কটি শুধুমাত্র সিপিইউতে চালানো হয় তার চেয়ে ধীর কর্মক্ষমতার কারণ হয়। এই ক্ষেত্রে, অ্যাপ্লিকেশন সতর্কতা তৈরি করে, যেমন:

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

এই ধরনের ব্যর্থতার জন্য কোন কলব্যাক নেই, যেহেতু এটি একটি প্রকৃত রান-টাইম ব্যর্থতা নয়। GPU প্রতিনিধির সাথে আপনার মডেলের এক্সিকিউশন পরীক্ষা করার সময়, এই সতর্কতার জন্য আপনাকে সতর্ক থাকতে হবে। এই সতর্কতাগুলির একটি উচ্চ সংখ্যা নির্দেশ করতে পারে যে আপনার মডেলটি GPU ত্বরণের জন্য ব্যবহারের জন্য সবচেয়ে উপযুক্ত নয় এবং মডেলটির রিফ্যাক্টরিং প্রয়োজন হতে পারে।

উদাহরণ মডেল

নিম্নলিখিত উদাহরণ মডেলগুলি LiteRT এর সাথে GPU ত্বরণের সুবিধা নেওয়ার জন্য তৈরি করা হয়েছে এবং রেফারেন্স এবং পরীক্ষার জন্য সরবরাহ করা হয়েছে:

GPU-এর জন্য অপ্টিমাইজ করা হচ্ছে

LiteRT GPU প্রতিনিধি ব্যবহার করে GPU হার্ডওয়্যারে মডেলগুলি চালানোর সময় নিম্নলিখিত কৌশলগুলি আপনাকে আরও ভাল পারফরম্যান্স পেতে সাহায্য করতে পারে:

  • অপারেশন রিশেপ করুন - কিছু অপারেশন যা একটি CPU-তে দ্রুত হয় মোবাইল ডিভাইসে GPU-এর জন্য উচ্চ খরচ হতে পারে। রিশেপ অপারেশনগুলি চালানোর জন্য বিশেষভাবে ব্যয়বহুল, যার মধ্যে BATCH_TO_SPACE , SPACE_TO_BATCH , SPACE_TO_DEPTH , এবং আরও অনেক কিছু রয়েছে৷ আপনার পুনর্নির্মাণ ক্রিয়াকলাপগুলির ব্যবহার ঘনিষ্ঠভাবে পরীক্ষা করা উচিত এবং বিবেচনা করা উচিত যে এটি শুধুমাত্র ডেটা অন্বেষণ বা আপনার মডেলের প্রাথমিক পুনরাবৃত্তির জন্য প্রয়োগ করা হয়েছে। তাদের অপসারণ উল্লেখযোগ্যভাবে কর্মক্ষমতা উন্নত করতে পারে.

  • ইমেজ ডেটা চ্যানেল - জিপিইউ-তে, টেনসর ডেটা 4-চ্যানেলগুলিতে কাটা হয়, এবং তাই আকৃতি [B,H,W,5] আকৃতির একটি টেনসরের উপর একটি গণনা একটি আকৃতির টেনসরে [B,H,W,8] ] একই কাজ করে [B,H,W,8] , কিন্তু [B,H,W,4] এর চেয়ে উল্লেখযোগ্যভাবে খারাপ। আপনি যে ক্যামেরা হার্ডওয়্যারটি ব্যবহার করছেন সেটি যদি RGBA-তে ইমেজ ফ্রেম সমর্থন করে, তাহলে 4-চ্যানেল ইনপুট খাওয়ানো উল্লেখযোগ্যভাবে দ্রুত, কারণ এটি 3-চ্যানেল RGB থেকে 4-চ্যানেল RGBX-এ মেমরি কপি এড়িয়ে যায়।

  • মোবাইল-অপ্টিমাইজ করা মডেল - সেরা পারফরম্যান্সের জন্য, আপনাকে মোবাইল-অপ্টিমাইজ করা নেটওয়ার্ক আর্কিটেকচারের সাথে আপনার ক্লাসিফায়ারকে পুনরায় প্রশিক্ষণ দেওয়ার কথা বিবেচনা করা উচিত। অন-ডিভাইস ইনফারেন্সিংয়ের জন্য অপ্টিমাইজেশন মোবাইল হার্ডওয়্যার বৈশিষ্ট্যগুলির সুবিধা গ্রহণ করে নাটকীয়ভাবে লেটেন্সি এবং পাওয়ার খরচ কমাতে পারে।

উন্নত GPU সমর্থন

কোয়ান্টাইজেশন এবং সিরিয়ালাইজেশন সহ আপনার মডেলগুলির জন্য আরও ভাল পারফরম্যান্স সক্ষম করতে আপনি GPU প্রক্রিয়াকরণের সাথে অতিরিক্ত, উন্নত কৌশলগুলি ব্যবহার করতে পারেন। নিম্নলিখিত বিভাগগুলি এই কৌশলগুলিকে আরও বিশদে বর্ণনা করে।

কোয়ান্টাইজড মডেল ব্যবহার করে

এই বিভাগটি ব্যাখ্যা করে যে কিভাবে GPU প্রতিনিধি নিম্নলিখিতগুলি সহ 8-বিট কোয়ান্টাইজড মডেলগুলিকে ত্বরান্বিত করে:

কর্মক্ষমতা অপ্টিমাইজ করতে, ফ্লোটিং-পয়েন্ট ইনপুট এবং আউটপুট টেনসর উভয়ই রয়েছে এমন মডেলগুলি ব্যবহার করুন৷

এটা কিভাবে কাজ করে?

যেহেতু GPU ব্যাকএন্ড শুধুমাত্র ফ্লোটিং-পয়েন্ট এক্সিকিউশনকে সমর্থন করে, তাই আমরা মূল মডেলের 'ফ্লোটিং-পয়েন্ট ভিউ' দিয়ে কোয়ান্টাইজড মডেল চালাই। উচ্চ-স্তরে, এটি নিম্নলিখিত পদক্ষেপগুলিকে অন্তর্ভুক্ত করে:

  • ধ্রুবক টেনসর (যেমন ওজন/পক্ষপাত) GPU মেমরিতে একবার ডি-কোয়ান্টাইজ করা হয়। LiteRT এর জন্য প্রতিনিধি সক্ষম হলে এই অপারেশনটি ঘটে৷

  • GPU প্রোগ্রামে ইনপুট এবং আউটপুট , যদি 8-বিট কোয়ান্টাইজ করা হয়, প্রতিটি অনুমানের জন্য ডি-কোয়ান্টাইজড এবং কোয়ান্টাইজ করা হয় (যথাক্রমে)। এই অপারেশনটি CPU-তে LiteRT-এর অপ্টিমাইজ করা কার্নেল ব্যবহার করে করা হয়।

  • কোয়ান্টাইজেশন সিমুলেটরগুলি কোয়ান্টাইজড আচরণ অনুকরণ করার জন্য অপারেশনগুলির মধ্যে সন্নিবেশ করা হয়। এই পদ্ধতিটি মডেলগুলির জন্য প্রয়োজনীয় যেখানে অপস আশা করে অ্যাক্টিভেশনগুলি কোয়ান্টাইজেশনের সময় শেখা সীমা অনুসরণ করবে।

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 এর মতো লাইব্রেরি ব্যবহার করে মডেল ডেটা থেকে একটি ফিঙ্গারপ্রিন্ট তৈরি করে একটি মডেল টোকেন গণনা করতে পারেন।