简介:
本教程在autodl平台上,使用Xinference加载本地自定义chatlm3模型的方式加载模型,致力于无网络环境情况下的模型加载和api封装,将环境和文件打包后可实现离线非容器部署,其它类型模型也可依此原理实现。
最简单的方法其实是直接使用autodl的社区lanchain镜像
配置信息
OS: Ubuntu 20.04
PyTorch: 2.1.0
Python: 3.10
CUDA: 12.1
GPU: RTX 4090D 24GB
CPU: 16 vCPU Intel(R) Xeon(R) Platinum 8481C
RAM: 80GB
硬盘: 80GB
Platform:Xinference
LLM: Chatglm3-6b
Embedding Models: BAAI/bge-large-zh-v1.5
TextSplitter: ChineseRecursiveTextSplitter
Kb_dataset: faiss
- FAISS:FAISS(Facebook AI相似性搜索)是Facebook AI Research开发的开源库。 它旨在有效地搜索大量高维数据中的相似项(向量)。
文档地址
FlagEmbedding-bge-large-zh-v1.5
原理
RAG(检索增强生成)是目前常见的llm的应用技术方案,其原理是通过语义检索本地的向量数据库,将本地数据携带到大模型的上下文中,模型有引用的数据,可以根据用户的提问进行输出,lanchain就是利用RAG实现的:
- Embedding 称为词嵌入,Embedding模型可以把文本块映射至向量空间中,类似TransE的原理
步骤
1.前期准备
1.1开启al自带的学术加速
source /etc/network_turbo
1.2 安装git-lfs
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs
git lfs install
2.使用Xinference部署Embedding和llm模型
2.1 建立一个llm和langchain专用python环境
由于Xinference的部分依赖会和langchain产生冲突,因此需要将这两个平台分开环境部署
在创建conda环境时,可以使用--prefix
参数来指定环境的安装位置。
这里分别创建了llm和langchain的环境
# 这个环境中会安装Xinference、Chatglm3-6b的依赖和bge-large-zh-v1.5的依赖
conda create -p /root/autodl-tmp/conda_env/llm python=3.10
# 这个环境会安装langchain
conda create -p /root/autodl-tmp/conda_env/langchain python=3.10
这里先激活llm环境,使用以下命令:
conda activate /root/autodl-tmp/conda_env/llm
PS:
如果你想要修改已存在的conda环境的位置,你需要将该环境复制到新的位置,然后使用
conda create --clone
来创建一个新的环境。例如:conda create --prefix /new/path/to/env --clone /path/to/existing/env
这将创建一个新的环境,其中包含现有环境中的所有包。
或者使用conda-pack打包环境
- 安装conda-pack包
conda install -c conda-forge conda-pack
或者
pip install conda-pack
- 使用 conda pack 命令开始打包环境
# 将名字为 my_env 的虚拟环境 打包为 my_env.tar.gz(默认就是这形式) conda pack -n my_env # -o 就是给导出的虚拟环境重新命名,所以导出来的虚拟环境名字为 out_name.tar.gz conda pack -n my_env -o out_name.tar.gz # 指定虚拟环境包的输出路径 conda pack -p /explicit/path/to/my_env
2.2 下载模型和安装xinference包
注意,使用git下载会因为git结构的特性,会把lfs文件备份一份在.git
文件中,所以要提前准备好模型权重本体两倍以上的空间,事后可以通过删除.git
文件删除这些缓存
git lfs clone https://huggingface.co/THUDM/chatglm3-6b
git lfs clone https://huggingface.co/BAAI/bge-large-zh-v1.5
# 以上会直接将权重下载下来,可能会耗时比较久
测试模型是否都可用:
这里我运行
response, history = model.chat(tokenizer, "你好", history=[])
遇到了模型运行时的报错(transformers 4.43.4),必须降低版 transformers的版本
pip install transformers==4.40.2
尝试过其它版本,要不xinference跑不起来、要不chatglm不能跑...
看了眼xinferenc和chatglm的issue,chatglm4好像也有这个问题
- 使用以下代码进行chatglm3-6b的测试,注意修改模型文件的位置
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("/root/autodl-tmp/model/chatglm3-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("/root/autodl-tmp/model/chatglm3-6b",trust_remote_code=True).half().cuda()
model = model.eval()
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
response, history = model.chat(tokenizer, "晚上睡不着应该怎么办", history=history)
print(response)
3.使用xinference运行模型,封装api
首先安装xinference,由于Chatglm3是基于transformers实现的,故这里我选择只装transformers版本的
pip install "xinference[transformers]"
# bge-large-zh-v1.5所需的依赖
pip install sentence-transformers
安装完毕后,使用以下命令启动xinference的webui
xinference-local --host 0.0.0.0 --port 9997
打开webui后,选择注册模型,分别在LANGUAGE MODEL
和EMBEDDING MODEL
中注册自己的本地模型
打开文档:
https://inference.readthedocs.io/zh-cn/latest/models/builtin/llm/chatglm3.html
https://inference.readthedocs.io/zh-cn/latest/models/builtin/embedding/bge-large-zh.html
选择对应模型填写默认参数,或者依照我下面的json作为参考
注意修改MODEL PATH
为模型所在目录的路径
注册完毕后可以运行模型了
或者使用或者编译json_config文件使用命令行加载
xinference register --model-type LLM --file my-glm3-chat.json --persist xinference launch --model-name my-glm3-chat --model-format pytorch --model-engine Transformers
- chatgim3的配置参考,依旧是注意修改模型地址
{ "version": 1, "context_length": 8192, "model_name": "my-chatglm3", "model_lang": [ "en", "zh" ], "model_ability": [ "generate", "chat" ], "model_description": "This is a custom model description.", "model_family": "chatglm3", "model_specs": [ { "model_format": "pytorch", "model_size_in_billions": 6, "quantizations": [ "none" ], "model_id": null, "model_hub": "huggingface", "model_uri": "/root/autodl-tmp/model/chatglm3-6b", "model_revision": null } ], "prompt_style": { "style_name": "CHATGLM3", "system_prompt": "", "roles": [ "user", "assistant" ], "intra_message_sep": "", "inter_message_sep": "", "stop": [ "<|user|>", "<|observation|>" ], "stop_token_ids": [ 64795, 64797, 2 ] }, "is_builtin": false }
- bge-large-zh
{ "model_name": "my-bge-large-zh", "model_id": null, "model_revision": null, "model_hub": "huggingface", "dimensions": 1024, "max_tokens": 512, "language": [ "zh" ], "model_uri": "/root/autodl-tmp/model/bge-large-zh-v1.5", "is_builtin": false }
4.安装langchain,并对接xinference的接口
首先切换为我们之前建的新环境
conda activate /root/autodl-tmp/conda_env/langchain
然后开始安装langchain-chatchat
pip install langchain-chatchat -U
# 安装xinference的发现器
pip install xinference-client
进入想要生成配置文件的目录
执行初始化
chatchat init
在文件夹中编辑model_settings.yaml 文件,确认其中的模型平台、LLM模型和Embed模型信息已经正确,以下是参考配置
# 模型配置项
# 默认选用的 LLM 名称
DEFAULT_LLM_MODEL: chatglm3-6b
# 默认选用的 Embedding 名称
DEFAULT_EMBEDDING_MODEL: bge-large-zh-v1.5
# AgentLM模型的名称 (可以不指定,指定之后就锁定进入Agent之后的Chain的模型,不指定就是 DEFAULT_LLM_MODEL)
Agent_MODEL: ''
# 默认历史对话轮数
HISTORY_LEN: 3
# 大模型最长支持的长度,如果不填写,则使用模型默认的最大长度,如果填写,则为用户设定的最大长度
MAX_TOKENS:
# LLM通用对话参数
TEMPERATURE: 0.7
# 支持的Agent模型
SUPPORT_AGENT_MODELS:
- chatglm3-6b
- glm-4
- openai-api
- Qwen-2
- qwen2-instruct
- gpt-3.5-turbo
- gpt-4o
# LLM模型配置,包括了不同模态初始化参数。
# `model` 如果留空则自动使用 DEFAULT_LLM_MODEL
LLM_MODEL_CONFIG:
preprocess_model:
model: ''
temperature: 0.05
max_tokens: 4096
history_len: 10
prompt_name: default
callbacks: false
llm_model:
model: ''
temperature: 0.9
max_tokens: 4096
history_len: 10
prompt_name: default
callbacks: true
action_model:
model: ''
temperature: 0.01
max_tokens: 4096
history_len: 10
prompt_name: ChatGLM3
callbacks: true
postprocess_model:
model: ''
temperature: 0.01
max_tokens: 4096
history_len: 10
prompt_name: default
callbacks: true
image_model:
model: sd-turbo
size: 256*256
# # 模型加载平台配置
# # 平台名称
platform_name: xinference
# # 平台类型
# # 可选值:['xinference', 'ollama', 'oneapi', 'fastchat', 'openai', 'custom openai']
# platform_type: xinference
# # openai api url
# api_base_url: http://127.0.0.1:9997/v1
# # api key if available
# api_key: EMPTY
# # API 代理
# api_proxy: ''
# # 该平台单模型最大并发数
# api_concurrencies: 5
# # 是否自动获取平台可用模型列表。设为 True 时下方不同模型类型可自动检测
# auto_detect_model: false
# # 该平台支持的大语言模型列表,auto_detect_model 设为 True 时自动检测
# llm_models: []
# # 该平台支持的嵌入模型列表,auto_detect_model 设为 True 时自动检测
# embed_models: []
# # 该平台支持的图像生成模型列表,auto_detect_model 设为 True 时自动检测
# text2image_models: []
# # 该平台支持的多模态模型列表,auto_detect_model 设为 True 时自动检测
# image2text_models: []
# # 该平台支持的重排模型列表,auto_detect_model 设为 True 时自动检测
# rerank_models: []
# # 该平台支持的 STT 模型列表,auto_detect_model 设为 True 时自动检测
# speech2text_models: []
# # 该平台支持的 TTS 模型列表,auto_detect_model 设为 True 时自动检测
# text2speech_models: []
MODEL_PLATFORMS:
- platform_name: xinference
platform_type: xinference
api_base_url: http://127.0.0.1:9997/v1
api_key: EMPTY
api_proxy: ''
api_concurrencies: 5
auto_detect_model: true
llm_models: []
embed_models: []
text2image_models: []
image2text_models: []
rerank_models: []
speech2text_models: []
text2speech_models: []
- platform_name: ollama
platform_type: ollama
api_base_url: http://127.0.0.1:11434/v1
api_key: EMPTY
api_proxy: ''
api_concurrencies: 5
auto_detect_model: false
llm_models:
- qwen:7b
- qwen2:7b
embed_models:
- quentinz/bge-large-zh-v1.5
text2image_models: []
image2text_models: []
rerank_models: []
speech2text_models: []
text2speech_models: []
- platform_name: oneapi
platform_type: oneapi
api_base_url: http://127.0.0.1:3000/v1
api_key: sk-
api_proxy: ''
api_concurrencies: 5
auto_detect_model: false
llm_models:
- chatglm_pro
- chatglm_turbo
- chatglm_std
- chatglm_lite
- qwen-turbo
- qwen-plus
- qwen-max
- qwen-max-longcontext
- ERNIE-Bot
- ERNIE-Bot-turbo
- ERNIE-Bot-4
- SparkDesk
embed_models:
- text-embedding-v1
- Embedding-V1
text2image_models: []
image2text_models: []
rerank_models: []
speech2text_models: []
text2speech_models: []
- platform_name: openai
platform_type: openai
api_base_url: https://api.openai.com/v1
api_key: sk-proj-
api_proxy: ''
api_concurrencies: 5
auto_detect_model: false
llm_models:
- gpt-4o
- gpt-3.5-turbo
embed_models:
- text-embedding-3-small
- text-embedding-3-large
text2image_models: []
image2text_models: []
rerank_models: []
speech2text_models: []
text2speech_models: []
配置完毕后,初始化默认知识库向量
chatchat kb -r
初始完毕后,启动langchain-chatchat
chatchat start -a
知识库验证:
上传文件:
尝试通过RAG检索总结:
reference
https://blog.lukeewin.top/archives/ubuntu-install-langchain-chatchat
https://blog.csdn.net/weixin_68531269/article/details/135747460