# Test Model Deepseekr1 Base Tp

> Runs LightLLM DeepSeek-R1 baseline TP gsm8k: single api_server with --tp 8 and --batch_max_tokens only, no MTP draft, no --dp, no EP MoE (distinct from deepseekr1-mtp-tp which adds MTP). GSM8K lm_eval on localhost port 8089. Requires a dedicated log directory, api_server and eval logs under that tree, summary.txt as consolidated report, tokenizer aligned with MODEL_DIR. Use for baseline R1 tensor-parallel accuracy runs without MTP/EP.

- Skill: `modeltc/test-model-deepseekr1-base-tp` (Agent Skill)
- Install (CLI): `npx skillmds@latest add modeltc/test-model-deepseekr1-base-tp`
- Raw SKILL.md: https://api.skillmd.com/api/skills/modeltc/test-model-deepseekr1-base-tp/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: ModelTC (https://skillmd.com/u/modeltc)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/modeltc/test-model-deepseekr1-base-tp

---


# DeepSeek-R1 **Base–TP**（无 MTP / 无 EP，`--tp 8`）本地 GSM8K 评测

**测试标识**：仅 **`--tp 8`** 与 **`--batch_max_tokens`** 等基础推理参数，**无** MTP、`--dp`、`--enable_ep_moe`。用于与 **MTP–TP**（含 MTP 草稿）、**MTP–EP**（EP MoE + TP+DP）等流程区分。

启动一组 `api_server`，待端口就绪后对同一服务执行一次 `lm_eval`（任务 **`gsm8k`**，`batch_size` **500**）。整轮产物须落在**同一日志目录**内归档日志与 **`summary.txt`**（见「日志目录」）；具体操作见「启动说明」。

## 日志目录（含 `summary.txt`）

- 每次评测先选定或新建**一个日志目录**（例如带时间戳或任务名），与其它测试轮次分开，便于区分管理。
- **`api_server` 进程的标准输出/错误**须写入该目录下文件（示例同级命名 **`server_base_tp.log`**；也可按变体或日期分子目录，团队任选其一，保持可追溯）。
- **`summary.txt` 固定放在该日志目录下**，写入本轮启动参数摘要、`lm_eval` 关键结果、失败原因或简要结论；**不再**把「最终总结」散落在当前工作目录或其它路径。
- `lm_eval` 终端输出建议单独落盘（如 **`eval_gsm8k.log`**）；**`summary.txt`** 仍承担**总览结论**角色。

## 启动说明

本节包含：启动前检查 → 启动服务的命令模板（可变项说明）→ 一条完整 server 命令 → 评测命令。

### 启动前检查

开跑前先确认资源可用；**不满足则先清理相关进程**，再启动服务与评测。

1. **显卡占用**：用 `nvidia-smi`（或与集群一致的占用查看方式）检查目标 GPU 是否被无关任务占满；若有冲突进程，结束后再启动本评测。
2. **端口**：服务固定 **`8089`**（与下文 `lm_eval` 的 `base_url` 一致）；用 `ss -tlnp`、`lsof -i :8089` 等确认**无进程监听**该端口；若已被占用，查出 PID 并结束占用进程后再启动。

### 启动服务的命令模板（可变项）

下列命令中出现的可变项含义如下（其余为固定写法）：

| 可变项 | 含义 |
|--------|------|
| `LOG_DIR` | 本轮评测日志目录，建议**绝对路径**；执行前 `export LOG_DIR=…`。 |
| `MODEL_DIR` | 主模型目录，对应 `--model_dir`；与 `lm_eval` 的 `tokenizer` 必须一致。 |
| `server_*.log`、`eval_*.log` | 仅文件名示例，可按任务重命名。 |

开跑前在同一 shell 中导出路径（将引号内整段替换为本机绝对路径；**勿写死下文未给出的机器路径**）：

```bash
export LOG_DIR='〈日志根目录〉'
export MODEL_DIR='〈主模型目录，对应 --model_dir〉'
```

首次试跑可用的**默认 `MODEL_DIR`** 见「执行约定」；与当前环境不符时再改为用户提供的目录。

### 一条 server 启动命令（后台落盘）

本条为 **Base–TP** 固定形态：**`LOADWORKER=18`**，**`--batch_max_tokens 6000`**，**`--tp 8`**，**`--port 8089`**，无 MTP / 无 `--dp` / 无 EP。以下为**可直接执行**的后台启动形式（已含 `nohup` 与日志重定向）；若暂时不需落盘，可自行去掉 `nohup`、`>> … 2>&1 &` 并在前台调试。命令中 **`${MODEL_DIR}`、`${LOG_DIR}`** 须已由上文 `export` 赋值。

```bash
LOADWORKER=18 \
nohup python -m lightllm.server.api_server \
  --batch_max_tokens 6000 \
  --model_dir "${MODEL_DIR}" --tp 8 --port 8089 \
  >> "${LOG_DIR}/server_base_tp.log" 2>&1 &
```

### 评测命令（服务就绪后执行一次）

服务就绪后执行（本地回环走代理时用 `no_proxy` / `NO_PROXY` 排除本机）。**`model_args` 中 `tokenizer` 必须与本次 server 的 `--model_dir`（即 **`${MODEL_DIR}`**）为同一字符串路径**。以下为带日志落盘的**完整命令**（`--model_args` 使用双引号以便展开 **`${MODEL_DIR}`**）：

```bash
HF_ALLOW_CODE_EVAL=1 HF_DATASETS_OFFLINE=0 \
no_proxy=127.0.0.1,localhost,::1 \
lm_eval --model local-completions \
  --model_args "{\"model\":\"deepseek-ai/DeepSeek-R1\", \"base_url\":\"http://localhost:8089/v1/completions\", \"max_length\": 16384, \"tokenizer\":\"${MODEL_DIR}\"}" \
  --tasks gsm8k --batch_size 500 --confirm_run_unsafe_code \
  >> "${LOG_DIR}/eval_gsm8k.log" 2>&1
```

- **`LOG_DIR`**：与启动服务一节相同；若仅调试不重定向，去掉 `\` 续行及最后的 `>> "${LOG_DIR}/eval_gsm8k.log" 2>&1` 即可在前台查看输出。
- **`MODEL_DIR`**：须与 server 启动命令中的 `--model_dir` 一致；路径随环境变化时的默认试跑与向用户确认见「执行约定」。
- 若环境需要，可同时设置 `NO_PROXY=127.0.0.1,localhost,::1`（或与团队约定一致的列表）。

## 执行约定（不要额外写“专用启动脚本”）

**模型目录（随环境变化）**：`MODEL_DIR` 在不同机器上路径不同。**首轮试跑**可先用下列默认（与常见本地部署对应；若本机不存在则跳过默认、直接执行下一步「向用户确认」）：

```bash
export MODEL_DIR=/mtc/models/DeepSeek-R1
```

若按默认路径 **export** 后仍无法启动服务，或日志中出现**明确的模型路径 / 权重加载 / 文件不存在**等错误，**不要反复盲试**：根据日志判断为路径问题时，**请用户提供**当前环境下实际的主模型目录，更新 `export MODEL_DIR=…` 后再执行（且保证 **`MODEL_DIR` 与 `lm_eval` 的 `tokenizer` 仍为同一路径**）。

1. **后台启动 server**：用 shell 后台或终端任务跑 `python -m lightllm.server.api_server ...`，**并将该进程输出重定向到本轮日志目录下的日志文件**（见上文「日志目录（含 summary.txt）」）；排查问题时 **tail** 该文件，而不是依赖未落盘的终端缓冲。
2. **不要用 health 接口** 判断就绪；改为探测 **端口 8089 是否处于 listen**（例如 `ss -tlnp` / `lsof -i :8089` 等，与系统一致即可）。
3. **等待启动**：若端口未就绪，约 **每 20 秒** 查看一次**服务日志文件**，区分仍在启动还是已报错退出；报错则写入日志目录下的 **`summary.txt`**（或先写服务日志再在 `summary.txt` 引用）并停止，不要继续盲等。
4. **维护 `summary.txt`**：位于**日志目录**；记录**本条使用的完整启动命令**（或等价摘要）、**端口检测结果**、**`lm_eval` 关键输出**；全部结束后在该文件内写**最终汇总**（是否成功、主要指标或失败原因）。可与用户口头摘要对照，但以日志目录中 **`summary.txt`** 为归档准绳。
5. **全部完成后**：确认日志目录下的 **`summary.txt`** 已包含完整最终总结；原始 server / eval 日志保留在同目录（或子目录）中备查。

## 输出文件

- **`summary.txt`**：仅位于**本轮日志目录**，作为本次 **Base–TP** 评测的**最终总结**文档。
- **服务与评测日志**：全部落在**同一日志目录**（建议按任务命名文件或分子目录），不得与未指定目录混写。

