1. 从零复现大模型实战营第二课:conda 隔离环境踩坑与 InternLM 推理落地
大模型实战营第二课的核心目标很明确:把 InternLM 从"听说过"变成"跑起来"。很多人卡在第一步——环境。你可能会遇到 base 环境里装了一堆包、版本互相打架、torch和transformers不兼容、sentencepiece死活装不上。这篇笔记就是把我自己复现课程实验的完整过程拆开,从 conda 克隆环境、PyTorch 依赖锁定,到 InternLM 模型加载、Streamlit 前端交互,再到 Lagent 智能体调用,每一步都给可复制的命令和验证动作。
适合谁看?如果你已经有一台带 GPU 的开发机(或者用 InternStudio 这类平台),想跟着课程把internlm-chat-7b跑通,并且希望环境是可复现、可回滚的,那这篇就是给你写的。核心检索词就三个:InternLM 推理、conda 环境隔离、Streamlit 交互。我实测下来,最容易翻车的不是模型加载,而是依赖版本和端口转发这两块,后面会重点讲。
先说整体路线:conda 克隆一个干净的 PyTorch 2.0.1 环境 → 装 modelscope/transformers/streamlit 等依赖 → 复制本地 InternLM 模型 → 跑 CLI 推理验证 → 跑 Streamlit Web Demo → 接 Lagent 做工具调用。每一步都有明确的成功标志,不会让你"跑完了但不知道对不对"。
2. TaoToken 前置准备:给推理链路留一个稳定的 API 出口
在本地跑 InternLM 推理是一回事,但实战营里很多实验会涉及调用外部模型 API 做对比、做 Agent 的工具调用。这时候你需要一个稳定的 API 入口。我自己的做法是:本地模型用 conda 环境跑,外部调用统一走 TaoToken 的 API,这样环境隔离和调用隔离是分开的,出问题好定位。
TaoToken 在这里的角色是"模型调用的统一出口"。它的 API 地址是https://taotoken.net/api,控制台在https://taotoken.net/console,API Keys 管理在https://taotoken.net/api-keys。如果你后面要接 Claude Code 或者做 coding 相关的 Agent,可以看https://taotoken.net/coding-plan;想先试试模型对话效果,用https://taotoken.net/chat就行。
为什么要在第二课就提这个?因为 Lagent 的 ReAct 智能体默认支持GPTAPI和HFTransformerCasualLM两种后端。你本地跑 InternLM 用 HF 后端,但如果想对比 GPT 系列的工具调用效果,就需要一个 API Key。提前把 Key 准备好,后面改react_web_demo.py的时候直接填,不用中途再折腾。
具体操作:登录控制台 → 进 API Keys 页面 → 创建一个新 Key → 复制保存。注意 Key 只在创建时显示一次,丢了就重新建。然后在你的环境变量或者代码里引用,不要硬编码到会提交到 git 的文件里。我一般会在~/.bashrc里加一行export TAOTOKEN_API_KEY="你的key",这样所有 conda 环境都能读到。
接入文档在https://taotoken.net/doc,里面有 Base URL、鉴权方式、模型 ID 列表。记住三件套:Base URL 是https://taotoken.net/api,Key 是你刚创建的,Model ID 按文档里写的填。后面 Lagent 里如果要用 GPTAPI,就把这三件套对应填进去。
这一步不是必须的,但如果你打算把第二课的实验延伸到第三、第四课的 Agent 开发,提前准备好会省很多事。本地 InternLM 负责"我能跑通推理",TaoToken 负责"我能稳定调用外部模型",两条腿走路。
3. 可复制配置:conda 环境、依赖清单与模型路径
这一节是全文最干的部分,直接给可复制的配置。先创建环境。课程里用的是克隆已有环境的方式,这样比从头conda create再一个个装包快得多,而且版本是验证过的。
# 克隆一个已有的 pytorch 2.0.1 环境 conda create --name internlm-demo --clone=/root/share/conda_envs/internlm-base # 激活环境 conda activate internlm-demo # 确认 python 和 torch 版本 python -V python -c "import torch; print(torch.__version__, torch.cuda.is_available())"成功标志:输出2.0.1和True。如果cuda.is_available()是False,说明 GPU 没挂上,先别往下走。
接下来装依赖。课程给的版本清单我整理成一张表,方便你对照:
| 包名 | 版本 | 作用 |
|---|---|---|
| modelscope | 1.9.5 | 模型下载与管理 |
| transformers | 4.35.2 | 模型加载与推理 |
| streamlit | 1.24.0 | Web 交互前端 |
| sentencepiece | 0.1.99 | 分词器依赖 |
| accelerate | 0.24.1 | 设备映射与推理加速 |
安装命令:
python -m pip install --upgrade pip pip install modelscope==1.9.5 pip install transformers==4.35.2 pip install streamlit==1.24.0 pip install sentencepiece==0.1.99 pip install accelerate==0.24.1注意sentencepiece这里课程原文写的是sentencepiece=0.1.99,少了一个等号,会报错。正确的是==。这个坑我踩过,报错信息是ERROR: Invalid requirement,看到就知道是等号写错了。
模型准备。InternStudio 平台的 share 目录已经放了全系列 InternLM 模型,直接复制:
mkdir -p /root/model/Shanghai_AI_Laboratory cp -r /root/share/temp/model_repos/internlm-chat-7b /root/model/Shanghai_AI_Laboratory验证模型文件:
ls /root/model/Shanghai_AI_Laboratory/internlm-chat-7b应该能看到config.json、tokenizer.model、pytorch_model.bin等文件。如果目录是空的,说明复制路径不对,检查 share 目录下的实际结构。
代码准备:
cd /root/code git clone http://gitee.com/internlm/InternLM.git cd InternLM git checkout 3028f07cb79e5b1d7342f4ad8d11efad3fd13d17然后修改web_demo.py第 29 行和 33 行的模型路径,改成/root/model/Shanghai_AI_Laboratory/internlm-chat-7b。用ctrl+s保存。
如果你要用 TaoToken 的 API 做对比实验,可以在环境变量里加:
export TAOTOKEN_BASE_URL="https://taotoken.net/api" export TAOTOKEN_API_KEY="你的key"这样后面 Lagent 里引用os.environ.get("TAOTOKEN_API_KEY")就能拿到,不用改代码。
4. 验证请求:CLI 推理、Streamlit 交互与 Lagent 工具调用
环境配好了,现在验证。先跑 CLI 推理,这是最直接的验证方式。在/root/code/InternLM目录下新建cli_demo.py:
import torch from transformers import AutoTokenizer, AutoModelForCausalLM model_name_or_path = "/root/model/Shanghai_AI_Laboratory/internlm-chat-7b" tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained( model_name_or_path, trust_remote_code=True, torch_dtype=torch.bfloat16, device_map='auto' ) model = model.eval() system_prompt = """You are an AI assistant whose name is InternLM (书生·浦语). - InternLM (书生·浦语) is a conversational language model that is developed by Shanghai AI Laboratory (上海人工智能实验室). It is designed to be helpful, honest, and harmless. - InternLM (书生·浦语) can understand and communicate fluently in the language chosen by the user such as English and 中文. """ messages = [(system_prompt, '')] print("=============Welcome to InternLM chatbot, type 'exit' to exit.=============") while True: input_text = input("User >>> ") input_text = input_text.replace(' ', '') if input_text == "exit": break response, history = model.chat(tokenizer, input_text, history=messages) messages.append((input_text, response)) print(f"robot >>> {response}")运行:
conda activate internlm-demo python /root/code/InternLM/cli_demo.py如果报ModuleNotFoundError: No module named 'sentencepiece',说明前面装依赖时那个等号写错了,补装:
pip install sentencepiece==0.1.99重新运行,输入"你好",看到模型回复就说明推理链路通了。输入exit退出。
接下来跑 Streamlit Web Demo。先配置本地端口转发。在本地 PowerShell 里生成 SSH 密钥:
ssh-keygen -t rsa cat ~\.ssh\id_rsa.pub把公钥复制到 InternStudio 控制台的 SSH Key 配置里。然后在本地终端做端口转发:
ssh -CNg -L 6006:127.0.0.1:6006 root@ssh.intern-ai.org.cn -p 33090注意33090换成你自己的端口号,这个在开发机的 SSH 链接里能看到。这条命令会挂起,最小化窗口就行。
回到开发机的 VSCode,运行:
conda activate internlm-demo cd /root/code/InternLM streamlit run web_demo.py --server.address 127.0.0.1 --server.port 6006按住ctrl点网址链接,浏览器打开后模型才开始加载,等一会儿就能对话了。
最后是 Lagent 智能体工具调用。先装 Lagent:
cd /root/code git clone https://gitee.com/internlm/lagent.git cd /root/code/lagent git checkout 511b03889010c4811b1701abb153e02b8e94fb5e pip install -e .注意pip install -e .最后有个点,源码安装。然后替换examples/react_web_demo.py的内容(课程原文有完整代码,这里不重复贴)。关键改动是init_model里把模型路径指向本地 InternLM:
st.session_state['model_map'][option] = HFTransformerCasualLM( '/root/model/Shanghai_AI_Laboratory/internlm-chat-7b')如果你要用 TaoToken 的 GPTAPI,改成:
st.session_state['model_map'][option] = GPTAPI( model_type=option, api_base=os.environ.get("TAOTOKEN_BASE_URL"), api_key=os.environ.get("TAOTOKEN_API_KEY") )运行:
streamlit run /root/code/lagent/examples/react_web_demo.py --server.address 127.0.0.1 --server.port 6006浏览器打开后,模型选择internlm,输入一个需要计算的问题,比如"123 乘以 456 等于多少",看它会不会调用 PythonInterpreter 插件。如果能看到"思考步骤"和"执行结果",说明 Agent 链路通了。用vgpu-smi可以看 GPU 占用。
5. 本篇常见错排查:401、local proxy failed 与 reading choices
这一节列几个我实际遇到过的报错,对照着排查。
报错一:ModuleNotFoundError: No module named 'sentencepiece'
原因:装依赖时sentencepiece=0.1.99少了一个等号,pip 没装上。解决:pip install sentencepiece==0.1.99。验证:python -c "import sentencepiece; print(sentencepiece.__version__)"。
报错二:401 Unauthorized或invalid api key
如果你在 Lagent 里用 GPTAPI 走 TaoToken,报 401 说明 Key 不对或没读到。检查三件套:Base URL 是不是https://taotoken.net/api,Key 是不是从https://taotoken.net/api-keys复制的,Model ID 是不是文档里写的。环境变量用echo $TAOTOKEN_API_KEY确认能打印出来。如果是在 Streamlit 里跑,注意 Streamlit 可能读不到 shell 的环境变量,直接在代码里传参更稳。
报错三:local proxy failed或端口转发失败
本地ssh -CNg -L 6006:127.0.0.1:6006 ...报错,先检查端口号是不是写成了自己的。33090只是示例,你的开发机端口在 SSH 链接里。另外确认本地 6006 端口没被占用,netstat -ano | findstr 6006看一下。如果还是不行,换个本地端口,比如-L 6007:127.0.0.1:6006,然后浏览器访问127.0.0.1:6007。
报错四:Error reading choices或模型加载卡住
这个通常出现在web_demo.py里模型路径没改对。检查第 29 行和 33 行是不是指向/root/model/Shanghai_AI_Laboratory/internlm-chat-7b。另外确认模型文件完整,ls一下看pytorch_model.bin在不在。如果显存不够,把torch_dtype改成torch.float16试试。
报错五:Lagent 里OAuth相关错误
如果你接的是需要 OAuth 的 API,报错会提示 token 过期或 scope 不对。TaoToken 的 API Key 方式是直接鉴权,不走 OAuth,所以如果你看到 OAuth 报错,大概率是代码里用了别的 SDK 默认配置。检查GPTAPI的初始化参数,确保api_key传的是 TaoToken 的 Key。
报错六:Streamlit 页面空白或 404
端口转发通了但页面打不开,先确认 Streamlit 进程还在跑,终端有没有报错。然后确认--server.address 127.0.0.1 --server.port 6006和转发命令里的端口一致。如果用的是 InternLM-XComposer 的 demo,可能需要加root_path=f'/proxy/6006/',这个在课程原文里有提到。
6. 语义一致 CTA:把第二课的推理链路接到真实开发流
第二课跑通之后,你手里有了一个能本地推理的 InternLM、一个能交互的 Streamlit 前端、一个能调工具的 Lagent Agent。接下来无非三个方向:继续调模型、接更多工具、或者把 Agent 用到实际编码任务里。
如果你要继续验证模型效果,比如对比 InternLM 和 GPT 系列在同一个 prompt 下的表现,用https://taotoken.net/chat直接试就行,不用再配环境。如果你要把 Agent 接到长期编码任务里,比如让 ReAct 自动写代码、跑测试、修 bug,可以看https://taotoken.net/coding-plan,里面有 coding 场景的配置方式。如果你在排障过程中需要确认 API 的鉴权和模型列表,接入文档在https://taotoken.net/doc,API Keys 在https://taotoken.net/api-keys。
我自己的习惯是:本地 InternLM 负责"离线可跑、数据不出机器"的实验,TaoToken 负责"需要更强模型或更稳定调用"的场景。两条链路分开,出问题的时候能快速定位是环境问题还是调用问题。第二课的环境搭好了,后面第三、第四课的实验直接在这个 conda 环境上叠就行,不用重来。