#!/usr/bin/env bash # # fix-litellm.sh — 修三套 litellm 离线起不来502 的根 # 根因configs/litellm/{public,gc,smt}.yaml 里 enable_prometheus: true # 离线镜像缺 prometheus 依赖 → worker 一启动就崩、三个一起死 → 4000 没人听 → # nginx 连不上报 Connection refused → 凡走 litellm 的(embed/chat/ocr)全 502。 # 修法关掉 enable_prometheus重启三个 litellm再刷新 nginx 上游缓存。 # # 用法机器上 sudo bash fix-litellm.sh # 若报 $\r 错 sed -i s/\r$// fix-litellm.sh 再跑。 # CFG/opt/llm-stack/configs/litellm TS$(date %Y%m%d-%H%M) OUT/tmp/litellm-fix-$TS.log echo 0. 留底修复前真实报错stderr健康日志里没有的那段 | tee $OUT docker logs litellm-public --tail 150 $OUT 21 echo 已存 $OUT echo 1. 关闭 enable_prometheus三套配置改前自动备份 for f in public gc smt; do y$CFG/$f.yaml [ -f $y ] || { echo 跳过(无 $y); continue; } cp -n $y $y.bak-$TS sed -i s/enable_prometheus:[[:space:]]*true/enable_prometheus: false/I $y printf %-12s - $f.yaml; grep -i enable_prometheus $y || echo (本无此项) done echo 2. 重启三个 litellm重读配置 docker restart litellm-public litellm-gc litellm-smt echo 等 25 秒让它们起来... sleep 25 echo 3. 刷新 nginx 上游 IP 缓存消除 502 docker restart nginx-gateway sleep 6 echo 4. 验证 docker ps --format {{.Names}}\t{{.Status}} | grep -E litellm|nginx | tee -a $OUT echo --- 经 8080 网关200通 --- | tee -a $OUT for p in public gc smt; do curl -s -o /dev/null -w /v1/$p/models HTTP%{http_code}\n http://localhost:8080/v1/$p/models | tee -a $OUT done echo 5. 修复后日志尾 docker logs litellm-public --tail 30 21 | tee -a $OUT echo echo 三个 litellm 变 healthy 且 HTTP200 即成功网页/opencode 随即可用。 echo 若仍失败把 $OUT 带回来里面有真实报错。 echo 回滚cp $CFG/public.yaml.bak-$TS $CFG/public.yamlgc/smt 同理后 docker restart litellm-public litellm-gc litellm-smt。修复235B#!/usr/bin/env bash # # set-235b-tp4.sh — 把公用方 235B 从 TP8 改成 TP4落到 4 张好卡 # 为什么 TP4你这个是 FP8 块量化(块128)版1536÷8192 不整除 → TP8 数学上 # 不可行1536÷4384÷1283 整除 → TP4 可行。 # 注意TP4 时每卡权重≈55G(TP8 的两倍)util 必须够大默认 0.85。 # ⚠ 请尽量选 4 张【好卡且其上没有大占用】的卡若 OOM降低 util 或换卡。 # # 用法机器上 # sudo bash set-235b-tp4.sh 0,1,3,5 # 引号内填 4 张好卡(0-7) # sudo bash set-235b-tp4.sh 0,1,3,5 0.80 # 第二个参数自定 utilOOM 时调小 # set -uo pipefail CARDS${1:-0,1,3,5} UTIL${2:-0.85} COMPOSE/opt/llm-stack/compose TS$(date %Y%m%d-%H%M) n$(echo $CARDS | tr , \n | grep -c .) [ $n 4 ] || { echo 必须正好 4 张卡你给的是 $n 张$CARDS; exit 1; } [ -f $COMPOSE/docker-compose.fallback-235b.yml ] || { echo 没找到 235B 叠加层请先 sudo /opt/llm-stack/runtime/switch-to-235b.sh 切到 235B 再跑本脚本。; exit 1; } cd $COMPOSE || exit 1 cp -n .env .env.bak-$TS # 1) TP4 抬高 utilTP4 每卡权重翻倍原 0.40 装不下 grep -q ^Q235_TP .env sed -i s/^Q235_TP.*/Q235_TP4/ .env || echo Q235_TP4 .env grep -q ^Q235_UTIL .env sed -i s/^Q235_UTIL.*/Q235_UTIL$UTIL/ .env || echo Q235_UTIL$UTIL .env # 2) 落卡用一个小叠加层覆盖 NVIDIA_VISIBLE_DEVICES不动原 overlay cat docker-compose.235btp4.yml EOF services: vllm-public-llm: environment: NVIDIA_VISIBLE_DEVICES: $CARDS CUDA_DEVICE_ORDER: PCI_BUS_ID EOF echo [*] Q235_TP4 Q235_UTIL$UTIL 卡$CARDS echo [*] 重建 vllm-public-llm三层叠加base fallback-235b 235btp4... docker compose -f docker-compose.yml -f docker-compose.fallback-235b.yml -f docker-compose.235btp4.yml up -d --force-recreate vllm-public-llm echo echo [*] 235B 加载约 3-8 分钟实时看日志 echo docker logs -f vllm-public-llm echo 成功标志出现 Application startup completedocker ps 里 vllm-public-llm 为 healthy。 echo 若日志再出现 ... not divisible by ... 128 卡数仍非 4检查 NVIDIA_VISIBLE_DEVICES。 echo 若 OOM/显存不足 同卡有小模型抢显存重跑并把 util 调小例如sudo bash set-235b-tp4.sh \$CARDS\ 0.70 echo echo 回滚cp $COMPOSE/.env.bak-$TS $COMPOSE/.env; rm $COMPOSE/docker-compose.235btp4.yml; sudo /opt/llm-stack/runtime/switch-to-235b.sh修复doc#!/usr/bin/env bash # # fix-delivery-doc.sh — 在交付文档最前面插入现场实测勘误更正自动生成的错误内容 # 作用对象/opt/llm-stack/DELIVERY.md 及其副本 /opt/llm-stack/docs/DELIVERY.md # 做法不去 sed 改正文易改坏而是在最顶部插入一段权威勘误注明与下文冲突 # 以本节为准。可重复运行带 BEGIN/END 标记重跑会先删旧勘误再插新的。 # # 用法先按你【最终跑通的状态】改下面几个变量再 # sudo bash fix-delivery-doc.sh # 若报 $\rsed -i s/\r$// fix-delivery-doc.sh 再跑。 # # 按现场最终状态填写改这里 PUBLIC_MODELQwen3-235B-A22B-Thinking-2507 # 公用方最终实际用的模型 PUBLIC_TP4 # 公用方并行度235B-FP8 只能 4 PUBLIC_CARDS0,1,3,5 # 公用方落的 4 张好卡 BAD_CARDS2,4 # 确认有问题、不可用于大模型的卡显示 Graphics Device SMT_LLM_CARDS6,7 # SMT 27B 已搬到的卡 # set -uo pipefail TS$(date %Y%m%d-%H%M) DOCS(/opt/llm-stack/DELIVERY.md /opt/llm-stack/docs/DELIVERY.md) read -r -d ERRATA EOF || true !-- ERRATA-BEGIN -- # ★ 现场实测勘误更新于 ${TS}与下文冲突处以本节为准 本文件下半部分由安装脚本在**首启前**自动生成部分内容是按设计预期写的经现场 8×H100 实测以下几处需更正。**实际交付状态以本节为准。** ## 1. 硬件勘误 - 8 张卡中 **${BAD_CARDS} 号为非标/有问题卡**\nvidia-smi\ 显示为 \NVIDIA Graphics Device\非 H100、功率 700WSXM 芯片魔改 PCIe不参与任何大模型部署。 - 本批 H100 **未配 NVLink 桥**且为**双路服务器跨槽topo 显示 SYS**卡间走 PCIe无 NVLink。 - 已用 \/etc/modprobe.d/disable-nvlink.conf\\NVreg_NvLinkDisable1\关闭 NVLink如需恢复删该文件 \update-initramfs -u\ 重启。 ## 2. 公用大模型勘误最重要 - 文档下文写公用方 DeepSeek-V4-Flash、占满 8 卡、tp8-ep——**在本机起不到**无 NVLink 导致专家并行(EP)的 all-to-all 失败且 dev 镜像 torch.compile 报 InductorError。 - **实际公用方已改为\${PUBLIC_MODEL}\TP${PUBLIC_TP}落卡 ${PUBLIC_CARDS}。** - 若仍要用 DeepSeek必须加 \--enforce-eager\关 torch.compile 改 tp4 落到好卡且 **不要用 dp-ep**仍带 EP会同样失败。无 NVLink 机器策略阶梯应为 **tp8-ep → tp8 → tp4**跳过 dp-ep。 ## 3. Qwen3-235BFP8勘误 - 此为 **FP8 块量化块128版只能 TP4**1536÷8192 不被 128 整除**TP8 在数学上不可行**vLLM 直接报 \not divisible by ... block_n 128\。 - 入口脚本/文档中TP8 默认、别改小的说法对**本 FP8 版无效**请按 TP4 使用。 ## 4. SMT 对话模型Qwen3.6-27B勘误 - 已从问题卡搬到 **${SMT_LLM_CARDS} 号卡**运行正常。 ## 5. 监控勘误 - 三套 litellm 配置已**关闭 \enable_prometheus\**离线镜像缺 prometheus 依赖会导致 litellm worker 崩溃、进而全网关 502。 - 影响Grafana 里 **litellm 层**的请求/延迟/token 面板无数据**vLLM 引擎自身指标、所有推理/路由/网页/API 功能均不受影响**。联网补齐依赖后可改回 \true\ 恢复。 ## 6. 本次现场修复清单 - 关闭 litellm \enable_prometheus\ 并重启三套 litellm nginx → 解决全网关 502。 - 公用方改为 ${PUBLIC_MODEL} TP${PUBLIC_TP}避开 ${BAD_CARDS} 号坏卡。 - SMT 27B 迁至 ${SMT_LLM_CARDS} 号卡。 !-- ERRATA-END -- EOF for DOC in ${DOCS[]}; do [ -f $DOC ] || { echo 跳过(不存在)$DOC; continue; } cp -n $DOC $DOC.bak-$TS # 重跑先删旧勘误块BEGIN..END避免重复插入 sed -i /!-- ERRATA-BEGIN --/,/!-- ERRATA-END --/d $DOC tmp$(mktemp) { printf %s\n\n $ERRATA; cat $DOC; } $tmp mv $tmp $DOC echo 已更新$DOC 原文件备份 $DOC.bak-$TS done echo echo 完成。打开 /opt/llm-stack/DELIVERY.md最顶部即为现场勘误。 echo 如需重改改本脚本顶部变量后再跑一次即可会自动替换旧勘误。扩展先修 litellm(最优先,跑脚本①) sudo bash fix-litellm.sh 三个 litellm 变 healthy、HTTP200 就成功,网页和 opencode 立刻能用。失败就把它生成的 /tmp/litellm-fix-*.log 带回来。 235B 改 TP4(脚本②,填 4 张好卡) sudo bash set-235b-tp4.sh 0,1,3,5 (0,1,3,5 换成你确认的 4 张好卡;235B 加载后看 docker logs -f vllm-public-llm,出现 Application startup complete 即成。OOM 就重跑加第二参数调小 util,如 ... 0,1,3,5 0.70。) DeepSeek 加 --enforce-eager 测试(简单,直接命令) sed -i /--enable-auto-tool-choice/a\ --enforce-eager /opt/llm-stack/configs/vllm/deepseek-launch.sh sudo /opt/llm-stack/runtime/switch-llm.sh ds tp4 docker logs -f vllm-public-llm (--enforce-eager 关掉 torch.compile,治 DeepSeek 那个 InductorError;ds tp4 让它只用 4 卡——但 DeepSeek 的 tp4 默认落卡可能含坏卡,若日志报错,改用脚本②同样的叠加层思路把它也指到 4 张好卡。DeepSeek 是 dev 镜像、最难,建议你先把 litellm 和 235B 跑通,DeepSeek 最后再试。)