ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

了解一下InternLM1:从模型结构到本地推理的TaoToken接入实践

了解一下InternLM1:从模型结构到本地推理的TaoToken接入实践 1. InternLM1 本地推理链路到底卡在哪从权重加载到 API 通道的完整拆解InternLM1 是一套多语千亿参数基座模型7B 版本完全可商用、支持 8k 语境窗口在中英文阅读理解与推理任务上表现扎实。如果你手上有一张 24G 显存的卡或者想用 CPU 加内存的方式先跑通对话与补全这篇内容就是为你写的。核心检索词先摆出来InternLM1 本地推理、权重加载、TaoToken 统一 Key 接入、对话与补全验证。适合谁适合已经拿到权重文件、想在自己机器上跑通第一条/v1/chat/completions请求的开发者也适合把 InternLM1 当作本地基座、再通过统一 API 通道做多模型对照的人。我先把整条链路拆成四段你对照自己的进度看卡在哪一段第一段是环境与依赖。InternLM1 的推理侧依赖transformers、torch、sentencepiece如果用 LMDeploy 加速还要装lmdeploy。这一段的典型报错是ImportError: cannot import name AutoModelForCausalLM多半是 transformers 版本太旧。第二段是权重加载。InternLM1 的权重目录里通常有config.json、tokenizer.model、pytorch_model.bin或分片文件。加载时报OSError: Cant load tokenizer基本是tokenizer.model路径没对上。第三段是本地推理服务。你可以用lmdeploy serve api_server起一个 OpenAI 兼容端口也可以用 transformers 直接generate。这一步的坑是显存不够导致CUDA out of memory或者 dtype 设成 float32 直接把 24G 吃满。第四段是统一 API 通道。本地服务起来之后你可能会想能不能用一个 Key 同时访问本地 InternLM1 和云端其他模型这就是 TaoToken 要解决的问题——它提供统一的 Base URL 和 API Key让你在同一个客户端里切换模型不用为每个模型单独维护一套鉴权。这四段里前三段是「让模型跑起来」第四段是「让模型好用」。很多人卡在第三段就停了因为本地服务只能自己用换台机器就要重新配。把第四段接上之后你的 InternLM1 就变成了一个可以被任意 OpenAI 兼容客户端调用的端点。下面按顺序给可复制的命令和配置。先确认你的 Python 版本建议 3.10 或 3.113.12 在部分 torch 版本上会有 wheel 缺失问题。python -V # 期望输出 Python 3.10.x 或 3.11.x然后建一个干净虚拟环境避免和系统里的 torch 冲突python -m venv venv-internlm source venv-internlm/bin/activate pip install --upgrade pip依赖安装分两种路线。路线 A 是纯 transformers 推理适合先验证权重能不能加载路线 B 是 LMDeploy适合要起 API 服务。先装路线 Apip install torch2.1.2 transformers4.36.2 sentencepiece0.1.99 accelerate0.25.0这里锁版本是有原因的InternLM1 的config.json里model_type是internlmtransformers 4.36 之后的版本对trust_remote_code的处理有变化锁在 4.36.2 能少踩一个KeyError: internlm的坑。装完之后用一行命令验证python -c import torch, transformers; print(torch.__version__, transformers.__version__) # 期望输出 2.1.2 4.36.2如果这一步报ModuleNotFoundError说明虚拟环境没激活或者 pip 装到了系统 Python。用which python确认路径指向venv-internlm/bin/python。权重加载的验证脚本我放在下一节这里先把目录结构说清楚。假设你的权重放在/data/models/internlm-7b目录里应该有/data/models/internlm-7b/ ├── config.json ├── tokenizer.model ├── tokenizer_config.json ├── pytorch_model-00001-of-00002.bin ├── pytorch_model-00002-of-00002.bin └── pytorch_model.bin.index.json如果只有单个pytorch_model.bin也没问题加载逻辑一样。关键是config.json里的vocab_size要和tokenizer.model对得上InternLM1 的 vocab_size 是 103168对不上会在 embedding 层报 shape mismatch。2. TaoToken 前置准备统一 Key 与 API 通道怎么配在讲配置之前先把 TaoToken 是什么说清楚。它是一个统一的大模型 API 通道提供 OpenAI 兼容的 Base URL 和 API Key。你注册之后拿到一个 Key就可以在同一个客户端里调用不同模型不用为每个模型单独申请账号、单独配鉴权。对于本地跑 InternLM1 的场景它的价值在于你可以把本地服务和云端模型放在同一个配置体系里切换模型只改一个model字段。前置准备分三步拿 Key、确认 Base URL、选模型 ID。第一步拿 Key。访问 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite登录后创建一个新 Key复制出来。Key 的格式通常是sk-开头的一串字符。注意Key 只在创建时显示一次关掉页面就看不到了建议先存到密码管理器里。第二步确认 Base URL。TaoToken 的 API 端点是https://taotoken.net/api注意这里不带 UTM 参数因为它是给代码里用的不是给浏览器点的。如果你在浏览器里访问这个地址看到 404是正常的它只响应 POST 请求。第三步选模型 ID。TaoToken 的模型列表可以在文档里查https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite对于 InternLM1 的对照场景你可以先用一个通用对话模型 ID 验证通道是否通比如gpt-4o-mini或claude-3-5-sonnet这类。等通道验证通过之后再把model字段换成你本地 InternLM1 服务的模型名。这里要强调一个概念TaoToken 的 Base URL 和本地 InternLM1 的 Base URL 是两个不同的端点。TaoToken 是云端统一通道本地 InternLM1 是你自己机器上的http://127.0.0.1:23333/v1。两者可以共存你在客户端里通过切换base_url来决定走哪条路。如果你想把两者串起来有两种做法做法一客户端直连 TaoToken模型 ID 填云端模型。本地 InternLM1 单独用另一个客户端访问。适合「本地验证模型能力、云端做对照」的场景。做法二用 TaoToken 的 Coding Plan 做长期编码任务本地 InternLM1 做离线补全。Coding Plan 的入口在这里https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewriteCoding Plan 适合需要长期、稳定调用编码模型的场景比如你每天都要用 AI 补全代码按量付费不如包月划算。本地 InternLM1 则适合断网环境或者数据不能出本地的场景。不管选哪种做法你都需要一个能发 HTTP 请求的客户端。最轻量的是curl最方便的是 Python 的openaiSDK。下面两节分别给配置。先装 openai SDKpip install openai1.12.0锁 1.12.0 是因为这个版本的base_url参数行为稳定之后的版本对http_client的默认超时做了调整本地服务响应慢的时候容易误报 timeout。3. 可复制配置settings.json 与 Python 客户端双份模板这一节给两份可直接复制的配置。第一份是给支持settings.json的客户端用的第二份是给 Python 脚本用的。两份配置里的 Base URL、Key、Model ID 三件套都写全你替换成自己的值就能跑。先看settings.json模板。这个格式适用于很多 OpenAI 兼容客户端路径通常在你的用户配置目录下比如~/.config/your-client/settings.json。如果你用的客户端不叫这个名字把字段名对应过去就行{ api: { base_url: https://taotoken.net/api, api_key: sk-你的TaoTokenKey, model: gpt-4o-mini, timeout: 60, max_retries: 2 }, local_internlm: { base_url: http://127.0.0.1:23333/v1, api_key: sk-local-no-auth, model: internlm-7b, timeout: 120, max_retries: 0 }, default_profile: api }这份配置里有两个 profileapi走 TaoToken 云端通道local_internlm走本地服务。default_profile决定默认用哪个。本地服务的api_key填什么都行因为 LMDeploy 起的服务默认不校验 Key但字段不能空否则某些客户端会报missing api_key。注意timeout的差异云端通道 60 秒够用本地 InternLM1 在 CPU 上跑可能一条回复要几十秒所以给到 120 秒。max_retries本地设 0因为本地服务重试没有意义失败就是失败了重试只会浪费时间。再看 Python 客户端的配置。这份可以直接存成test_internlm.pyfrom openai import OpenAI # 云端通道走 TaoToken cloud_client OpenAI( base_urlhttps://taotoken.net/api, api_keysk-你的TaoTokenKey, timeout60.0, max_retries2, ) # 本地通道走 LMDeploy 起的 InternLM1 服务 local_client OpenAI( base_urlhttp://127.0.0.1:23333/v1, api_keysk-local-no-auth, timeout120.0, max_retries0, ) def chat(client, model, prompt): resp client.chat.completions.create( modelmodel, messages[{role: user, content: prompt}], temperature0.7, max_tokens256, ) return resp.choices[0].message.content if __name__ __main__: print( 云端通道 ) print(chat(cloud_client, gpt-4o-mini, 用一句话解释什么是渐进式训练)) print( 本地 InternLM1 ) print(chat(local_client, internlm-7b, 用一句话解释什么是渐进式训练))这份脚本的关键点是两个 client 用不同的base_url和timeout。temperature设 0.7 是对话场景的常用值max_tokens设 256 是为了快速验证正式用的时候可以调大。如果你用的是 Claude Code 这类工具配置方式不太一样。Claude Code 的接入文档在这里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewriteClaude Code 的配置核心也是三件套Base URL 填https://taotoken.net/apiKey 填你的 TaoToken KeyModel ID 填你要用的模型。具体写到哪个配置文件里文档里有说明这里不展开避免路径写错误导你。还有一个场景是 Codex 的auth.json。如果你用 Codex 做编码auth.json里需要填OPENAI_BASE_URL和OPENAI_API_KEY。Base URL 同样是https://taotoken.net/apiKey 同样是你的 TaoToken Key。Model ID 在 Codex 的配置里单独指定。三件套再强调一遍因为这是最容易配错的地方配置项云端通道TaoToken本地通道InternLM1Base URLhttps://taotoken.net/apihttp://127.0.0.1:23333/v1API Keysk-你的TaoTokenKey任意非空字符串Model ID云端模型名如gpt-4o-mini本地服务名如internlm-7b配好之后不要急着跑长任务先用一条短请求验证。下一节给验证命令和期望返回。4. 验证请求与返回结果核对一次 curl 加一次 Python 调用验证分两步先用 curl 确认通道通再用 Python 确认返回结构对。curl 的好处是不依赖任何 SDK能排除 SDK 版本问题。先验证云端通道curl -s https://taotoken.net/api/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-你的TaoTokenKey \ -d { model: gpt-4o-mini, messages: [{role: user, content: 回复两个字收到}], max_tokens: 16 }期望返回是一个 JSON结构大致如下{ id: chatcmpl-xxxx, object: chat.completion, created: 1700000000, model: gpt-4o-mini, choices: [ { index: 0, message: { role: assistant, content: 收到 }, finish_reason: stop } ], usage: { prompt_tokens: 12, completion_tokens: 2, total_tokens: 14 } }核对三个点choices[0].message.content是不是你要的内容finish_reason是不是stopusage.total_tokens是不是大于 0。如果content是空的但finish_reason是length说明max_tokens设太小了调大重试。再验证本地 InternLM1。前提是你已经用 LMDeploy 起了服务。起服务的命令lmdeploy serve api_server /data/models/internlm-7b \ --server-name 0.0.0.0 \ --server-port 23333 \ --model-name internlm-7b \ --tp 1--tp 1表示单卡张量并行。如果你有两张卡可以设--tp 2显存压力会小一半。--model-name是你自己起的名字客户端里的model字段要和它一致。服务起来之后终端会打印Uvicorn running on http://0.0.0.0:23333。这时候用 curl 验证curl -s http://127.0.0.1:23333/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-local-no-auth \ -d { model: internlm-7b, messages: [{role: user, content: 回复两个字收到}], max_tokens: 16 }返回结构和云端一致。如果本地返回里content是乱码检查tokenizer.model是不是和权重匹配。InternLM1 的 tokenizer 是 sentencepiece 格式用错 tokenizer 会输出乱码。再用 Python 脚本跑一遍确认 SDK 层面也通python test_internlm.py期望输出两段第一段是云端模型的回复第二段是本地 InternLM1 的回复。如果第一段报AuthenticationError检查 Key 有没有复制错注意 Key 里没有空格。如果第二段报ConnectionError检查 LMDeploy 服务是不是还在跑用curl http://127.0.0.1:23333/v1/models确认端口活着。这里给一个返回结果核对的检查清单你可以照着过一遍检查项云端期望本地期望HTTP 状态码200200object字段chat.completionchat.completionchoices长度11finish_reasonstop或lengthstop或lengthusage.total_tokens 0 0响应时间1-5 秒5-60 秒看硬件如果本地响应时间超过 60 秒说明你在 CPU 上跑或者显存不够触发了内存交换。CPU 跑 7B 模型一条短回复几十秒是正常的要提速就上 GPU 或者用量化版本。验证通过之后你就可以把这份配置用到实际项目里了。下一节讲常见报错这些是我在配的过程中实际遇到过的。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节按报错信息来组织你遇到哪条就查哪条。每条都给原因和修法。报错一401 Unauthorized或AuthenticationError这是最常见的。原因有三个Key 复制错了、Key 前面多了空格、Key 已经失效。先检查 Key 本身。用 curl 直接测curl -s -o /dev/null -w %{http_code} https://taotoken.net/api/models \ -H Authorization: Bearer sk-你的TaoTokenKey如果返回 401说明 Key 有问题。去 API Keys 页面重新创建一个https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keys_fixutm_campaignrewrite注意创建之后立刻复制页面刷新就看不到了。如果返回 200说明 Key 没问题那 401 是客户端配置的问题检查settings.json里api_key字段有没有被引号包住有没有多余空格。报错二local proxy failed或Connection refused这个报错通常出现在本地通道。原因是 LMDeploy 服务没起来或者端口被占用。先确认服务状态curl -s http://127.0.0.1:23333/v1/models如果返回Connection refused说明服务没起来。重新起lmdeploy serve api_server /data/models/internlm-7b --server-port 23333 --model-name internlm-7b --tp 1如果返回Address already in use说明 23333 端口被占了。换一个端口lmdeploy serve api_server /data/models/internlm-7b --server-port 23334 --model-name internlm-7b --tp 1然后客户端里的base_url也要改成http://127.0.0.1:23334/v1。还有一种情况是local proxy failed出现在云端通道。这通常是因为你的网络环境配了系统级代理而代理没有放行taotoken.net。检查环境变量echo $HTTP_PROXY $HTTPS_PROXY如果有值临时清掉再试unset HTTP_PROXY HTTPS_PROXY报错三Error reading choices或KeyError: choices这个报错说明返回的 JSON 里没有choices字段。原因通常是服务返回了错误信息但客户端没处理。先用 curl 看原始返回curl -s http://127.0.0.1:23333/v1/chat/completions \ -H Content-Type: application/json \ -d {model: internlm-7b, messages: [{role: user, content: hi}], max_tokens: 16}如果返回里有error字段按 error 信息排查。常见的是model not found说明model字段和--model-name不一致。改成一致即可。如果返回是空的检查 LMDeploy 的日志。日志里通常有CUDA out of memory这时候要降--tp或者用量化版本。报错四OAuth相关报错这个报错出现在 Claude Code 或 Codex 这类工具里。原因是这些工具默认走 OAuth 流程而你配的是 API Key 模式。修法是找到工具的配置文件把认证模式从 OAuth 改成 API Key。Claude Code 的配置文档在这里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode_oauthutm_campaignrewriteCodex 的话检查auth.json里是不是同时有 OAuth token 和 API Key。如果有冲突删掉 OAuth 相关字段只留OPENAI_BASE_URL和OPENAI_API_KEY。报错五CUDA out of memory这个不是配置问题是硬件问题。InternLM1 7B 在 float16 下大约需要 14G 显存加上 KV cache 和中间激活24G 卡刚好够。如果报 OOM三个方向一是降max_tokens减少 KV cache 占用。二是用--tp 2做张量并行把权重分到两张卡。三是用量化版本LMDeploy 支持 4bit 量化显存占用能降到 6G 左右。量化启动命令lmdeploy serve api_server /data/models/internlm-7b --server-port 23333 --model-name internlm-7b --tp 1 --quant-policy 4--quant-policy 4表示 4bit 量化。量化之后回复质量会有轻微下降但对话和补全场景基本感知不到。排查完这些你的链路应该就通了。最后给一个 CTA方便你继续往下走。6. 继续往下走模型对话、接入文档与 Coding Plan 的分流入口链路跑通之后下一步取决于你的目标。如果你只是想验证模型能力去模型对话页面直接试https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite这个页面不需要写代码选模型、输问题就能看回复。适合快速对比不同模型的表现也适合把 InternLM1 的回复和云端模型做对照。如果你要把接入用到实际项目里去接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdoc_ctautm_campaignrewrite文档里有各语言的 SDK 示例、参数说明、错误码对照。遇到本文没覆盖的报错先查文档的错误码表。如果你是长期做编码或 Agent 任务看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_plan_ctautm_campaignrewriteCoding Plan 适合每天都要调用编码模型的场景按量付费在低频时划算高频时包月更省。最后说一个我自己的用法。我把本地 InternLM1 当作离线补全的兜底网络好的时候走 TaoToken 云端通道网络断了就切到本地。两套配置放在同一个settings.json里切换只改default_profile一个字段。这样既保证了在线时的响应速度又保证了离线时不断档。如果你也想这么用先把本文第 3 节的settings.json复制过去把两个 profile 的 Key 和路径填上然后用第 4 节的 curl 各测一遍。两个都返回 200 之后你就可以放心地在项目里切换了。
返回列表