ประเภทการหาปริมาณใน StableHLO
การหาปริมาณเป็นเทคนิคในการเพิ่มประสิทธิภาพโมเดลแมชชีนเลิร์นนิงโดย การแปลงตัวเลขทศนิยม (เช่น ตัวเลขที่ใช้ในโมเดลเดิม) เป็นจำนวนเต็มที่มีความแม่นยำต่ำกว่า ซึ่งจะช่วยลดการใช้หน่วยความจำและเพิ่มความเร็วในการคำนวณ ทำให้โมเดลมีประสิทธิภาพมากขึ้นสำหรับการติดตั้งใช้งานในอุปกรณ์ที่มีทรัพยากรจำกัด
การกำหนดปริมาณ StableHLO เป็นไปตามข้อกำหนดการกำหนดปริมาณ LiteRT โดยใช้รูปแบบการกำหนดปริมาณแบบสม่ำเสมอที่รองรับทั้งการกำหนดปริมาณต่อเทนเซอร์และการกำหนดปริมาณต่อแกน โดยจะรับช่วงนิพจน์ประเภทจากภาษาเฉพาะ Quant ของ MLIR ซึ่งเป็นวิธีมาตรฐานในการแสดงประเภทข้อมูลที่เล็กลง
การหาปริมาณแบบสม่ำเสมอจะแมปค่าทศนิยมกับจำนวนเต็มโดยใช้ขนาดขั้นแบบสม่ำเสมอ ซึ่งส่งผลให้ค่าที่หาปริมาณแล้วมีระยะห่างเท่ากัน ซึ่งทำได้ผ่าน ความสัมพันธ์แบบแอฟฟินโดยใช้พารามิเตอร์การหาปริมาณที่สำคัญ 2 รายการ
การหาปริมาณแบบสม่ำเสมอช่วยลดความซับซ้อนในการแสดงจำนวนทศนิยมโดย การแมปจำนวนทศนิยมกับจำนวนเต็มที่มีระยะห่างเท่ากัน การแมปนี้ทำได้ ผ่านการแปลงแบบแอฟฟินที่ใช้พารามิเตอร์หลัก 2 รายการ ได้แก่ สเกลและ จุดศูนย์ สเกลจะกำหนดขนาดขั้นระหว่างค่าที่หาปริมาณต่อเนื่อง สเกลที่เล็กลงหมายความว่าค่าที่วัดปริมาณแล้วจะ อยู่ใกล้กันมากขึ้น จุดศูนย์กำหนดค่าจำนวนเต็มที่แสดงค่าศูนย์ ในพื้นที่จำนวนทศนิยมเดิม
ความสัมพันธ์ระหว่างค่าทศนิยมเดิม (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] เราเลือกที่จะหาปริมาณ
เทนเซอร์นี้ตามมิติข้อมูลที่ 2 (quantized_dimension = 1) ซึ่งหมายความว่า
เราจะมี 3 ชิ้น (เนื่องจากมิติข้อมูลที่ 2 มีขนาด 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}>>
การส่งผ่านการหาปริมาณใน StableHLO
StableHLO มีการส่งผ่านคอมไพเลอร์หลายรายการที่ช่วยให้สามารถทำการแปลงและการเพิ่มประสิทธิภาพต่างๆ ที่เกี่ยวข้องกับการวัดปริมาณ ซึ่งช่วยให้คุณมีความยืดหยุ่นในการจัดการโมเดลที่วัดปริมาณ บัตรเหล่านี้ได้แก่
stablehlo-legalize-qdq-to-quantized-op
การส่งผ่านนี้จะผสานรูปแบบทั่วไปในโมเดลที่ปริมาณเป็นจำนวนเต็ม ซึ่งเป็นการดำเนินการยกเลิกการหาปริมาณ ตามด้วยการดำเนินการแบบจุดลอย และสุดท้ายคือการดำเนินการหาปริมาณ ให้เป็นการดำเนินการหาปริมาณรายการเดียว รายละเอียด
stablehlo-legalize-quantized-op-to-qdq
โดยการส่งผ่านนี้จะทำตรงกันข้ามกับการส่งผ่านก่อนหน้า โดยจะแยกการดำเนินการที่ผ่านการหาปริมาณ ออกเป็นลำดับการดำเนินการที่เทียบเท่ากัน ได้แก่ การยกเลิกการหาปริมาณ การดำเนินการแบบจุดลอยตัว และการดำเนินการหาปริมาณ รายละเอียด
stablehlo-legalize-quant-to-math
การส่งผ่านนี้จะแปลงการดำเนินการ StableHLO ในประเภทที่เล็กลงเป็นการดำเนินการที่เทียบเท่าในประเภทจำนวนเต็ม ซึ่งโดยพื้นฐานแล้วจะใช้การคำนวณการหาปริมาณ โดยใช้การดำเนินการทางคณิตศาสตร์มาตรฐาน การแยกย่อยนี้มีประโยชน์ สำหรับระบบที่ไม่รองรับการหาปริมาณโดยกำเนิด แต่ยังคงใช้ การคำนวณการหาปริมาณเพื่อแสดงความหมายของโมเดลที่หาปริมาณได้ รายละเอียด
stablehlo-quant-legalize-to-tosa-rescale
StableHLO มีความสามารถในการทำให้การดำเนินการที่ผ่านการวัดปริมาณถูกต้องตามกฎหมายเพื่อการแสดงผลที่สอดคล้องกันในภาษา TOSA การทำให้ถูกกฎหมายนี้
ช่วยให้ StableHLO และ TOSA เข้ากันได้และทำงานร่วมกันได้ การส่งผ่านนี้จะแปลงการดำเนินการที่กำหนดปริมาณของ StableHLO เป็นการผสมผสานระหว่างการดำเนินการของ StableHLO และ TOSA อย่างมีกลยุทธ์ โดยใช้ Dialect ของ TOSA เป็นหลักสำหรับการดำเนินการ rescale tosa.rescale Op มีบทบาทสำคัญในการปรับ
สเกลและจุดศูนย์ของค่าที่กำหนดปริมาณ ซึ่งช่วยให้แสดงข้อมูลที่กำหนดปริมาณได้อย่างถูกต้องภายในเฟรมเวิร์ก TOSA
รายละเอียด
tosa-rescale-legalize-to-stablehlo
พาสนี้จะเขียนการดำเนินการปรับขนาด TOSA ใหม่เป็นการดำเนินการทางคณิตศาสตร์ดั้งเดิมของ StableHLO หนึ่งใน Use Case หลักของพาสนี้คือการอนุญาตให้ตัวแปล StableHLO ประเมินโปรแกรมที่มีการดำเนินการปรับขนาด TOSA รายละเอียด
การประเมินโปรแกรมที่แปลงเป็นควอนไทซ์
โปรแกรมตีความอ้างอิง StableHLO สามารถเรียกใช้โปรแกรมที่มีการดำเนินการเชิงปริมาณได้อย่างมีประสิทธิภาพ โดยเริ่มจากการลดโปรแกรมให้อยู่ในรูปแบบที่เทียบเท่ากันโดยใช้เฉพาะการดำเนินการกับจำนวนเต็ม กระบวนการลดระดับนี้เกี่ยวข้องกับการส่งผ่านคอมไพเลอร์หลายครั้ง ซึ่งจะแปลงโปรแกรมก่อนการตีความ
โดยพื้นฐานแล้ว ตัวแปลจะใช้ประโยชน์จากstablehlo-legalize-quant-to-math
pass เพื่อแปลงการดำเนินการที่ผ่านการหาปริมาณให้เป็นการดำเนินการทางคณิตศาสตร์จำนวนเต็มที่เกี่ยวข้อง
การส่งผ่านนี้จะแนะนำการดำเนินการออกอากาศ CHLO สำหรับการจัดการ
การคูณ/การหารสเกลและการบวกจุดศูนย์ จากนั้นระบบจะแปลงการดำเนินการ CHLO เหล่านี้ให้เป็นการดำเนินการ StableHLO เพื่อให้มั่นใจว่า
จะเข้ากันได้กับอินเทอร์พรีเตอร์ StableHLO ซึ่งจะนำเสนอการดำเนินการที่เกี่ยวข้องกับรูปร่างซึ่งจะ
ได้รับการกำหนดรูปแบบมาตรฐานและเพิ่มประสิทธิภาพในภายหลังโดยใช้การกำหนดรูปแบบมาตรฐาน
หลายครั้ง
ลำดับการส่งผ่านทั้งหมดที่เกี่ยวข้องกับกระบวนการลดนี้มีดังนี้
stablehlo-legalize-quant-to-math
chlo-legalize-to-stablehlo
canonicalize
shape-legalize-to-stablehlo
stablehlo-canonicalize-dynamism
กรณีทดสอบที่ทำให้เล็กลง
StableHLO มีชุดกรณีทดสอบที่ครอบคลุมและมีการวัดปริมาณเพื่อตรวจสอบ ความถูกต้องและลักษณะการทำงานของการดำเนินการที่วัดปริมาณ กรณีทดสอบเหล่านี้ทำหน้าที่เป็น Unit Test ซึ่งครอบคลุมการดำเนินการ 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 กับ การใช้งานหรือเฟรมเวิร์กอื่นๆ
- การแก้ไขข้อบกพร่องและการพัฒนา: ช่วยในการพัฒนาและการแก้ไขข้อบกพร่องของฟีเจอร์การเพิ่มประสิทธิภาพหรือการเพิ่มประสิทธิภาพการวัดปริมาณใหม่ๆ