<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Sglang on Wilson Wu</title><link>https://wilsonwu.me/zh/tags/sglang/</link><description>Recent content in Sglang on Wilson Wu</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Thu, 10 Jul 2025 00:00:00 -0400</lastBuildDate><atom:link href="https://wilsonwu.me/zh/tags/sglang/index.xml" rel="self" type="application/rss+xml"/><item><title>玩转大语言模型：使用 SGLang 框架实现大语言模型推理入门教程</title><link>https://wilsonwu.me/zh/blog/2025/getting-started-with-sglang/</link><pubDate>Thu, 10 Jul 2025 00:00:00 -0400</pubDate><guid>https://wilsonwu.me/zh/blog/2025/getting-started-with-sglang/</guid><description>这篇文章带你从零开始，快速上手 SGLang：了解它是什么、为什么快、如何安装与启动、如何用 OpenAI 兼容接口调用，并通过一个完整的 Demo（含流式输出与并发调用）一步步跑通。文章面向刚接触 SGLang 的同学，几分钟内即可看到本地模型在线响应。</description><content:encoded><![CDATA[<p>随着大语言模型热度的升级，企业和个人使用者的研究重心逐步从训练转移至推理（说白了是由造轮子转变为务实的使用）。而在模型推理领域，最炙手可热的两大框架无疑是 vLLM 和 SGLang，而作为后起之秀的 SGLang，其表现也值得大家关注，今天就基于 SGLang 为大家带来一篇入门教程文章，希望能帮助更多希望了解大语言模型及 SGLang 框架的朋友。</p>
<h2 id="sglang-简介">SGLang 简介</h2>
<p>SGLang 是一款面向大语言模型（LLM）和视觉语言模型（VLM）的高性能推理框架，通过精心设计的后端运行时与前端语言协同工作，使模型交互更加高效且可控。其核心优势包括：</p>
<ul>
<li><strong>高效后端运行时</strong>：采用创新的 RadixAttention 技术实现前缀缓存，支持跳跃式受限解码、零开销 CPU 调度、连续批处理、令牌注意力（分页注意力）、张量并行、FlashInfer 内核、分块预填充以及多种量化技术（FP8/INT4/AWQ/GPTQ），显著提升推理效率。</li>
<li><strong>灵活前端语言</strong>：提供直观且强大的 LLM 编程接口，支持链式生成调用、高级提示工程、复杂控制流、多模态输入、并行处理及外部系统交互。</li>
<li><strong>广泛模型兼容性</strong>：支持多种主流生成式模型（Llama、Gemma、Mistral、QWen、DeepSeek、LLaVA 等）、嵌入模型（e5-mistral、gte）及奖励模型（Skywork），并提供简便的新模型扩展机制。</li>
<li><strong>活跃开源生态</strong>：拥有蓬勃发展的社区支持，已获得广泛业界认可（截至 2025 年 3 月 17 日，GitHub 累计星标超过 12,000）。</li>
</ul>
<p>其技术架构如下：</p>
<p><img alt="SGLang 架构" loading="lazy" src="/zh/blog/2025/getting-started-with-sglang/1-sglang-architecture.png"></p>
<p>除此之外，对于初学者，需要了解其以下特性：</p>
<ul>
<li><strong>OpenAI 兼容 API</strong>：直接用 openai Python SDK 或 cURL 调用，不用改你的上层业务代码。</li>
<li><strong>高吞吐与低延迟</strong>：结合连续批处理与前缀缓存等技巧，让相同前缀的请求复用计算。</li>
<li><strong>生产友好</strong>：支持多并发、流式输出、可与 Hugging Face 模型库直接对接。</li>
</ul>
<h2 id="环境准备">环境准备</h2>
<p>工欲善其事必先利其器，要完成本文的新手实验，需准备如下环境：</p>
<ul>
<li>操作系统：建议 Linux（常用为 Ubuntu 20.04+）。WSL2 也可尝试。</li>
<li>Python：建议 3.10 或 3.11。</li>
<li>GPU：建议 NVIDIA 显卡，24GB 显存可跑 7B/8B 级（如 Llama 3.1 8B）。没有 GPU 也能跑小模型或量化模型，但性能有限。</li>
<li>模型来源：Hugging Face（如 meta-llama/Llama-3.1-8B-Instruct）或本地路径。</li>
</ul>
<h2 id="安装-sglang">安装 SGLang</h2>
<p>环境就绪后，使用 pip 安装 SGLang（确保已安装 pip、可选创建虚拟环境）。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>pip install sglang openai huggingface<span style="color:#f92672">-</span>hub
</span></span></code></pre></div><p>如果你需要从 Hugging Face 自动下载私有或受限模型，请先登录或设置 Token：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>huggingface-cli login
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 或</span>
</span></span><span style="display:flex;"><span>export HF_TOKEN<span style="color:#f92672">=</span>您的Token
</span></span></code></pre></div><h2 id="启动-sglang-服务">启动 SGLang 服务</h2>
<p>可以通过以下两种启动方式进行 SGLang 服务的启动。不同版本的 SGLang 命令行参数可能略有差异，如果出现参数名称不匹配，先执行 &ndash;help 查看本机版本支持的参数。</p>
<h3 id="通过-launcher-启动">通过 launcher 启动</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>python -m sglang.launcher <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --model meta-llama/Llama-3.1-8B-Instruct <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --host 0.0.0.0 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --port <span style="color:#ae81ff">30000</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --tp <span style="color:#ae81ff">1</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --max-model-len <span style="color:#ae81ff">8192</span>
</span></span></code></pre></div><p>其中常用参数说明如下：</p>
<ul>
<li>&ndash;model：Hugging Face 模型名称或本地模型权重路径</li>
<li>&ndash;host/&ndash;port：服务监听地址与端口</li>
<li>&ndash;tp：Tensor Parallel 并行度（单卡设为 1；多卡可根据需要设为 2、4 等）</li>
<li>&ndash;max-model-len：上下文最大长度</li>
</ul>
<p>另外需要注意以下两点：</p>
<ul>
<li>如果使用的是 Hugging Face 模型，首次运行会下载模型权重，请确保网络通畅。</li>
<li>如果显存吃紧，可优先尝试更小模型，或减少 &ndash;max-model-len。</li>
</ul>
<h3 id="通过-sglang-命令启动">通过 sglang 命令启动</h3>
<p>如果您使用的版本提供 sglang serve 命令，也可使用如下命令进行启动：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sglang serve -m meta-llama/Llama-3.1-8B-Instruct --host 0.0.0.0 --port <span style="color:#ae81ff">30000</span>
</span></span></code></pre></div><h2 id="快速验证">快速验证</h2>
<p>服务启动后，OpenAI 兼容接口即可使用：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl http://127.0.0.1:30000/v1/chat/completions <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#e6db74">&#34;Content-Type: application/json&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#e6db74">&#34;Authorization: Bearer EMPTY&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -d <span style="color:#e6db74">&#39;{
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;model&#34;: &#34;meta-llama/Llama-3.1-8B-Instruct&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;messages&#34;: [
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">      {&#34;role&#34;: &#34;system&#34;, &#34;content&#34;: &#34;You are a helpful assistant.&#34;},
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">      {&#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;用两句话介绍一下你自己。&#34;}
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    ],
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;max_tokens&#34;: 128,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;temperature&#34;: 0.2
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  }&#39;</span>
</span></span></code></pre></div><p>如果运行正常，将返回标准的 ChatCompletion JSON 响应。</p>
<h2 id="使用-python-openai-sdk-进行调用">使用 Python OpenAI SDK 进行调用</h2>
<p>非流式调用（最简单的问答）：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> openai <span style="color:#f92672">import</span> OpenAI
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>client <span style="color:#f92672">=</span> OpenAI(
</span></span><span style="display:flex;"><span>    base_url<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;http://127.0.0.1:30000/v1&#34;</span>,
</span></span><span style="display:flex;"><span>    api_key<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;EMPTY&#34;</span>  <span style="color:#75715e"># 本地服务通常不校验</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>messages <span style="color:#f92672">=</span> [
</span></span><span style="display:flex;"><span>    {<span style="color:#e6db74">&#34;role&#34;</span>: <span style="color:#e6db74">&#34;system&#34;</span>, <span style="color:#e6db74">&#34;content&#34;</span>: <span style="color:#e6db74">&#34;You are a helpful assistant who answers in Chinese.&#34;</span>},
</span></span><span style="display:flex;"><span>    {<span style="color:#e6db74">&#34;role&#34;</span>: <span style="color:#e6db74">&#34;user&#34;</span>, <span style="color:#e6db74">&#34;content&#34;</span>: <span style="color:#e6db74">&#34;请用三句话介绍帕累托最优。&#34;</span>}
</span></span><span style="display:flex;"><span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>resp <span style="color:#f92672">=</span> client<span style="color:#f92672">.</span>chat<span style="color:#f92672">.</span>completions<span style="color:#f92672">.</span>create(
</span></span><span style="display:flex;"><span>    model<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;meta-llama/Llama-3.1-8B-Instruct&#34;</span>,
</span></span><span style="display:flex;"><span>    messages<span style="color:#f92672">=</span>messages,
</span></span><span style="display:flex;"><span>    temperature<span style="color:#f92672">=</span><span style="color:#ae81ff">0.2</span>,
</span></span><span style="display:flex;"><span>    max_tokens<span style="color:#f92672">=</span><span style="color:#ae81ff">256</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(resp<span style="color:#f92672">.</span>choices[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">.</span>message<span style="color:#f92672">.</span>content)
</span></span></code></pre></div><p>流式输出（边生成边打印）：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> openai <span style="color:#f92672">import</span> OpenAI
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>client <span style="color:#f92672">=</span> OpenAI(base_url<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;http://127.0.0.1:30000/v1&#34;</span>, api_key<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;EMPTY&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>messages <span style="color:#f92672">=</span> [
</span></span><span style="display:flex;"><span>    {<span style="color:#e6db74">&#34;role&#34;</span>: <span style="color:#e6db74">&#34;system&#34;</span>, <span style="color:#e6db74">&#34;content&#34;</span>: <span style="color:#e6db74">&#34;You are a helpful assistant that speaks Chinese.&#34;</span>},
</span></span><span style="display:flex;"><span>    {<span style="color:#e6db74">&#34;role&#34;</span>: <span style="color:#e6db74">&#34;user&#34;</span>, <span style="color:#e6db74">&#34;content&#34;</span>: <span style="color:#e6db74">&#34;简述 Transformer 的核心思想，并给出一个现实类比。&#34;</span>}
</span></span><span style="display:flex;"><span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>stream <span style="color:#f92672">=</span> client<span style="color:#f92672">.</span>chat<span style="color:#f92672">.</span>completions<span style="color:#f92672">.</span>create(
</span></span><span style="display:flex;"><span>    model<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;meta-llama/Llama-3.1-8B-Instruct&#34;</span>,
</span></span><span style="display:flex;"><span>    messages<span style="color:#f92672">=</span>messages,
</span></span><span style="display:flex;"><span>    temperature<span style="color:#f92672">=</span><span style="color:#ae81ff">0.2</span>,
</span></span><span style="display:flex;"><span>    max_tokens<span style="color:#f92672">=</span><span style="color:#ae81ff">300</span>,
</span></span><span style="display:flex;"><span>    stream<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> chunk <span style="color:#f92672">in</span> stream:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> chunk<span style="color:#f92672">.</span>choices <span style="color:#f92672">and</span> chunk<span style="color:#f92672">.</span>choices[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">.</span>delta:
</span></span><span style="display:flex;"><span>        delta <span style="color:#f92672">=</span> chunk<span style="color:#f92672">.</span>choices[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">.</span>delta<span style="color:#f92672">.</span>content
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> delta:
</span></span><span style="display:flex;"><span>            print(delta, end<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>, flush<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">[Done]&#34;</span>)
</span></span></code></pre></div><p>通过以上两种方式，我们可以构建自己的推理服务应用，也可以通过市面上开源的软件来接入您部署的推理服务，如 Open-WebUI 等。</p>
<h2 id="常见问题与排错">常见问题与排错</h2>
<ul>
<li>启动时报显存不足（CUDA OOM）
<ul>
<li>尝试更小的模型（如 7B/8B）、减小 <code>--max-model-len</code>、或降低并发。</li>
<li>如果有多卡，增加 &ndash;tp 并用多卡分摊显存。</li>
</ul>
</li>
<li>拉取模型失败或速度慢
<ul>
<li>先执行 <code>huggingface-cli login</code>；或提前手动把模型权重下载到本地路径，并在 <code>--model</code> 里填本地路径。</li>
</ul>
</li>
<li>API 报 <code>Unknown argument</code>
<ul>
<li>不同版本的命令行参数可能有差异。请运行：<code>python -m sglang.launcher --help</code></li>
<li>根据你安装的版本调整参数名，如 <code>--model</code> / <code>--model-path</code>、<code>--tp</code> / <code>--tensor-parallel-size</code> 等。</li>
</ul>
</li>
<li>Python 客户端 <code>401/Key</code> 错误
<ul>
<li>本地服务通常不校验 Key，只要带上一个占位即可（如 <code>EMPTY</code>）。</li>
</ul>
</li>
<li>流式输出不打印
<ul>
<li>确认传了 <code>stream=True</code>；迭代 chunk 时取 <code>choices[0].delta.content</code>。</li>
</ul>
</li>
<li>并发性能不达预期
<ul>
<li>尝试用 Async 客户端并发请求；避免在单线程里串行等待。</li>
<li>检查 GPU 利用率；确认没有 CPU/GPU 数据传输瓶颈。</li>
</ul>
</li>
</ul>
<h2 id="总结">总结</h2>
<p>至此，你已经完成了：</p>
<ul>
<li>安装与启动 SGLang 服务</li>
<li>用 OpenAI 兼容接口进行非流式与流式推理</li>
</ul>
<p>祝你上手顺利，玩得开心！如果遇到命令行参数或 API 的小差异，参考本地版本的 &ndash;help 与官方文档进行快速适配即可。</p>
]]></content:encoded></item></channel></rss>