图龙网络科技

问答社区

原创作者: 图龙网络科技 发布时间: 2023-09-23 229.8K 人阅读

SGLang 是一个针对大型语言模型和视觉语言模型的快速服务框架。

太极混元 发布于 1个月前 分类:语言模型

SGLang 是一个针对大型语言模型和视觉语言模型的快速服务框架。通过共同设计后端运行时和前端语言,它使您与模型的交互更快、更可控。核心功能包括:

  • 快速后端运行时:通过 RadixAttention 提供高效的服务,用于前缀缓存、前跳约束解码、连续批处理、令牌注意力(分页注意力)、张量并行性、FlashInfer 内核、分块预填充和量化 (INT4/FP8/AWQ/GPTQ)。
  • 灵活的前端语言:为LLM应用程序编程提供直观的界面,包括链式生成调用、高级提示、控制流、多模式输入、并行性和外部交互。
  • 广泛的模型支持:支持广泛的生成模型(Llama、Gemma、Mistral、QWen、DeepSeek、LLaVA 等)和嵌入模型(e5-mistral),易于扩展以集成新模型。
  • 活跃社区:SGLang 是开源的,并得到行业采用的活跃社区的支持。

    安装

    您可以使用以下任一方法安装 SGLang。

    方法一:使用点

    pip install --upgrade pip
    pip install "sglang[all]"
    
    # Install FlashInfer CUDA kernels
    pip install flashinfer -i https://flashinfer.ai/whl/cu121/torch2.4/
    

    方法二:从源头

    # Use the last release branch
    git clone -b v0.3.3.post1 https://github.com/sgl-project/sglang.git
    cd sglang
    
    pip install --upgrade pip
    pip install -e "python[all]"
    
    # Install FlashInfer CUDA kernels
    pip install flashinfer -i https://flashinfer.ai/whl/cu121/torch2.4/
    

    方法三:使用docker

    Docker 镜像在 Docker Hub 上以lmsysorg/sglang 的形式提供,由Dockerfile构建。将下面替换<secret>为您的 Huggingface Hub令牌

    docker run --gpus all \
        -p 30000:30000 \
        -v ~/.cache/huggingface:/root/.cache/huggingface \
        --env "HF_TOKEN=<secret>" \
        --ipc=host \
        lmsysorg/sglang:latest \
        python3 -m sglang.launch_server --model-path meta-llama/Llama-3.1-8B-Instruct --host 0.0.0.0 --port 30000

    方法4:使用docker compose

    方法 5:使用 SkyPilot 在 Kubernetes 或云上运行

    常用注意事项

    • FlashInfer是默认的关注内核后端。仅支持sm75及以上。如果您在 sm75+ 设备(例如 T4、A10、A100、L4、L40S、H100)上遇到任何与 FlashInfer 相关的问题,请通过--attention-backend triton --sampling-backend pytorch在 GitHub 上添加并打开问题来切换到其他内核。
    • 如果您只需要使用 OpenAI 后端,则可以使用pip install "sglang[openai]".

    后端:SGLang 运行时 (SRT)

    SGLang Runtime (SRT) 是一个高效的服务引擎。

    快速入门

    启动服务器

    python -m sglang.launch_server --model-path meta-llama/Meta-Llama-3-8B-Instruct --port 30000
    

    发送请求

    curl http://localhost:30000/generate \
      -H "Content-Type: application/json" \
      -d '{
        "text": "Once upon a time,",
        "sampling_params": {
          "max_new_tokens": 16,
          "temperature": 0
        }
      }'
    
    了解有关参数规范、流式传输和多模式支持的更多信息。

    OpenAI 兼容 API

    此外,服务器支持OpenAI兼容的API。

    import openai
    client = openai.Client(
        base_url="http://127.0.0.1:30000/v1", api_key="EMPTY")
    
    # Text completion
    response = client.completions.create(
    	model="default",
    	prompt="The capital of France is",
    	temperature=0,
    	max_tokens=32,
    )
    print(response)
    
    # Chat completion
    response = 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)
    
    # Text embedding
    response = client.embeddings.create(
        model="default",
        input="How are you today",
    )
    print(response)

    它支持流、视觉以及OpenAI API 参考指定的 Chat/Completions/Models/Batch 端点的几乎所有功能。

    附加服务器参数

    • 要启用多 GPU 张量并行性,请添加--tp 2.如果报告错误“这两个设备之间不支持对等访问”,请添加--enable-p2p-check到服务器启动命令中。
    python -m sglang.launch_server --model-path meta-llama/Meta-Llama-3-8B-Instruct --tp 2
    
    • 要启用多 GPU 数据并行性,请添加--dp 2.如果有足够的内存,数据并行对于吞吐量会更好。它也可以与张量并行一起使用。以下命令总共使用 4 个 GPU。
    python -m sglang.launch_server --model-path meta-llama/Meta-Llama-3-8B-Instruct --dp 2 --tp 2
    
    • 如果您在服务期间看到内存不足错误,请尝试通过设置较小的 值来减少 KV 缓存池的内存使用量--mem-fraction-static。默认值为0.9
    python -m sglang.launch_server --model-path meta-llama/Meta-Llama-3-8B-Instruct --mem-fraction-static 0.7
    
    • 有关调整超参数以获得更好性能的信息,请参阅hyperparameter_tuning.md 。
    • 如果您在长提示预填充期间看到内存不足错误,请尝试设置较小的分块预填充大小。
    python -m sglang.launch_server --model-path meta-llama/Meta-Llama-3-8B-Instruct --chunked-prefill-size 4096
    
    • 要启用 torch.compile 加速,请添加--enable-torch-compile.它可以加速小批量的小模型。
    • 要启用 torchao 量化,请添加--torchao-config int4wo-128.它支持各种量化策略。
    • 要启用 fp8 权重量化,请添加--quantization fp8fp16 检查点或直接加载 fp8 检查点而不指定任何参数。
    • 要启用 fp8 kv 缓存量化,请添加--kv-cache-dtype fp8_e5m2.
    • 如果模型在 Hugging Face 分词器中没有聊天模板,您可以指定自定义聊天模板
    • 要在多个节点上运行张量并行,请添加--nnodes 2.如果您有两个节点,每个节点上有两个 GPU,并且想要运行 TP=4,则设sgl-dev-0为第一个节点的主机名并50000为可用端口,则可以使用以下命令。如果遇到死锁,请尝试添加--disable-cuda-graph
    # Node 0
    python -m sglang.launch_server --model-path meta-llama/Meta-Llama-3-8B-Instruct --tp 4 --nccl-init sgl-dev-0:50000 --nnodes 2 --node-rank 0
    
    # Node 1
    python -m sglang.launch_server --model-path meta-llama/Meta-Llama-3-8B-Instruct --tp 4 --nccl-init sgl-dev-0:50000 --nnodes 2 --node-rank 1
    

    没有 HTTP 服务器的引擎

    我们还提供了一个无需 HTTP 服务器的推理引擎。例如,

    import sglang as sgl
    
    def main():
        prompts = [
            "Hello, my name is",
            "The president of the United States is",
            "The capital of France is",
            "The future of AI is",
        ]
        sampling_params = {"temperature": 0.8, "top_p": 0.95}
        llm = sgl.Engine(model_path="meta-llama/Meta-Llama-3.1-8B-Instruct")
    
        outputs = llm.generate(prompts, sampling_params)
        for prompt, output in zip(prompts, outputs):
            print("===============================")
            print(f"Prompt: {prompt}\nGenerated text: {output['text']}")
    
    if __name__ == "__main__":
        main()

    这可用于:

    1. 离线批量推理
    2. 构建自定义服务器

    您可以在此处查看完整示例

    支持型号

    生成模型

    • 羊驼 / 羊驼 2 / 羊驼 3 / 羊驼 3.1/米斯特拉尔 / 混合 / 米斯特拉尔 NeMo/杰玛 / 杰玛 2/Qwen / Qwen 2 / Qwen 2 教育部/深寻/深寻 2/奥尔教育部
    • LLaVA-OneVision
      • python3 -m sglang.launch_server --model-path lmms-lab/llava-onevision-qwen2-7b-ov --port=30000 --chat-template=chatml-llava
      • python3 -m sglang.launch_server --model-path lmms-lab/llava-onevision-qwen2-72b-ov --port=30000 --tp-size=8 --chat-template=chatml-llava
      • 使用OpenAI Vision API查询服务器。请参阅test/srt/test_vision_openai_server.py中的示例
    • 拉瓦 1.5 / 1.6 / NeXT
      • python -m sglang.launch_server --model-path lmms-lab/llama3-llava-next-8b --port=30000 --tp-size=1 --chat-template=llava_llama_3
      • python -m sglang.launch_server --model-path lmms-lab/llava-next-72b --port=30000 --tp-size=8 --chat-template=chatml-llava
      • 使用OpenAI Vision API查询服务器。请参阅test/srt/test_vision_openai_server.py中的示例
    • 易-VL/稳定LM/Command-R/数据库接收/格罗克/聊天GLM/实习生LM 2/Exaone 3/百川2/最小每千次展示费用 / 最小每千次展示费用 3/XVERSE / XVERSE 教育部/斯莫尔LM

    嵌入模型

    • e5-米斯特拉尔
    • gte-Qwen2
      • python -m sglang.launch_server --model-path Alibaba-NLP/gte-Qwen2-7B-instruct --is-embedding

    支持新模型的说明位于此处

    使用 ModelScope 中的模型-更多的跑羊驼 3.1 405B

    基准性能

    • 通过运行以下命令而不启动服务器来对单个静态批次进行基准测试。参数与 相同launch_server.py。请注意,这不是动态批处理服务器,因此对于真实服务器可以处理的批处理大小,它可能会耗尽内存。真实服务器会将预填充截断为多个批次,而此单元测试则不会。如需准确的大批量测试,请改用sglang.bench_serving
      python -m sglang.bench_latency --model-path meta-llama/Meta-Llama-3-8B-Instruct --batch 32 --input-len 256 --output-len 32
      
    • 在线服务基准。首先启动服务器并运行以下命令。
      python3 -m sglang.bench_serving --backend sglang --num-prompt 10
      

    前端:结构化生成语言 (SGLang)

    前端语言可与本地模型或 API 模型一起使用。它是 OpenAI API 的替代方案。您可能会发现它更容易用于复杂的提示工作流程。

    快速入门

    下面的示例展示了如何使用 sglang 回答多轮问题。

    使用本地模型

    首先,启动服务器

    python -m sglang.launch_server --model-path meta-llama/Meta-Llama-3-8B-Instruct --port 30000
    

    然后,连接到服务器并回答多轮问题。

    from sglang import function, system, user, assistant, gen, set_default_backend, RuntimeEndpoint
    
    @function
    def multi_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.",
    )
    
    for m in state.messages():
        print(m["role"], ":", m["content"])
    
    print(state["answer_1"])

    使用 OpenAI 模型

    设置 OpenAI API 密钥

    export OPENAI_API_KEY=sk-******
    

    然后,回答一个多轮问题。

    from sglang import function, system, user, assistant, gen, set_default_backend, OpenAI
    
    @function
    def multi_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.",
    )
    
    for m in state.messages():
        print(m["role"], ":", m["content"])
    
    print(state["answer_1"])

    更多示例

    还支持 Anthropic 和 VertexAI (Gemini) 模型。您可以在example/quick_start找到更多示例。

    语言特性

    首先,导入 sglang。

    import sglang as sgl

    sglang提供了一些简单的原语,例如genselectforkimage。您可以在由 装饰的函数中实现提示流程sgl.function。然后您可以使用run或调用该函数run_batch。系统将为您管理状态、聊天模板、并行性和批处理。

    以下示例的完整代码可以在readme_examples.py中找到

    控制流程

    您可以在函数体内使用任何 Python 代码,包括控制流、嵌套函数调用和外部库。

    @sgl.function
    def tool_use(s, question):
        s += "To answer this question: " + question + ". "
        s += "I need to use a " + sgl.gen("tool", choices=["calculator", "search engine"]) + ". "
    
        if s["tool"] == "calculator":
            s += "The math expression is" + sgl.gen("expression")
        elif s["tool"] == "search engine":
            s += "The key word to search is" + sgl.gen("word")

    并行性

    用于fork启动并行提示。因为sgl.gen是非阻塞的,所以下面的 for 循环并行发出两个生成调用。

    @sgl.function
    def tip_suggestion(s):
        s += (
            "Here are two tips for staying healthy: "
            "1. Balanced Diet. 2. Regular Exercise.\n\n"
        )
    
        forks = s.fork(2)
        for i, f in enumerate(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")

    多模态

    用于sgl.image传递图像作为输入。

    @sgl.function
    def image_qa(s, image_file, question):
        s += sgl.user(sgl.image(image_file) + question)
        s += sgl.assistant(sgl.gen("answer", max_tokens=256)

    另请参见srt_example_llava.py

    受限解码

    用于regex指定正则表达式作为解码约束。仅本地型号支持此功能。

    @sgl.function
    def regular_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解码

    用于regex通过正则表达式指定 JSON 架构。

    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.function
    def character_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)

    另请参阅json_decode.py了解使用 Pydantic 模型指定格式的其他示例。

    配料

    用于run_batch通过连续批处理运行一批请求。

    @sgl.function
    def text_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
    )

    流媒体

    添加stream=True以启用流式传输。

    @sgl.function
    def text_qa(s, question):
        s += "Q: " + question + "\n"
        s += "A:" + sgl.gen("answer", stop="\n")
    
    state = text_qa.run(
        question="What is the capital of France?",
        temperature=0.1,
        stream=True
    )
    
    for out in state.text_iter():
        print(out, end="", flush=True)

    角色

    使用聊天模型时,使用sgl.systemsgl.usersgl.assistant设置角色。您还可以使用开始和结束标记定义更复杂的角色提示。

    @sgl.function
    def chat_example(s):
        s += sgl.system("You are a helpful assistant.")
        # Same as: s += s.system("You are a helpful assistant.")
    
        with s.user():
            s += "Question: What is the capital of France?"
    
        s += sgl.assistant_begin()
        s += "Answer: " + sgl.gen(max_tokens=100, stop="\n")
        s += sgl.assistant_end()

    提示和实施细节

    • choices中的参数是sgl.gen通过计算所有选择的标记长度归一化对数概率并选择概率最高的一个来实现的。
    • 根据正则表达式设置的约束,regex中的参数是通过带有 logit 偏差屏蔽的自回归解码来实现的。它与和sgl.gen兼容。temperature=0temperature != 0

0个回复

  • 龙族们都在等待回复

提供中小企业建站高端正版精品系统

正品模板 购买协议