vLLM 的 Transformers 报错,把 Codex 的 API 地址改到 TaoToken 后查依赖

vLLM 的 Transformers 报错,把 Codex 的 API 地址改到 TaoToken 后查依赖 在 WSL Ubuntu 22.04 里用 uv 装完vllm0.8.5模型还没真正开始推理Qwen2Tokenizer就先抛出AttributeError: Qwen2Tokenizer has no attribute all_special_tokens_extended。这个报错看起来像模型文件坏了其实是 vLLM 0.8.5 与当前环境里的 Transformers 版本错位。我后来把 Codex 的 API 地址改到 TaoToken先去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建一把 Key把 Base URL 填成https://taotoken.net/api让 Codex 对照 vLLM 0.8.5 的依赖矩阵排查而不是继续在聊天窗口里反复猜。这样每次让 Codex 读报错、查矩阵、生成修复命令Token 都从这把 Key 走 TaoToken 计费排查过程也能在控制台看到消耗。原文的路径是 Windows WSL2先用nvidia-smi确认驱动支持到 CUDA 12.x再看 vLLM 0.8.5 预编译 CUDA 12.1然后用 uv 建独立.venv固定vllm0.8.5安装。这个路径本身没问题坑在依赖解析和模型架构两头。下面按排障顺序写先还原两个报错再把 Codex 的 TaoToken 通道配好最后给出 uv 锁transformers4.51.3或换 Qwen2-VL-2B 的可复制命令。1. WSL 里 vllm0.8.5 刚装完Qwen2Tokenizer 先报 all_special_tokens_extended1.1 报错长什么样命令停在哪一步前面的安装步骤和原文一致WSL 里进 Ubuntu装 uv把项目放在~/vllm而不是/mnt/c创建独立环境再固定版本安装。真正启动服务时命令大概长这样cd ~/vllm source .venv/bin/activate vllm serve ~/models/Qwen3.5-4B \ --host 127.0.0.1 \ --port 8000 \ --dtype half \ --gpu-memory-utilization 0.8 \ --max-model-len 4096模型权重已经下载到~/models/Qwen3.5-4B路径没错驱动也正常但 vLLM 在加载 tokenizer 的阶段就停了。终端里出现的不是 CUDA OOM也不是权重文件缺失而是Qwen2Tokenizer没有all_special_tokens_extended属性。这个属性属于 Transformers 的 tokenizer 体系vLLM 只是在启动时调用了它。原文里也提到之前可能混装过 TransformersvLLM 的依赖没有阻止解析到一个更新版本的 Transformers。结果就是vLLM 0.8.5 按旧接口去拿all_special_tokens_extended而新版 Transformers 里的 Qwen2Tokenizer 继承链或方法暴露方式已经变了。这不是 Qwen3.5 模型文件损坏而是运行时的 Python 包版本对不上。1.2 为什么 vLLM 0.8.5 与新版 Transformers 会互掐vLLM 是推理引擎Transformers 是模型加载和 tokenizer 的工具箱。vLLM 的 PagedAttention 和 Continuous Batching 负责把显存切块、把请求动态混批提升吞吐和显存利用率但模型配置、tokenizer、部分 architecture 识别仍然要调用 Transformers。两者是配合关系不是替代关系。vLLM 0.8.5 发布时对应一套经过验证的依赖矩阵其中 Transformers 通常落在 4.51.x 附近。如果当前.venv里被解析到 Transformers 5.xtokenizer 接口就可能变。all_special_tokens_extended只是一个表象背后是 vLLM 0.8.5 的代码路径与新版 Transformers 的接口不兼容。uv 能保证环境目录干净但不能保证依赖版本自动落在 vLLM 0.8.5 期望的区间。尤其是之前用过pip install transformers或者系统 Python 里也有一份uv pip install vllm0.8.5时解析器可能把新版 Transformers 一起装进来。注意不要看到Qwen2Tokenizer报错就去删模型权重。先确认当前环境里transformers.__version__和transformers.__file__再看 vLLM 0.8.5 官方依赖矩阵。模型文件通常没问题问题在 Python 包。2. 降到 transformers4.51.3 后qwen3_5 架构又不认识2.1 第二个 ValueError 的完整含义看到第一个报错后原文选择了降级uv pip install --reinstall transformers4.51.3再跑vllm serveall_special_tokens_extended不报了但新的 ValueError 出现ValueError: The checkpoint you are trying to load has model type qwen3_5 but Transformers does not recognize this architecture.这句话的意思是Transformers 4.51.3 能配合 vLLM 0.8.5但它不认识qwen3_5这个 architecture。它知道 Qwen2、Qwen2-VL 等一批模型类型但 Qwen3.5 的qwen3_5需要更新版本的 Transformers 才能识别。于是你被夹在中间新版 Transformers 解决架构识别却破坏 vLLM 0.8.5 的 tokenizer 调用旧版 Transformers 修复 tokenizer 调用却不认识 Qwen3.5。这不是“再降一点”或“再升一点”就能简单解决的单点问题而是 vLLM 版本、Transformers 版本、模型 architecture 三者的交集问题。vLLM 0.8.5 有它支持的模型列表Transformers 4.51.3 有它认识的 architecture 列表Qwen3.5 又要求更新的 Transformers。三个条件同时满足才能把服务拉起来。2.2 两个报错叠在一起不是模型坏了是依赖矩阵和模型架构错位第一个报错说明环境里 Transformers 太新第二个报错说明降级后的 Transformers 太旧。中间没有一条“随便装一个版本”的捷径。原文最后换成 Qwen2-VL-2B就是因为 Qwen2-VL 的 architecture 在 Transformers 4.51.3 和 vLLM 0.8.5 的交集里加载阶段不会撞架构不识别。但换模型也有代价Qwen2-VL-2B 虽然参数少实际显存占用不只由参数量决定还受--gpu-memory-utilization、--max-model-len、--dtype、图像输入配置、当前 GPU 其他进程影响。普通电脑一直 OOM不一定是模型选错也可能是参数给得太满。这里就需要一个能读报错、能对照官方依赖矩阵、还能帮你生成诊断命令的助手而不是靠感觉反复卸载重装。3. 把 Codex 的 Base URL 指到 TaoToken让它对照依赖矩阵3.1 在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建 Key别用别人的打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册并登录在控制台创建一把 API Key。本文所有配置里的 Key 都写成YOUR_API_KEY你把它替换成自己刚创建的那把即可。不要从聊天记录、论坛或截图里复制别人的 Key也不要把它提交到 Git。这把 Key 的用途很明确Codex 每次帮你读 vLLM 报错、对照依赖矩阵、生成uv pip修复命令时请求都会消耗 Token统一从这把 Key 走 TaoToken 计费。TaoToken 在这里的角色是统一 API 与兼容通道不是网络代理也不是让 Codex 去连你的 WSL。Codex 只负责生成和解释命令命令必须由你在 WSL 本地执行再把输出贴回对话。3.2 ~/.codex/config.tomlmodel_provider 与 base_url 怎么写Codex 的配置不要套 Claude Code 的ANTHROPIC_*变量。它读取的是~/.codex/config.toml。一个可用的自定义 provider 写法如下model YOUR_MODEL_ID model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat这里有三处要核对base_url必须是https://taotoken.net/api末尾不要加/v1也不要加任何 UTM 参数。model填YOUR_MODEL_ID具体 ID 以 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 模型广场当时列表为准不要凭记忆写一个带日期后缀的假 ID。env_key指向环境变量名不要把 Key 明文写进 TOML。然后在终端里导出 Keyexport TAOTOKEN_API_KEYYOUR_API_KEY如果希望每次开 WSL 都生效可以把这行写进~/.bashrc。配置好后启动 Codex它发出的排查请求就会走 TaoToken 的兼容通道。3.3 给 Codex 的排查提示词模板只输出命令由你在 WSL 执行不要让 Codex 直接连你的 WSL 或替你执行卸载命令。更好的方式是给它完整上下文要求它输出可复制命令和判断依据你在本地执行再把结果贴回对话。提示词可以这样写我在 WSL Ubuntu 22.04项目目录 ~/vllm已激活 .venv用 uv 安装了 vllm0.8.5torch-backendcu124。 错误 1AttributeError: Qwen2Tokenizer has no attribute all_special_tokens_extended 错误 2ValueError: The checkpoint you are trying to load has model type qwen3_5 but Transformers does not recognize this architecture. 请对照 vLLM 0.8.5 官方依赖矩阵输出 1. 检查 pip/uv 混装和 transformers 实际版本的命令 2. 清理混装后用 uv 锁定兼容 transformers 版本的可复制命令 3. 如果继续用 Qwen3.5需要满足哪些架构支持条件 4. 如果换 Qwen2-VL-2B需要检查哪些依赖和显存参数。 只输出命令和解释不要替我执行。这样 Codex 的每次输出都围绕 vLLM 0.8.5 的依赖矩阵而不是泛泛地建议“升级所有包”。你执行完命令后把nvidia-smi、uv pip show transformers、python -c import transformers; print(transformers.__version__)的结果贴回去它才能继续收窄问题。4. 用 uv 清理混装的 Transformers或者换一个 vLLM 0.8.5 认识的模型4.1 先查 transformers 到底装了几份在动手重装前先确认你到底在用哪个 Python、哪一份 Transformerscd ~/vllm source .venv/bin/activate which python python -c import transformers, sys; print(transformers.__version__); print(transformers.__file__) uv pip show transformers pip show transformers如果which python指向~/vllm/.venv/bin/python但transformers.__file__指向系统目录或另一个虚拟环境就说明环境混了。WSL 里尤其容易发生在/mnt/c下用 Windows 侧 Python或者没激活.venv就直接pip install。把项目放在~/vllm、每次都确认source .venv/bin/activate能避免大部分路径问题。4.2 方案 Auv 锁 transformers4.51.3 并重建 .venv如果决定继续用 vLLM 0.8.5并且模型换成它认识的架构最干净的做法是重建.venv而不是在旧环境里反复--reinstall。uv 的.venv就在项目目录下删掉整个.venv就等于销毁全部依赖清理非常直观cd ~/vllm deactivate 2/dev/null || true rm -rf .venv uv venv --python 3.12 --seed --managed-python source .venv/bin/activate export UV_INDEX_URLhttps://mirrors.aliyun.com/pypi/simple uv pip install vllm0.8.5 --torch-backendcu124 uv pip install transformers4.51.3装完后再跑一次版本检查python -c import vllm, transformers; print(vLLM:, vllm.__version__); print(Transformers:, transformers.__version__)如果 vLLM 0.8.5 的依赖解析把 Transformers 又拉高了可以用 constraints 文件锁住或者把两个包放在同一条安装命令里让 uv 一起解析。关键是不要一边用uv pip一边又用系统pip往同一个环境里装包。混装一次后面每个报错都会变得更难判断。4.3 方案 B换 Qwen2-VL-2B让 Codex 帮你核对显存和架构如果 Qwen3.5 的qwen3_5架构在 vLLM 0.8.5 Transformers 4.51.3 组合里始终不认识换模型比硬升依赖更省时间。原文最后也是走到 Qwen2-VL-2B 这条路。模型可以从镜像站下载到~/models然后启动服务cd ~/models ~/hfd.sh Qwen/Qwen2-VL-2B-Instruct启动参数先用保守值vllm serve ~/models/Qwen2-VL-2B-Instruct \ --host 127.0.0.1 \ --port 8000 \ --dtype half \ --gpu-memory-utilization 0.8 \ --max-model-len 4096如果还是 OOM不要直接下结论“普通电脑跑不了”。先把nvidia-smi的输出、vLLM 启动参数、报错全文贴回 Codex让它对照 vLLM 0.8.5 的文档给出下一步是降--gpu-memory-utilization还是降--max-model-len还是换更小的量化版本。Codex 能帮你生成诊断命令和参数对照但执行仍然在本地。5. 修复后的验证import、vllm serve 与 OOM 边界5.1 最小验证命令跑一遍依赖锁好、模型换好之后先不要在业务代码里直接调用跑一遍最小验证cd ~/vllm source .venv/bin/activate python -c import torch, vllm, transformers; print(vLLM:, vllm.__version__); print(Transformers:, transformers.__version__); print(Torch:, torch.__version__, torch.version.cuda); print(CUDA:, torch.cuda.is_available()); print(GPU:, torch.cuda.get_device_name(0))确认CUDA: True、GPU 名字正确、vLLM 和 Transformers 版本落在预期区间。然后启动 vLLM 服务另开一个 WSL 终端请求本地模型列表curl http://127.0.0.1:8000/v1/models这一步的curl打的是本地 vLLM不要和 TaoToken 的 Base URL 混在一起。Codex 走的是https://taotoken.net/apivLLM 本地服务走http://127.0.0.1:8000两者各管各的。5.2 换 Qwen2-VL-2B 仍然 OOM把参数贴回 Codex 而不是硬试OOM 常见来源有四个--gpu-memory-utilization给得太高、--max-model-len超出显存承受范围、--dtype与模型权重不匹配、当前 GPU 上还有别的进程占显存。你可以让 Codex 生成一套诊断顺序比如先执行nvidia-smi再看 vLLM 启动日志里 KV cache 分配失败的细节。把这些结果贴回对话让 Codex 基于 vLLM 0.8.5 的依赖矩阵和 Qwen2-VL-2B 的加载要求给出下一组参数。它不能直接连你的 WSL也不应该替你执行但可以把“该查什么、该改哪个参数”梳理清楚省去反复 OOM 的盲试。6. 跑通之后去控制台对一下这次排查的 Token 消耗6.1 先用模型对话验证同一把 KeyCodex 配置里换了 Base URL 之后先在 TaoToken 模型对话 里用同一把YOUR_API_KEY发一条测试消息。确认模型 ID 填的是模型广场当时列表里的可用项Base URL 是https://taotoken.net/api且没有/v1。如果模型对话能通但 Codex 报 401 或 404再回去检查TAOTOKEN_API_KEY是否导出、model_provider是否指向taotoken。6.2 长期排查依赖Coding Plan 和 API Keys 页面怎么选如果只是偶尔让 Codex 读一次 vLLM 报错用按量 Key 就够。如果接下来还要反复让它对照依赖矩阵、生成 uv 命令、解释 OOM 日志可以打开 Coding Plan 看套餐是否合适Key 在 控制台 API Keys 创建和管理。模型广场的可用列表仍然以 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 当时显示为准不要拿一篇旧文章里的模型 ID 直接填。如果 OOM 还在先把nvidia-smi和 vLLM 启动参数贴回对话让 Codex 基于 vLLM 0.8.5 的依赖矩阵再收一轮。依赖冲突这件事最怕的不是报错多而是环境里同时存在两套 Python 包管理结果越急越容易在 WSL 里盲试版本。