设置您的链
主机(硬件提供商或节点)向网络提供计算资源,并根据其提供的资源数量和质量获得奖励。
要加入网络,您需要部署两个服务:
- 网络节点 – 由两个节点组成的服务:一个链节点和一个API节点。该服务处理所有通信。链节点连接到区块链,而API节点管理用户请求。
- 推理(ML)节点 – 一种在GPU上执行大语言模型(LLM)推理的服务。您至少需要一个ML节点才能加入网络。
本指南描述了在同台机器上部署这两个服务的场景,每个主机拥有一个ML节点。服务以Docker容器形式部署。
实时演示 — 如何启动节点(主机快速入门)
通过快速入门启动节点的演示会话录像如下。录像中的某些步骤可能与下方说明不同,因为快速入门会根据社区反馈持续更新。请始终遵循书面快速入门 — 它反映了当前正确的流程。
前提条件
本节提供有关配置硬件基础设施以参与Gonka网络启动的指导。目标是通过使您的部署符合网络期望来最大化协议奖励。
支持的模型
该协议支持治理批准的模型用于推理和计算证明(PoC v2)。在Gonka主网上,每个批准的模型都有其独立的PoC组和奖励追踪(自v0.2.12升级后支持多模型PoC)。
| 模型ID | 角色 |
|---|---|
MiniMaxAI/MiniMax-M2.7 |
MiniMax M2.7 — 基础模型(自提案78 / 轮次308起) |
deepseek-ai/DeepSeek-V4-Flash-0731 |
DeepSeek V4 Flash — PoC模型(自提案94 / 轮次360起)。系数位于poc_params。 |
zai-org/GLM-5.3-Flash |
GLM-5.3-Flash — 自轮次395起为活跃PoC模型(提案101)。penalty_start_epoch 394。系数0.62位于poc_params。 |
权威模型列表(治理API)
批准的模型可能在发布或轮次间发生变化。在编辑node-config.json之前,调用治理API,并将每个返回对象的"id"作为"models"下的键:
curl -sS http://node2.gonka.ai:8000/v1/governance/models
jq -r '.models[].id'。如果node2.gonka.ai无法访问,请使用其他参与者的公共API基础URL(协议、主机和端口)。响应还包括网络参数,例如model_args;后面的node-config.json示例展示了常见硬件的典型args — 请根据您的GPU和基准测试进行调整。
您通常在node-config.json中为每个ML节点运行一个模型。
治理列表(GET /v1/governance/models,poc_params.models)是每个模型的批准目录。模型的系数仅在其所属组符合条件时才产生共识权重:满足v_min和w_threshold的投票权。错过/拒绝惩罚仅适用于符合条件的组。一个被列入但无投票权的模型是下一个PoC的启动候选者 — 仅切换node-config不会恢复共识权重。请检查poc_params和该轮次的confirmation_weight_scales。从v0.2.16起,weight_scale_factor在poc_params.models上为空。已包含在奖励权重中的系数是该轮次confirmation_weight_scales上的effective_coefficient。参见多模型PoC。
实时服务是单独的检查:/v1/epochs/current/participants。moonshotai/Kimi-K2.6和zai-org/GLM-5.2-FP8仍保留在治理目录中,但已被提案101从poc_params中移除 — 它们不是PoC模型。GLM-5.3-Flash自轮次395(penalty_start_epoch 394)起为活跃PoC组;参见GLM-5.3-Flash启动。
如果您不运行所有批准的模型
多模型PoC按每个模型跟踪参与情况。对于您未运行的符合条件的模型,请使用链上委托或拒绝。常规的错过/拒绝惩罚仅适用于符合条件的组。一个被列入但无投票权的模型是启动候选者;refuse不是必需的,也不是启动参与模式。委托/拒绝不是上线节点的必要条件 — 您使用与向ML操作密钥授予权限中相同的账户(冷)密钥,在注册和验证之后。复制粘贴命令位于末尾:可选:PoC委托和拒绝。有关策略和惩罚,请阅读多模型PoC — 主机操作指南。对于GLM-5.3-Flash(自轮次394起的惩罚),请参见GLM-5.3-Flash启动。
治理与模型分类
- 如果经治理批准,模型可被归类到某一类别。
- 关于添加或更改支持模型的决策由治理做出。
- 有关治理流程和如何提出新模型的详细信息,请参阅交易与治理指南。
建议的硬件配置
要运行有效的节点,您需要配备支持的GPU的机器。以下为参考布局:
| 模型名称 | ML节点(最少) | 示例硬件 | 每个ML节点的最小VRAM |
|---|---|---|---|
MiniMaxAI/MiniMax-M2.7 |
≥ 2 | 每个ML节点:4× A100 / 4× H100 / 2× H200 / 2× B200 | ~320 GB |
deepseek-ai/DeepSeek-V4-Flash-0731 |
≥ 2 | 每个ML节点:4× H100 / 2× H200 / 2× B200 / 1× B300 | ~280 GB |
zai-org/GLM-5.3-Flash |
≥ 2 | 8× H100 / 4× H200 / 4× B200 / 2× B300 每个MLNode | ~560 GB |
这是一个参考架构。您可以调整节点数量或硬件分配,但我们建议遵循核心原则:每个节点应支持所有模型层级的多个ML节点。
从 v0.2.16 开始,从 effective_coefficient 读取周期的奖励系数,而不是从 poc_params.models[].weight_scale_factor(该字段为空)。相同的值位于 GET /chain-api/productscience/inference/inference/dynamic_coefficients/{epoch_index}。epoch_index = 0 是当前周期。将每个 Decimal 解码为 value × 10^exponent。下一个PoC的界限是 poc_params.models[].dynamic_coefficient。在 v0.2.16 之前形成的周期仍使用 weight_scale_factor。只有当模型组有资格(具有投票权)时,系数才会产生共识权重。参见 DeepSeek V4 Flash Bootstrap、GLM-5.3-Flash Bootstrap 和 系数表。vLLM 参数示例见下面的 node-config.json 示例。
有关最佳部署配置的更多详细信息,请参见 此处。
托管网络节点的服务器应具备:
- 16核CPU(amd64)
- 64 GB 或更多内存
- 1TB NVMe SSD
- 最低100Mbps网络连接(建议1Gbps)
最终要求将取决于连接的ML节点数量及其总吞吐量。
用于部署每个ML节点的服务器应具备:
- 至少为GPU显存容量的1.5倍内存
- 16核CPU(网络节点和ML节点可部署在同一台服务器上)。
- 已安装并配置NVIDIA Container Toolkit,CUDA Toolkit版本在12.6至12.9之间。您可以通过
nvidia-smi检查版本。
网络访问、代理和端口(重要)
Gonka网络采用基于代理的架构,以保护节点免受滥用和DDoS攻击。所有公共HTTP/HTTPS流量必须通过代理容器。直接暴露网络节点或ML节点服务是不安全的。
公开暴露的端口
以下端口可以暴露给公共互联网:
- 5000 - Tendermint P2P通信
- 8000 / 8443 - 仅通过代理的应用服务
警告:内部端口
以下端口为仅限内部使用,严禁公开访问:
- 26657 - Tendermint RPC
- 9100, 9200 — 网络节点内部API
- 5050 — ML节点 / vLLM推理API
- 8080 — ML节点API
如果这些端口中的任何一个暴露在公共互联网上,您的节点将面临风险。第三方可以自由发送请求,过载您的ML节点,干扰挖矿,或导致您的节点脱离周期。
要求:
- 仅允许从本地主机、私有网络或白名单访问这些端口
- 切勿公开暴露这些端口
- Docker默认设置不安全
从升级 0.2.8 开始
为默认增强安全性和性能,除非显式覆盖,否则将自动应用以下路由控制和链服务限制。
# Defines which routes bypass rate limits (Exempt) vs those completely disabled (Blocked)
- GONKA_API_EXEMPT_ROUTES=chat inference
- GONKA_API_BLOCKED_ROUTES=poc-batches training
# Disables public access to Chain services by default
- DISABLE_CHAIN_API=${DISABLE_CHAIN_API:-true}
- DISABLE_CHAIN_RPC=${DISABLE_CHAIN_RPC:-true}
- DISABLE_CHAIN_GRPC=${DISABLE_CHAIN_GRPC:-true}
以下情况描述了网络节点和ML节点服务的内部端口隔离。这些规则在将代理配置为唯一公共入口点后生效。它们不替代代理,必须与代理一起使用。
将端口绑定到仅本地主机。
网络节点(docker-compose.yml)
如果您的ML节点容器和网络节点容器在同一台机器上,您可以直接编辑 gonka/deploy/join/docker-compose.yml:
api:
ports:
- "127.0.0.1:9100:9100"
- "127.0.0.1:9200:9200"
**ML 节点 (`docker-compose.mlnode.yml`)**
```
ports:
- "127.0.0.1:${PORT:-8080}:8080"
- "127.0.0.1:${INFERENCE_PORT:-5050}:5000"
```
请勿使用:
- "9100:9100"
- "9200:9200"
- "5050:5000"
- "8080:8080"
在此配置中,网络节点与 ML 节点之间的所有通信必须通过私有网络进行。严禁使用公共 IP 或公共 DNS 名称进行:
- ML 节点 API
DAPI_API__POC_CALLBACK_URL
如果 ML 节点和网络节点容器位于不同机器上,则情况 1 中描述的修复方法将无效,保护这些端口的具体方式取决于您的配置。您应通过同一 Docker 网络或在机器间建立私有网络来连接 ML 节点和网络容器,暴露该网络中的端口并关闭公共访问。在此情况下,您还应在配置中正确设置 DAPI_API__POC_CALLBACK_URL 变量。此 URL 必须指向私有/内部地址,而非公共地址。
设置您的节点
快速入门说明旨在将网络节点和推理节点部署在同一台机器上(单服务器设置)。
多节点部署
如果您要部署多个 GPU 节点,请参阅详细的 多节点部署指南 以进行正确设置和配置。无论您是将推理节点部署在单台机器上还是跨多台服务器(包括跨地理区域),所有推理节点都必须连接到同一个网络节点。
密钥管理概述
在配置您的网络节点之前,您需要设置加密密钥以确保安全操作。
建议在启动生产节点前阅读 密钥管理指南。
我们使用三密钥系统:
- 账户密钥(冷钱包)- 在您的本地安全机器上创建,用于高风险操作
- 共识密钥(TMKMS - 温存储)- 由安全的 TMKMS 服务管理,用于区块验证和网络共识参与
- ML 运营密钥(温钱包)- 在服务器上创建,用于自动化 AI 工作负载交易
[本地机器] 安装 CLI 工具
inferenced CLI 是本地账户管理和网络操作所必需的。它是一个命令行界面工具,允许您从本地机器创建和管理 Gonka 账户、注册主机并执行各种网络操作。
选择正确的二进制文件
GitHub 发布版本可能包含多个 inferenced 工件。
对于本地 CLI 使用,请始终下载 特定操作系统的打包 CLI 构建,例如:
inferenced-darwin-amd64.zipinferenced-darwin-arm64.zipinferenced-linux-amd64.zipinferenced-linux-arm64.zip
请勿使用专为升级路径或容器/运行时环境设计的通用 inferenced 二进制文件。这些工件可能无法在您的本地机器上作为独立 CLI 正常工作。
版本要求
请确保您使用的是 inferenced CLI 构建 版本 0.2.9 或 更新版本。旧版 CLI 不支持权限授予,可能导致意外行为。
如果您计划提交治理提案,特别是使用新消息类型的提案,请使用最新发布的特定操作系统 CLI 构建。
验证安装
chmod +x inferenced
./inferenced --help
macOS 用户
在 macOS 上,如果提示,请在 System Settings → Privacy & Security 中允许执行。向下滚动至关于 inferenced 的警告并点击 Allow Anyway。
如果二进制文件在 Linux 上启动失败并出现类似 Error relocating ./inferenced: qsort_r: symbol not found 的错误,您很可能下载了非 CLI 或仅用于升级的工件,而非特定操作系统的打包 CLI 构建。请重新下载适用于您操作系统和架构的正确归档文件。
[本地机器] 创建账户密钥
重要:此步骤必须在安全的本地机器上执行(非您的服务器)
关于账户密钥(冷密钥)
账户密钥是您的主要高权限密钥。它在本地创建,永不存储在您的服务器上。
- 主密钥,用于授予所有其他密钥权限
- 必须存储在安全的离线、隔离机器上
- 仅用于授予权限和验证者注册
- 由助记词保护——如果丢失,所有访问将永久丢失
使用 file 密钥环后端创建您的账户密钥(在支持的系统上,您也可以使用 os 以获得增强的安全性):
./inferenced keys add gonka-account-key --keyring-backend file
CLI 将要求您输入密码,并显示已创建的密钥对信息。
❯ ./inferenced keys add gonka-account-key --keyring-backend file
Enter keyring passphrase (attempt 1/3):
Re-enter keyring passphrase:
- address: gonka1rk52j24xj9ej87jas4zqpvjuhrgpnd7h3feqmm
name: gonka-account-key
pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"Au+a3CpMj6nqFV6d0tUlVajCTkOP3cxKnps+1/lMv5zY"}'
type: local
**Important** write this mnemonic phrase in a safe place.
It is the only way to recover your account if you ever forget your password.
pyramid sweet dumb critic lamp various remove token talent drink announce tiny lab follow blind awful expire wasp flavor very pair tell next cable
至关重要:请将此助记词抄写下来,并存储在安全的离线位置。此助记词是恢复您的账户密钥的唯一方式。
硬件钱包支持
当前状态:网络启动时暂不支持硬件钱包。
目前:请将您的账户密钥存储在安全的专用机器上,尽量减少互联网暴露并使用强加密。
重要:无论未来是否采用硬件钱包,都请始终将助记词作为备份。
[服务器] 下载部署文件
克隆包含基础部署脚本的仓库:
git clone https://github.com/gonka-ai/gonka.git -b main && \
cd gonka/deploy/join
DeepSeek V4 Flash 和 MLNode 3.0.16
main 仍锁定 MLNode 3.0.14-post2,不包含 DeepSeek node-config-*.json 文件。要部署 deepseek-ai/DeepSeek-V4-Flash-0731,请改为克隆 vllm-0.25.1-upgrade:
git clone https://github.com/gonka-ai/gonka.git -b vllm-0.25.1-upgrade && \
cd gonka/deploy/join
该分支锁定 ghcr.io/gonka-ai/mlnode:3.0.16(如果主机仍使用 CUDA 12.9,请使用 3.0.16-cu129 标签)。
GLM-5.3-Flash 和 MLNode 3.1.0
GLM-5.3-Flash 需要 vLLM 0.28、CUDA 13 驱动(580+)和镜像 ghcr.io/gonka-ai/mlnode:3.1.0-vllm-0.28.0。请勿对 GLM 使用 3.0.17。请克隆 feat/glm-5-3-flash-release 以获取内置的 node-config-glm53flash-*.json 文件(gonka-ai/gonka#1734):
git clone https://github.com/gonka-ai/gonka.git -b feat/glm-5-3-flash-release && \
cd gonka/deploy/join
在 8×H100 上将 POC_BATCH_SIZE_DEFAULT 设为 8,在 H200 上设为 16,在 B200/B300 上设为 32。在 NVSwitch VM 上设置 NCCL_NVLS_ENABLE=0。请参阅 GLM-5.3-Flash 启动指南。
并复制 config 文件模板:
cp config.env.template config.env
克隆仓库后,您将找到以下关键配置文件:
| 文件 | 描述 |
|---|---|
config.env |
包含网络节点的环境变量 |
docker-compose.yml |
用于启动网络节点的 Docker Compose 文件 |
docker-compose.mlnode.yml |
用于启动 ML 节点的 Docker Compose 文件 |
node-config.json |
网络节点使用的配置文件,描述此网络节点管理的推理节点 |
[服务器] 设置环境变量
配置必需
请完成问卷以生成您的 config.env 配置。环境变量取决于您的选择(HTTP/HTTPS、SSL 证书方法等)。
无域名时无法使用 HTTPS
SSL/TLS 证书仅能为域名(例如 example.com)签发,不能为直接 IP 地址签发。由于您表示未配置域名,您的节点将仅配置为 HTTP(端口 8000)。
如果您需要 HTTPS 安全性,请执行以下操作:
- 获取一个域名,并配置 DNS 指向您的服务器 IP 地址
- 点击上方的 "重置" 按钮,并在被问及是否拥有域名时选择 "是"
对于生产部署,强烈建议使用 HTTPS 以加密 API 通信并保护敏感数据。
如果您的节点无法连接到默认的种子节点,请参见常见问题解答获取详情。
[服务器] 编辑环境变量
需要编辑的变量:
其他所有变量均可保持不变。
如何从域名提供商获取变量:
Cloudflare
1) 打开 Cloudflare 仪表板。
2) 转到 Profile → API Tokens。
3) 点击 Create Token。
4) 使用 Edit zone DNS 模板,或设置权限:Zone:Read 和 DNS:Edit。
5) 将令牌限制为您的 DNS 区域并创建它。
6) 复制令牌并设置 CF_DNS_API_TOKEN。
AWS Route53
选项 A — AWS CLI
HOSTED_ZONE_ID="Z123EXAMPLE"
cat > route53-acme.json <<'JSON'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["route53:ChangeResourceRecordSets"],
"Resource": "arn:aws:route53:::hostedzone/${HOSTED_ZONE_ID}"
},
{
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:ListHostedZonesByName",
"route53:ListResourceRecordSets",
"route53:GetChange"
],
"Resource": "*"
}
]
}
JSON
aws iam create-policy \
--policy-name acme-dns-route53-${HOSTED_ZONE_ID} \
--policy-document file://route53-acme.json | jq -r .Policy.Arn
USER_NAME="acme-dns"
POLICY_ARN=$(aws iam list-policies --query "Policies[?PolicyName=='acme-dns-route53-${HOSTED_ZONE_ID}'].Arn" -o tsv)
aws iam create-user --user-name "$USER_NAME" >/dev/null || true
aws iam attach-user-policy --user-name "$USER_NAME" --policy-arn "$POLICY_ARN"
CREDS=$(aws iam create-access-key --user-name "$USER_NAME")
AWS_ACCESS_KEY_ID=$(echo "$CREDS" | jq -r .AccessKey.AccessKeyId)
AWS_SECRET_ACCESS_KEY=$(echo "$CREDS" | jq -r .AccessKey.SecretAccessKey)
echo "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID"
echo "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY"
echo "AWS_REGION=<your-aws-region>"
选项 B — 控制台
1) 创建一个仅限于您的托管区域的 IAM 策略(ChangeResourceRecordSets 和列出权限)。
2) 创建一个具有编程访问权限的 IAM 用户。
3) 将策略附加到该用户。
4) 创建访问密钥对并设置 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 和 AWS_REGION。
Google Cloud DNS
选项 A — gcloud CLI:
PROJECT_ID="<your-gcp-project>"
SA_NAME="acme-dns"
SA_EMAIL="$SA_NAME@$PROJECT_ID.iam.gserviceaccount.com"
gcloud config set project "$PROJECT_ID"
# 1) Service account
gcloud iam service-accounts create "$SA_NAME" \
--display-name "ACME DNS for proxy-ssl"
# 2) Role
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--member "serviceAccount:$SA_EMAIL" \
--role "roles/dns.admin"
# 3) Key → base64 (single line)
gcloud iam service-accounts keys create key.json --iam-account "$SA_EMAIL"
GCE_SERVICE_ACCOUNT_JSON_B64=$(base64 < key.json | tr -d '\n')
echo "GCE_PROJECT=$PROJECT_ID"
echo "GCE_SERVICE_ACCOUNT_JSON_B64=$GCE_SERVICE_ACCOUNT_JSON_B64"
1) IAM & 管理员 → 服务账号 → 创建服务账号(例如:acme-dns)。
2) 为服务账号授予角色:DNS 管理员(roles/dns.admin)。
3) 服务账号 → 密钥 → 添加密钥 → 创建新密钥(JSON)→ 下载。
4) 将 JSON 密钥 Base64 编码为单行,并设置 GCE_SERVICE_ACCOUNT_JSON_B64。将 GCE_PROJECT 设置为您的项目 ID。
Azure DNS
选项 A — Azure CLI(快速)
# 1) Login and choose subscription
az login
az account set --subscription "<your-subscription-name-or-id>"
# 2) Set where your DNS zone lives
RG="<<your-dns-resource-group>>"
ZONE="<<your-zone>>" # e.g., gonka.ai
SP_NAME="gonka-acme-$(date +%s)"
SUBSCRIPTION_ID=$(az account show --query id -o tsv)
SCOPE="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG/providers/Microsoft.Network/dnszones/$ZONE"
CREDS=$(az ad sp create-for-rbac \
--name "$SP_NAME" \
--role "DNS Zone Contributor" \
--scopes "$SCOPE" \
--only-show-errors)
# 4) Extract values
AZURE_CLIENT_ID=$(echo "$CREDS" | jq -r .appId)
AZURE_CLIENT_SECRET=$(echo "$CREDS" | jq -r .password)
AZURE_TENANT_ID=$(echo "$CREDS" | jq -r .tenant)
# 5) Print for your env file
echo "AZURE_CLIENT_ID=$AZURE_CLIENT_ID"
echo "AZURE_CLIENT_SECRET=$AZURE_CLIENT_SECRET"
echo "AZURE_SUBSCRIPTION_ID=$SUBSCRIPTION_ID"
echo "AZURE_TENANT_ID=$AZURE_TENANT_ID"
1) 转到 Microsoft Entra ID → 应用注册 → 新注册。复制应用程序(客户端)ID 和目录(租户)ID。
2) 转到证书和密钥 → 新客户端密钥。复制密钥值并设置 AZURE_CLIENT_SECRET。
3) 复制您的订阅 ID 并设置 AZURE_SUBSCRIPTION_ID。
4) 在您的 DNS 区域中,打开访问控制 (IAM) → 添加角色分配 → DNS 区域贡献者 → 分配给已注册的应用。
DigitalOcean DNS
1) 打开 DigitalOcean 控制面板。
2) 转到 API → 令牌。
3) 生成一个具有写入权限的令牌并设置 DO_AUTH_TOKEN。
Hetzner DNS
1) 打开 https://dns.hetzner.com。
2) 转到 API 令牌。
3) 创建新令牌并设置 HETZNER_API_KEY。
加载配置:
source config.env
使用环境变量
以下各节中的示例将引用这些环境变量(例如 $PUBLIC_URL、$ACCOUNT_PUBKEY、$SEED_API_URL),无论是在本地机器命令还是服务器命令中。请确保在每个将执行这些命令的终端会话中运行 source config.env。
[服务器] 编辑服务器的推理节点描述
Note
选择与您将要服务的模型和 GPU 类别匹配的标签。确认模型位于 GET /v1/governance/models。资格(投票权,confirmation_weight_scales)和实时服务(/v1/epochs/current/participants)与此目录无关。moonshotai/Kimi-K2.6 和 zai-org/GLM-5.2-FP8 在 提案 101 之后不再是 PoC 模型。治理决策负责添加或修改支持的模型。有关模型治理工作原理及如何提出新模型的详细信息,请参阅 交易与治理指南。
不是 PoC 模型(提案 101)
moonshotai/Kimi-K2.6 已被 提案 101 从 poc_params.models 中移除。它仍保留在 GET /v1/governance/models(推理目录)中,但切换到它不会获得 PoC 共识权重。这些参数是最后已知的部署形态。
有关当前 PoC 集(MiniMax、DeepSeek、GLM-5.3-Flash),请参阅其他标签和 GLM-5.3-Flash 启动。原始 Kimi 启动记录位于 Kimi K2.6 启动。
对于 Kimi K2.6 在 Blackwell 4×B200 或 8×B200 上,以及作为 8×H200 在相同布局下的参考(tensor_parallel_size 4 个专家并行分布在八个 GPU 上),请使用此 vLLM 参数集。仅在您的堆栈或基准测试需要时进行调整。
仓库中的参考部署配置:deploy/join/node-config-kimik26-B200.json。
edit node-config.json
[
{
"id": "node1",
"host": "inference",
"inference_port": 5000,
"poc_port": 8080,
"max_concurrent": 500,
"models": {
"moonshotai/Kimi-K2.6": {
"args": [
"--tensor-parallel-size", "4",
"--enable-expert-parallel",
"--trust-remote-code",
"--mm-encoder-tp-mode", "data",
"--tool-call-parser", "kimi_k2",
"--reasoning-parser", "kimi_k2",
"--attention-backend", "FLASHINFER_MLA",
"--disable-custom-all-reduce",
"--gpu-memory-utilization", "0.95",
"--max-num-seqs", "128",
"--max-model-len", "240000"
]
}
}
}
]
注册或通过 API 更新节点时,使用相同的 "models" 块;有关等效的 curl 示例,请参阅 Kimi K2.6 启动。
仓库中的参考部署配置:deploy/join/node-config-kimik26-H200.json。在所有 GPU 上使用 FLASHMLA 注意力和 tensor_parallel_size=8,无专家并行。
!!! note "edit node-config.json"
```
[
{
"id": "node1",
"host": "inference",
"inference_port": 5000,
"poc_port": 8080,
"max_concurrent": 500,
"models": {
"moonshotai/Kimi-K2.6": {
"args": [
"--tensor-parallel-size", "8",
"--enable-expert-parallel",
"--trust-remote-code",
"--mm-encoder-tp-mode", "data",
"--tool-call-parser", "kimi_k2",
"--reasoning-parser", "kimi_k2",
"--attention-backend", "FLASHMLA",
"--gpu-memory-utilization", "0.90",
"--max-model-len", "240000"
]
}
}
}
]
```
对于 MiniMax M2.7 在 4×A100 上,请使用此 vLLM 参数集。A100 无法使用 FP8 FlashInfer MoE 路径,因此此配置使用 marlin MoE 后端。您还需要为 mlnode-308 服务设置环境变量 VLLM_USE_FLASHINFER_MOE_FP8=0(这在随 MLNode 3.0.14 一起提供的 deploy/join/docker-compose.mlnode.yml 中已预先设置)。
仓库中的参考部署配置:deploy/join/node-config-minimaxm27-A100.json。
!!! note "edit node-config.json"
```
[
{
"id": "node1",
"host": "inference",
"inference_port": 5000,
"poc_port": 8080,
"max_concurrent": 500,
"models": {
"MiniMaxAI/MiniMax-M2.7": {
"args": [
"--moe-backend", "marlin",
"--tensor-parallel-size", "4",
"--gpu-memory-utilization", "0.95",
"--max-num-seqs", "128",
"--enable-auto-tool-choice",
"--max-model-len", "180000",
"--kv-cache-dtype", "fp8",
"--tool-call-parser", "minimax_m2",
"--reasoning-parser", "minimax_m2_append_think"
]
}
}
}
]
```
对于 MiniMax M2.7 在 4×H100 上,请使用此 vLLM 参数集。使用 FLASHINFER 注意力后端和 FP8 kv-cache。
仓库中的参考部署配置:deploy/join/node-config-minimaxm27-H100.json。
!!! note "edit node-config.json"
```
[
{
"id": "node1",
"host": "inference",
"inference_port": 5000,
"poc_port": 8080,
"max_concurrent": 500,
"models": {
"MiniMaxAI/MiniMax-M2.7": {
"args": [
"--tensor-parallel-size", "4",
"--attention-backend", "FLASHINFER",
"--gpu-memory-utilization", "0.92",
"--max-num-seqs", "128",
"--enable-auto-tool-choice",
"--max-model-len", "180000",
"--kv-cache-dtype", "fp8",
"--tool-call-parser", "minimax_m2",
"--reasoning-parser", "minimax_m2_append_think"
]
}
}
}
]
```
对于 MiniMax M2.7 在 2×H200(MiniMax 的 Hopper 参考类别)上,请使用此 vLLM 参数集。使用 FLASHINFER 注意力后端、FP8 kv-cache 和 tensor_parallel_size=2。MiniMax M2.7 的 PoC 黄金向量是在此确切配置上记录的。
仓库中的参考部署配置:deploy/join/node-config-minimaxm27-H200.json。
!!! note "edit node-config.json"
```
[
{
"id": "node1",
"host": "inference",
"inference_port": 5000,
"poc_port": 8080,
"max_concurrent": 500,
"models": {
"MiniMaxAI/MiniMax-M2.7": {
"args": [
"--tensor-parallel-size", "2",
"--attention-backend", "FLASHINFER",
"--gpu-memory-utilization", "0.92",
"--max-num-seqs", "128",
"--enable-auto-tool-choice",
"--max-model-len", "180000",
"--kv-cache-dtype", "fp8",
"--tool-call-parser", "minimax_m2",
"--reasoning-parser", "minimax_m2_append_think"
]
}
}
}
]
```
使用此 vLLM 参数集配置 MiniMax M2.7 在 2×B200(MiniMax 的 Blackwell 参考类别)上。使用 FLASHINFER_TRTLLM MoE 后端和 FP8 kv-cache 以及 tensor_parallel_size=2。
仓库中的参考部署配置:deploy/join/node-config-minimaxm27-B200.json。
!!! note "edit node-config.json"
```
[
{
"id": "node1",
"host": "inference",
"inference_port": 5000,
"poc_port": 8080,
"max_concurrent": 500,
"models": {
"MiniMaxAI/MiniMax-M2.7": {
"args": [
"--tensor-parallel-size", "2",
"--moe-backend", "FLASHINFER_TRTLLM",
"--gpu-memory-utilization", "0.92",
"--max-num-seqs", "128",
"--enable-auto-tool-choice",
"--max-model-len", "180000",
"--kv-cache-dtype", "fp8",
"--tool-call-parser", "minimax_m2",
"--reasoning-parser", "minimax_m2_append_think"
]
}
}
}
]
```
使用此 vLLM 参数集配置 DeepSeek V4 Flash 在 4×H100 上。DeepSeek 需要 MLNode 3.0.16(vLLM 0.25.1)。
仓库中的参考部署配置:deploy/join/node-config-deepseekv4flash0731-H100.json。
!!! note "edit node-config.json"
```
[
{
"id": "node1",
"host": "inference",
"inference_port": 5000,
"poc_port": 8080,
"max_concurrent": 500,
"models": {
"deepseek-ai/DeepSeek-V4-Flash-0731": {
"args": [
"--revision", "7872f01b1d1fe23eabc4c98b48bffcef5a386062",
"--tensor-parallel-size", "4",
"--gpu-memory-utilization", "0.85",
"--max-model-len", "400000",
"--max-num-batched-tokens", "32768",
"--kv-cache-dtype", "fp8",
"--tokenizer-mode", "deepseek_v4",
"--enable-auto-tool-choice",
"--tool-call-parser", "deepseek_v4",
"--reasoning-parser", "deepseek_v4",
"--trust-remote-code"
]
}
}
}
]
```
使用此 vLLM 参数集配置 DeepSeek V4 Flash 在 2×H200 上。DeepSeek 需要 MLNode 3.0.16(vLLM 0.25.1)。
仓库中的参考部署配置:deploy/join/node-config-deepseekv4flash0731-H200.json。
!!! note "edit node-config.json"
```
[
{
"id": "node1",
"host": "inference",
"inference_port": 5000,
"poc_port": 8080,
"max_concurrent": 500,
"models": {
"deepseek-ai/DeepSeek-V4-Flash-0731": {
"args": [
"--revision", "7872f01b1d1fe23eabc4c98b48bffcef5a386062",
"--tensor-parallel-size", "2",
"--gpu-memory-utilization", "0.90",
"--max-model-len", "400000",
"--max-num-batched-tokens", "32768",
"--kv-cache-dtype", "fp8",
"--tokenizer-mode", "deepseek_v4",
"--enable-auto-tool-choice",
"--tool-call-parser", "deepseek_v4",
"--reasoning-parser", "deepseek_v4",
"--trust-remote-code"
]
}
}
}
]
```
使用此 vLLM 参数集配置 DeepSeek V4 Flash 在 2×B200 上。DeepSeek 需要 MLNode 3.0.16(vLLM 0.25.1)。为在 Blackwell 上获得更好性能,请使用 nvfp4 变体 node-config-deepseekv4flash0731-B200-nvfp4.json(model_override 至 MJPansa/DeepSeek-V4-Flash-0731-NVFP4);该格式需要 API v0.2.15-post5 —— 请参阅 网络更新。
仓库中的参考部署配置:deploy/join/node-config-deepseekv4flash0731-B200.json。
!!! note "edit node-config.json"
```
[
{
"id": "node1",
"host": "inference",
"inference_port": 5000,
"poc_port": 8080,
"max_concurrent": 500,
"models": {
"deepseek-ai/DeepSeek-V4-Flash-0731": {
"args": [
"--revision", "7872f01b1d1fe23eabc4c98b48bffcef5a386062",
"--tensor-parallel-size", "2",
"--gpu-memory-utilization", "0.90",
"--max-model-len", "400000",
"--max-num-batched-tokens", "32768",
"--kv-cache-dtype", "fp8",
"--tokenizer-mode", "deepseek_v4",
"--enable-auto-tool-choice",
"--tool-call-parser", "deepseek_v4",
"--reasoning-parser", "deepseek_v4",
"--trust-remote-code"
]
}
}
}
]
```
使用此 vLLM 参数集配置 DeepSeek V4 Flash 在 1×B300 上。DeepSeek 需要 MLNode 3.0.16(vLLM 0.25.1)。在 B300 上,这是当前系数(0.246)下权重最高的 PoC 选项。为获得更好性能,请使用 nvfp4 变体 node-config-deepseekv4flash0731-B300-nvfp4.json(model_override 至 MJPansa/DeepSeek-V4-Flash-0731-NVFP4);该格式需要 API v0.2.15-post5 —— 请参阅 网络更新。
仓库中的参考部署配置:deploy/join/node-config-deepseekv4flash0731-B300.json。
!!! note "edit node-config.json"
```
[
{
"id": "node1",
"host": "inference",
"inference_port": 5000,
"poc_port": 8080,
"max_concurrent": 500,
"models": {
"deepseek-ai/DeepSeek-V4-Flash-0731": {
"args": [
"--revision", "7872f01b1d1fe23eabc4c98b48bffcef5a386062",
"--tensor-parallel-size", "1",
"--gpu-memory-utilization", "0.90",
"--max-model-len", "400000",
"--max-num-batched-tokens", "32768",
"--kv-cache-dtype", "fp8",
"--tokenizer-mode", "deepseek_v4",
"--enable-auto-tool-choice",
"--tool-call-parser", "deepseek_v4",
"--reasoning-parser", "deepseek_v4",
"--trust-remote-code"
]
```
使用此 vLLM 参数集配置 GLM-5.3-Flash 在 8×H100 上。GLM 需要 MLNode 3.1.0(vLLM 0.28,CUDA 13)。设置 POC_BATCH_SIZE_DEFAULT=8。
仓库中的参考部署配置:deploy/join/node-config-glm53flash-H100.json,参见 feat/glm-5-3-flash-release。
!!! note "edit node-config.json"
```
[
{
"id": "node1",
"host": "inference",
"inference_port": 5000,
"poc_port": 8080,
"max_concurrent": 500,
"models": {
"zai-org/GLM-5.3-Flash": {
"args": [
"--revision", "04c4e9e95c5da8862dced7e5056455116f83a7e0",
"--tensor-parallel-size", "8",
"--gpu-memory-utilization", "0.95",
"--max-num-batched-tokens", "16384",
"--kv-cache-dtype", "fp8",
"--block-size", "2304",
"--max-num-seqs", "256",
"--no-enable-flashinfer-autotune",
"--enable-auto-tool-choice",
"--tool-call-parser", "glm47",
"--reasoning-parser", "glm45",
"--trust-remote-code"
]
}
}
}
]
```
使用此 vLLM 参数集配置 GLM-5.3-Flash 在 4×H200 上。GLM 需要 MLNode 3.1.0(vLLM 0.28,CUDA 13)。设置 POC_BATCH_SIZE_DEFAULT=16。对于 8×H200,请运行两个 4-GPU 实例(node-config-glm53flash-8xH200.json)。
仓库中的参考部署配置:deploy/join/node-config-glm53flash-H200.json。
!!! note "edit node-config.json"
```
[
{
"id": "node1",
"host": "inference",
"inference_port": 5000,
"poc_port": 8080,
"max_concurrent": 500,
"models": {
"zai-org/GLM-5.3-Flash": {
"args": [
"--revision", "04c4e9e95c5da8862dced7e5056455116f83a7e0",
"--tensor-parallel-size", "4",
"--gpu-memory-utilization", "0.90",
"--max-num-batched-tokens", "16384",
"--kv-cache-dtype", "fp8",
"--block-size", "2304",
"--max-num-seqs", "256",
"--no-enable-flashinfer-autotune",
"--enable-auto-tool-choice",
"--tool-call-parser", "glm47",
"--reasoning-parser", "glm45",
"--trust-remote-code"
]
}
}
}
]
```
使用此 vLLM 参数集配置 GLM-5.3-Flash 在 4×B200 上。GLM 需要 MLNode 3.1.0(vLLM 0.28,CUDA 13)。在 B200 上,这是当前系数(0.62)下的预期 PoC 切换点。设置 POC_BATCH_SIZE_DEFAULT=32。在 NVSwitch VM 上设置 NCCL_NVLS_ENABLE=0。
仓库中的参考部署配置:deploy/join/node-config-glm53flash-B200.json。
!!! note "edit node-config.json"
```
[
{
"id": "node1",
"host": "inference",
"inference_port": 5000,
"poc_port": 8080,
"max_concurrent": 500,
"models": {
"zai-org/GLM-5.3-Flash": {
"args": [
"--revision", "04c4e9e95c5da8862dced7e5056455116f83a7e0",
"--tensor-parallel-size", "4",
"--gpu-memory-utilization", "0.90",
"--max-num-batched-tokens", "65536",
"--kv-cache-dtype", "fp8",
"--block-size", "2304",
"--max-num-seqs", "256",
"--no-enable-flashinfer-autotune",
"--enable-auto-tool-choice",
"--tool-call-parser", "glm47",
"--reasoning-parser", "glm45",
"--trust-remote-code"
]
}
}
}
]
```
使用此 vLLM 参数集配置 GLM-5.3-Flash 在 2×B300 上。GLM 需要 MLNode 3.1.0(vLLM 0.28,CUDA 13)。在当前系数下,DeepSeek 仍是 B300 上权重最高的选项;此配置为可选。设置 POC_BATCH_SIZE_DEFAULT=32。在 NVSwitch VM 上设置 NCCL_NVLS_ENABLE=0。
仓库中的参考部署配置:deploy/join/node-config-glm53flash-B300.json。
!!! note "edit node-config.json"
```
[
{
"id": "node1",
"host": "inference",
"inference_port": 5000,
"poc_port": 8080,
"max_concurrent": 500,
"models": {
"zai-org/GLM-5.3-Flash": {
"args": [
"--revision", "04c4e9e95c5da8862dced7e5056455116f83a7e0",
"--tensor-parallel-size", "2",
"--gpu-memory-utilization", "0.90",
"--max-num-batched-tokens", "65536",
"--kv-cache-dtype", "fp8",
"--block-size", "2304",
"--max-num-seqs", "256",
"--no-enable-flashinfer-autotune",
"--enable-auto-tool-choice",
"--tool-call-parser", "glm47",
"--reasoning-parser", "glm45",
"--trust-remote-code"
]
}
}
}
]
```
有关最优部署配置的更多详细信息,请参阅 此链接。
Validate the deployment
gonka 仓库 提供了一个代理技能 mlnode-validate,用于将 ML Node 与特定模型的预计算诚实 PoC 向量进行验证。使用与您部署的模型匹配的黄金参考:MiniMax-M2.7、DeepSeek V4 Flash(参见 vllm-0.25.1-upgrade)或 GLM-5.3-Flash(参见 feat/glm-5-3-flash-release)。Qwen3-0.6B / Qwen3-235B 的工件为历史版本,不是主网模型。请参阅 验证 ML Node 部署。
[Server] 预下载模型权重到 Hugging Face 缓存 (HF_HOME)
推理节点从 Hugging Face 下载模型权重。 为确保模型权重已准备好用于推理,您应在部署前下载它们。
moonshotai/Kimi-K2.6 在 提案 101 之后不再是 PoC 模型。仅当您打算从治理推理目录提供该模型时才下载它。将 node-config 切换为 Kimi 不会恢复 PoC 共识权重。有关历史记录,请参阅 Kimi K2.6 启动。
```bash
mkdir -p $HF_HOME
huggingface-cli download moonshotai/Kimi-K2.6
```
模型许可:参见 [模型许可](../model-licenses.md)。
mkdir -p $HF_HOME
huggingface-cli download MiniMaxAI/MiniMax-M2.7
模型许可:参见 模型许可。MiniMax M2.7 需要 MLNode 3.0.14 或更高版本(镜像 ghcr.io/gonka-ai/mlnode:3.0.14-cu129,锁定在 deploy/join/docker-compose.mlnode.yml)。在 A100 硬件上,还需确保为 mlnode-308 服务设置 VLLM_USE_FLASHINFER_MOE_FP8=0 环境变量(在随附的 compose 文件中已预设)。
mkdir -p $HF_HOME
huggingface-cli download deepseek-ai/DeepSeek-V4-Flash-0731 --revision 7872f01b1d1fe23eabc4c98b48bffcef5a386062
模型许可:参见 模型许可。DeepSeek V4 Flash 需要 MLNode 3.0.16 或更高版本(镜像 ghcr.io/gonka-ai/mlnode:3.0.16,锁定在 deploy/join/docker-compose.mlnode.yml 分支的 vllm-0.25.1-upgrade 上;如果主机仍使用 CUDA 12.9,请使用 3.0.16-cu129 标签)。有关操作说明和链上选项(意图、委托),请参阅 DeepSeek V4 Flash 启动指南。在 Blackwell GPU 上,nvfp4 重新打包 MJPansa/DeepSeek-V4-Flash-0731-NVFP4 需要 API v0.2.15-post5 —— 请参阅 网络更新。
mkdir -p $HF_HOME
huggingface-cli download zai-org/GLM-5.3-Flash --revision 04c4e9e95c5da8862dced7e5056455116f83a7e0
模型许可:参见 模型许可。GLM-5.3-Flash 需要 MLNode 3.1.0(镜像 ghcr.io/gonka-ai/mlnode:3.1.0-vllm-0.28.0)、vLLM 0.28 和 CUDA 13 驱动(580+)。请勿使用 3.0.17。有关操作说明和链上选项(意图、委托),请参阅 GLM-5.3-Flash 启动指南。
启动节点
[服务器] 拉取 Docker 镜像(容器)
在运行以下命令前,请确保您位于 gonka/deploy/join 文件夹中。
docker compose -f docker-compose.yml -f docker-compose.mlnode.yml pull
[服务器] 启动初始服务
启动密钥设置所需的必要服务(不包括 API 服务):
source config.env && \
docker compose up tmkms node -d --no-deps
我们首先启动这些特定容器,因为:
tmkms- 生成并安全管理验证器注册所需的共识密钥node- 连接到区块链并提供 RPC 端点以检索共识密钥api- 此阶段故意排除,因为我们需要在下一步中在其内部创建 ML 操作密钥
建议
您可以检查日志以确认初始服务是否成功启动:
docker compose logs tmkms node -f
如果看到链节点持续处理区块事件,则说明设置正常运行。
关于共识密钥
- 由安全的 TMKMS 服务管理
- 温存储,防止双重签名
- 区块验证与网络共识参与
- 可通过账户密钥或授权委托进行轮换
在 步骤 3.2.(inferenced register-new-participant)的注册命令期间,共识密钥将与链上的账户密钥(冷密钥)关联,从而将您的节点确立为网络的有效参与者。
如果您删除或覆盖 .tmkms 文件夹,您的共识密钥将丢失。此密钥是将您的节点与区块链验证者集关联的关键。一旦 .tmkms 被删除,您必须从头开始整个设置,包括生成新的共识密钥(通过 tmkms)(参见 FAQ 页面中的 “我清除了或覆盖了我的共识密钥”)。
完成密钥设置和主机注册
现在我们需要通过创建温密钥、注册主机并授予权限来完成密钥管理设置:
3.1. [服务器] 创建 ML 操作密钥
关于 ML 操作密钥(温密钥)
- 由账户密钥授权用于 ML 特定交易
- 服务器上的加密文件,可通过编程方式访问
- 自动化交易(推理请求、证明提交、奖励)
- 可随时由账户密钥轮换或撤销
- 需要持续可用,除非必要,否则请勿删除或轮换。
使用 file 密钥环后端在 api 容器内创建温密钥(编程访问所必需)。密钥将存储在映射到容器 /root/.inference 的持久卷中:
docker compose run --rm --no-deps -it api /bin/sh
在容器内创建 ML 操作密钥:
printf '%s\n%s\n' "$KEYRING_PASSWORD" "$KEYRING_PASSWORD" | inferenced keys add "$KEY_NAME" --keyring-backend file
重要
请勿运行此命令两次。 ML 操作密钥(温密钥)每个服务器仅生成一次,必须在重启后保留。
- 如果您意外删除或重新初始化,请遵循 FAQ 中的恢复说明: “我删除了温密钥”.
- 在重启您的节点时,完全跳过此步骤——密钥已生成并持久存储在 API 容器中。
示例输出:
~ # printf '%s\n%s\n' "$KEYRING_PASSWORD" "$KEYRING_PASSWORD" | inferenced keys add "$KEY_NAME" --keyring-backend file
- address: gonka1gyz2agg5yx49gy2z4qpsz9826t6s9xev6tkehw
name: node-702105
pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"Ao8VPh5U5XQBcJ6qxAIwBbhF/3UPZEwzZ9H/qbIA6ipj"}'
type: local
**Important** write this mnemonic phrase in a safe place.
It is the only way to recover your account if you ever forget your password.
again plastic athlete arrow first measure danger drastic wolf coyote work memory already inmate sorry path tackle custom write result west tray rabbit jeans
3.2. [服务器] 注册主机
从同一容器中注册主机——这会将您的 URL、账户密钥和共识密钥(自动获取)链上关联:
inferenced register-new-participant \
$DAPI_API__PUBLIC_URL \
$ACCOUNT_PUBKEY \
--node-address $DAPI_CHAIN_NODE__SEED_API_URL
预期输出:
...
Found participant: gonka1rk52j24xj9ej87jas4zqpvjuhrgpnd7h3feqmm (url: http://36.189.234.237:19250, status: ACTIVE)
Participant is now available at http://36.189.234.237:19250/v2/participants/gonka1rk52j24xj9ej87jas4zqpvjuhrgpnd7h3feqmm
Account balance: 0
账户已拥有 GNK,但尚未发送任何交易
在大多数情况下,inferenced register-new-participant 可以直接从 api 容器内注册您的主机。
但是,存在一个已知的边缘情况:如果您的账户密钥地址已接收 GNK,但从未发送过交易,则从容器内注册可能会失败,并出现类似以下错误:
rpc error: code = Unknown desc = runtime error: invalid memory address or nil pointer dereference: panic
当账户有余额,但其链上交易序列仍为 0 时,可能会发生这种情况。
如果上述命令因该错误失败,您可以在您的本地机器上检查账户余额和序列:
```bash
./inferenced query auth account <YOUR_COLD_ADDRESS> \
--node <node-url>/chain-rpc/ \
--output json | jq -r '.account.value.sequence // .sequence // "0"'
```
如果账户具有非零的 `ngonka` 余额,且序列命令返回 `0`,请使用下面的手动注册流程。
步骤 1. 仍在步骤 3.1 的容器中时,获取您的共识密钥并记录下来:
curl -s $DAPI_CHAIN_NODE__URL/status | jq -r '.result.validator_info.pub_key.value'
**步骤 2.** 退出容器,然后在您的**本地机器**(您的账户密钥存储位置)上运行以下命令:
```bash
./inferenced tx inference submit-new-participant \
<PUBLIC_URL> \
--validator-key <CONSENSUS_KEY> \
--keyring-backend file \
--from <COLD_KEY_NAME> \
--timeout-duration 1m \
--unordered \
--node <node-url>/chain-rpc/ \
--chain-id gonka-mainnet
```
`<node-url>`——网络上任何已运行的节点(例如 `http://node2.gonka.ai:8000`)。不要使用您自己的节点 URL——在此步骤中,它尚未完全启动。
如果您使用自定义 --keyring-dir 创建了账户密钥,请在命令中添加 --keyring-dir <path>。
该命令将提示 confirm transaction before signing and broadcasting [y/N]:——输入 y 继续。
在主网上注册是免费的。注册费用组已禁用,因此此命令不会消耗 GNK 作为燃料。
每个节点的账户密钥配置
为每个网络节点生成唯一的 ACCOUNT_PUBKEY,以确保主机之间的正确分离。
然后我们可以退出容器:
exit
3.3. [本地机器] 授予 ML 操作密钥权限
重要:请在创建账户密钥的安全本地机器上执行此步骤
从您的账户密钥向 ML 操作密钥授予权限。这还会创建一个费用授权(冷账户 → 温账户),默认消费限额为 10 GNK,以便 API 可以从冷账户支付需要费用的交易。如果此额度后来耗尽,您无法直接补充——必须撤销并重新授权;请参阅刷新费用授权。从 v0.2.16 开始,此授权包含 MsgDeclarePoCIntent,升级会将其添加到已存在的授权中。升级时无需重新运行此命令。委托和拒绝保持独立。请参阅如何从温密钥声明 PoC 意图?。
./inferenced tx inference grant-ml-ops-permissions \
gonka-account-key \
<ml-operational-key-address-from-step-3.1> \
--from gonka-account-key \
--keyring-backend file \
--gas 2000000 \
--gas-prices 1ngonka \
--node <seed_api_url from server's config.env>/chain-rpc/
预期输出:
...
Transaction sent with hash: FB9BBBB5F8C155D0732B290C443A0D06BC114CDF43E8EE8FB329D646C608062E
Waiting for transaction to be included in a block...
Transaction confirmed successfully!
Block height: 174
3.4. [服务器] 手动 SSL 证书设置
如果您在上述问卷中选择了手动 SSL 证书设置,请按照以下步骤配置您的 SSL 证书:
准备目录
mkdir -p secrets/nginx-ssl secrets/certbot
生成证书(Dockerized Certbot;DNS‑01)
DOMAIN=<FULL_DOMAIN_NAME>
ACCOUNT_EMAIL=<EMAIL_ADDRESS> # renewal notices
mkdir -p secrets/nginx-ssl secrets/certbot
docker run --rm -it \
-v "$(pwd)/secrets/certbot:/etc/letsencrypt" \
-v "$(pwd)/secrets/nginx-ssl:/mnt/nginx-ssl" \
certbot/certbot certonly --manual --preferred-challenges dns \
-d "$DOMAIN" --email "$ACCOUNT_EMAIL" --agree-tos --no-eff-email \
--deploy-hook 'install -m 0644 "$RENEWED_LINEAGE/fullchain.pem" /mnt/nginx-ssl/cert.pem; \
install -m 0600 "$RENEWED_LINEAGE/privkey.pem" /mnt/nginx-ssl/private.key'
DNS 挑战
Certbot 将暂停并显示在您的提供商处添加的 TXT DNS 记录。验证后,cert.pem 和 private.key 将出现在 ./secrets/nginx-ssl/ 中。
验证证书文件
确保证书文件已就位:
ls -la secrets/nginx-ssl/
您应该看到:
- cert.pem(完整链证书)
- private.key(权限为 0600 的私钥)
问卷生成的 config.env 文件已包含必要的 SSL 配置变量:
- SERVER_NAME=<FULL_DOMAIN_NAME>
- SSL_CERT_SOURCE=./secrets/nginx-ssl
在继续之前,请确保使用您的实际域名编辑 SERVER_NAME。
[服务器] 启动完整节点
最后,启动所有容器,包括 API:
source config.env && \
docker compose -f docker-compose.yml -f docker-compose.mlnode.yml up -d
使用自动 SSL 证书管理启动所有容器:
source config.env && \
docker compose --profile "ssl" \
-f docker-compose.yml -f docker-compose.mlnode.yml \
up -d
--profile "ssl" 标志启用了 proxy-ssl 容器,该容器自动管理 SSL 证书。
使用手动 SSL 证书启动所有容器:
source config.env && \
docker compose -f docker-compose.yml -f docker-compose.mlnode.yml up -d
验证节点状态
验证 HTTPS 是否正常工作:
curl -I https://<FULL_DOMAIN_NAME>:8443/health # Expect: HTTP/2 200 OK
打开此 URL,将 <your-gonka-cold-address> 替换为您的地址:
http://node2.gonka.ai:8000/v2/participants/<your-gonka-cold-address>
您应该会看到 JSON 格式的参与者数据(participant.address、participant.inferenceUrl、participant.status)。
要检查账户数据(pubkey、balance、denom),请使用:
http://node2.gonka.ai:8000/v2/accounts/<your-gonka-cold-address>
当您的节点完成计算证明阶段(每 24 小时运行一次)后,您可以访问以下 URL 查看您的节点:
http://node2.gonka.ai:8000/v1/epochs/current/participants
您可以在 MLNode 上自行模拟计算证明,以确保在链上开始 PoC 阶段时一切正常。
您可以在该阶段前关闭服务器,并在下一次计算证明开始前重新启动。 要跟踪下一次计算证明会话的开始时间,请查看以下仪表板:
http://node2.gonka.ai:8000/dashboard/gonka/validator
节点运行后,通过代理检查节点状态。
curl http://<PUBLIC_IP>:8000/chain-rpc/status
curl http://0.0.0.0:26657/status
curl http://node2.gonka.ai:8000/chain-rpc/status
当您的节点在仪表板中可见后,您可能还想更新您的公开资料(主机名、网站、头像)。这有助于其他参与者在网络中识别您的节点。您可以在此处找到说明。
为您的账户密钥(交易手续费)充值
重要:手续费从您的冷钱包支付。请在您的安全本地机器上执行转账和涉及手续费的交易。
从升级 v0.2.16 开始,Gonka 对一组特定的主机交易收取链上手续费。仅注册不足以加入计算证明(PoC)或一个纪元:您的冷账户必须持有足够的流动 GNK 余额,以便这些消息能被包含在链上。
在下一个 PoC 窗口前为您的账户密钥地址充值。此余额应与您将在 §5 存入抵押品 中锁定的抵押品分开——手续费从自由余额中支出;抵押品则存入抵押品模块。
当前手续费适用于以下消息类型:
| 消息 | 涵盖内容 |
|---|---|
MsgPoCV2StoreCommit |
在计算证明期间提交 PoC v2 提交 |
MsgSubmitHardwareDiff |
报告硬件/ML 节点变更 |
MsgDeclarePoCIntent |
在引导窗口期间声明模型意向 |
MsgSetPoCDelegation |
将 PoC 验证权重委托给其他参与者 |
MsgRefusePoCDelegation |
明确拒绝某个模型的 PoC 委托 |
MsgDepositCollateral |
存入抵押品(本节的后续步骤) |
MsgWithdrawCollateral |
在解绑期后提取抵押品 |
其他协议职责流量(例如常规推理、PoC 验证、种子提交、奖励申领和 BLS)保持免费。银行转账、authz 授权和 feegrant 撤销/授权属于 cosmos 组,每单位 gas 费用为 1 ngonka。治理投票保持免费。始终使用 ngonka 作为余额和手续费的面额。
链会为付费交易提取 gas limit × price。每单位 gas 为 1 ngonka 的 --gas 2000000 等于 0.002 GNK。请将手动限制保持在此范围内。高达数十亿 gas 的限制会从账户中提取数十亿 ngonka,即使交易实际使用的 gas 很少。链会拒绝超过 100 GNK 的手续费。任何低于该上限的手续费仍会全额收取。
--gas auto 仅设置 gas 限制。请同时传递 --gas-prices 1ngonka,或明确设置 --fees 数量。若付费交易的手续费为空,则会被拒绝并返回 insufficient fee。
收费组在链上如下:
curl -s http://node2.gonka.ai:8000/chain-api/productscience/inference/inference/params \
| jq '.params.fee_params | {enabled_fee_groups, groups: [.groups[] | {name, min_gas_price}]}'
在主网上,enabled_fee_groups 为 epoch 和 cosmos,每单位 gas 均为 1 ngonka。不在该列表中的组保持免费。
在您的本地机器上获取您的冷账户地址:
./inferenced keys show gonka-account-key -a --keyring-backend file
向该地址发送 GNK。建议冷账户的初始充值为 10 GNK——足以覆盖数个纪元的操作手续费以及您从冷钱包签署的一次性设置交易(权限授权、委托、抵押品存入)。另外,§3.3 授予权限 会创建一个 feegrant,允许 ML 操作密钥从冷钱包支出手续费,默认支出限额为 10 GNK。该限额是 feegrant 支出的上限;发送更多 GNK 不会自动提升该限额。抵押品是独立的;请参阅 §5 存入抵押品。
确认转账已到账(替换 <your-gonka-cold-address>):
curl -s "http://node2.gonka.ai:8000/v2/accounts/<your-gonka-cold-address>" | jq '.balance, .denom'
检查一个纪元的手续费预算
在您的节点运行且 API 容器启动后(§4 启动完整节点),在服务器上运行此命令。管理 API 仅监听 localhost——不会通过公共代理暴露。
curl -s http://127.0.0.1:9200/admin/v1/epoch-fee-budget | jq
示例响应:
{
"denom": "ngonka",
"spendable_balance": "7254963228",
"budget_balance": "36266880",
"count": 23712,
"count_source": "top_participant",
"budget_known": true,
"spendable_covers_budget": true
}
如何阅读:
budget_balance— 仅估算此纪元所需的 ngonka(主要 PoC、可能的确认 PoC 和硬件差异费用)。这是一个带余量的上限,而非精确账单。spendable_balance— 节点当前实际可用于手续费的金额:冷账户的流动余额,受对 ML 操作密钥剩余 feegrant 额度的限制。spendable_covers_budget: true— 该受限金额足以覆盖本纪元的估算。spendable_covers_budget: false— 手续费余量不足。请检查两方面:- 如果冷账户余额较低 → 向冷账户发送更多 GNK。
- 如果冷账户仍有资金但 feegrant 支出限额已耗尽 → 撤销并重新授权(见下文)。仅发送 GNK 不会提升 feegrant 限额。
count_source: "top_participant"— 该估算基于上一 PoC 阶段中最活跃参与者的存储提交量。如需保守的手动估算,请传入您自己的提交数量:
curl -s "http://127.0.0.1:9200/admin/v1/epoch-fee-budget?count=100" | jq
此检查不包括上表中的抵押品或一次性设置消息——仅涵盖当前纪元的持续性 PoC/硬件流量。
为多个纪元做规划
该端点一次仅估算一个纪元。手续费随交易发生而消耗;未使用的 GNK 仍保留在您的冷账户中,未使用的 feegrant 余量也保留在授权中,直到耗尽。
- 每个纪元重新检查——在网络活动变化时,在 PoC 前后再次运行此命令。
- 提前规划——将
budget_balance乘以您希望覆盖的纪元数量(例如,主网上budget_balance × 90约等于三个月,因为纪元约为 24 小时)。确保冷账户中保持如此多的流动 GNK,且 feegrant 限额足够(每个授权默认为 10 GNK)。 - 当
spendable_covers_budget为 false 时——若余额不足,请补充冷账户;若 feegrant 限额已用完,请刷新授权(下一节)。不存在“补充 feegrant”的交易。
当10 GNK配额用完时刷新feegrant
grant-ml-ops-permissions 创建一个 feegrant,以便ML操作密钥(热)可以从您的账户密钥(冷)支付费用,默认支出限额为 10 GNK。Cosmos feegrant 没有更新/补充消息:当该配额耗尽(或过期)时,即使冷账户仍有余额,API也无法提交带费用的交易。您必须 撤销 旧的配额,然后 重新授予 以创建新的10 GNK限额。
- 确保冷账户仍持有足够的流动GNK(如需请发送更多)。
- 在您的 本地机器 上,撤销旧的配额(
[granter] [grantee]— 冷,然后热)。在运行授予命令前,请等待撤销交易在区块中确认。
./inferenced tx feegrant revoke <cold-account-address> <ml-operational-key-address> \
--from gonka-account-key \
--keyring-backend file \
--node http://node2.gonka.ai:8000/chain-rpc/ \
--chain-id gonka-mainnet \
--gas auto \
--gas-adjustment 2.0 \
--gas-prices 1ngonka
- 撤销确认后,重新授予:
./inferenced tx inference grant-ml-ops-permissions \
gonka-account-key \
<ml-operational-key-address> \
--from gonka-account-key \
--keyring-backend file \
--gas 2000000 \
--gas-prices 1ngonka \
--node http://node2.gonka.ai:8000/chain-rpc/ \
--chain-id gonka-mainnet
如果已存在配额,grant-ml-ops-permissions 将跳过创建新的feegrant并提示您撤销。成功重新授予后,请使用 epoch-fee-budget 重新检查,直到 spendable_covers_budget 为 true。
[本地机器] 存入抵押品
重要:请在创建账户密钥的安全本地机器上执行此步骤。
抵押品是锁定的GNK,用于激活您PoC权重中可抵押的部分。如果没有它,主机仅能获得 基础权重(默认为20%),而无法获得完整计算证明奖励。宽限期已结束,因此此步骤是实现满额权重所必需的。
关于时间的说明:验证节点状态确认您的容器正在运行且参与者已注册,但这 不 意味着计算证明(PoC)已成功——PoC每约24小时运行一次,只有在完成之后,您才能在
$NODE_URL/v1/epochs/current/participants查看实际权重。以下两个选项允许您现在使用估算值存入,或等待首次PoC后使用精确数据存入。
无法提前知道您的PoC权重——它由您的硬件、网络当前规模和每个模型的系数决定。
选项A — 现在存入(从第1个周期起获得满额权重)。 查看网络中当前的权重分布,并存入足够覆盖上限的金额。您的节点在首次PoC时已具备抵押品。
export NODE_URL="<seed_api_url from server's config.env>" # e.g. http://node2.gonka.ai:8000
export CHAIN_ID="gonka-mainnet"
PARAMS=$(curl -s "$NODE_URL/chain-api/productscience/inference/inference/params")
BASE_WEIGHT_RATIO=$(echo "$PARAMS" | jq -r '.params.collateral_params.base_weight_ratio
| (.value | tonumber) * pow(10; .exponent | tonumber)')
COLLATERAL_PER_UNIT=$(echo "$PARAMS" | jq -r '.params.collateral_params.collateral_per_weight_unit
| (.value | tonumber) * pow(10; .exponent | tonumber)')
MAX_WEIGHT=$(curl -s "$NODE_URL/v1/epochs/current/participants" \
| jq '[.active_participants.participants[].weight] | max')
DEPOSIT=$(printf "%.0f" "$(echo "$MAX_WEIGHT * (1 - $BASE_WEIGHT_RATIO) * $COLLATERAL_PER_UNIT * 2" | bc -l)")
echo "Recommended deposit (covers network max with 2x buffer): ${DEPOSIT} ngonka"
公式为 MAX_WEIGHT × (1 − BASE_WEIGHT_RATIO) × COLLATERAL_PER_UNIT × 2:仅需为权重中可抵押部分提供抵押(其余部分作为基础权重授予),而 × 2 是推荐的安全缓冲。所有参数均从链上读取,因此即使治理更新参数,脚本仍保持正确。
为什么是2×缓冲? PoC权重在各个纪元间波动(网络归一化、模型系数、上限、惩罚)。协议不会自动补充:如果您的抵押品在下一个纪元边界时低于实际权重,您将无声地获得较少权重,直到您存入更多抵押品——至少损失一个纪元的全部奖励。超额抵押品不会丢失:它会留在模块中,稍后可通过
withdraw-collateral提取。
选项 B — 等待首次 PoC,然后精确存入(损失一个纪元的20%权重)。 现在跳过此步骤,等待您的首个 PoC 阶段完成(约每24小时一次),然后在 $NODE_URL/v1/epochs/current/participants 检查您的实际权重,并使用您自己的权重替换上述脚本中的 MAX_WEIGHT 重新运行。从第二个纪元开始,您的节点将满载运行。
从您的账户密钥存入抵押品(始终使用 ngonka):
./inferenced tx collateral deposit-collateral ${DEPOSIT}ngonka \
--from gonka-account-key \
--keyring-backend file \
--node $NODE_URL/chain-rpc/ \
--chain-id $CHAIN_ID \
--gas auto \
--gas-adjustment 2.0 \
--gas-prices 1ngonka
验证:
MY_ADDR=$(./inferenced keys show gonka-account-key -a --keyring-backend file)
curl -s "$NODE_URL/chain-api/productscience/inference/collateral/collateral/$MY_ADDR" | jq
存款是累积的——如果权重增长,可稍后通过另一个 deposit-collateral 补充。要释放未使用的抵押品,请使用 withdraw-collateral(需经历解绑期,默认为1个纪元)。
有关 slashing、提款和参数调优的详细信息,请参阅 抵押品文档。
可选:PoC 委托与拒绝
在您的主机注册完成、ML 运营密钥已授权,且您能验证参与后使用本节——通常在您的本地机器上使用账户(冷)密钥(gonka-account-key)执行。此处操作并非启动容器所必需;仅当您不在自己的 GPU 上运行所有治理批准的模型,而必须委托 PoC 投票给其他参与者、拒绝委托或与 params 比较时间时适用。
对于每个 model_id,您要么运行模型(PoC 由您的堆栈提交),要么在链上发出信号。委托是当您信任运行该模型的主机时的常见选择;拒绝是明确的退出选项。背景:多模型 PoC — 主机操作指南。
将 NODE 设置为任意同步的链 RPC(模式与 grant-ml-ops-permissions 相同:从 config.env 获取种子 API URL,并附加 /chain-rpc/)。
export NODE="<PUBLIC_CHAIN_RPC>" # e.g. http://node2.gonka.ai:8000/chain-rpc/
export CHAIN_ID="gonka-mainnet"
export KEY="gonka-account-key"
export KEYRING_BACKEND="file"
检查治理参数(惩罚、penalty_start_epoch 等):
./inferenced query inference params --node "$NODE" -o json
检查您的 PoC 委托/拒绝/意图状态(所有模型):
MY_ADDR="$(./inferenced keys show "$KEY" -a --keyring-backend "$KEYRING_BACKEND")"
./inferenced query inference poc-delegation "$MY_ADDR" --node "$NODE" -o json
委托 — 将您对该模型 PoC 验证的权重附加到 DELEGATEE(他们的 gonka1… 地址)。以 MiniMax 为例:
MODEL="MiniMaxAI/MiniMax-M2.7"
DELEGATEE="gonka1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
./inferenced tx inference set-poc-delegation "$MODEL" "$DELEGATEE" \
--from "$KEY" \
--node "$NODE" \
--chain-id "$CHAIN_ID" \
--keyring-backend "$KEYRING_BACKEND" \
--gas auto \
--gas-adjustment 2.0 \
--gas-prices 1ngonka \
-y
DeepSeek 示例(例如,您仅在您的 GPU 上运行 MiniMax):
MODEL="deepseek-ai/DeepSeek-V4-Flash-0731"
DELEGATEE="gonka1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
./inferenced tx inference set-poc-delegation "$MODEL" "$DELEGATEE" \
--from "$KEY" \
--node "$NODE" \
--chain-id "$CHAIN_ID" \
--keyring-backend "$KEYRING_BACKEND" \
--gas auto \
--gas-adjustment 2.0 \
--gas-prices 1ngonka \
-y
清除 一个模型的委托:
MODEL="deepseek-ai/DeepSeek-V4-Flash-0731"
./inferenced tx inference set-poc-delegation "$MODEL" "" \
--from "$KEY" \
--node "$NODE" \
--chain-id "$CHAIN_ID" \
--keyring-backend "$KEYRING_BACKEND" \
--gas auto \
--gas-adjustment 2.0 \
--gas-prices 1ngonka \
-y
拒绝 一个模型的委托(链上明确的“否”)。对您未运行的符合条件的模型使用此操作(例如,如果您仅提供 MiniMax,则为 GLM-5.3-Flash 或 DeepSeek)。常规拒绝/错过惩罚仅适用于符合条件的组。
MODEL="deepseek-ai/DeepSeek-V4-Flash-0731"
./inferenced tx inference refuse-poc-delegation "$MODEL" \
--from "$KEY" \
--node "$NODE" \
--chain-id "$CHAIN_ID" \
--keyring-backend "$KEYRING_BACKEND" \
--gas auto \
--gas-adjustment 2.0 \
--gas-prices 1ngonka \
-y
declare-poc-intent 主要适用于新模型启动窗口;请参阅 GLM-5.3-Flash 启动 和 DeepSeek V4 Flash 启动。更多命令和边缘情况:多模型 PoC — 主机操作指南。
停止并清理您的节点
如何停止您的节点
检查您当前所处的轮次。打开 URL:http://node1.gonka.ai:8000/api/v1/epochs/latest(您也可以使用任何其他活跃参与者的 URL)。
在响应中查找:
"latest_epoch": {
"index": 88,
...
}
记住您的节点最后工作的轮次索引。
在同一 JSON 响应中查找:
"next_epoch_stages": {
...
"claim_money": <block_number>
}
禁用每个 ML 节点。
curl -X POST http://<api_node_static_ip>:<admin_port>/admin/v1/nodes/<id>/disable
保持网络节点在线并同步,它应自动处理奖励申领。
要检查您的最新奖励是否已被申领,在 claim_money 区块之后运行以下命令(将 <YOUR_ADDRESS> 和 <EPOCH> 替换为您的实际值):
inferenced query inference show-epoch-performance-summary <EPOCH> <YOUR_ADDRESS> --node http://node1.gonka.ai:8000/chain-rpc/ --output json
Output:
{
"epochPerformanceSummary": {
"epoch_index": "87",
"participant_id": "<YOUR_ADDRESS>",
"missed_requests": "1",
"rewarded_coins": "123456",
"claimed": true
}
}
claimed = true,则您的奖励已被申领。
如果显示 false,请继续手动申领步骤。
手动申领奖励(如需)
运行:
curl -X POST http://localhost:9200/admin/v1/claim-reward/recover \
-H "Content-Type: application/json" \
-d '{"force_claim": true}'
验证移除和权重。如果您禁用了所有节点,则您的参与者应不再出现在活跃参与者列表中。如果您仍能看到您的参与者,则意味着网络仍期望您参与该轮次,若此时禁用节点,您可能会错过推理,从而影响您的声誉。
确保您位于 gonka/deploy/join 文件夹中。要停止所有运行的容器:
docker compose -f docker-compose.yml -f docker-compose.mlnode.yml down
docker-compose.yml 和 docker-compose.mlnode.yml 文件中定义的所有服务,除非显式配置,否则不会删除卷或数据。
如何清理您的节点(完全重置)
如果您想完全重置节点并删除所有数据(用于重新部署或迁移),请使用以下清理步骤。
-
要清理缓存并从头开始,删除本地
.inference和.dapi文件夹(推理运行时缓存和身份):rm -rf .inference .dapi .tmkms -
(可选) 清除模型权重缓存:
rm -rf $HF_HOME
Note
删除 $HF_HOME 将需要从 Hugging Face 重新下载大型模型文件,或重新挂载 NFS 缓存。
需要帮助? 请访问 常见问题页面 获取答案,或加入 Discord 服务器 以获取一般咨询、技术问题或安全问题的帮助。