diff --git "a/InternLM2/02-InternLM2-7B-chat langchain \346\216\245\345\205\245.md" "b/InternLM2/02-InternLM2-7B-chat langchain \346\216\245\345\205\245.md" new file mode 100644 index 00000000..fb3563c7 --- /dev/null +++ "b/InternLM2/02-InternLM2-7B-chat langchain \346\216\245\345\205\245.md" @@ -0,0 +1,99 @@ +# InternLM2-7B-chat langchain 接入 + +InternLM2 ,即书生·浦语大模型第二代,开源了面向实用场景的70亿参数基础模型与对话模型 (InternLM2-Chat-7B)。模型具有以下特点: + +- 有效支持20万字超长上下文:模型在20万字长输入中几乎完美地实现长文“大海捞针”,而且在 LongBench 和 L-Eval 等长文任务中的表现也达到开源模型中的领先水平。 可以通过 LMDeploy 尝试20万字超长上下文推理。 +- 综合性能全面提升:各能力维度相比上一代模型全面进步,在推理、数学、代码、对话体验、指令遵循和创意写作等方面的能力提升尤为显著,综合性能达到同量级开源模型的领先水平,在重点能力评测上 InternLM2-Chat-20B 能比肩甚至超越 ChatGPT (GPT-3.5)。 +- 代码解释器与数据分析:在配合代码解释器(code-interpreter)的条件下,InternLM2-Chat-20B 在 GSM8K 和 MATH 上可以达到和 GPT-4 相仿的水平。基于在数理和工具方面强大的基础能力,InternLM2-Chat 提供了实用的数据分析能力。 +- 工具调用能力整体升级:基于更强和更具有泛化性的指令理解、工具筛选与结果反思等能力,新版模型可以更可靠地支持复杂智能体的搭建,支持对工具进行有效的多轮调用,完成较复杂的任务。 + + +## 环境准备 + +在 autodl 平台中租赁一个 3090 等 24G 显存的显卡机器,如下图所示镜像选择 PyTorch-->2.0.0-->3.8(ubuntu20.04)-->11.8 + +![机器配置选择](images/1.png) +接下来打开刚刚租用服务器的 JupyterLab,并且打开其中的终端开始环境配置、模型下载和运行 demo。 + +pip 换源加速下载并安装依赖包 + +```shell +# 升级pip +python -m pip install --upgrade pip +# 更换 pypi 源加速库的安装 +pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple + +pip install modelscope==1.11.0 +pip install transformers==4.37.0 +pip install sentencepiece==0.1.99 +pip install accelerate==0.24.1 +pip install transformers_stream_generator==0.0.4 +pip install langchain +``` + +## 模型下载 + +使用 modelscope 中的 snapshot_download 函数下载模型,第一个参数为模型名称,参数 cache_dir 为模型的下载路径。 + +在 /root/autodl-tmp 路径下新建 model_download.py 文件并在其中输入以下内容,粘贴代码后请及时保存文件,如下图所示。并运行 `python /root/autodl-tmp/model_download.py` 执行下载,模型大小为 14GB,下载模型大概需要 2 分钟。 + +```python +import torch +from modelscope import snapshot_download, AutoModel, AutoTokenizer +import os +model_dir = snapshot_download('Shanghai_AI_Laboratory/internlm2-chat-7b', cache_dir='/root/autodl-tmp', revision='master') +``` + +## 代码准备 + +为便捷构建 LLM 应用,我们需要基于本地部署的 InternLM2-LM,自定义一个 LLM 类,将 InternLM2 接入到 LangChain 框架中。完成自定义 LLM 类之后,可以以完全一致的方式调用 LangChain 的接口,而无需考虑底层模型调用的不一致。 + +基于本地部署的 InternLM2 自定义 LLM 类并不复杂,我们只需从 LangChain.llms.base.LLM 类继承一个子类,并重写构造函数与 _call 函数即可: + +```python +from langchain.llms.base import LLM +from typing import Any, List, Optional +from langchain.callbacks.manager import CallbackManagerForLLMRun +from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig, LlamaTokenizerFast +import torch + +class InternLM2_LLM(LLM): + # 基于本地 Qwen2 自定义 LLM 类 + tokenizer: AutoTokenizer = None + model: AutoModelForCausalLM = None + + def __init__(self, mode_name_or_path :str): + + super().__init__() + print("正在从本地加载模型...") + self.tokenizer = AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_code=True) + self.model = AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtype=torch.float16, trust_remote_code=True).cuda() + self.model = self.model.eval() + print("完成本地模型的加载") + + def _call(self, prompt : str, stop: Optional[List[str]] = None, + run_manager: Optional[CallbackManagerForLLMRun] = None, + **kwargs: Any): + + response, history = self.model.chat(self.tokenizer, prompt, history=[]) + + return response + @property + def _llm_type(self) -> str: + return "InternLM2_LLM" +``` + +在上述类定义中,我们分别重写了构造函数和 _call 函数:对于构造函数,我们在对象实例化的一开始加载本地部署的 InternLM2 模型,从而避免每一次调用都需要重新加载模型带来的时间过长;_call 函数是 LLM 类的核心函数,LangChain 会调用该函数来调用 LLM,在该函数中,我们调用已实例化模型的 chat 方法,从而实现对模型的调用并返回调用结果。 + +在整体项目中,我们将上述代码封装为 LLM.py,后续将直接从该文件中引入自定义的 LLM 类。 + +## 代码运行 + +然后就可以像使用任何其他的langchain大模型功能一样使用了。 + +```python +from LLM import InternLM2_LLM + +llm = InternLM2_LLM(mode_name_or_path = "/root/autodl-tmp/Shanghai_AI_Laboratory/internlm2-chat-7b") +llm("你是谁") +``` \ No newline at end of file diff --git "a/Qwen1.5/02-Qwen1.5-7B-Chat \346\216\245\345\205\245langchain\346\220\255\345\273\272\347\237\245\350\257\206\345\272\223\345\212\251\346\211\213.md" "b/Qwen1.5/02-Qwen1.5-7B-Chat \346\216\245\345\205\245langchain\346\220\255\345\273\272\347\237\245\350\257\206\345\272\223\345\212\251\346\211\213.md" index 2f8e555a..843480a6 100644 --- "a/Qwen1.5/02-Qwen1.5-7B-Chat \346\216\245\345\205\245langchain\346\220\255\345\273\272\347\237\245\350\257\206\345\272\223\345\212\251\346\211\213.md" +++ "b/Qwen1.5/02-Qwen1.5-7B-Chat \346\216\245\345\205\245langchain\346\220\255\345\273\272\347\237\245\350\257\206\345\272\223\345\212\251\346\211\213.md" @@ -4,7 +4,7 @@ 在 autodl 平台中租赁一个 3090 等 24G 显存的显卡机器,如下图所示镜像选择 PyTorch-->2.0.0-->3.8(ubuntu20.04)-->11.8 -![机器配置选择](images/4.png) +![机器配置选择](images/1.png) 接下来打开刚刚租用服务器的 JupyterLab,并且打开其中的终端开始环境配置、模型下载和运行 demo。 pip 换源加速下载并安装依赖包 diff --git a/README.md b/README.md index 3fca9f83..77753d69 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ - [InternLM2](https://github.com/InternLM/InternLM) - [x] [InternLM2-7B-chat FastApi 部署调用](./InternLM2/01-InternLM2-7B-chat%20FastAPI部署.md) @ 不要葱姜蒜 - - [ ] InternLM2-7B-chat langchain 接入 + - [x] [InternLM2-7B-chat langchain 接入](./InternLM2/02-InternLM2-7B-chat%20langchain%20接入.md) @ 不要葱姜蒜 - [x] [InternLM2-7B-chat WebDemo 部署](./InternLM2/03-InternLM2-7B-chat WebDemo 部署.md) @ 白玉 - [ ] InternLM2-7B-chat Xtuner Qlora 微调