ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

DeepSeek Harness 跑 HumanEval 代码评测:Key 用 TaoToken 的 OpenAI 兼容 API

DeepSeek Harness 跑 HumanEval 代码评测:Key 用 TaoToken 的 OpenAI 兼容 API 1. 为什么 HumanEval 评测卡在了模型后端DeepSeek Harness 跑 HumanEval 有一个很容易卡住的点本地没有大显存显卡时vLLM 后端根本起不来。这次我用 TaoToken 提供的 OpenAI 兼容 API 把这条评测链路跑通了Key 在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建eval_humaneval.yaml 里改三个字段就能跑。HumanEval 是模型代码生成能力的标准基准Harness 本身又支持 openai 后端所以真正要准备的只有一把可用的 Key。这篇文章按原文第 6 部分的评测流程走一遍先装 Harness再把 vLLM 后端替换成 OpenAI 兼容 API 后端最后跑 HumanEval 拿 pass1。跑完之后会额外做一步——到官网控制台查看调用记录确认这次评测确实走了这把 Key。如果你之前也卡在本地显存不足这篇正好帮你把 HumanEval 跑通。1.1 vLLM 后端的门槛显存与部署HumanEval 的默认配置示例通常写成 model.type: vllm后面跟着模型名、tensor_parallel_size、max_model_len。这在多卡 GPU 的评测机上很顺但 vLLM 本身要求本地有足够显存来加载模型还要单独安装和管理推理服务。很多开发者真正卡住的不是 Harness 不会用而是本地没有能跑目标模型的硬件条件。原文第 6 部分同时给出了另一条路径把 model.type 改成 openai然后补上 base_url 和 api_key。这说明 DeepSeek Harness 从设计上就支持 OpenAI 兼容 API 后端不需要改任何源码。本地不需要部署模型Harness 像访问普通 OpenAI 接口一样把请求发出去再拿回模型生成的代码继续评测。1.2 OpenAI 兼容 API 后端让 Harness 回到「评测」本身TaoToken 在这条链路里只做一件事提供 OpenAI 兼容的 API 入口接收 Harness 发出的推理请求并转发给对应模型。pass1、pass10、样本级结果全部由 Harness 自己统计TaoToken 不参与打分。换句话说评测逻辑没有变变的只是模型推理发生在远端。这样切换有一个明显的好处本地不需要准备 GPU评测脚本、YAML 配置和结果分析流程都保持原样。如果之后要换模型对比只需要改 YAML 里的 name 字段不用重新部署一套 vLLM 环境。2. 准备三样东西Harness 环境、TaoToken Key、模型 ID2.1 创建虚拟环境并安装 deepseek-harness建议使用 Python 3.10 以上的干净虚拟环境避免和系统 Python 里的包互相污染python3 -m venv harness_env source harness_env/bin/activate pip install -U deepseek-harness装完先执行harness --version能打印版本号说明安装成功。如果提示 command not found检查当前 shell 是否还在虚拟环境里或者重新激活环境后再试。需要调试 Harness 源码的话可以克隆 DeepSeek-Harness 仓库并执行pip install -e .日常跑评测用pip install就够了没必要走源码安装。2.2 在 TaoToken 创建 API Key打开 TaoToken 注册并登录进入控制台创建一个 API Key。Key 创建后只会完整显示一次先复制到本地临时文件下一步填进 eval_humaneval.yaml。这里先区分两个地址官网地址用来注册、创建 Key、看模型广场、看用量真正填进 Harness 的是另一个 API 地址。不要混用否则后面排障会绕弯路。2.3 模型 ID 以模型广场为准OpenAI 兼容 API 配置里的 name 字段决定 Harness 调用哪个模型。网上教程里常见的deepseek-coder、deepseek-llm-7b-chat这类名字不一定等于手头真实可用的模型 ID。跑到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 的模型广场找到目标模型复制它当前展示的模型 ID。模型 ID 以 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 模型广场当时列表为准不要凭记忆填。3. 把 eval_humaneval.yaml 的后端改成 openai3.1 一份可直接跑的 YAML 配置在 HumanEval 代码评测场景下eval_humaneval.yaml 可以写成下面这样model: type: openai name: 模型广场上的模型ID base_url: https://taotoken.net/api api_key: YOUR_API_KEY max_retries: 3 tasks: name: humaneval num_fewshot: 0 max_length: 1024 temperature: 0.2 top_p: 0.95 output: dir: ./results name: humaneval_openai_run对比 vLLM 版本改动集中在 model 段type 从 vllm 改成 openai把 tensor_parallel_size、max_model_len 删掉再补上 base_url、api_key、max_retries。tasks 和 output 保持原样。max_retries 表示请求失败后的重试次数走远程 API 时建议保留。3.2 base_url 填 https://taotoken.net/api不要带 /v1注意TaoToken 的接口地址是 https://taotoken.net/api官网地址用于注册和建 Key两者不要互相替换。有些 OpenAI 兼容服务要求地址末尾带 /v1TaoToken 的接口不需要。配置里填的是 https://taotoken.net/api末尾不要加 /v1更不要把官网落地页地址填进来。TaoToken 提供的是统一 API 通道接口地址是给程序用的官网地址是给人用的。如果不想把 Key 直接写进 YAML也可以用环境变量export OPENAI_API_KEYYOUR_API_KEY export OPENAI_BASE_URLhttps://taotoken.net/api然后 YAML 里的 api_key 写成${OPENAI_API_KEY}。不过直接写死更直观少一层变量解析问题。提醒一句如果本地之前配过其他服务的 OPENAI_API_KEY 或 OPENAI_BASE_URL先执行echo $OPENAI_BASE_URL看一眼避免被环境变量串到别的地址上。4. 跑通 HumanEval 并读取 pass14.1 先用 limit 限制样本数验证链路配置保存后不要急着全量评测先用命令行加一个 limit 参数让 Harness 只做少量样本harness run --config eval_humaneval.yaml --limit 10这一步通过后再去掉 limit 跑全量harness run --config eval_humaneval.yamlHumanEval 一共 164 个问题单次评测并不算大。但 temperature 和采样次数会明显放大请求量例如要算 pass10 就需要对同一道题做多次采样。小样本验证能先排除「Key 写错、地址不对、模型 ID 不存在」这三类问题再投入全量请求省时也省钱。4.2 从 results 目录看 pass1 和样本输出评测完成后进入 ./results/humaneval_openai_run 目录Harness 会保存 JSON 格式的结果和日志。HumanEval 的核心指标是pass1也就是模型一次生成就通过全部测试用例的比例。结果文件的结构大致如下{ task: humaneval, metrics: { pass1: 0.0 }, samples: [ { task_id: HumanEval/0, completion: # 模型生成的代码, passed: false } ] }这个 JSON 是示例结构不是某款模型的真实成绩。具体数值以你实际评测输出为准模型、temperature、top_p 不同pass1 都会不同。样本级结果里保存了每条题目的生成代码和是否通过适合事后排查模型是没见过这类题还是代码生成被截断导致失败。5. 跑完去 TaoToken 控制台对调用记录5.1 用调用记录确认这次请求是否成功评测结束后除了看结果 JSON还要确认请求确实经过了 TaoToken。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 的用量或调用记录页按刚才评测的时间段筛选能看到 Harness 发出的请求条数、模型和消耗情况。这一步在「验证用量」场景下特别有用如果结果文件里已经生成了 pass1但控制台查不到调用记录说明评测可能命中了本地缓存或走了别的环境变量并不是真的通过 TaoToken 通道请求到模型。控制台记录条数和评测样本数对得上链路才算真正闭环。5.2 批量回归时留意用量与配额如果把评测从单次 HumanEval 扩展到回归测试请求量会成批上涨。批量评测脚本循环多个模型、多个任务每种组合都是一批请求。用 API 后端时不用考虑显存但要开始考虑配额跑之前看一眼控制台余量再决定一次跑多少。如果接下来要长期跑 MMLU、GSM8K、HumanEval 的组合建议按批规划而不是集中一天跑完。6. HumanEval 走 OpenAI 后端时的几个报错6.1 401 Unauthorized最常见的是 Key 没填对。检查 eval_humaneval.yaml 里的 api_key 是不是还停留在 YOUR_API_KEY 占位符如果终端里设过 OPENAI_API_KEY 环境变量还要确认它没有覆盖 YAML 里的值。401 是认证失败和费用、限流无关先把 Key 复制对再重试。6.2 404 Not Found 与模型 ID如果模型 ID 不存在或已下线Harness 会收到 404。这类问题不要靠猜回到模型广场复制当前可用的模型 ID。某些文章里的模型名可能带着版本号或日期后缀这些都要以模型广场实时列表为准。另外检查 base_url 是不是 https://taotoken.net/api 而不是带 /v1 的变体路径多一段少一段都会导致 404。6.3 请求超时与 max_retries代码生成任务的输出比普通问答长推理耗时自然更高。如果日志里出现 timeout 或 retry 提示先把 max_retries 从 3 调到 5再观察调用记录里的耗时。仍然超时的话把 tasks.max_length 调小一些或者换模型广场中响应更快的模型。要注意 max_length 是生成长度上限调大不解决超时反而可能加重先判断瓶颈在生成长度还是网络延迟。7. 建立固定的 HumanEval 评测流程7.1 从单次评测到回归基线评测脚本和配置应该放进 Git 仓库和代码一起维护。eval_humaneval.yaml 里最常改的就是 model 的 name 字段模型更新时只改这个值重跑同一份配置就能对比两个版本的 pass1 波动。固定随机种子和 temperature 也很重要温度设为 0 可以让相同输入得到稳定输出评测结果的可比性更高。7.2 后续评测的接入入口当前链路已经稳定Harness 负责采样和指标计算TaoToken 作为统一的 OpenAI 兼容 API 通道处理模型请求。之后把评测范围扩到其他基准时可以先用 模型对话 发一条测试消息确认模型可用要批量跑多任务基准先到 Coding Plan 看套餐配额新 Key 的创建和轮换统一从 控制台 API Keys 进入。这样评测、用量、Key 管理就在一条工作流里了。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进