Trí tuệ nhân tạo
SGLang: Thực Hiện Hiệu Quả 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 ngày càng được sử dụng cho các nhiệm vụ phức tạp đòi hỏi nhiều cuộc gọi tạo, các kỹ thuật nhắc nhở tiên tiến, kiểm soát luồng và đầu vào/đầu ra cấu trúc. Tuy nhiên, các hệ thống hiệu quả cho việc lập trình và thực hiện các ứng dụng này đang thiếu. SGLang, một hệ thống mới được giới thiệu, nhằm giải quyết điều này bằng cách cung cấp thực hiện hiệu quả 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ữ phía trước và một thời gian chạy. Phía trước đơn giản hóa việc lập trình với các nguyên tắc cho tạo và kiểm soát song song, trong khi thời gian chạy tăng tốc thực hiện thông qua các tối ưu hóa mới như RadixAttention để tái sử dụng bộ nhớ đệm KV và máy trạng thái hữu hạn nén để 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ới 6,4× hiệu suất cao hơ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ữ và đa phương tiện lớn khác nhau, giải quyết các nhiệm vụ như kiểm soát tác nhân, lý luận logic, chuẩn mực học ít lần, giải mã JSON, đường ống tạo tăng cường và trò chuyện nhiều lượt.
Những 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 rộng lớn hơn 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 đầu vào và các kỹ thuật nhắc nhở khác nhau, chẳng hạn như học ít lần, tự nhất quán, khung suy nghĩ và cây suy nghĩ. Những trường hợp sử dụng mới này đòi hỏi nhiều cuộc gọi tạo LLM phụ thuộc, cho thấy 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ự thay đổ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 lên lịch 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 liên quan đến nhiều cuộc gọi LLM xen kẽ với kiểm soát 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 SGLang
Mặc dù LM programs được sử dụng rộng rãi, các hệ thống hiện tại cho việc thể hiện và thực hiện 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ụ nhàm chán và khó khăn do bản 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 nhắc nhở thử nghiệm, phân tích đầu ra giòn, xử lý nhiều phương thức đầu vào và thực hiện các cơ chế song song. Phức tạp này 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 Thực Hiện: Thực hiện LM programs là không hiệu quả do tính toán và sử dụng bộ nhớ dư thừa. Các động cơ suy luận trạng thái nghệ thuật, được tối ưu hóa để giảm độ trễ và cải thiện hiệu suất, thiếu kiến thức trực tiếp về tải trọng, dẫn đến sự không hiệu quả đáng kể. Một ví dụ đáng chú ý là tái sử dụng bộ nhớ đệm Key-Value (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ơ chế hiệu quả để促 tiến 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 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, 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 cấu trúc nhiều cuộc gọi trong LM programs cho thực hiện hiệu quả. Như được hiển thị trong hình dưới đây, SGLang có hai phần: một ngôn ngữ phía trước và một thời gian chạy phía sau.

Phía trước đơ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 hiện của chúng. Cả hai phần có thể làm việc cùng nhau cho 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 tắc 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 luồng kiểm soát 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 tắc đến luồng cho thực hiện không đồng bộ, đảm bảo kiểm soát đúng về同步 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 động cơ 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 tái sử dụng trên nhiều cuộc gọi và làm chậm thực hiện. 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ả.
- Máy Trạng Thái Hữu Hạn Nén: 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, làm cho chúng chỉ có thể 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 độ.
- Thực Hiện API Tương Lai: Đối với các mô hình chỉ có API như OpenAI’s GPT-4, SGLang giới thiệu thực hiện API tương lai để 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 kiểm soát tác nhân, lý luận logic, chuẩn mực học ít lần, giải mã JSON, đường ống tạo tăng cường và trò chuyện nhiều lượt. Hiệu suất được kiểm tra 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 GPU NVIDIA A10G và A100. Kết quả thí nghiệm cho thấy SGLang đạt được tới 6,4× hiệu suất cao hơ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 tắc ngôn ngữ và các chế độ thực hiện của nó, 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 nhàm chá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 tắc 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 tắc SGLang có thể được thêm vào trạng thái s để thực hiện bằng cách 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 sử dụng select, lưu kết quả trong s[“related”]. Nếu liên quan, nhắc nhở được chia 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, theo một lược đồ được định nghĩa bởi một ràng buộc biểu thức chính quy regex. SGLang đơn giản hóa chương trình này rất nhiều, vì một chương trình tương đương sử dụng giao diện API OpenAI sẽ cần 2,1× nhiều 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 tắc cho việc 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 Python và thư viện. Dưới đây là các nguyên tắc:
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 của 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 bản sao song song của trạng thái nhắc nhở.
- join: Hợp nhất lại trạng thái nhắc nhở.
- image và video: Nhận đầu vào hình ảnh và video.
Cách đơn giản nhất để thực hiện 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 coi là một luồng không đồng bộ. Các nguyên tắc như extend, gen và select được gửi đến luồng cho thực hiện không đồng bộ, cho phép mã Python tiếp tục chạy mà không cần chờ tạo xong, tương tự như việc khởi động 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 hiện 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 chính xác. Ngoài ra, các chương trình SGLang có thể được biên dịch thành các đồ thị tính toán và thực hiện với một trình thực hiện đồ thị, cho phép tối ưu hóa thêm.
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ư trình tối ưu 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 tắc. SGLang là một hệ thống cấp thấp tương tự như LMQL và Guidance. Bảng dưới đây so sánh các tính năng của chúng.

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 thành 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 để cải thiện hiệu suất thời gian chạy đượ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 lô các yêu cầu học ít lần, và lấy mẫu tự nhất quán. Mỗi cạnh của cây mang một nhãn biểu thị một chuỗi con hoặc một chuỗi token. Các nút được mã màu để phản ánh các trạng thái khác nhau: xanh lá cây cho các nút mới được thêm, xanh da trời cho các nút được truy cập trong thời điểm và đỏ cho các nút đã bị loại bỏ.
Bước 1: Cây radix ban đầu là trống.
Bước 2: Máy chủ xử lý một thông điệp người dùng đến “Xin chào” và trả lời với đầu ra LLM “Xin chào!”. Nhắc nhở hệ thống “Bạn là một trợ lý hữu ích”, thông điệp người dùng “Xin chào!” và trả lời LLM “Xin chào!” được hợp nhất vào cây như một cạnh đơn liên kết với một nút mới.
Bước 3: Một nhắc nhở mới đến và máy chủ tìm thấy tiền tố của nhắc nhở (tức là lượt đầu tiên của cuộc trò chuyện) trong cây radix và tái sử dụng bộ nhớ đệm KV của nó. Lượt mới được thêm vào cây như một nút mới.
Bước 4: Một phiên trò chuyện mới bắt đầu. Nút từ Bước 3 được chia thành hai nút để cho phép hai phiên trò chuyện chia sẻ nhắc nhở hệ thống.
Bước 5: Phiên trò chuyện thứ hai tiếp tục. Tuy nhiên, do giới hạn bộ nhớ, một nút từ Bước 4 phải bị loại bỏ. Lượt mới được thêm vào sau nút còn lại từ Bước 4.
Bước 6: Máy chủ nhận một yêu cầu học ít lần, xử lý nó và chèn nó vào cây. Nút gốc được chia vì yêu cầu mới không chia sẻ tiền tố với các nút hiện có.
Bước 7: Máy chủ nhận một lô yêu cầu học ít lần bổ sung. Những yêu cầu này chia sẻ cùng một tập các ví dụ ít lần, vì vậy một nút từ Bước 6 được chia để cho phép chia sẻ.
Bước 8: Máy chủ nhận một thông điệp mới từ phiên trò chuyện đầu tiên. Nó loại bỏ tất cả các nút từ phiên trò chuyện thứ hai vì chúng là những nút ít được sử dụng gần đây nhất.
Bước 9: Máy chủ nhận một yêu cầu lấy mẫu nhiều câu trả lời hơn cho các câu hỏi trong một nút từ Bước 8, có thể là để nhắc nhở tự nhất quán. Để tạo không gian cho những yêu cầu này, nhiều nút được loại bỏ.
Ví dụ này minh họa cách RadixAttention xử lý việc phân bổ và loại bỏ động các nút trong cây radix để đáp ứng các yêu cầu khác nhau, đảm bảo tái sử dụng bộ nhớ đệm KV hiệu quả và quản lý bộ nhớ.
SGLang: Đánh Giá và Kết Quả
Kết Quả Trên Các Mô Hình Mở Trọng Lượng
Kết quả độ trễ và hiệu suất được hiển thị trong các hình dưới đây. SGLang cải thiện hiệu suất lên tới 6,4× và giảm độ trễ lên tới 3,7×. 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 đơn và giải mã đầu ra cấu trúc nhanh hơn.

Trên các chuẩn mực 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ả, cho thấy rằng việc lập lịch bộ nhớ đệm nhận thức của SGLang đạt được tới 96% tỷ lệ hit tối ưu trung bình.

Kết Quả Trên Các 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 các chuẩn mực, 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 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 Các 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 tắc 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 chuẩn mực khác, việc triển khai ban đầu của mô hình trong Hugging Face Transformers đã được sử dụng làm chuẩn mực. Như được hiển thị trong bảng dưới đây, SGLang cung cấp hiệu suất lên tới 6× cao hơn trên các chuẩn mực 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ỉ có một công nhân SGLang phục vụ mỗi mô hình. Sau một tháng, một 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 tin nhắn hệ thống chung, các hình ảnh ví dụ được tái sử dụng thường xuyên và 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× 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 việc thực hiện hiệu quả 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ữ phía trước và một thời gian chạy. Phía trước đơn giản hóa việc lập trình với các nguyên tắc cho tạo và kiểm soát song song, trong khi thời gian chạy tăng tốc thực hiện thông qua các tối ưu hóa mới như RadixAttention để tái sử dụng bộ nhớ đệm KV và máy trạng thái hữu hạn nén để 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ới 6,4× hiệu suất cao hơ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ữ và đa phương tiện lớn khác nhau, giải quyết các nhiệm vụ như kiểm soát tác nhân, lý luận logic, chuẩn mực học ít lần, giải mã JSON, đường ống tạo tăng cường và trò chuyện nhiều lượt.












