Package: sglang
SGLang|Blog|Paper|SGLang is a structured generation language designed for large language models (LLMs).
It makes your interaction with LLMs faster and more controllable by co-designing the frontend language and the runtime system.The core features of SGLang include:A Flexible Front-End Language: This allows for easy programming of LLM applications with multiple chained generation calls, advanced prompting techniques, control flow, multiple modalities, parallelism, and external interaction.A High-Performance Runtime with RadixAttention: This feature significantly accelerates the execution of complex LLM programs by automatic KV cache reuse across multiple calls. It also supports other common techniques like continuous batching and tensor parallelism.News[2024/02] 🔥 SGLang enables3x faster JSON decodingwith compressed finite state machine (blog).[2024/01] 🔥 SGLang powers the serving of the officalLLaVA v1.6release demo (usage).[2024/01] SGLang provides up to5x faster inferencewith RadixAttention (blog).ContentsInstallQuick StartFrontend: Structured Generation Language (SGLang)Backend: SGLang Runtime (SRT)Benchmark And PerformanceRoadmapCitation And AcknowledgmentInstallMethod 1: With pippip install "sglang[all]"Method 2: From sourcegit clone git@github.com:sgl-project/sglang.git
cd sglang

pip install --upgrade pip
pip install -e "python[all]"NotesIf you are using older GPUs (NVIDIA V100, T4), please pick the correct triton compiler version to avoid some known bugs.For NVIDIA T4, please usepip install "triton>=2.2.0".For NVIDIA V100, please install thenightlyversion.If you only need to use the OpenAI backend, you can avoid installing other dependencies by usingpip install "sglang[openai]"Quick StartThe example below shows how to use sglang to answer a mulit-turn question.Using Local ModelsFirst, launch a server withpython -m sglang.launch_server --model-path meta-llama/Llama-2-7b-chat-hf --port 30000Then, connect to the server and answer a multi-turn question.fromsglangimportfunction,system,user,assistant,gen,set_default_backend,RuntimeEndpoint@functiondefmulti_turn_question(s,question_1,question_2):s+=system("You are a helpful assistant.")s+=user(question_1)s+=assistant(gen("answer_1",max_tokens=256))s+=user(question_2)s+=assistant(gen("answer_2",max_tokens=256))set_default_backend(RuntimeEndpoint("http://localhost:30000"))state=multi_turn_question.run(question_1="What is the capital of the United States?",question_2="List two local attractions.",)forminstate.messages():print(m["role"],":",m["content"])print(state["answer_1"])Using OpenAI ModelsSet the OpenAI API Keyexport OPENAI_API_KEY=sk-******Then, answer a multi-turn question.fromsglangimportfunction,system,user,assistant,gen,set_default_backend,OpenAI@functiondefmulti_turn_question(s,question_1,question_2):s+=system("You are a helpful assistant.")s+=user(question_1)s+=assistant(gen("answer_1",max_tokens=256))s+=user(question_2)s+=assistant(gen("answer_2",max_tokens=256))set_default_backend(OpenAI("gpt-3.5-turbo"))state=multi_turn_question.run(question_1="What is the capital of the United States?",question_2="List two local attractions.",)forminstate.messages():print(m["role"],":",m["content"])print(state["answer_1"])More ExamplesAnthropic and VertexAI (Gemini) models are also supported.
You can find more examples atexamples/quick_start.Frontend: Structured Generation Language (SGLang)To begin with, import sglang.importsglangassglsglangprovides some simple primitives such asgen,select,fork,image.
You can implement your prompt flow in a function decorated bysgl.function.
You can then invoke the function withrunorrun_batch.
The system will manage the state, chat template, parallelism and batching for you.The complete code for the examples below can be found atreadme_examples.pyControl FlowYou can use any Python code within the function body, including control flow, nested function calls, and external libraries.@sgl.functiondeftool_use(s,question):s+="To answer this question: "+question+". "s+="I need to use a "+sgl.gen("tool",choices=["calculator","search engine"])+". "ifs["tool"]=="calculator":s+="The math expression is"+sgl.gen("expression")elifs["tool"]=="search engine":s+="The key word to search is"+sgl.gen("word")ParallelismUseforkto launch parallel prompts.
Becausesgl.genis non-blocking, the for loop below issues two generation calls in parallel.@sgl.functiondeftip_suggestion(s):s+=("Here are two tips for staying healthy: ""1. Balanced Diet. 2. Regular Exercise.\n\n")forks=s.fork(2)fori,finenumerate(forks):f+=f"Now, expand tip{i+1}into a paragraph:\n"f+=sgl.gen(f"detailed_tip",max_tokens=256,stop="\n\n")s+="Tip 1:"+forks[0]["detailed_tip"]+"\n"s+="Tip 2:"+forks[1]["detailed_tip"]+"\n"s+="In summary"+sgl.gen("summary")Multi ModalityUsesgl.imageto pass an image as input.@sgl.functiondefimage_qa(s,image_file,question):s+=sgl.user(sgl.image(image_file)+question)s+=sgl.assistant(sgl.gen("answer",max_tokens=256)See alsosrt_example_llava.py.Constrained DecodingUseregexto specify a regular expression as a decoding constraint.
This is only supported for local models.@sgl.functiondefregular_expression_gen(s):s+="Q: What is the IP address of the Google DNS servers?\n"s+="A: "+sgl.gen("answer",temperature=0,regex=r"((25[0-5]|2[0-4]\d|[01]?\d\d?).){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)",)JSON DecodingUseregexto specify a JSON schema with a regular expression.character_regex=(r"""\{\n"""+r"""    "name": "[\w\d\s]{1,16}",\n"""+r"""    "house": "(Gryffindor|Slytherin|Ravenclaw|Hufflepuff)",\n"""+r"""    "blood status": "(Pure-blood|Half-blood|Muggle-born)",\n"""+r"""    "occupation": "(student|teacher|auror|ministry of magic|death eater|order of the phoenix)",\n"""+r"""    "wand": \{\n"""+r"""        "wood": "[\w\d\s]{1,16}",\n"""+r"""        "core": "[\w\d\s]{1,16}",\n"""+r"""        "length": [0-9]{1,2}\.[0-9]{0,2}\n"""+r"""    \},\n"""+r"""    "alive": "(Alive|Deceased)",\n"""+r"""    "patronus": "[\w\d\s]{1,16}",\n"""+r"""    "bogart": "[\w\d\s]{1,16}"\n"""+r"""\}""")@sgl.functiondefcharacter_gen(s,name):s+=name+" is a character in Harry Potter. Please fill in the following information about this character.\n"s+=sgl.gen("json_output",max_tokens=256,regex=character_regex)See alsojson_decode.pyfor an additional example on specifying formats with Pydantic models.BatchingUserun_batchto run a batch of requests with continuous batching.@sgl.functiondeftext_qa(s,question):s+="Q: "+question+"\n"s+="A:"+sgl.gen("answer",stop="\n")states=text_qa.run_batch([{"question":"What is the capital of the United Kingdom?"},{"question":"What is the capital of France?"},{"question":"What is the capital of Japan?"},],progress_bar=True)StreamingAddstream=Trueto enable streaming.@sgl.functiondeftext_qa(s,question):s+="Q: "+question+"\n"s+="A:"+sgl.gen("answer",stop="\n")states=text_qa.run(question="What is the capital of France?",temperature=0.1,stream=True)foroutinstate.text_iter():print(out,end="",flush=True)Tips and Implementation DetailsThechoicesargument insgl.genis implemented by computing the normalized log probabilities of all choices and selecting the one with the highest probability.Theregexargument insgl.genis implemented through autoregressive decoding with logit bias masking, according to the constraints set by the regex.Backend: SGLang Runtime (SRT)The SGLang Runtime (SRT) is designed to work best with the SGLang frontend.
However, it can also be used as a standalone API server.
In this case, theRadixAttentioncan still greatly accelerate many use cases with automatic KV cache reuse.UsageLaunch a serverpython -m sglang.launch_server --model-path meta-llama/Llama-2-7b-chat-hf --port 30000Send a requestcurl http://localhost:30000/generate \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Once upon a time,",
    "sampling_params": {
      "max_new_tokens": 16,
      "temperature": 0
    }
  }'Learn more about the argument formathere.OpenAI Compatible APIIn addition, the server supports an experimental OpenAI-compatible API.importopenaiclient=openai.Client(base_url="http://127.0.0.1:30000/v1",api_key="EMPTY")# Text completionresponse=client.completions.create(model="default",prompt="The capital of France is",temperature=0,max_tokens=32,)print(response)# Chat completionresponse=client.chat.completions.create(model="default",messages=[{"role":"system","content":"You are a helpful AI assistant"},{"role":"user","content":"List 3 countries and their capitals."},],temperature=0,max_tokens=64,)print(response)In above example, the server uses the chat template specified in the model tokenizer.
You can override the chat template if needed when launching the server:python -m sglang.launch_server --model-path meta-llama/Llama-2-7b-chat-hf --port 30000 --chat-template llama-2If the chat template you are looking for is missing, you are welcome to contribute it.
Meanwhile, you can also temporary register your chat template as follows:{"name":"my_model","system":"
system","user":"
user","assistant":"
assistant","sep_style":"CHATML","sep":"
","stop_str":["
","
"]}python -m sglang.launch_server --model-path meta-llama/Llama-2-7b-chat-hf --port 30000 --chat-template ./my_model_template.jsonAdditional ArgumentsAdd--tp 2to enable tensor parallelism.python -m sglang.launch_server --model-path meta-llama/Llama-2-7b-chat-hf --port 30000 --tp 2If you see out-of-memory errors during serving, please try to reduce the memory usage of the KV cache pool by setting a smaller value of--mem-fraction-static. The default value is0.9python -m sglang.launch_server --model-path meta-llama/Llama-2-7b-chat-hf --port 30000 --mem-fraction-static 0.7You can turn onflashinferto acclerate the inference by using highly optimized CUDA kernels.Supported ModelsLlamaMistralMixtralQwen / Qwen 2LLaVApython3 -m sglang.launch_server --model-path liuhaotian/llava-v1.5-7b --tokenizer-path llava-hf/llava-1.5-7b-hf --chat-template vicuna_v1.1 --port 30000Yi-VLseesrt_example_yi_vl.py.AWQ/GPTQ quantizationBenchmark And PerformanceLlama-7B on NVIDIA A10G, FP16, Tensor Parallelism=1Mixtral-8x7B on NVIDIA A10G, FP16, Tensor Parallelism=8Learn morehere.Roadmaphttps://github.com/sgl-project/sglang/issues/157Citation And Acknowledgment@misc{zheng2023efficiently,
      title={Efficiently Programming Large Language Models using SGLang},
      author={Lianmin Zheng and Liangsheng Yin and Zhiqiang Xie and Jeff Huang and Chuyue Sun and Cody Hao Yu and Shiyi Cao and Christos Kozyrakis and Ion Stoica and Joseph E. Gonzalez and Clark Barrett and Ying Sheng},
      year={2023},
      eprint={2312.07104},
      archivePrefix={arXiv},
      primaryClass={cs.AI}
}We learned from the design and reused some code of the following projects:Guidance,vLLM,LightLLM,FlashInfer,Outlines,LMQL.