AB
AiBoss
チュートリアル

StableLM

チュートリアル

在无服务器 GPU 上部署并运行 StableLM 对话模型

本文介绍如何借助社区模板,在无服务器 GPU 平台上部署 StableLM 语言模型,并用 Python 客户端把它接入成一个可连续对话的命令行聊天程序,包括密钥获取、输入格式、生成参数与常见问题。

StableLM 是 StabilityAI 发布的开源语言模型,可用于研究与商业用途。它本身只是一个模型权重,要真正把它跑起来,还需要 GPU 算力、推理服务封装和一套调用接口。本文要解决的问题就是:不自己搭 GPU 机器,而是借助无服务器 GPU 平台上的社区模板,把 StableLM 部署成一个可调用的推理端点,再用 Python 客户端把它接成一个能连续对话的命令行聊天程序。如果你手上有 API 密钥、会写几行 Python,就可以跟着做完。站内也有对应的工具条目可供查阅:StableLM。

整条路径可以拆成两段:第一段在平台上完成,选模板、点部署、拿到模型密钥;第二段在本地完成,安装客户端库、填入两把密钥、按模型要求的格式构造输入、解析返回结果。第一段几乎不需要写代码,第二段的核心代码不到三十行。下面按顺序展开。

准备工作

开始之前,先把下面几项确认清楚。缺任何一项,后面的步骤都会卡住。

  • 平台账号:需要在提供无服务器 GPU 推理的平台上注册账号。部署、运行、查看日志都在这个账号下进行。
  • API 密钥(api_key):账号级别的密钥,用于标识调用方身份。通常在账号的设置或密钥管理页面生成。
  • 模型密钥(model_key):模型级别的密钥,在某个具体模型部署完成后生成,用来指定你要调用哪一个已部署的模型。它和 api_key 是两个不同的值,不能混用。
  • Python 环境:本地需要能运行 Python 3 的环境,并能用 pip 安装第三方包。
  • 客户端库:需要安装平台提供的 Python 客户端库,本文示例中导入名为 banana_dev,调用方式为 banana.run(...)。
  • 网络:本地要能访问平台的推理接口,否则 banana.run 会超时或报连接错误。

关于账号套餐、免费额度、计费方式、可用区域这些信息,各平台调整频繁,本文不给出具体数字,请以平台官网当前公布的信息为准。同样,StableLM 的模型版本、参数量、许可证条款也会随发布更新,使用前应核对官方说明。

为什么用社区模板而不是自己打包

自己部署一个语言模型,通常要处理依赖安装、显存分配、推理框架选择、请求队列与冷启动等一堆细节。社区模板是其他用户提交并维护的模型仓库,已经针对无服务器 GPU 环境做过适配和优化,部署时不需要自己写 Dockerfile 或推理服务代码。对只想尽快拿到一个可调用端点的人来说,这是成本最低的路径。代价是模板的维护状态、默认参数、支持的输入字段都由模板作者决定,使用前最好先看一眼模板说明。

操作步骤

第一步:在平台上找到 StableLM 模板并部署

登录平台后,进入模板(Template)区域,搜索 StableLM,选中对应的模型模板。模板页面上会显示该模型的简介、输入输出格式以及部署入口。确认模板与你的用途匹配后,点击部署按钮。

部署过程由平台完成,包括拉取镜像、分配 GPU、启动推理服务。所需时间取决于模型大小和当时的排队情况,通常几分钟内可以完成。部署成功后,模型会进入可调用状态,并在模型详情页给出该模型的 model_key。把这个值复制下来,后面写代码要用。

如果部署失败,先看平台给出的构建日志或运行日志。常见原因包括账号未完成验证、额度不足、所选区域资源紧张。这些都属于平台侧问题,按日志提示处理即可。

第二步:安装 Python 客户端库

在本地终端中安装客户端库。包名以平台文档为准,本文示例使用的导入名是 banana_dev:

pip install banana-dev

安装完成后,可以在 Python 交互环境里执行 import banana_dev 验证是否成功。如果报模块找不到,检查当前使用的 Python 解释器与 pip 是否属于同一环境,虚拟环境尤其容易出这个问题。

第三步:准备两把密钥

代码里需要填入两个值:

  • api_key:账号级 API 密钥,从账号设置页获取。
  • model_key:第一步部署完成后得到的模型密钥。

建议不要把密钥硬编码进要提交到版本库的文件里。可以先用环境变量保存,在代码中读取,例如 os.environ["API_KEY"] 与 os.environ["MODEL_KEY"]。本文为了与示例保持一致,仍以字符串占位符的形式展示,实际使用时请替换成自己的值或改为读取环境变量。

第四步:按模板要求构造输入

这是整篇教程里最容易出错的一步。StableLM 的对话模板要求把用户输入和助手回复用特殊标记分隔开,示例中使用的格式是:

<|USER|>用户说的话<|ASSISTANT|>

也就是说,用户消息前加 <|USER|>,助手开始生成的位置加 <|ASSISTANT|>。模型看到这个结构,才知道该从哪里接着往下写。如果漏掉标记,模型可能把整段当成普通文本续写,输出会变得不可控。

除了 prompt,示例还传了两个生成参数:

参数示例值作用
prompt带标记的字符串模型输入,包含用户消息与助手起始标记
max_new_tokens64限制本次生成的最大新 token 数
temperature0.7控制采样随机性,值越高输出越发散

这两个数值是示例中的取值,不是必须遵守的默认值。想要更长的回答就调大 max_new_tokens,想要更稳定的输出就调低 temperature。模板实际支持的字段与取值范围,以模板页面说明为准。

第五步:调用模型并解析返回

调用入口是 banana.run(api_key, model_key, prompt),其中第三个参数就是上面构造的输入字典。返回值是一个字典,模型生成的文本位于 modelOutputs 列表的第一项里,字段名为 output:

result = model_response["modelOutputs"][0]["output"]

拿到文本后,示例还做了一步处理:把用户输入从结果里去掉。原因是模型返回的内容可能包含完整的对话上下文,而不只是新生成的回复。用 result.replace(user_prompt, "") 把用户原话剔除,剩下的就是助手部分。这一步不是必须的,取决于模板返回的具体内容,可以先打印原始返回值观察一下再决定。

一个完整示例

下面是一个可以直接运行的最小聊天程序。它把前面几步串起来:读取密钥、循环接收用户输入、构造带标记的 prompt、调用模型、打印回复。输入 stop 退出。

import banana_dev as banana

api_key = "INSERT API KEY"
model_key = "INSERT MODEL KEY"

print("this is your StableLM chatbot! What do you want to talk about?")

def call_model(prompt):
    out = banana.run(api_key, model_key, prompt)
    return out

while True:
    print("type your message:")
    user_prompt = input('')
    if user_prompt == "stop":
        exit()

    model_inputs = {
        "prompt": "<|USER|>" + user_prompt + "<|ASSISTANT|>",
        "max_new_tokens": 64,
        "temperature": 0.7
    }

    model_response = call_model(prompt=model_inputs)
    result = model_response["modelOutputs"][0]["output"]
    print(result.replace(user_prompt, ""))

运行前,把 INSERT API KEY 和 INSERT MODEL KEY 替换成自己的两把密钥。运行后终端会先打印一句开场白,然后等待输入。输入一句话回车,程序会调用远端模型并打印回复,接着继续等待下一句。输入 stop 结束。

这个示例刻意保持简单,没有做异常处理、没有保存对话历史、没有流式输出。它适合用来验证部署是否成功、密钥是否有效、输入格式是否正确。确认能跑通之后,再按自己的需求往上加功能。

验证清单

如果程序跑不通,按下面的顺序逐项排查:

  1. 密钥是否填对:api_key 与 model_key 是否来自正确的位置,有没有多余空格或换行。
  2. 模型是否处于运行状态:平台上的部署是否成功、是否被暂停或删除。
  3. 输入结构是否正确:prompt 里是否同时包含 <|USER|> 与 <|ASSISTANT|>,拼接时有没有漏掉空格或引号。
  4. 返回结构是否与代码一致:先打印整个 model_response,确认 modelOutputs 与 output 这两个键确实存在。
  5. 网络是否可达:本地能否访问平台接口,是否有代理或防火墙拦截。

注意事项

  • 模板与接口会变化:社区模板由用户维护,输入字段、返回结构、默认参数都可能随模板更新而改变。本文示例反映的是写作时的形态,实际使用前请以模板页面与平台文档的当前说明为准。
  • 两把密钥要分清:api_key 是账号级,model_key 是模型级。把 model_key 填到 api_key 的位置,或者反过来,都会导致调用失败。
  • 对话标记不能省:<|USER|> 与 <|ASSISTANT|> 是模型区分角色轮次的依据,省略后输出质量会明显下降。
  • 生成长度有上限:max_new_tokens 控制单次生成的新 token 数,设得过大可能超出模型上下文长度或触发平台限制,设得过小则回答会被截断。
  • 无服务器意味着冷启动:长时间没有请求后,实例可能被回收,下一次调用需要重新拉起,首次响应会明显变慢。对延迟敏感的场景要提前考虑这一点。
  • 计费与配额以官网为准:调用次数、GPU 时长、免费额度、价格都会调整,本文不列具体数字。上线前请查阅平台当前的价格与配额页面。
  • 模型能力有边界:StableLM 是通用语言模型,输出可能包含不准确或不当内容,用于面向用户的产品时应自行加入过滤与审核环节。
  • 许可证需自行核对:模型声明可用于研究与商业用途,但具体条款可能随版本更新,商用前应阅读对应版本的许可证原文。