Trí tuệ nhân tạo
SGLang: Thực Thi Hiệu Quả Của Chương Trình Mô Hình Ngôn Ngữ Cấu Trúc
Các mô hình ngôn ngữ lớn (LLM) đang được sử dụng ngày càng nhiều cho các nhiệm vụ phức tạp đòi hỏi nhiều cuộc gọi tạo, kỹ thuật nhắc nhở tiên tiến, điều khiển luồng và đầu vào/đầu ra cấu trúc. Tuy nhiên, các hệ thống hiệu quả để lập trình và thực thi các ứng dụng này vẫn còn thiếu. SGLang, một hệ thống mới được giới thiệu, nhằm giải quyết vấn đề này bằng cách cung cấp thực thi hiệu quả của các chương trình mô hình ngôn ngữ phức tạp. SGLang bao gồm một ngôn ngữ frontend và một thời gian chạy. Frontend đơn giản hóa việc lập trình với các nguyên thủy cho tạo và kiểm soát song song, trong khi thời gian chạy tăng tốc thực thi thông qua các tối ưu hóa mới như RadixAttention cho tái sử dụng bộ nhớ đệm KV và máy trạng thái hữu hạn nén cho giải mã đầu ra cấu trúc nhanh hơn. Các thí nghiệm chứng minh rằng SGLang đạt được tốc độ cao hơn 6,4 lần so với các hệ thống suy luận trạng thái nghệ thuật trên các mô hình ngôn ngữ lớn và đa phương tiện khác nhau, giải quyết các nhiệm vụ như điều khiển tác nhân, lý luận logic, đánh giá học tập ít lần, giải mã JSON, đường ống tạo tăng cường thu hồi, và trò chuyện nhiều lượt.
Các tiến bộ gần đây trong khả năng của LLM đã mở rộng tiện ích của chúng, cho phép chúng xử lý một loạt các nhiệm vụ chung và hoạt động như các tác nhân tự chủ. Trong các ứng dụng này, LLM tham gia vào việc lập kế hoạch nhiều vòng, lý luận và tương tác với môi trường bên ngoài. Điều này được thực hiện thông qua việc sử dụng công cụ, nhiều phương thức nhập và các kỹ thuật nhắc nhở khác nhau, chẳng hạn như học tập ít lần, tự nhất quán, bộ xương của suy nghĩ và cây của suy nghĩ. Những trường hợp sử dụng mới này đòi hỏi nhiều cuộc gọi LLM phụ thuộc, thường chỉ ra xu hướng sử dụng cấu trúc nhiều cuộc gọi để hoàn thành các nhiệm vụ phức tạp.
Sự chuyển đổi này đánh dấu một sự chuyển đổi từ việc trò chuyện đơn giản sang việc sử dụng chương trình mô hình ngôn ngữ một cách tinh vi hơn, nơi các chương trình sắp xếp và kiểm soát các quá trình tạo của LLM. Những chương trình này được gọi là “Chương Trình Mô Hình Ngôn Ngữ” (LM Programs). Các kỹ thuật nhắc nhở tiên tiến và các công việc của tác nhân thuộc phạm vi của LM programs. Có hai thuộc tính chung của LM programs: (1) LM programs thường bao gồm nhiều cuộc gọi LLM xen kẽ với điều khiển luồng để hoàn thành các nhiệm vụ phức tạp và tăng cường chất lượng tổng thể. (2) LM programs nhận đầu vào cấu trúc và tạo ra đầu ra cấu trúc, cho phép sự kết hợp của LM programs và tích hợp vào các hệ thống phần mềm hiện có.
Trong bài viết này, chúng tôi sẽ đi sâu vào khuôn khổ SGLang, khám phá kiến trúc của nó, phân tích hiệu suất của nó và so sánh nó với các khuôn khổ trạng thái nghệ thuật. Vậy hãy bắt đầu.
Giới Thiệu Về SGLang
Mặc dù LM programs được sử dụng rộng rãi, nhưng các hệ thống hiện tại để thể hiện và thực thi chúng vẫn còn kém hiệu quả. SGLang xác định hai thách thức chính liên quan đến việc sử dụng hiệu quả LM programs:
- Phức Tạp Lập Trình: Phát triển LM programs là một nhiệm vụ khó khăn và tốn thời gian do tính chất không xác định của LLM. Điều này liên quan đến việc xử lý chuỗi rộng rãi, điều chỉnh thử nghiệm các nhắc nhở, phân tích đầu ra giòn, xử lý nhiều phương thức nhập và thực hiện các cơ chế song song. Phức tạp này làm giảm đáng kể khả năng đọc của thậm chí các chương trình đơn giản.
- Hiệu Suất Thi Hành: Thi hành LM programs là không hiệu quả do tính toán thừa và sử dụng bộ nhớ. Các hệ thống suy luận trạng thái nghệ thuật, được tối ưu hóa để giảm độ trễ và cải thiện tốc độ, thiếu kiến thức trực tiếp về tải trọng, dẫn đến các hiệu quả không đáng kể. Một ví dụ đáng chú ý là việc tái sử dụng bộ nhớ đệm KV, bao gồm các tensor trung gian có thể tái sử dụng cần thiết cho suy luận tạo. Các hệ thống hiện tại thiếu các cơ chế hiệu quả để tạo điều kiện cho việc tái sử dụng bộ nhớ đệm KV trên nhiều cuộc gọi LLM chia sẻ một tiền tố chung, dẫn đến các tính toán không cần thiết và lãng phí bộ nhớ. Ngoài ra, giải mã đầu ra cấu trúc bị hạn chế, chẳng hạn như chế độ JSON, là không tối ưu vì các hệ thống hiện tại chỉ giải mã một token tại một thời điểm.
Để giải quyết những thách thức này, SGLang giới thiệu một Ngôn Ngữ Tạo Cấu Trúc cho LLM. Ý tưởng cốt lõi là khai thác hệ thống nhiều cuộc gọi trong LM programs để thực thi hiệu quả. Như được hiển thị trong hình dưới đây, SGLang có hai phần: một ngôn ngữ frontend và một thời gian chạy backend.

Frontend đơn giản hóa việc lập trình của LM programs, và thời gian chạy tăng tốc thực thi của chúng. Những phần này có thể làm việc cùng nhau để đạt được hiệu suất tốt hơn hoặc hoạt động độc lập.
SGLang là một ngôn ngữ đặc biệt được nhúng trong Python, cung cấp các nguyên thủy cho tạo (ví dụ: extend, gen, select) và kiểm soát song song (ví dụ: fork, join). Nó tương thích với điều khiển luồng và thư viện của Python, cho phép người dùng phát triển các công việc nhắc nhở tiên tiến dễ dàng với cú pháp Python bản địa. SGLang bao gồm một trình thông dịch và một trình biên dịch. Trình thông dịch quản lý trạng thái nhắc nhở như một luồng và gửi các hoạt động nguyên thủy đến luồng cho thực thi không đồng bộ, đảm bảo kiểm soát đúng sự đồng bộ và song song trong chương trình. Ngoài ra, các chương trình SGLang có thể được theo dõi và biên dịch để tối ưu hóa thêm.
- RadixAttention: Kỹ thuật này cho phép tái sử dụng tự động bộ nhớ đệm KV trên nhiều cuộc gọi tạo. Trong các hệ thống suy luận hiện tại, bộ nhớ đệm KV của một yêu cầu được loại bỏ sau khi xử lý, ngăn chặn việc tái sử dụng trên nhiều cuộc gọi và làm chậm thực thi. SGLang duy trì một bộ nhớ đệm LRU của bộ nhớ đệm KV trong một cây radix, quản lý bộ nhớ đệm KV như một bộ nhớ đệm truyền thống và sử dụng cây radix cho việc khớp, chèn và loại bỏ hiệu quả. Điều này cho phép thời gian chạy xử lý các mẫu tái sử dụng khác nhau một cách hiệu quả.
- Compressed Finite State Machine: Kỹ thuật này cho phép giải mã đầu ra cấu trúc nhanh hơn. Các hệ thống hiện tại chỉ tuân theo các ràng buộc cho token tiếp theo, cho phép chúng giải mã một token tại một thời điểm. Thay vào đó, SGLang phân tích các ràng buộc và xây dựng một máy trạng thái hữu hạn nén để đại diện cho chúng, nén một đường dẫn nhiều token thành một bước đường dẫn khi có thể, cho phép giải mã nhiều token cùng một lúc để tăng tốc độ.
- API Speculative Execution: Đối với các mô hình API chỉ, như OpenAI’s GPT-4, SGLang giới thiệu thực thi suy đoán API để tối ưu hóa các chương trình nhiều cuộc gọi.
Sử dụng SGLang, các ứng dụng LLM khác nhau đã được thực hiện, bao gồm điều khiển tác nhân, lý luận logic, đánh giá học tập ít lần, giải mã JSON, đường ống tạo tăng cường thu hồi, trò chuyện nhiều lượt và xử lý đa phương tiện. Hiệu suất được thử nghiệm trên các mô hình bao gồm Llama-7B/70B, Mistral-8x7B, LLaVA-v1.5-7B (hình ảnh) và LLaVA-NeXT-34B (video) trên NVIDIA A10G và A100 GPUs. Kết quả thử nghiệm cho thấy SGLang đạt được tốc độ cao hơn 6,4 lần trên một loạt các tải trọng, mô hình và thiết lập phần cứng, so với các hệ thống lập trình và suy luận hiện tại, bao gồm Guidance, vLLM và LMQL.
SGLang: Mô Hình Lập Trình và Phương Pháp
Mô hình lập trình SGLang được giới thiệu thông qua một ví dụ chạy, mô tả các nguyên thủy ngôn ngữ và các chế độ thực thi, và phác thảo các cơ hội tối ưu hóa thời gian chạy. Mô hình này đơn giản hóa các hoạt động khó khăn trong các công việc nhiều cuộc gọi (ví dụ: xử lý chuỗi, gọi API, chỉ định ràng buộc, song song) bằng cách cung cấp các nguyên thủy linh hoạt và có thể kết hợp. SGLang là một ngôn ngữ đặc biệt được nhúng trong Python.

Hàm multi_dimensional_judge lấy ba đối số: `s`, `path`, và `essay`. s quản lý trạng thái nhắc nhở, path là đường dẫn tệp hình ảnh, và essay là văn bản bài luận. Các chuỗi mới và các nguyên thủy SGLang có thể được thêm vào trạng thái s để thực thi sử dụng toán tử +=. Đầu tiên, hàm thêm hình ảnh và bài luận vào nhắc nhở. Sau đó, nó kiểm tra xem bài luận có liên quan đến hình ảnh bằng cách chọn, lưu kết quả trong s[“related”]. Nếu liên quan, nhắc nhở được fork thành ba bản sao để đánh giá song song từ các chiều khác nhau, sử dụng gen để lưu kết quả trong f[“judgment”]. Tiếp theo, nó hợp nhất các phán quyết, tạo một bản tóm tắt và gán một điểm chữ. Cuối cùng, nó trả về kết quả trong định dạng JSON, tuân theo một lược đồ được xác định bởi một biểu thức chính quy regex. SGLang đơn giản hóa chương trình này, vì một chương trình tương đương sử dụng giao diện API OpenAI sẽ cần 2,1 lần số dòng mã do xử lý chuỗi và kiểm soát song song thủ công.
SGLang cung cấp các nguyên thủy để kiểm soát trạng thái nhắc nhở, tạo và song song, có thể được sử dụng với cú pháp và thư viện Python. Dưới đây là các nguyên thủy:
gen: Gọi một mô hình để tạo và lưu kết quả trong một biến có tên được chỉ định trong đối số đầu tiên. Nó hỗ trợ một đối số regex để ràng buộc đầu ra theo một ngữ pháp được định nghĩa bởi một biểu thức chính quy (ví dụ: một lược đồ JSON).
- select: Gọi một mô hình để chọn tùy chọn có xác suất cao nhất từ một danh sách.
- += hoặc extend: Thêm một chuỗi vào nhắc nhở.
- [variable_name]: Lấy kết quả của một tạo.
- fork: Tạo các fork song song của trạng thái nhắc nhở.
- join: Hợp nhất trạng thái nhắc nhở.
- hình ảnh và video: Nhận đầu vào hình ảnh và video.
Cách đơn giản nhất để thực thi một chương trình SGLang là thông qua một trình thông dịch, nơi một nhắc nhở được xử lý như một luồng không đồng bộ. Các nguyên thủy như extend, gen và select được gửi đến luồng cho thực thi không đồng bộ. Những cuộc gọi không đồng bộ này cho phép mã Python tiếp tục chạy mà không cần chờ đợi việc tạo hoàn thành, tương tự như việc khởi chạy các hạt nhân CUDA không đồng bộ. Mỗi nhắc nhở được quản lý bởi một trình thực thi luồng trong một luồng nền, cho phép song song trong chương trình. Việc lấy kết quả tạo sẽ bị chặn cho đến khi chúng sẵn sàng, đảm bảo sự đồng bộ hóa đúng.
Các hệ thống lập trình cho LLM có thể được phân loại thành cấp cao (ví dụ: LangChain, DSPy) và cấp thấp (ví dụ: LMQL, Guidance, SGLang). Các hệ thống cấp cao cung cấp các nhắc nhở được định nghĩa trước hoặc tự động tạo, chẳng hạn như bộ tối ưu hóa nhắc nhở của DSPy. Các hệ thống cấp thấp thường không thay đổi nhắc nhở nhưng cho phép thao tác trực tiếp với nhắc nhở và các nguyên thủy. SGLang là một hệ thống cấp thấp tương tự như LMQL và Guidance.

SGLang tập trung nhiều hơn vào hiệu suất thời gian chạy và đi kèm với thời gian chạy được thiết kế chung, cho phép các tối ưu hóa mới. Các ngôn ngữ cấp cao (ví dụ: DSPy) có thể được biên dịch sang các ngôn ngữ cấp thấp (ví dụ: SGLang). Việc tích hợp SGLang như một backend trong DSPy để đạt được hiệu suất thời gian chạy tốt hơn được chứng minh sau.

Ví dụ trên minh họa các hoạt động RadixAttention với chính sách loại bỏ LRU trên chín điểm thời gian,展示 sự tiến hóa động của cây radix để đáp ứng các yêu cầu khác nhau. Những yêu cầu này bao gồm hai phiên trò chuyện, một loạt các câu hỏi học tập ít lần, và lấy mẫu tự nhất quán.
SGLang: Đánh Giá và Kết Quả
Kết Quả Trên Mô Hình Mở Trọng Lượng
Kết quả độ trễ và tốc độ được hiển thị trong các hình dưới đây. SGLang cải thiện tốc độ lên đến 6,4 lần và giảm độ trễ lên đến 3,7 lần. Những cải thiện này là kết quả của việc tái sử dụng bộ nhớ đệm KV, khai thác song song trong một chương trình và giải mã đầu ra cấu trúc nhanh hơn.

Trên các điểm chuẩn này, tỷ lệ hit bộ nhớ đệm nằm trong khoảng từ 50% đến 99%. Hình 13 (Phụ lục) liệt kê các tỷ lệ hit bộ nhớ đệm đạt được và tối ưu cho tất cả chúng, cho thấy rằng việc lập lịch bộ nhớ đệm nhận thức của SGLang đạt đến 96% tỷ lệ hit tối ưu trung bình.

Kết Quả Trên Mô Hình Lớn Hơn Với Song Song Tensor
Các mô hình lớn hơn, Mixtral-8x7B và Llama-70B, đã được thử nghiệm với song song tensor trên cùng một tập hợp các điểm chuẩn, và kết quả được báo cáo trong hình dưới đây. Tốc độ trên các mô hình lớn hơn cho thấy một xu hướng tương tự như được quan sát trên các mô hình nhỏ hơn, cho thấy rằng tối ưu hóa của SGLang được tổng quát hóa tốt cho các mô hình lớn hơn. Guidance và LMQL đã bị bỏ qua do thiếu các triển khai hiệu quả của song song tensor.

Kết Quả Trên Mô Hình Đa Phương Tiện
SGLang có hỗ trợ bản địa cho các mô hình đa phương tiện với các nguyên thủy hình ảnh và video. Các tối ưu hóa trong bài viết này tương thích với các mô hình đa phương tiện. Đối với RadixAttention, băm của các hình ảnh đầu vào được tính toán và sử dụng làm khóa trong cây radix, cho phép tái sử dụng bộ nhớ đệm KV của các token hình ảnh từ cùng một hình ảnh. LLaVA-v1.5-7B (hình ảnh) đã được chạy trên llava-bench-in-the-wild và LLaVA-NeXT-34B (video) trên ActivityNet. Vì những mô hình này không được hỗ trợ tốt bởi các hệ thống baseline khác, việc thực hiện ban đầu của các tác giả mô hình trong Hugging Face Transformers đã được sử dụng làm baseline. Như được hiển thị trong bảng dưới đây, SGLang cung cấp tốc độ lên đến 6 lần cao hơn trên các điểm chuẩn này. Trong llava-bench-in-the-wild, nhiều câu hỏi về cùng một hình ảnh đã được xử lý, và thời gian chạy SGLang đã tái sử dụng bộ nhớ đệm KV trong trường hợp này.

Triển Khai Sản Xuất
SGLang đã được triển khai trong Chatbot Arena để phục vụ các mô hình mở trọng lượng. Do lưu lượng thấp cho một số mô hình, chỉ một công nhân SGLang phục vụ mỗi mô hình. Sau một tháng, tỷ lệ hit bộ nhớ đệm RadixAttention 52,4% cho LLaVA-Next-34B và 74,1% cho Vicuna-33B đã được quan sát. Các hit bộ nhớ đệm đến từ các thông điệp hệ thống chung, các hình ảnh ví dụ được tái sử dụng thường xuyên và các lịch sử trò chuyện nhiều lượt. Điều này đã giảm độ trễ token đầu tiên trung bình 1,7 lần cho Vicuna-33B.

Suy Nghĩ Cuối Cùng
Trong bài viết này, chúng tôi đã nói về SGLang, một hệ thống mới được giới thiệu, nhằm giải quyết vấn đề này bằng cách cung cấp thực thi hiệu quả của các chương trình mô hình ngôn ngữ phức tạp. SGLang bao gồm một ngôn ngữ frontend và một thời gian chạy backend. Frontend đơn giản hóa việc lập trình với các nguyên thủy cho tạo và kiểm soát song song, trong khi thời gian chạy tăng tốc thực thi thông qua các tối ưu hóa mới như RadixAttention cho tái sử dụng bộ nhớ đệm KV và máy trạng thái hữu hạn nén cho giải mã đầu ra cấu trúc nhanh hơn. Các thí nghiệm chứng minh rằng SGLang đạt được tốc độ cao hơn 6,4 lần so với các hệ thống suy luận trạng thái nghệ thuật trên các mô hình ngôn ngữ lớn và đa phương tiện khác nhau, giải quyết các nhiệm vụ như điều khiển tác nhân, lý luận logic, đánh giá học tập ít lần, giải mã JSON, đường ống tạo tăng cường thu hồi, và trò chuyện nhiều lượt.












