TellWorldAI 世界档案
问档案English

首页›实践›实践

实践

Kimi K2.5 用 SGLang 部署

在 8 张 96GB 显卡上用 SGLang 部署 Kimi K2.5,提供兼容 OpenAI 的接口,并测试聊天、流式输出和天气工具调用。

这篇适合谁

适合有 8 卡工作站或服务器、想在自己机器上跑 Kimi K2.5 的开发者。读完你能启动一个兼容 OpenAI 协议的服务,并跑通普通对话、流式输出和一次需要两轮模型请求的工具调用。

为什么要本地部署

本文列出三个理由。第一是数据隐私:对话和处理都在内网完成,更容易满足合规要求。第二是延迟:不经过公网,网络波动的影响小,适合高频交互和自动化 Agent 任务。第三是成本:吞吐量很大的业务,本地部署可能比长期调用 API 省钱[1]。

环境和依赖

实测环境是 8 张 NVIDIA RTX PRO 6000,每张 96GB,系统为 Ubuntu 22.04,CUDA 版本 12.8,Python 3.12,PyTorch 2.8.0[1]。先建一个 Python 3.12 的 conda 环境,并升级 pip[1]。

conda create -n sglang python=3.12 pip -y
conda activate sglang
python -m pip install --upgrade pip

在 AutoDL 上下载慢时,可以执行 source /etc/network_turbo 开启网络加速,用 unset http_proxy; unset https_proxy 关闭加速[1]。

直接执行 pip install sglang 处理 Kimi 2.5 时可能遇到兼容性问题。官方的部署指南建议从源码安装 SGLang,并指定特定版本的 cuDNN,这一步建议照做[1][2]。

pip install "sglang @ git+https://github.com/sgl-project/sglang.git#subdirectory=python"
pip install nvidia-cudnn-cu12==9.16.0.29

下载模型

用 ModelScope 的 snapshot_download 下载 moonshotai/Kimi-K2.5,cache_dir 要选一个空间足够的目录[1]。

from modelscope import snapshot_download
# 下载 Kimi-K2.5 模型
model_dir = snapshot_download(
    'moonshotai/Kimi-K2.5', 
    cache_dir='./kimi_models', 
    revision='master'
)
print(f"模型下载完成,存储路径为: {model_dir}")

启动服务

--model-path 要指向包含 config.json 和权重文件的文件夹,权重可以是 .bin 或 .safetensors 格式[1]。--tp 8 表示用 8 张卡做张量并行[1]。--trust-remote-code 允许执行模型里的自定义代码。两个解析器参数 --tool-call-parser kimi_k2 和 --reasoning-parser kimi_k2 分别处理 Kimi 的工具调用和推理输出[1]。

sglang serve --model-path /your/path/to/Kimi-K2.5 --tp 8 --trust-remote-code --tool-call-parser kimi_k2 --reasoning-parser kimi_k2

启动服务的终端要保持开着,客户端脚本另开一个终端运行[1]。

启动为什么这么慢

启动耗时很长,需要有心理准备。按实测数据,单从磁盘读取权重就要约 1 小时 45 分钟。读完权重后,还有一段较长的初始化,期间会进行多卡之间的 P2P 通信、张量切分和 MoE 专家排列,几十分钟内终端可能没有任何日志[1]。整个启动过程实测为 8714 秒,约 2 小时 25 分钟[1]。

显存的读数有两个。SGLang 报告每张卡约 72.33G,这是权重和必要缓冲区的实际占用。nvidia-smi 显示每张卡约 81.4G,差额来自 SGLang 预先分配的静态图和较大的 KV 缓存池[1]。日志中出现 HTTP 200 响应和 API 调用成功的记录,就说明部署成功[1]。

普通对话和流式输出

先确认服务已经就绪,再发请求。启动完成前发出的请求会失败,而且启动本身可能很久,所以看启动日志比反复重试更可靠[1]。

客户端的基础地址是 http://127.0.0.1:30000/v1,API Key 填 empty,模型名填 default。短指令会一次性返回完整结果[1]。

import openai
client = openai.Client(
    base_url="http://127.0.0.1:30000/v1", 
    api_key="empty"
)
response = client.chat.completions.create(
    model="default",
    messages=[
        {"role": "user", "content": "你好 Kimi,请介绍一下你自己,并确认一下你现在的版本。"}
    ],
    temperature=0.7
)
print(f"Kimi 的回答:\n{response.choices[0].message.content}")

长文本生成或交互式对话更适合流式输出。把 stream=True 打开后,逐块打印 delta.content,用户能更早看到内容。这样用户能更早看到内容,感觉上更快[1]。

for chunk in response:
    content = chunk.choices[0].delta.content
    if content is not None:
        print(content, end="", flush=True)

工具调用

工具调用的分工是:模型负责判断该调用哪个函数、传什么参数,真正的请求由你的程序完成。示例里的天气函数只是演示,换成自己的业务接口时,参数定义和返回格式都要重新设计[1]。

工具调用需要两次模型请求。第一次返回结构化的工具调用,第二次把工具结果整理成自然语言回答[1]。

示例工具是 get_weather,参数有 location 和 unit,其中 unit 只能取 celsius 或 fahrenheit[1]。

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "获取一个给定地点的当前实时天气情况,如查询不到则返回错误信息。",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {"type": "string", "description": "城市名,例如:北京, Tokyo, London"},
                "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
            },
            "required": ["location", "unit"]
        }
    }
}]

第一次请求里设置 tools 和 tool_choice="auto"[1]。

response = client.chat.completions.create(
    model="default",
    messages=[{"role": "user", "content": user_query}],
    tools=tools,
    tool_choice="auto"
)

示例工具调用的是 OpenWeatherMap 的天气接口,API Key 不要公开分享[1]。在一次测试中,模型规划的是查询宝鸡、单位摄氏度的天气,最终回答为约 -0.7°C、阴天[1]。

本文改编自 Datawhale 开源项目 self-llm 中的 Kimi K2.5 SGLang 部署教程[1],原文以 Apache-2.0 许可证发布。

来源

  1. 1
    03-Kimi-2.5-SGLang部署应用Datawhale self-llm (Apache-2.0)
  2. 2
    deploy_guidance.mdHugging Face (Moonshot AI)

引用本页: Kimi K2.5 用 SGLang 部署. TellWorld, https://www.tellworld.net/zh/practice/practice-kimi-k2-5-sglang. 更新于 2026-11-14

相关动态