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

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

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

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

GPU ML অপারেশন সাপোর্ট

LiterRT 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

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

GPU সাপোর্টের সমস্যা সমাধান

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

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

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

উদাহরণ মডেল

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

GPU-এর জন্য অপ্টিমাইজেশন

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

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

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

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

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

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

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

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

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

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

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

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

  • GPU প্রোগ্রামের ইনপুট এবং আউটপুট , যদি 8-বিট কোয়ান্টাইজ করা হয়, প্রতিটি ইনফারেন্সের জন্য যথাক্রমে ডি-কোয়ান্টাইজড এবং কোয়ান্টাইজড করা হয়। এই অপারেশনটি 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 এর মতো লাইব্রেরি ব্যবহার করে মডেল ডেটা থেকে একটি ফিঙ্গারপ্রিন্ট তৈরি করে একটি মডেল টোকেন গণনা করতে পারেন।