StableHLO Quantization

انواع کوانتیزاسیون در StableHLO

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

کوانتیزه‌سازی StableHLO از مشخصات کمی‌سازی LiteRT پیروی می‌کند، با استفاده از یک طرح کوانتیزه‌سازی یکنواخت با پشتیبانی از کوانتیزه‌سازی هر تانسور و هر محور. بیان نوع خود را از گویش Quant MLIR به ارث برده است، و یک روش استاندارد برای نمایش انواع داده های کوانتیزه شده ارائه می دهد.

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

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

رابطه بین مقدار ممیز شناور اصلی ( real_value ) و مقدار صحیح کوانتیزه شده ( quantized_value ) در کمی سازی یکنواخت است:

real_value = scale * (quantized_value - zero_point)

کوانتیزاسیون بر تانسور

در کوانتیزاسیون هر تانسور، یک مقیاس واحد و نقطه صفر برای همه مقادیر درون تانسور استفاده می شود. یک نوع کوانتیزه شده در هر تانسور در StableHLO به صورت زیر بیان می شود:

quant.uniform scale:zero_point>

مثال : !quant.uniform<i8:f32, 0.01:50>

این یک عدد صحیح 8 بیتی ( i8 ) را نشان می دهد که برای ذخیره یک عدد ممیز شناور 32 بیتی ( f32 ) با استفاده از مقیاس 0.01 و نقطه صفر 50 استفاده می شود.

کوانتیزاسیون هر محور

کوانتیزاسیون هر محور در مقایسه با کوانتیزاسیون هر تانسور رویکرد دقیق تری را ارائه می دهد. به جای استفاده از یک مقیاس منفرد و نقطه صفر برای کل تانسور، کوانتیزاسیون هر محور، مقیاس‌های جداگانه و نقاط صفر را به برش‌هایی در امتداد یک بعد خاص quantized_dimension از تانسور اختصاص می‌دهد. این امر به ویژه زمانی مفید است که مقادیر در ابعاد مختلف به طور قابل توجهی متفاوت باشند و امکان حفظ بهتر اطلاعات و دقت را فراهم کنند.

تانسور t را با ابعاد [4, 3, 2] در نظر بگیرید. ما انتخاب می کنیم که این تانسور را در امتداد بعد دوم کمی کنیم ( quantized_dimension = 1 ). این بدان معنی است که ما سه برش خواهیم داشت (از آنجایی که بعد دوم دارای اندازه 3 است) که هر کدام مقیاس و نقطه صفر خود را دارند:

t[:, 0, :]: This slice gets scale[0] and zero_point[0].
t[:, 1, :]: This slice gets scale[1] and zero_point[1].
t[:, 2, :]: This slice gets scale[2] and zero_point[2].

در StableHLO، نوع کوانتیزه شده هر محور به صورت زیر بیان می شود:

quant.uniform {scale0:zero_point0, scale1:zero_point1, ...}>

که در آن طول scale:zero_point با تعداد برش‌ها در امتداد quantized_dimension تانسور حاوی منطبق است.

مثال : tensor<4x3x2x!quant.uniform<i8:f32:1, {0.2:20, 0.1:10, 0.3:30}>>

Quantization در StableHLO عبور می کند

StableHLO چندین پاس کامپایلر را ارائه می‌کند که امکان تبدیل‌ها و بهینه‌سازی‌های مختلف مربوط به کوانتیزه شدن را فراهم می‌کند و به شما در نحوه مدیریت مدل‌های کوانتیزه شده انعطاف‌پذیری می‌دهد. این پاس ها عبارتند از:

stablehlo-legalize-qdq-to-quantized-op

این گذر یک الگوی رایج در مدل‌های کوانتیزه، یک عملیات dequantize و به دنبال آن یک عملیات ممیز شناور، و در نهایت یک عملیات کوانتیزه کردن، را به یک عملیات کوانتیزه‌شده منفرد ترکیب می‌کند. جزئیات

stablehlo-legalize-quantized-op-to-qdq

این پاس برعکس پاس قبلی انجام می دهد. این یک عملیات کوانتیزه شده را به دنباله معادل خود از عملیات dequantize، floating-point، و quantize تجزیه می کند. جزئیات

stablehlo-legalize-quant-to-math

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

stablehlo-quant-legalize-to-tosa-rescale

StableHLO قابلیت قانونی کردن عملیات کوانتیزه شده را به نمایندگی های مربوطه آنها در گویش TOSA ارائه می دهد. این قانونی سازی سازگاری و قابلیت همکاری بین StableHLO و TOSA را تسهیل می کند. این پاس به طور استراتژیک عملیات کوانتیزه شده StableHLO را به ترکیبی از عملیات StableHLO و TOSA تبدیل می کند، با گویش TOSA که عمدتاً برای عملیات rescale استفاده می شود. عملیات tosa.rescale نقش مهمی در تنظیم مقیاس و نقطه صفر مقادیر کوانتیزه ایفا می کند و نمایش دقیق داده های کوانتیزه شده را در چارچوب TOSA امکان پذیر می کند. جزئیات

tosa-rescale-legalize-to-stablehlo

این پاس، عملیات مقیاس مجدد TOSA را به عملیات ریاضی ابتدایی StableHLO بازنویسی می کند. یکی از موارد استفاده اصلی برای این پاس اجازه دادن به مفسر StableHLO برای ارزیابی برنامه های حاوی عملیات مقیاس مجدد TOSA است. جزئیات

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

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

اساساً، مفسر از پاس stablehlo-legalize-quant-to-math برای تبدیل عملیات کوانتیزه شده به پیاده سازی های حسابی اعداد صحیح مربوطه استفاده می کند. این مجوز عملیات پخش CHLO را برای مدیریت ضرب/تقسیم مقیاس و جمع نقطه صفر معرفی می کند. برای اطمینان از سازگاری با مترجم StableHLO، این عملیات CHLO سپس به عملیات StableHLO قانونی می شود. این عملیات‌های مرتبط با شکل را معرفی می‌کند که متعاقباً با استفاده از یک سری پاس‌های متعارف، متعارف و بهینه می‌شوند.

توالی کامل پاس های درگیر در این فرآیند پایین آوردن به شرح زیر است:

stablehlo-legalize-quant-to-math
chlo-legalize-to-stablehlo
canonicalize
shape-legalize-to-stablehlo
stablehlo-canonicalize-dynamism

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

StableHLO مجموعه جامعی از موارد تست کوانتیزه را برای تأیید صحت و رفتار عملیات کوانتیزه ارائه می دهد. این موارد تست به عنوان تست واحد عمل می کنند و عملیات مختلف StableHLO را در سناریوهای کوانتیزه شده پوشش می دهند.

یک مثال معمولی از یک مورد آزمایش کوانتیزه شده به نظر می رسد

func.func @main() -> tensor<11xf32> {
    %operand_0 = stablehlo.constant dense<...> : tensor<11xf32>
    %operand_1 = stablehlo.constant dense<...> : tensor<11xf32>
    %golden = stablehlo.constant dense<...> : tensor<11xf32>

    %0 = stablehlo.uniform_quantize %operand_0 : (tensor<11xf32>) -> tensor<11x!quant.uniform<i8:f32, 0.3>>
    %1 = stablehlo.uniform_quantize %operand_1 : (tensor<11xf32>) -> tensor<11x!quant.uniform<i8:f32, 0.3>>

    %2 = stablehlo.add %1, %0 : tensor<11x!quant.uniform<i8:f32, 0.3>>

    %result = stablehlo.uniform_dequantize %2 : (tensor<11x!quant.uniform<i8:f32, 0.3>>) -> tensor<11xf32>

    %4 = stablehlo.custom_call @check.eq(%golden, %result) : (tensor<11xf32>, tensor<11xf32>) -> tensor<i1>

    return %3 : tensor<11xf32>
  }

و شامل:

  • داده های ورودی: مقادیر ورودی نماینده برای عملیات.
  • خروجی طلایی: خروجی مورد انتظار عملیات زمانی که روی داده های ورودی اعمال می شود، مطابق با مفسر مرجع StableHLO و ارزیابی کننده HLO .

این موارد آزمایشی برای موارد زیر ارزشمند هستند:

  • اعتبارسنجی کوانتیزاسیون StableHLO: اطمینان از اینکه رفتار کوانتیزاسیون عملیات StableHLO با نتایج مورد انتظار مطابقت دارد.
  • اعتبار سنجی متقاطع: مقایسه رفتار کوانتیزاسیون StableHLO با سایر پیاده سازی ها یا چارچوب ها.
  • اشکال زدایی و توسعه: کمک به توسعه و رفع اشکال ویژگی های کوانتیزاسیون یا بهینه سازی های جدید.