پیاده سازی LiteRT در Google Tensor

۱. مرور کلی

کیت توسعه نرم‌افزاری تنسور گوگل (Google Tensor SDK) برای کامپایل مدل‌های LiteRT برای دستگاه‌های پیکسل استفاده می‌شود. مدل‌های کامپایل‌شده را می‌توان برای بهبود عملکرد استنتاج یادگیری ماشینی روی دستگاه‌های پیکسل پیاده‌سازی کرد. برای استفاده از SDK، ابتدا باید مدل خود را به یک مدل LiteRT ( tflite ) تبدیل کنید.

این آزمایشگاه کد بر اساس آزمایشگاه عمومی گیت‌هاب، آزمایشگاه آموزش کامپایل LiteRT AOT، ساخته شده است: در کولاب باز است .

هدف

بیاموزید که چگونه از کامپایلر LiteRT AOT (قبل از زمان) برای کامپایل یک مدل تقسیم‌بندی سلفی از یک مدل TFLite به یک مدل LiteRT که برای EdgeTPU های روی دستگاه بهینه و کامپایل شده است، استفاده کنید.

این آزمایشگاه همچنین شما را در مراحل آماده‌سازی مدل‌ها با Play for On-device AI ( PODAI ) راهنمایی می‌کند.

PODAI مدل‌های سفارشی برای ویژگی‌های هوش مصنوعی روی دستگاه را با کارایی بیشتری ارائه می‌دهد. این فناوری فرآیند راه‌اندازی، هدف‌گیری، نسخه‌بندی و دانلود مدل‌های هوش مصنوعی شما را ساده می‌کند. هنگامی که با کامپایل LiteRT EdgeTPU AOT ترکیب می‌شود، به توسعه‌دهندگان اجازه می‌دهد مدل‌های ML کامپایل‌شده را برای دستگاه‌های مختلف ارائه دهند، بدون اینکه نیازی به دانستن اینکه تلفن کاربر نهایی شامل کدام EdgeTPUها است، باشد.

مدل‌های مورد استفاده

مدل‌هایی که ما استفاده می‌کنیم در اصل در راهنمای تقسیم‌بندی تصویر MediaPipe منتشر شده‌اند. در اینجا جزئیاتی در مورد مدل مورد استفاده در این آزمایشگاه کد آمده است:

  • SelfieMulticlass : یک مدل LiteRT که تصویری از یک فرد می‌گیرد، نواحی مانند مو، پوست و لباس را مکان‌یابی می‌کند و یک نقشه تقسیم‌بندی تصویر برای این موارد ارائه می‌دهد.

۲. شروع کنید

برای دسترسی و شروع به کار با Google Tensor SDK، این مراحل را دنبال کنید:

  1. برای دسترسی به Google Tensor SDK ثبت نام کنید . قبل از ادامه، باید منتظر ایمیلی از گوگل باشید که حاوی لینک دانلود افزونه کامپایلر است.
  2. افزونه کامپایلر ( litert_plugin_compiler.tar.gz ) را دانلود کنید و آن را در پوشه‌ای به دلخواه خود قرار دهید.
  3. متغیر محیطی را روی مسیر سیستم محلی فایل دانلود شده، یعنی GOOGLE_TENSOR_SDK_BETA ، تنظیم کنید.
    می‌توانید این دستور را در ترمینال bash خود اجرا کنید:
    export GOOGLE_TENSOR_SDK_BETA=/path/to/downloaded/compiler
    
    یا می‌توانید این را در نوت‌بوک Colab خود اجرا کنید:
    %env GOOGLE_TENSOR_SDK_BETA=/path/to/downloaded/compiler
    
  4. سپس این دستور را برای نصب بسته اجرا کنید:
    pip install ai-edge-litert-sdk-google-tensor
    

۳. بسته‌های مورد نیاز را نصب کنید

با نصب بسته‌های مورد نیاز، از جمله ai-edge-litert-nightly که شامل کامپایلر EdgeTPU AOT است و سایر کتابخانه‌هایی که برای تبدیل مدل استفاده می‌کنید، شروع کنید.

از این بسته برای نصب بک‌اند LiteRT برای Google Tensor استفاده کنید: ai-edge-litert-sdk-google-tensor .

پس از نصب بسته‌ها، جلسه را مجدداً راه‌اندازی کنید و از مراحل نصب ادامه دهید. نصب را تکرار نکنید .

اگر قصد دارید تنظیمات را روی سیستم خود انجام دهید، توصیه می‌کنیم از یک محیط مجازی پایتون (venv) استفاده کنید و این دستورات را در محیط مجازی اجرا کنید.

حذف برخی از بسته‌های نرم‌افزاری

قبل از آن، tensorflow که به طور پیش‌فرض با colab runtime همراه است را حذف نصب کنید.

pip uninstall -y tensorflow ai-edge-litert

نصب تمام کتابخانه‌ها

نصب بک‌اند LiteRT برای Google Tensor

pip install ai-edge-litert-sdk-google-tensor

نصب بسته‌های باقی‌مانده

pip install matplotlib huggingface-hub ai-edge-litert-nightly

۴. تمام کتابخانه‌ها را وارد کنید

پس از اتمام نصب، به اجرای اصلی ادامه دهید.

بسته‌های مورد نیاز را وارد کنید:

import os
import shutil

from ai_edge_litert.aot import aot_compile as aot_lib
from ai_edge_litert.aot.ai_pack import export_lib as ai_pack_export
from ai_edge_litert.aot.vendors.google_tensor import target as gt_target
import huggingface_hub
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import requests

۵. یک مدل LiteRT کامپایل کنید

این بخش کاربردهای پیشرفته‌ای مانند کامپایل مستقیم یک مدل LiteRT (TFLite) را پوشش می‌دهد.

کامپایل EdgeTPU از مدل TFLite

این مرحله به یک مدل TFLite نیاز دارد. اگر مدل TFLite ندارید، مدل خود را به فرمت TFLite تبدیل کنید.

مدل TFLite را دریافت کنید

ما برای این مورد استفاده از مدل MediaPipe MultiClass Segmentation استفاده می‌کنیم.

مدل TFLite از صفحه تقسیم‌بندی تصویر MediaPipe در دسترس است.

work_dir = '.'

model_url = 'https://storage.googleapis.com/mediapipe-models/image_segmenter/selfie_multiclass_256x256/float32/latest/selfie_multiclass_256x256.tflite'
tflite_model_path = os.path.join(work_dir, 'selfie_multiclass_256x256.tflite')

model_content = requests.get(model_url)

with open(tflite_model_path, 'wb') as fout:
  fout.write(model_content.content)

با استفاده از LiteRT Python API، مدل TfLite را به سرعت تأیید کنید

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

# Downloading Testing image

test_image = huggingface_hub.hf_hub_download(
    repo_id="litert-community/MediaPipe-Selfie-Segmentation",
    filename="test_img.png",
)
pil_image = Image.open(test_image).convert("RGB").resize((256, 256))

from ai_edge_litert.compiled_model import CompiledModel

SEGMENT_COLORS = [
    (0, 0, 0),
    (255, 0, 0),
    (0, 255, 0),
    (0, 0, 255),
    (255, 255, 0),
    (255, 0, 255),
]
INPUT_SIZE = (256, 256)
NUM_CLASSES = 6

# Load the model and image
model = CompiledModel.from_file(tflite_model_path)
original_image = np.array(Image.open(test_image).convert('RGB'))
img_array = np.array(pil_image).astype(np.float32)

# Normalize the image
normalized = (img_array - 127.5) / 127.5
normalized = np.ascontiguousarray(normalized, dtype=np.float32)

# Run inference
sig_idx = 0
input_buffers = model.create_input_buffers(sig_idx)
output_buffers = model.create_output_buffers(sig_idx)
input_data = normalized.reshape(-1)
input_buffers[0].write(input_data)
model.run_by_index(sig_idx, input_buffers, output_buffers)

# Get output data
height, width = INPUT_SIZE
output_size = height * width * NUM_CLASSES
output_data = output_buffers[0].read(output_size, np.float32)
output_data = output_data.reshape(height, width, NUM_CLASSES)
mask = np.argmax(output_data, axis=2).astype(np.uint8)

# Create colored mask
colored_mask = np.zeros((height, width, 3), dtype=np.uint8)
for label_idx in range(NUM_CLASSES):
  class_mask = mask == label_idx
  color = SEGMENT_COLORS[label_idx]
  colored_mask[class_mask] = color

# Blend with original image
# Resize colored mask to match original image if necessary
if original_image.shape[:2] != colored_mask.shape[:2]:
  colored_mask_pil = Image.fromarray(colored_mask)
  colored_mask_pil = colored_mask_pil.resize(
      (original_image.shape[1], original_image.shape[0])
  )
  colored_mask = np.array(colored_mask_pil)

# Blend images with alpha 0.5
alpha = 0.5
blended_image = (
    original_image * (1 - alpha) + colored_mask * alpha
).astype(np.uint8)

# Display them
fig, axes = plt.subplots(1, 3, figsize=(9, 3))

for idx, (title, image) in enumerate([
    ('Original Image', original_image),
    ('Colored Mask', colored_mask),
    ('Blended Image', blended_image),
]):
  axes[idx].imshow(image)
  axes[idx].set_title(title)
  axes[idx].axis('off')

plt.tight_layout()
plt.show()

تبدیل به مدل LiteRT، با کامپایل EdgeTPU AOT.

ما از API های ai_edge_litert.aot برای کامپایل مدل استفاده می‌کنیم.

compiled_models = aot_lib.aot_compile(tflite_model_path, keep_going=True)

# This variable will be used later to create the AI Pack.
all_google_tensor_compiled_models = compiled_models

# Print Compilation Report
print(all_google_tensor_compiled_models.compilation_report())

# Saving compiled models to disk. This saves all the compiled models, and a CPU
# fallback model.
all_google_tensor_compiled_models.export(
    work_dir, model_name='selfie_segmentation'
)

وقتی کامپایل تمام شد، از متد model.export برای خروجی گرفتن از همه مدل‌ها به دیسک استفاده کنید.

به طور پیش‌فرض، مدل‌ها در یک ساختار مسطح در دایرکتوری خروجی ذخیره می‌شوند، و نام هر مدل با پسوند شناسه‌ی backend همراه است.

برای مثال:

نام فایل مدل

بک‌اند

تراشه

توجه داشته باشید

selfie_segmentation_fallback.tflite

پردازنده/پردازنده گرافیکی

ناموجود

ناموجود

selfie_segmentation_Google_Tensor_G3.tflite

گوگل

تنسور_جی۳

گوگل تنسور G3

selfie_segmentation_Google_Tensor_G4.tflite

گوگل

تنسور_G4

گوگل تنسور جی۴

قطعه‌بندی_سلفی_گوگل_تنسور_جی۵.tflite

گوگل

تنسور_جی۵

گوگل تنسور جی۵

۶. خروجی گرفتن و اعتبارسنجی روی CPU

پس از اتمام کامپایل، مدل TFLite را روی CPU تأیید کنید. این کار را با استفاده از "مدل پشتیبان" تولید شده در طول کامپایل انجام دهید.

# Run LiteRT with test image
from ai_edge_litert.compiled_model import CompiledModel

# Normalize the image to [-1, 1]
img_array = np.array(pil_image, dtype=np.float32)
normalized = (img_array - 127.5) / 127.5
numpy_array = np.ascontiguousarray(normalized)[None, ...]

cpu_model_path = os.path.join(work_dir, "selfie_segmentation_fallback.tflite")
cm_model = CompiledModel.from_file(cpu_model_path)
sig_idx = 0
input_buffers = cm_model.create_input_buffers(sig_idx)
output_buffers = cm_model.create_output_buffers(sig_idx)
input_buffers[0].write(numpy_array)
cm_model.run_by_index(sig_idx, input_buffers, output_buffers)

# Read the 6-channel output and apply argmax
output_data = output_buffers[0].read(256 * 256 * 6, np.float32)
output_data = output_data.reshape((256, 256, 6))
mask = np.argmax(output_data, axis=2).astype(np.uint8)

# Create a colored mask using the previously defined SEGMENT_COLORS
colored_mask = np.zeros((256, 256, 3), dtype=np.uint8)
for label_idx in range(6):
  class_mask = mask == label_idx
  color = SEGMENT_COLORS[label_idx]
  colored_mask[class_mask] = color

mask_image = Image.fromarray(colored_mask)

# Show output results
fig, axes = plt.subplots(1, 2, figsize=(9, 3))

for idx, (title, image) in enumerate([
    ('Test Image', pil_image),
    ('TFLite Mask Image', mask_image),
]):
  axes[idx].imshow(image)
  axes[idx].set_title(title)
  axes[idx].axis('off')

plt.tight_layout()
plt.show()

۷. خروجی گرفتن از مدل‌ها برای PODAI

پس از تأیید مدل‌های شما، گام اساسی بعدی آماده‌سازی آنها برای استقرار است. این بخش نحوه بسته‌بندی مدل‌های کامپایل‌شده شما برای آپلود در گوگل پلی را شرح می‌دهد که امکان ارسال به دستگاه‌های کاربر را از طریق چارچوب هوش مصنوعی روی دستگاه گوگل پلی (PODAI) فراهم می‌کند.

ماژول AiEdgeLiteRT AOT (Ahead-of-Time) ابزارهای ai_pack به‌طور خاص برای این منظور ارائه می‌دهد. این ابزارها یک AI Pack ایجاد می‌کنند که یک دارایی داده‌ای حیاتی است. یک AI Pack مدل‌های کامپایل شده شما را با پیکربندی‌های هدف‌گیری دستگاه بسته‌بندی می‌کند و تضمین می‌کند که مدل‌ها و دارایی‌های صحیح به دستگاه‌های کاربر مناسب تحویل داده می‌شوند. این امر به‌ویژه برای کامپایل‌های NPU (واحد پردازش عصبی) حیاتی است، زیرا تضمین می‌کند که مدل‌های بهینه شده برای یک سیستم روی تراشه (SoC) خاص فقط به دستگاه‌های مجهز به آن SoC می‌رسند.

# Configuring the AI Pack
os.makedirs('selfie_multiclass', exist_ok=True)
ai_pack_dir = os.path.join(work_dir, 'ai_pack')
ai_pack_name = 'selfie_segmentation'
litert_model_name = 'segmentation_model'

# Clean up
shutil.rmtree(ai_pack_dir, ignore_errors=True)

# Export
ai_pack_export.export(
    all_google_tensor_compiled_models,
    ai_pack_dir,
    ai_pack_name,
    litert_model_name
)

بررسی منبع بسته هوش مصنوعی

def list_files(startpath):
  """Function to print out the tree structure of a directory."""
  for root, dirs, files in os.walk(startpath):
    level = root.replace(startpath, '').count(os.sep)
    indent = ' ' * 4 * (level)
    print('{}{}/'.format(indent, os.path.basename(root)))
    subindent = ' ' * 4 * (level + 1)
    for f in files:
      print('{}{}'.format(subindent, f))
"""View the files generated within the AI pack directory"""
list_files(ai_pack_dir)

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

گردآوری NPU برای دستگاه خاص یا EdgeTPU

به طور پیش‌فرض، کامپایل LiteRT AOT به تمام backend های ثبت شده کامپایل می‌شود. برای توسعه محلی، ممکن است بخواهید فقط برای دستگاه‌های خاص، مانند تلفن‌های توسعه، کامپایل کنید. با ارائه صریح اهداف کامپایل، به این هدف برسید.

مثال زیر به Google Tensor G5 کامپایل می‌شود.

# Specifying the compilation target
tensor_g5_target = gt_target.Target(gt_target.SocModel.TENSOR_G5)

# Compile from the TFLite model for a specific target
compiled_models = aot_lib.aot_compile(
    tflite_model_path,
    target=[tensor_g5_target],
    keep_going=False,  # We want to error out when there's failure.
)

print(compiled_models.compilation_report())

پرچم‌های کامپایل برای گوگل تنسور

فرآیند کامپایل را از طریق پرچم‌های کامپایل سفارشی کنید. در اینجا، از این پرچم استفاده شده است: google_tensor_truncation_type="half"

هنگام کامپایل یک مدل TFLite

compiled_models = aot_lib.aot_compile(
    tflite_model_path,
    target=[tensor_g5_target],
    keep_going=False,
    google_tensor_truncation_type="half"
)

۹. مراحل بعدی

تبریک می‌گویم!

مدل‌های شما آماده‌ی استفاده توسط PODAI هستند!

حالا برای مراحل بعدی به اندروید استودیو بروید؛ برای جزئیات بیشتر به نمونه‌های قطعه‌بندی تصویر LiteRT مراجعه کنید.