1. 两台华硕 Ascent GX10 跑本地 Coding Agent 的真实体验从单机到双机 vLLM 部署华硕 Ascent GX10 是一台桌面级 AI 计算设备单机 128GB 统一内存能直接跑起 30B 级别的大模型。两台通过 ConnectX-7 高速线缆互联后可以承载更大的模型比如 MiniMax M2.7 AWQ 4-bit 这类参数量更高的版本。这套组合能做什么简单说就是让本地 AI 不只是聊天而是真正进入开发流程——读项目文件、建目录、跑命令、改代码、修报错。适合谁适合长期用 AI 写代码、愿意自己部署模型、能处理 Docker 和 vLLM 配置的开发者。我实测下来单机跑 Qwen 3.6 35B 能出活但需要人频繁介入双机跑更大模型后Agent 的自主性明显提升会主动用 create-next-app 搭脚手架功能完成度也更高。下面把双机互联、vLLM 启动参数、OpenCode 接入本地端点的完整配置和踩坑过程写清楚。2. 双机互联与 vLLM 多节点部署NCCL 验证与启动参数配置两台 GX10 互联的第一步是物理连接。用 QSFP 线缆把两台机器的 ConnectX-7 网口直连不需要交换机。连好后先确认系统识别到网卡ibdev2netdev输出里应该能看到两个 mlx5 设备状态为 Active。如果只看到一个检查线缆是否插紧或者换一根线试试。接下来验证 NCCL 通信。这一步很关键如果 NCCL 不通后面 vLLM 多节点启动会直接卡死。用官方测试工具跑一遍# 在两台机器上分别执行指定主节点 IP # 主节点假设 IP 为 169.254.1.1 ./nccl-tests/build/all_reduce_perf -b 8 -e 128M -f 2 -g 1 # 从节点 ./nccl-tests/build/all_reduce_perf -b 8 -e 128M -f 2 -g 1 -c 1 -n 100如果输出里能看到 bus bandwidth 数值说明 NCCL 通信正常。我踩过的坑是两台机器的 NCCL 版本不一致导致 all_reduce 直接报错。解决办法是统一用容器里的 NCCL或者把宿主机的 NCCL 升级到相同版本。vLLM 多节点启动需要指定分布式参数。主节点执行vllm serve /models/MiniMax-M2.7-AWQ \ --tensor-parallel-size 2 \ --pipeline-parallel-size 1 \ --distributed-executor-backend ray \ --ray-address auto \ --host 0.0.0.0 \ --port 8000 \ --max-model-len 32768 \ --gpu-memory-utilization 0.85 \ --quantization awq \ --trust-remote-code从节点需要先启动 Ray 并加入集群ray start --address169.254.1.1:6379 --node-ip-address169.254.1.2然后在从节点上不需要再执行 vllm serveRay 会自动调度。这里有个细节--tensor-parallel-size 2表示把模型切到两张卡上但 GX10 是统一内存架构实际是把模型分到两台机器的内存里。--gpu-memory-utilization 0.85是给 KV Cache 留空间如果设太高模型加载完但推理时 OOM。启动过程中如果遇到容器权限问题比如 NCCL 报permission denied或者ibv_reg_mr failed需要在 Docker 启动时加--privileged和--cap-addIPC_LOCK。我实测下来加 privileged 后吞吐从 26-28 tokens/s 提升到接近 41 tokens/s效果很明显。模型文件放在 NAS 上通过网络加载vLLM 启动时指定路径即可。但要注意 NAS 的读取速度如果网络带宽不够模型加载会非常慢。建议用 10GbE 以上连接或者把模型文件提前拷贝到本地 NVMe。3. OpenCode 接入本地 vLLM 端点的可复制配置vLLM 服务跑起来后OpenCode 需要指向本地端点。OpenCode 是一个 coding agent 工具能读项目文件、执行终端命令、修改代码。它的配置文件通常放在项目根目录的.opencode/config.json或者用户目录的~/.opencode/settings.json。下面是一份可复制的配置片段{ provider: { local-vllm: { type: openai, baseURL: http://169.254.1.1:8000/v1, apiKey: sk-local-no-auth, models: { minimax-m2.7: { name: MiniMax-M2.7-AWQ, maxTokens: 32768, temperature: 0.2, topP: 0.95 } } } }, agent: { model: local-vllm/minimax-m2.7, workspace: /home/user/projects/homelab-tracker, autoApprove: false, maxIterations: 50 } }这里baseURL填主节点的 IP 和 vLLM 端口apiKey随便填一个因为本地 vLLM 默认不校验。maxTokens要和 vLLM 启动时的--max-model-len一致否则请求会被截断。temperature设 0.2 是为了让代码生成更稳定太高容易胡编。如果你用的是 Cline 或者 Claude Code 这类工具配置逻辑类似核心三件套是 Base URL、Key、Model ID。以 Cline 为例在 VS Code 设置里找到 Cline 的 Provider 配置{ cline.provider: openai, cline.baseUrl: http://169.254.1.1:8000/v1, cline.apiKey: sk-local-no-auth, cline.model: MiniMax-M2.7-AWQ }注意 Model ID 要和 vLLM 启动时加载的模型名称一致。如果 vLLM 启动时用的是路径/models/MiniMax-M2.7-AWQ那 Model ID 就是MiniMax-M2.7-AWQ不要带路径。OpenCode 启动后它会自动读取项目文件建立索引。第一次运行会慢一些因为要扫描整个项目。之后就可以给它下任务了比如opencode run 创建一个 HomeLab 服务追踪器用 Next.js 和 SQLite包含 Proxmox、TrueNAS、Grafana、Plex、Pi-hole 的服务列表支持增删改查和过滤Agent 会先创建 spec、task、agents、progress 文件然后按步骤推进。如果中途卡住可以输入continue让它继续。我实测下来双机跑 MiniMax M2.7 时Agent 会主动调用create-next-app生成脚手架而不是手写一堆配置文件这一点比单机跑 Qwen 35B 时聪明很多。4. 验证请求与成功结果单机与双机的生成质量、延迟与吞吐对比配置完成后先用 curl 验证 vLLM 端点是否正常curl http://169.254.1.1:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: MiniMax-M2.7-AWQ, messages: [{role: user, content: 写一个 Python 函数计算斐波那契数列第 n 项}], max_tokens: 256, temperature: 0.2 }如果返回 JSON 里有choices字段和生成的代码说明端点正常。如果报connection refused检查 vLLM 是否还在运行或者防火墙是否挡住了 8000 端口。接下来用同一批代码任务对比单机和双机。我选了三个任务生成一个 REST API、修复一个过滤 Bug、把 UI 改成 Windows XP 风格。单机跑 Qwen 3.6 35B FP8双机跑 MiniMax M2.7 AWQ 4-bit。第一个任务单机用了 12 轮对话才把 API 跑起来中间卡在工具调用里两次需要手动输入 continue。双机用了 7 轮Agent 主动选了 FastAPI 而不是 Flask还自己写了 pytest 测试。延迟方面单机首 token 延迟约 1.2 秒双机约 1.8 秒因为模型更大加载和推理都慢一点。但吞吐上双机稳定在 40 tokens/s 左右单机在 55 tokens/s 左右单机反而更快。第二个任务修复过滤 Bug。单机跑了 5 轮模型一直改不对 search params 的用法最后我让它去看 Next.js 文档才找到正确写法。双机跑了 3 轮模型自己读了node_modules/next/dist/docs里的文档然后改对了。这个差异很明显大模型在工具使用和文档检索上更强。第三个任务Windows XP 风格改造。单机直接放弃了说“这个任务太复杂”。双机真的做出了开始菜单、窗口、状态栏、服务图标和可移动窗口。虽然细节粗糙但功能可用。这个任务考验的是 Agent 对现有项目结构的理解和持续迭代能力双机明显更稳。吞吐测试用 vLLM 自带的 benchmarkvllm bench serve \ --backend openai-chat \ --base-url http://169.254.1.1:8000 \ --model MiniMax-M2.7-AWQ \ --num-prompts 50 \ --request-rate 2单机 Qwen 35B 的 output throughput 约 55 tokens/s双机 MiniMax M2.7 约 41 tokens/s。双机吞吐低一些但生成质量高很多少走弯路节省的时间远超吞吐差距。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth 报错第一个常见报错是 401 Unauthorized。本地 vLLM 默认不校验 API Key但 OpenCode 或 Cline 可能会强制要求填 Key。如果报 401检查配置文件里的apiKey是否为空。随便填一个字符串就行比如sk-local-no-auth。如果 vLLM 启动时加了--api-key参数那就要填对应的值。第二个报错是local proxy failed。这个通常出现在 OpenCode 尝试连接本地端点时原因是baseURL写错了。注意不要写成http://localhost:8000因为 OpenCode 可能跑在容器里localhost 指向容器本身而不是宿主机。要写宿主机的实际 IP比如http://169.254.1.1:8000/v1。如果还是不通用curl在容器里测试一下。第三个报错是reading choices相关比如Error reading choices: list index out of range。这个说明 vLLM 返回的 JSON 里没有choices字段通常是模型加载失败或者请求格式不对。检查 vLLM 日志看模型是否成功加载。如果日志里有OOM或者CUDA out of memory降低--gpu-memory-utilization或者减小--max-model-len。另外确认请求里的model字段和 vLLM 加载的模型名称一致。第四个报错是 OAuth 相关比如OAuth token expired或者invalid_grant。这个一般出现在用云端 API 的工具上但如果你在 OpenCode 里配置了云端 Provider 又切到本地可能会残留 OAuth 配置。检查~/.opencode/settings.json里是否有oauth字段删掉或者改成oauth: null。如果用的是 Claude Code检查~/.claude/config.json里的authType是否为apiKey而不是oauth。还有一个坑是 NCCL 版本不一致导致的unhandled cuda error。两台机器的 NCCL 版本必须一致建议都用容器里的 NCCL或者把宿主机的 NCCL 升级到相同版本。检查命令dpkg -l | grep nccl如果版本不同卸载后重新安装相同版本。最后如果 vLLM 启动时卡在Loading model weights超过 10 分钟检查 NAS 的读取速度。模型文件如果放在 NAS 上网络带宽不够会导致加载极慢。建议用iftop看一下网络流量如果只有几 MB/s说明带宽瓶颈。解决办法是把模型文件拷贝到本地 NVMe或者升级到 10GbE 网络。6. 本地 Coding Agent 的长期使用建议与接入文档两台 GX10 跑本地 Coding Agent硬件成本不低单台 3 万多两台加上 QSFP 线缆和功耗投入不小。但它适合一类明确的人长期用 AI 写代码愿意把模型部署、项目环境和执行链路放在自己手里。这类人面对的任务往往不够性感却很耗时间比如老项目依赖升级、测试补齐、UI 细节修复、内部工具重构。Coding Agent 的价值就在这些地方你给它一个清晰目标它在后台不断尝试、修改、运行、修复你保留最终判断负责 review 和验收。如果你打算长期跑本地 Coding Agent建议把模型文件放在本地 NVMe 而不是 NAS减少加载时间。vLLM 启动参数里--gpu-memory-utilization不要超过 0.9给 KV Cache 留足空间。OpenCode 的maxIterations设 50 左右太少容易半途而废太多会浪费算力。另外定期检查 NCCL 和 vLLM 的版本保持一致避免通信报错。如果你需要更稳定的 API 接入方案或者想对比本地部署和云端 API 的成本可以访问 TaoToken 的接入文档https://taotoken.net/api 和 API Keys 管理页面https://taotoken.net/api-keys 。模型对话功能可以直接在 https://taotoken.net/model-chat 体验长期编码和 Agent 任务可以看 Coding Planhttps://taotoken.net/coding-plan 。Claude Code 的接入配置参考https://taotoken.net/claude-code 。控制台地址https://taotoken.net/console 。官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。本地 AI 还会卡住还会犯错还会误判也会把环境搞乱。可它已经能打开一个项目理解需求修改代码运行检查把一个小应用一步步推到可用状态。它离“放手让 AI 写完项目”还有距离但离“把一部分工程脏活交给本地机器”已经很近了。