简介:

本教程在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开发的开源库。 它旨在有效地搜索大量高维数据中的相似项(向量)。

文档地址

lanchain

FlagEmbedding-bge-large-zh-v1.5

chatglm3

Xinference

原理

RAG(检索增强生成)是目前常见的llm的应用技术方案,其原理是通过语义检索本地的向量数据库,将本地数据携带到大模型的上下文中,模型有引用的数据,可以根据用户的提问进行输出,lanchain就是利用RAG实现的:

notion image

  • 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打包环境

  1. 安装conda-pack包
conda install -c conda-forge conda-pack

或者

pip install conda-pack
  1. 使用 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 MODELEMBEDDING MODEL中注册自己的本地模型image-20240822150201755

image-20240822150444923

打开文档:

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作为参考

image-20240822150323548

注意修改MODEL PATH为模型所在目录的路径

注册完毕后可以运行模型了

image-20240822150727169

image-20240822151011746

或者使用或者编译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

知识库验证:

上传文件:

image-20240822115815795

尝试通过RAG检索总结:

image-20240822115840070

image-20240822115903058

reference

https://blog.lukeewin.top/archives/ubuntu-install-langchain-chatchat

https://blog.csdn.net/weixin_68531269/article/details/135747460

https://blog.csdn.net/m0_60791400/article/details/140023407

如果对你有帮助就太好了)))