本文提供了一份分步指南,介绍如何通过 AMD Token Lab 在 AMD GPU 上调用 Gemma 4 31B。AMD Token Lab 是一个免费 API,随 AMD AI Developer Program 会员资格一同提供。在此基础上,我们搭建了一个本地聊天页面、一个终端客户端和一个小型 ADK 智能体,全部基于同一套环境。
https://github.com/xbill9/gemma4-dev/tree/main/tokenlab-sglang-amd-31b
问题很简单:在一个零成本的 API 上你能构建什么?Token Lab 为每位计划成员提供一个密钥、30 天访问期和积分预算,无需信用卡,也无需申请额度。下文中的每个数字都来自 2026-11-13 向其发送的请求。
什么是 AMD Token Lab?
Token Lab 自称是一个 OpenAI 兼容 API,“为领先的开源模型提供服务,运行在 AMD Instinct 和 Radeon 上”。其基础 URL 为https://api.tokenlab.amd.com/v1,可通过 curl、OpenAI 和 Anthropic SDK、LangChain 以及 AMD AI Notebooks 使用。
它是 AMD AI Developer Program 的会员福利之一。该计划的 Cloud Credits 页面提供三个选项:AMD Instinct Developer Cloud、Fireworks AI 和 Token Lab。Token Lab 是唯一标注“无需申请额度”的选项。
目录中共有 10 个模型,全部标注为免费:Gemma 4 31B、DeepSeek V4 Flash 和 V4.1 Flash、Qwen3.8 27B、三个 MiniCPM 模型,以及三个决策模型。Gemma-4-31B-IT 可读取文本和图像,上下文窗口为 262,144 个 token。
新密钥附带的内容:
| 配额 | 值 |
|---|---|
| 积分 | 10,用于访问期 |
| 访问期 | 30 天,可延长一次,每次 15 天 |
| 速率限制 | 每个密钥每分钟 20 次请求 |
| Gemma 4 31B 费率 | 每百万输入 token 0.035 积分,每百万输出 token 0.07 积分 |
| 你的成本 | 零 |
Token Lab 表示,积分衡量的是每个模型的相对用量,模型越大,每个 token 消耗的积分越多。运行本文中的所有内容,23 次请求共使用了 10 积分中的 0.000335。
此时你应当已具备……
- 一个用于注册 AMD 账户的电子邮箱
- Python 3 及
pip - 对于智能体:
google-adk和litellm(pip install google-adk litellm) - 克隆
gemma4-dev,或仅克隆tokenlab-sglang-amd-31b目录
第 1 步 — 加入 AMD AI Developer Program
该计划主页直言不讳:“加入该计划是免费的,可帮助你在 AMD 硬件上构建、优化和扩展 AI。”
前往https://developer.amd.com并选择加入计划。如果你是 AMD 新用户,页面列出的步骤如下:
- 完成 AMD AI Developer Program 注册表单
- 验证你的邮箱地址
- 访问 AI Academy
如果已有 AMD 账户,请登录并打开加入表单。
会员权益还包括一个月的 DeepLearning.AI 会员资格、活动优先报名、与 AMD 工程师的私密 Discord 频道,以及每月抽奖赢取 Radeon GPU 或 Ryzen AI PC。
第 2 步 — 获取 Token Lab 密钥
打开https://notebooks.amd.com/tokenlab并使用以下方式登录AMD AI Developer Program (Global) 登录。该页面有三个步骤:获取你的密钥、复制 base URL、从目录中调用模型。
仪表盘显示剩余点数、过去 30 天的请求数、剩余天数、速率限制和密钥状态,并提供重新生成或撤销密钥的按钮。重新生成会保留你的点数和访问期限。
将密钥放入 rig 的.env,仅你自己可读,且绝不提交到仓库:
cd tokenlab-sglang-amd-31b
umask 077; echo 'TOKENLAB_API_KEY=tl-...' > .env
base URL 和模型名称位于已提交的tpu.env中:
TOKENLAB_BASE_URL=https://api.tokenlab.amd.com/v1
MODEL_NAME=Gemma-4-31B-IT
第 3 步 — 第一次调用
make query发送一次聊天补全请求并打印原始回复:
$ make query
{
"model": "Gemma-4-31B-IT",
"choices": [
{
"message": {
"role": "assistant",
"content": "澳大利亚的首都是堪培拉。"
},
"finish_reason": "stop",
"matched_stop": 106
}
],
"usage": {
"prompt_tokens": 20,
"completion_tokens": 8,
"cost": 1.1228e-06
}
}
每条回复都带有一个以点数计的cost字段,因此客户端可以自行维护累计总量。
第 4 步 — 端点背后是什么
make models打印 Token Lab 发布的模型卡:
{
"id": "Gemma-4-31B-IT",
"name": "Gemma 4 31B",
"description": "由 Model Ops 管理的动态 sglang-router 服务",
"context_length": 262144,
"supported_parameters": ["temperature", "max_tokens", "top_p", "stream",
"response_format", "tools", "tool_choice", "reasoning_effort"],
"architecture": {"input_modalities": ["text", "image"], "output_modalities": ["text"]}
}
Gemma 4 31B 运行在 SGLang 上:模型卡中写着 "sglang-router",回复中带有 SGLang 的matched_stop字段。同一目录中的三个 MiniCPM 模型是 "vllm-router" 服务。Token Lab 仅以 AMD Instinct 和 Radeon 来指代硬件。
工具调用和 JSON 输出都在支持的参数中,这正是第 7 步中的智能体所需要的。
第 5 步 — 一个本地聊天页面
chat_ui.py是这个仓库的 TPU v5e vLLM 机器上的聊天页面,指向 Token Lab。它是标准库 Python:在一个页面上提供服务,并127.0.0.1转发/v1/*到 Token Lab,并附带密钥,因此密钥保留在你的机器上,永远不会到达浏览器。
$ make ui
Chat UI on http://localhost:8766 -> https://api.tokenlab.amd.com/v1 (Gemma-4-31B-IT)
侧边面板有最大 token 数、temperature、top-p、思考开关和系统提示词;上一条回复的首 token 时间、解码速率、token 数和积分;模型卡片;以及本次会话的累计数据。那条回复首 token 耗时 4.96 s,解码速率为每秒 9.5 个 token,消耗了 0.00000942 积分。
🖼 按钮用于附加图片,以 OpenAI 图片格式的 data URL 发送。开启思考后,Gemma 的推理会通过chat_template_kwargs.enable_thinking进行,推理内容会流式显示在答案上方的可折叠区域中。
第 6 步 — 从终端
ask.py遵循ask本仓库 GTX 1650 Ti 机器的客户端:单次提问后退出、管道输入,或带记忆的对话。
$ make bin # links ~/bin/ask-tokenlab
$ echo "Canberra is the capital of Australia." | ask-tokenlab translate to French
**Canberra est la capitale de l'Australie.**
管道输入成为材料,参数成为指令。-T开启思考,-I photo.jpg附加图片,-r打印原始 JSON,不带参数则打开一个对话,其中!清除历史记录。
第 7 步 — 一个示例 ADK 智能体
tokenlab_agent/是 Google 的 Agent Development Kit 的一个小型智能体。ADK 通过 LiteLLM 的 OpenAI provider 访问 Token Lab,因此整个连接就是一个模型对象:
model = LiteLlm(
model="openai/Gemma-4-31B-IT",
api_base="https://api.tokenlab.amd.com/v1",
api_key=TOKENLAB_API_KEY,
num_retries=30,
timeout=600,
extra_body={"chat_template_kwargs": {"enable_thinking": False}},
)
该智能体有两个工具。list_tokenlab_models返回 Token Lab 当前提供的内容。count_and_range在代码中计数、过滤并找出最小值和最大值,因此模型引用精确数字并说明它使用的过滤条件:
def count_and_range(numbers: list[float], at_least: Optional[float] = None,
below: Optional[float] = None) -> dict:
"""统计满足 at_least <= x < below 的数字,并给出它们的最小值、最大值和总和。"""
run_agent.py运行一轮并打印每次工具调用及其耗时:
$ python3 run_agent.py
8.1s call count_and_range({"at_least": 10, "numbers": [0, 2, 3, 20, 21, 22, 23, 10, 11, 12, 13]})
8.1s result {"filter": "10 <= x", "total_values": 11, "count": 8, "min": 10, "max": 23, "sum": 132}
12.3s answer There are 8 values that are 10 or more, using the filter "10 <= x".
Gemma 将 "10 or more" 理解为at_least: 10,工具返回了 8,答案引用了工具的计数和过滤条件。第二个工具:
$ python3 run_agent.py Token Lab 上哪些模型由 vLLM 提供服务,哪些由 SGLang 提供服务?简短列表。
25.7s call list_tokenlab_models({})
38.4s result {"models": [{"id": "Clef", "service": "由 Model Ops 管理的动态辅助路由服务", ...
48.9s answer **vLLM:**
* MiniCPM5-2B
* MiniCPM-V-4.7-1B
* MiniCPM-V-4.7-35B-A3B
**SGLang:**
* DeepSeek-V4.1-Flash
* DeepSeek-V4-Flash
* Gemma-4-31B-IT
* Qwen3.8-27B
同一个智能体也运行在 ADK 自带的工具中:make agent用于adk run在终端中,以及make agent-web用于adk web在端口 8767 上。
第 8 步 — 免费版有多快?
一次一个流式请求,temperature 0,从一台笔记本电脑发起:
| 思考 | 补全 token 数 | 首 token | 总计 | 解码 |
|---|---|---|---|---|
| 关闭 | 97 | 5.04 s | 17.8 s | 7.55 tok/s |
| 关闭 | 256 | 1.22 s | 35.0 s | 7.55 tok/s |
| 关闭 | 35 | 2.23 s | 12.3 s | 3.41 tok/s |
| 开启 | 390(291 推理) | 3.35 s | 199.8 s | 1.98 tok/s |
一天之内,单个请求的解码速度在 2.0 到 9.5 token/秒之间波动,首 token 在 1.2 到 5.0 s 后到达。在计时运行中,响应头在半秒内到达,流在首 token 之前持续发送 keep-alive ping。
该端点由所有 Token Lab 用户共享。Gemma 4 31B 在所有用户合计下限制为同时 128 个请求,超出限制的请求会收到 HTTP 429,并附带Retry-After: 1。这些数字描述的是 Token Lab 当天的负载,并不说明其背后 GPU 的速度。
🔎 提示:在流开始前重试
当模型达到共享上限或你的密钥超过每分钟 20 个请求时,Token Lab 会返回 429;当后端重启时,会返回 502、503 或 504。其 FAQ 要求客户端等待几秒后重新发送请求,并遵守Retry-After。
tokenlab.py会在回复开始前为聊天页面和终端客户端执行该操作,智能体则通过 LiteLLM 的num_retries获得该能力。已经开始后才中断的流没有可用于重试的状态码:完整的流以data: [DONE]结束,聊天页面会标记没有以它结尾的回复。
该流还会携带会让严格解析器出错的行:: ping排队期间,id: N每个事件之后,以及event: done在[DONE]之前。只读取data:行。
比较与对照
该项目 Cloud Credits 页面上的三个选项:
| Token Lab | AMD Instinct Developer Cloud | Fireworks AI | |
|---|---|---|---|
| 你将获得 | 模型目录的 API | 裸 AMD Instinct GPU | 托管模型端点 |
| 额度申请 | 🥇 无 | 表单,然后验证 | 表单,然后验证 |
| 设置 | 🥇 一个密钥 | 你自己的技术栈(vLLM、SGLang、PyTorch) | 🥈 一个密钥 |
| 对模型的控制 | 仅目录 | 🥇 你部署的任何东西 | 目录 |
| 速度 | 共享,有波动 | 🥇 独占一块 GPU | 托管 |
| 过期 | 激活后 30 天 | 激活后 30 天 | 签发后 90 天内 |
那么,选哪一个?
从 Token Lab 开始。它不花任何费用,除了一个密钥之外不需要申请,也不需要任何设置。这里是拿 Gemma 4 31B 与目录中其他模型对比、搭建原型以及接上智能体的地方。
当原型需要可靠的响应速度、需要目录之外的模型,或者需要一台自己的服务器时,申请 AMD Instinct Developer Cloud 额度并自行部署模型;本仓库的gpu-vllm-mi300x-31brig 在 vLLM 上部署同一个模型。
总结
本文的目标是找出在 AMD Token Lab(AMD AI Developer Program 附带的免费 API)上能构建什么。解决方案的关键是一个小型客户端模块,它保存密钥、按 Token Lab 的要求重试,并提供聊天页面、终端客户端和一个 ADK 智能体。结果如下:
- 🟢 加入该计划是免费的,Token Lab 无需申请额度:一个密钥附带 10 个点数、30 天有效期和每分钟 20 次请求。
- 🟢 Gemma 4 31B 通过 OpenAI API 回答文本和图像问题,支持思考、工具调用和 262,144 token 的上下文窗口。
- 🟢 本文所有内容在 23 次请求中共用掉 10 个点数中的 0.000335。
- 🟢 本地聊天页面把密钥保存在你的机器上,并显示每次回复的耗时和点数。
- 🟢 一个 ADK 智能体用一个
LiteLlm对象即可访问 Token Lab 并调用工具:它根据某个工具的精确结果回答了一道计数问题。 - ⚠️ 该端点是共享的:一次请求的解码速度为每秒 2.0 到 9.5 个 token,首个 token 最多需要 5 秒。
- ⚠️ Gemma 4 31B 在 Token Lab 背后运行于 SGLang,GPU 型号未公开。
- ❌ 超过共享的 128 次请求上限的请求会收到 429,必须重新发送;回复中途被截断的流无法自动重试。
范围:一台笔记本电脑调用api.tokenlab.amd.com于 2026-11-13,一次一个请求,Gemma-4-31B-IT,计时表使用 temperature 0。耗时包含网络以及共享服务上其他用户的负载,因此会逐小时变化。并发、长提示词和回答准确率未作测量。智能体使用 google-adk 2.13.0 和 litellm 1.106.4。
在 AMD Token Lab 上构建的策略通过逐步递进的方式得到了验证。
参考资料
- GitHub 上的 tokenlab-sglang-amd-31b
- 本文的证据
- AMD AI Developer Program
- AMD Token Lab
- Google Agent Development Kit
- LiteLLM
- SGLang
- Hugging Face 上的 Gemma 4 31B
- GitHub 上的 gemma4-dev
希望你喜欢!
