โมเดลและแพลตฟอร์ม AI

SGLang: การดำเนินการแบบมีประสิทธิภาพของโปรแกรมโมเดลภาษาที่มีโครงสร้าง

mm
เพิ่ม Unite.AI ลงในแหล่งข้อมูลที่คุณต้องการบน Google

โมเดลภาษาขนาดใหญ่ (LLMs) ถูกใช้มากขึ้นสำหรับงานที่ซับซ้อนซึ่งต้องการการเรียกใช้หลายครั้ง เทคนิคการกระตุ้นที่ซับซ้อน การควบคุมการไหล และการเข้า/ออกที่มีโครงสร้าง อย่างไรก็ตาม ระบบที่มีประสิทธิภาพสำหรับการเขียนโปรแกรมและดำเนินการแอปพลิเคชันเหล่านี้ยังขาดไป SGLang ซึ่งเป็นระบบที่แนะนำใหม่ มีเป้าหมายที่จะแก้ไขปัญหานี้โดยการให้การดำเนินการแบบมีประสิทธิภาพของโปรแกรมโมเดลภาษาที่ซับซ้อน SGLang ประกอบด้วยภาษาหน้าจอและรันไทม์ ภาษาหน้าจอทำให้การเขียนโปรแกรมง่ายขึ้นด้วยตัวช่วยสำหรับการสร้างและควบคุมความขนาน รันไทม์เร่งการดำเนินการผ่านการปรับให้เหมาะสมที่ใหม่ เช่น RadixAttention สำหรับการใช้ซ้ำ KV cache และเครื่องจักรสถานะจำกัดที่บีบอัดสำหรับการถอดรหัสการออกที่มีโครงสร้างที่เร็วขึ้น การทดลองแสดงให้เห็นว่า SGLang สามารถบรรลุประสิทธิภาพสูงถึง 6.4 เท่าเมื่อเทียบกับระบบการอนุมานรัฐของการทำงานบนโมเดลภาษาขนาดใหญ่และหลายรูปแบบที่หลากหลาย โดยจัดการกับงานดังกล่าว เช่น การควบคุมเอเย่นต์ การให้เหตุผลเชิงตรรกะ การทดสอบการเรียนรู้แบบไม่มากนัก JSON การถอดรหัส การสร้างที่เพิ่มขึ้นโดยการค้นหา และการแชทแบบหลายรอบ

ความก้าวหน้าล่าสุดในความสามารถของ LLMs ได้ขยายความสามารถของพวกมัน ทำให้สามารถจัดการกับงานทั่วไปได้หลากหลายขึ้น และทำงานเป็นตัวแทนอิสระได้ ในแอปพลิเคชันเหล่านี้ LLMs มีส่วนร่วมในการวางแผนหลายรอบ การให้เหตุผล และการโต้ตอบกับสภาพแวดล้อมภายนอก สิ่งนี้ได้รับการอำนวยความสะดวกผ่านการใช้เครื่องมือ การรับข้อมูลหลายรูปแบบ และเทคนิคการกระตุ้นที่หลากหลาย เช่น การเรียนรู้แบบไม่มากนัก ความสอดคล้องภายในตัวเอง โครงร่างความคิด และต้นไม้ความคิด การใช้งานใหม่เหล่านี้ต้องการการเรียกใช้ LLMs หลายครั้ง ซึ่งมักจะขึ้นอยู่กันและกัน โดยบ่งบอกถึงแนวโน้มในการใช้โครงสร้างหลายครั้งในการทำงานที่ซับซ้อน

การเปลี่ยนแปลงนี้แสดงถึงการเปลี่ยนแปลงจากการแชทแบบง่ายๆ ไปสู่การใช้งานแบบโปรแกรมมาติกที่ซับซ้อนของ LLMs โดยที่โปรแกรมจัดตารางและควบคุมกระบวนการสร้างของ LLMs โปรแกรมเหล่านี้เรียกว่า “โปรแกรมโมเดลภาษา” (LM Programs) เทคนิคการกระตุ้นที่ซับซ้อนและワークフโลว์ของเอเย่นต์อยู่ภายใต้ขอบเขตของโปรแกรม LM มีคุณสมบัติทั่วไปสองประการของโปรแกรม LM: (1) โปรแกรม LM มักจะเกี่ยวข้องกับการเรียกใช้ LLMs หลายครั้งซึ่งแทรกอยู่กับการไหลของการควบคุมเพื่อทำงานที่ซับซ้อนและเพิ่มคุณภาพโดยรวม (2) โปรแกรม LM รับข้อมูลเข้าที่มีโครงสร้างและผลิตข้อมูลออกที่มีโครงสร้าง ทำให้สามารถประกอบโปรแกรม LM และรวมเข้ากับระบบซอฟต์แวร์ที่มีอยู่

ในบทความนี้ เราจะมาดูกรอบงาน SGLang อย่างลึกซึ้ง โดยสำรวจโครงสร้าง วิเคราะห์ประสิทธิภาพ และเปรียบเทียบกับกรอบงานรัฐของการทำงาน เรามาเริ่มกันเลย

การแนะนำ SGLang

尽管การใช้โปรแกรม LM อย่างแพร่หลาย ระบบปัจจุบันสำหรับการแสดงออกและการดำเนินการยังคงไม่มีประสิทธิภาพ SGLang ระบุความท้าทายหลักสองประการเกี่ยวกับการใช้โปรแกรม LM อย่างมีประสิทธิภาพ:

  • ความซับซ้อนของการเขียนโปรแกรม: การพัฒนาโปรแกรม LM นั้นยากและซับซ้อนเนื่องจากธรรมชาติที่ไม่แน่นอนของ LLMs ซึ่งรวมถึงการดัดแปลงสตริงอย่างกว้างขวาง การปรับแต่งการกระตุ้นอย่างทดลอง การวิเคราะห์ผลลัพธ์ที่ไม่แน่นอน การจัดการข้อมูลเข้าหลายรูปแบบ และการนำการขนานมาใช้ ความซับซ้อน nàyลดความอ่านง่ายของโปรแกรมแม้แต่โปรแกรมที่ง่ายที่สุด
  • ความไม่มีประสิทธิภาพในการดำเนินการ: การดำเนินการโปรแกรม LM นั้นไม่มีประสิทธิภาพเนื่องจากการคำนวณซ้ำและการใช้หน่วยความจำ ระบบการอนุมานรัฐของการทำงานที่ได้รับการปรับให้เหมาะสมเพื่อลดความล่าช้าและปรับปรุงประสิทธิภาพขาดความรู้โดยตรงเกี่ยวกับงาน ทำให้เกิดความไม่มีประสิทธิภาพอย่างมีนัยสำคัญ ตัวอย่างที่เห็นได้ชัดคือการนำ KV cache มาใช้ซ้ำ ซึ่งประกอบด้วยเทนเซอร์กลางที่สามารถนำกลับมาใช้ใหม่ได้สำหรับการอนุมานที่สร้างขึ้น ระบบปัจจุบันขาดกลไกที่มีประสิทธิภาพในการอำนวยความสะดวกในการนำ KV cache มาใช้ซ้ำระหว่างการเรียกใช้ LLMs หลายครั้งที่มีคำนำร่วมกัน ทำให้เกิดการคำนวณที่ไม่จำเป็นและหน่วยความจำที่สูญเปล่า นอกจากนี้ การถอดรหัสที่จำกัดสำหรับการออกที่มีโครงสร้าง เช่น โหมด JSON ยังไม่เหมาะสม เนื่องจากระบบที่มีอยู่สามารถถอดรหัสโทเค็นเพียงโทเค็นเดียวในแต่ละครั้ง

เพื่อแก้ไขความท้าทายเหล่านี้ SGLang นำเสนอภาษา Structured Generation สำหรับ LLMs ความคิดหลักคือการเอาโครงสร้างหลายครั้งในโปรแกรม LM มาใช้สำหรับการดำเนการที่มีประสิทธิภาพ ตามที่แสดงในตัวอย่างต่อไปนี้ SGLang มีส่วนประกอบสองส่วน: ภาษาหน้าจอและรันไทม์

ภาษาหน้าจอทำให้การเขียนโปรแกรม LM ง่ายขึ้น และรันไทม์เร่งการดำเนินการ ส่วนเหล่านี้สามารถทำงานร่วมกันเพื่อประสิทธิภาพที่ดีขึ้นหรือทำงานอิสระ SGLang เป็นภาษาเฉพาะโดเมนที่ฝังอยู่ใน Python โดยให้ตัวช่วยสำหรับการสร้าง (เช่น extend, gen, select) และการควบคุมความขนาน (เช่น fork, join) มันเข้ากันได้กับการไหลของการควบคุมและไลบรารีของ Python ทำให้ผู้ใช้สามารถพัฒนากระบวนการการกระตุ้นที่ซับซ้อนได้อย่างง่ายดายด้วยวากยสั่ง Python ที่เป็นเนทีฟ SGLang มีตัวตีความและตัวคอมไพล์ ตัวตีความจัดการสถานะการกระตุ้นเป็นลำดับและยื่นการดำเนินต่างๆ ให้กับลำดับสำหรับการดำเนินการแบบไม่บล็อก ทำให้แน่ใจว่ามีการควบคุมที่เหมาะสมเกี่ยวกับการสynchronisation และความขนานภายในโปรแกรม นอกจากนี้ โปรแกรม SGLang สามารถถูกติดตามและคอมไพล์สำหรับการปรับให้เหมาะสมเพิ่มเติม รันไทม์ของ SGLang เสนอการปรับให้เหมาะสมใหม่ๆ เพื่อเร่งการดำเนินการของโปรแกรม LM:

  • RadixAttention: เทคนิคนี้ทำให้สามารถนำ KV cache มาใช้ซ้ำระหว่างการเรียกใช้ LLMs หลายครั้งได้ ในระบบการอนุมานรัฐของการทำงานที่มีอยู่ KV cache ของคำขอจะถูกทิ้งหลังจากระบุผล ทำให้ไม่สามารถนำกลับมาใช้ซ้ำระหว่างการเรียกใช้ LLMs หลายครั้งที่มีคำนำร่วมกัน และทำให้การดำเนินการช้าลง SGLang รักษา LRU cache ของ KV cache ภายในต้นไม้ราดิกซ์ โดยจัดการ KV cache เช่นเดียวกับแคชแบบดั้งเดิม และใช้ต้นไม้ราดิกซ์สำหรับการจับคู่ การแทรก และการขับออกอย่างมีประสิทธิภาพ ทำให้รันไทม์สามารถจัดการรูปแบบการนำกลับมาใช้ซ้ำที่หลากหลายได้อย่างมีประสิทธิภาพ
  • Compressed Finite State Machine: เทคนิคนี้ทำให้การถอดรหัสที่จำกัดสำหรับการออกที่มีโครงสร้างเร็วขึ้น ระบบที่มีอยู่ติดตามข้อจำกัดเพียงสำหรับโทเค็นถัดไป ทำให้สามารถถอดรหัสได้เพียงโทเค็นเดียวในแต่ละครั้ง SGLang วิเคราะห์ข้อจำกัดและสร้างเครื่องจักรสถานะจำกัดที่บีบอัดเพื่อแสดงข้อจำกัด โดยบีบอัดเส้นทางหลายโทเค็นให้เป็นเส้นทางเดียวเมื่อเป็นไปได้ ทำให้สามารถถอดรหัสหลายโทเค็นได้ในคราวเดียวสำหรับความเร็วที่เร็วขึ้น
  • API Speculative Execution: สำหรับโมเดล API เช่น OpenAI’s GPT-4 SGLang นำเสนอการดำเนินการแบบคาดเดา API เพื่อปรับให้เหมาะสมสำหรับโปรแกรมหลายครั้ง

โดยใช้ SGLang แอปพลิเคชัน LLMs หลากหลายถูกนำไปใช้ รวมถึงการควบคุมเอเย่นต์ การให้เหตุผลเชิงตรรกะ การทดสอบการเรียนรู้แบบไม่มากนัก การถอดรหัส JSON การสร้างที่เพิ่มขึ้นโดยการค้นหา การแชทแบบหลายรอบ และการประมวลผลแบบหลายรูปแบบ ประสิทธิภาพถูกทดสอบบนโมเดล รวมถึง Llama-7B/70B, Mistral-8x7B, LLaVA-v1.5-7B (รูปภาพ) และ LLaVA-NeXT-34B (วิดีโอ) บน GPU NVIDIA (NVDA ) A10G และ A100 ผลการทดลองแสดงให้เห็นว่า SGLang สามารถบรรลุประสิทธิภาพสูงถึง 6.4 เท่าเมื่อเทียบกับระบบการเขียนโปรแกรมและการอนุมานที่มีอยู่ รวมถึง Guidance, vLLM และ LMQL

SGLang: โมเดลการเขียนโปรแกรมและวิธีการ

โมเดลการเขียนโปรแกรม SGLang ถูกนำเสนอผ่านตัวอย่างที่ทำงาน โดยอธิบายภาษาและโหมดการดำเนินการที่มีประสิทธิภาพ โมเดลนี้ทำให้การดำเนินการที่ซับซ้อนในワークフローหลายครั้ง (เช่น การดัดแปลงสตริง การเรียกใช้ API การกำหนดข้อจำกัด การควบคุมความขนาน) ง่ายขึ้นโดยการให้ตัวช่วยที่ยืดหยุ่นและประกอบได้ SGLang เป็นภาษาเฉพาะโดเมนที่ฝังอยู่ใน Python

ฟังก์ชัน multi_dimensional_judge รับสามอาร์กิวเมนต์: `s`, `path` และ `essay` s จัดการสถานะการกระตุ้น path คือเส้นทางไฟล์รูปภาพ และ essay คือข้อความเรียงความ ใหม่สตริงและตัวช่วย SGLang สามารถถูกเพิ่มเข้ากับสถานะ s สำหรับการดำเนินการแบบไม่บล็อกโดยใช้การดำเนินการ += การเรียกใช้แบบไม่บล็อกเหล่านี้ทำให้โค้ด Python สามารถดำเนินการต่อได้โดยไม่ต้องรอการสร้างให้เสร็จสิ้น

SGLang ให้ตัวช่วยสำหรับการควบคุมสถานะการกระตุ้น การสร้าง และการควบคุมความขนาน ต่อไปนี้คือตัวช่วย:

gen: เรียกใช้โมเดลเพื่อสร้างและจัดเก็บผลลัพธ์ในตัวแปรที่มีชื่อตามที่ระบุในอาร์กิวเมนต์แรก มันรองรับอาร์กิวเมนต์ regex เพื่อจำกัดผลลัพธ์ให้ปฏิบัติตามไวยากรณ์ที่กำหนดโดยนิพจน์ปกติ (เช่น สกีม่า JSON)

  • select: เรียกใช้โมเดลเพื่อเลือกตัวเลือกที่มีความน่าจะเป็นสูงสุดจากรายการ
  • += หรือ extend: เพิ่มสตริงเข้ากับการกระตุ้น
  • [variable_name]: ดึงผลลัพธ์ของการสร้าง
  • fork: สร้างการขนานของสถานะการกระตุ้น
  • join: รวมสถานะการกระตุ้น
  • image และ video: รับข้อมูลเข้ารูปภาพและวิดีโอ

วิธีที่ง่ายที่สุดในการดำเนินการโปรแกรม SGLang คือผ่านตัวตีความ โดยที่การกระตุ้นถูกมองว่าเป็นลำดับที่ไม่บล็อก ตัวช่วยเช่น extend, gen และ select ถูกส่งไปยังลำดับสำหรับการดำเนินการแบบไม่บล็อก การเรียกใช้แบบไม่บล็อกเหล่านี้ทำให้โค้ด Python สามารถดำเนินการต่อได้โดยไม่ต้องรอการสร้างให้เสร็จสิ้น

ระบบการเขียนโปรแกรมสำหรับ LLMs สามารถแบ่งออกเป็นสองประเภท: ระดับสูง (เช่น LangChain, DSPy) และระดับต่ำ (เช่น LMQL, Guidance, SGLang) ระบบระดับสูงให้การกระตุ้นที่กำหนดไว้ล่วงหน้าหรือที่สร้างโดยอัตโนมัติ ระบบระดับต่ำไม่เปลี่ยนการกระตุ้น แต่อนุญาตให้ควบคุมการกระตุ้นและตัวช่วยโดยตรง SGLang เป็นระบบระดับต่ำที่คล้ายกับ LMQL และ Guidance

SGLang มุ่งเน้นไปที่ประสิทธิภาพรันไทม์มากขึ้น และมีรันไทม์ที่ออกแบบมาเพื่อทำงานร่วมกัน ซึ่งช่วยให้สามารถปรับให้เหมาะสมใหม่ๆ ได้ ระบบระดับสูงสามารถถูกคอมไพล์เป็นระบบระดับต่ำ (เช่น SGLang) ได้ การผสมผสาน SGLang เป็นแบ็คเอนด์ใน DSPy สำหรับประสิทธิภาพรันไทม์ที่ดีขึ้นได้รับการแสดง

ตัวอย่างด้านบนแสดงการดำเนินการ RadixAttention โดยมีนโยบายการขับออก LRU ในเก้าจุดเวลา โดยแสดงการเปลี่ยนแปลงของต้นไม้ราดิกซ์ในการตอบสนองต่อคำขอที่หลากหลาย ซึ่งรวมถึงเซสชันแชทสองเซสชัน ชุดคำถามการเรียนรู้แบบไม่มากนัก และการวาดตัวอย่างสำหรับการกระตุ้นที่สอดคล้องกันเอง

SGLang: การประเมินและการทดสอบ

ผลลัพธ์บนโมเดลที่เปิดเผย

ผลลัพธ์ของความล่าช้าและประสิทธิภาพถูกแสดงในตารางต่อไปนี้ SGLang ปรับปรุงประสิทธิภาพสูงถึง 6.4 เท่าและลดความล่าช้าลงสูงสุด 3.7 เท่า การปรับปรุงเหล่านี้เป็นผลมาจากการนำ KV cache มาใช้ซ้ำ การใช้ประโยชน์จากความขนานภายในโปรแกรมเดียว และการถอดรหัสที่จำกัดที่เร็วขึ้น

ในงานทดสอบเหล่านี้ อัตราการถูกของแคชอยู่ในช่วงตั้งแต่ 50% ถึง 99% ตาราง 13 (ในภาคผนวก) แสดงอัตราการถูกของแคชที่ได้รับและอัตราที่เหมาะสมที่สุดสำหรับงานทดสอบทั้งหมด โดยแสดงให้เห็นว่าการกำหนดตารางการทำงานที่ตระหนักถึงแคชของ SGLang เข้าใกล้อัตราการถูกของแคชที่เหมาะสมที่สุด 96% โดยเฉลี่ย

ผลลัพธ์บนโมเดลที่ใหญ่ขึ้นด้วยความขนานของเทนเซอร์

โมเดลที่ใหญ่กว่า เช่น Mixtral-8x7B และ Llama-70B ถูกทดสอบด้วยความขนานของเทนเซอร์บนชุดงานทดสอบเดียวกัน และผลลัพธ์ถูกรายงานในตารางต่อไปนี้ การเพิ่มความเร็วบนโมเดลที่ใหญ่กว่าแสดงแนวโน้มที่คล้ายกับที่สังเกตเห็นในโมเดลที่เล็กกว่า โดยบ่งชี้ว่าการปรับให้เหมาะสมของ SGLang ขยายได้ดีไปยังโมเดลที่ใหญ่กว่า Guidance และ LMQL ถูก省略เนื่องจากการขาดการนำไปใช้ที่มีประสิทธิภาพของความขนานของเทนเซอร์

ผลลัพธ์บนโมเดลหลายรูปแบบ

SGLang มีการสนับสนุนโมเดลหลายรูปแบบโดยตรงด้วยตัวช่วยรูปภาพและวิดีโอ การปรับให้เหมาะสมในบทความนี้เข้ากันได้กับโมเดลหลายรูปแบบ สำหรับ RadixAttention เฮชของโทเค็นรูปภาพถูกคำนวณและใช้เป็นคีย์ในต้นไม้ราดิกซ์ ทำให้สามารถนำ KV cache ของโทเค็นรูปภาพที่เหมือนกันมาใช้ซ้ำได้ LLaVA-v1.5-7B (รูปภาพ) ถูกทดสอบบน llava-bench-in-the-wild และ LLaVA-NeXT-34B (วิดีโอ) บน ActivityNet เนื่องจากโมเดลเหล่านี้ไม่ได้รับการสนับสนุนอย่างดีจากระบบที่เปรียบเทียบ เราจึงใช้การนำไปใช้ของ Hugging Face Transformers ของผู้สร้างโมเดลเป็นระบบที่เปรียบเทียบ ตามที่แสดงในตารางต่อไปนี้ SGLang ให้ประสิทธิภาพสูงถึง 6 เท่าบนงานทดสอบเหล่านี้

การนำไปใช้ในการผลิต

SGLang ถูกนำไปใช้ใน Chatbot Arena เพื่อเสิร์ฟโมเดลที่เปิดเผย เนื่องจากการจราจรต่ำสำหรับบางโมเดล จึงมีเพียง SGLang หนึ่งอันเท่านั้นที่เสิร์ฟแต่ละโมเดล หลังจากหนึ่งเดือน อัตราการถูกของแคช RadixAttention 52.4% สำหรับ LLaVA-Next-34B และ 74.1% สำหรับ Vicuna-33B ถูกสังเกตเห็น การถูกของแคชมาจากข้อความระบบทั่วไป รูปภาพตัวอย่างที่ใช้ซ้ำบ่อยๆ และประวัติการแชทหลายรอบ ทำให้ลดความล่าช้าในการสร้างโทเค็นแรกโดยเฉลี่ย 1.7 เท่าสำหรับ Vicuna-33B

ความคิดสุดท้าย

ในบทความนี้ เราได้พูดถึง SGLang ซึ่งเป็นระบบที่แนะนำใหม่ มีเป้าหมายที่จะแก้ไขปัญหานี้โดยการให้การดำเนินการแบบมีประสิทธิภาพของโปรแกรมโมเดลภาษาที่ซับซ้อน SGLang ประกอบด้วยภาษาหน้าจอและรันไทม์ ภาษาหน้าจอทำให้การเขียนโปรแกรมง่ายขึ้นด้วยตัวช่วยสำหรับการสร้างและควบคุมความขนาน รันไทม์เร่งการดำเนินการผ่านการปรับให้เหมาะสมที่ใหม่ เช่น RadixAttention สำหรับการใช้ซ้ำ KV cache และเครื่องจักรสถานะจำกัดที่บีบอัดสำหรับการถอดรหัสการออกที่มีโครงสร้างที่เร็วขึ้น การทดลองแสดงให้เห็นว่า SGLang สามารถบรรลุประสิทธิภาพสูงถึง 6.4 เท่าเมื่อเทียบกับระบบการอนุมานรัฐของการทำงานบนโมเดลภาษาขนาดใหญ่และหลายรูปแบบที่หลากหลาย โดยจัดการกับงานดังกล่าว เช่น การควบคุมเอเย่นต์ การให้เหตุผลเชิงตรรกะ การทดสอบการเรียนรู้แบบไม่มากนัก JSON การถอดรหัส การสร้างที่เพิ่มขึ้นโดยการค้นหา และการแชทแบบหลายรอบ

Kunal Kejriwal เป็นวิศวกรแบ็กเอนด์ที่เชี่ยวชาญด้าน Python, PostgreSQL, Redis และโครงสร้างพื้นฐานคลาวด์บน GCP และ AWS. ด้วยประสบการณ์สามปีในการสร้างและขยายระบบการผลิต เขาเขียนเกี่ยวกับโครงสร้างพื้นฐาน AI, ระบบกระจาย, และสถาปัตยกรรมที่อยู่เบื้องหลังการปรับใช้งานแมชชีนเลิร์นนิง