GBI概念以及DB-GPT不了解的可以去看看本人之前的两篇博文。本篇文章主要详细记录DB-Chat部署使用。
环境
- python3.10.9
- GPU:A100
- jupyter lab
- torch 1.13.1 cu117
- torch 0.13.1 cu117
- torchvision 0.14.1 cu117
- CUDA:11.7
Jupyter Lab
安装JupyterLab
代码语言:bash复制pip install jupyterlab
配置JupyterLab
创建一个配置文件:
代码语言:txt复制jupyter lab --generate-config
找到生成的配置文件,通常位于 ~/.jupyter/jupyter_lab_config.py
,然后编辑它:
vim ~/.jupyter/jupyter_lab_config.py
设置密码:
代码语言:txt复制jupyter notebook password
在生成的json文件下面打开找到hash_password。
在配置文件中找到以下几行,并根据需要取消注释和修改:
代码语言:python代码运行次数:0复制# 监听所有的IP地址(默认只监听本地)
c.ServerApp.ip = '0.0.0.0'
# 不使用浏览器自动打开
c.ServerApp.open_browser = False
# 设置访问密码
c.ServerApp.password = 'your_hashed_password'
# 是否需要访问密码
c.ServerApp.password_required = True
# 设置访问端口(默认是8888)
c.ServerApp.port = 8888
如果有误打开了port重复打开端口:
先看看端口信息:
代码语言:txt复制sudo netstat -tuln
下载一下lsof:
代码语言:txt复制sudo yum install lsof -y
安装完成后,你可以确认 lsof
是否已成功安装:
lsof -v
使用 lsof
查找并关闭端口
sudo lsof -i :8888
找到使用该端口的进程ID (PID) 后,使用 kill
命令关闭进程:
sudo kill <PID>
打开jupyter lab:
代码语言:txt复制jupyter lab --allow-root
记得在服务器上面打开端口,云服务器好设置,如果是本地机器的话需要确认服务器上的防火墙允许8888端口的流量:
代码语言:txt复制sudo firewall-cmd --zone=public --add-port=8888/tcp --permanent
sudo firewall-cmd --reload
好了之后可以在8888端口访问,之后开始部署DB-Chat:
源码下载:
代码语言:txt复制git clone https://github.com/eosphoros-ai/DB-GPT.git
可以先虚拟一个db-gpt的环境:
代码语言:txt复制conda create -n dbgpt_env python=3.10
conda activate dbgpt_env
下载依赖:
代码语言:txt复制pip install -e ".[default]"
我这里报错:
下载一下setuptools_scm
代码语言:txt复制pip install setuptools_scm
问题解决。
配置一下环境变量:
代码语言:txt复制cp .env.template .env
需要注意的是这几个点:
LLM:
SQL:
我这边先进行本地部署chatglm4-9b:
代码语言:txt复制mkdir models and cd models
通过魔搭下载确保lfs已经安装:
代码语言:txt复制git lfs install
开始克隆:
代码语言:txt复制git clone https://www.modelscope.cn/ZhipuAI/glm-4-9b-chat.git
模型比较大,大概有20G需要耐心等一下,下载完了之后先安装一下依赖,跑个Demo看看效果:
trans_cli_demo.ipynb:
代码语言:python代码运行次数:0复制import os
from pathlib import Path
from threading import Thread
from typing import Union
import gradio as gr
import torch
from peft import AutoPeftModelForCausalLM, PeftModelForCausalLM
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
PreTrainedModel,
PreTrainedTokenizer,
PreTrainedTokenizerFast,
StoppingCriteria,
StoppingCriteriaList,
TextIteratorStreamer
)
from transformers import AutoTokenizer, StoppingCriteria, StoppingCriteriaList, TextIteratorStreamer, AutoModel
ModelType = Union[PreTrainedModel, PeftModelForCausalLM]
TokenizerType = Union[PreTrainedTokenizer, PreTrainedTokenizerFast]
MODEL_PATH = os.environ.get('MODEL_PATH', '/root/DB-GPT/models/glm-4-9b-chat')
TOKENIZER_PATH = os.environ.get("TOKENIZER_PATH", MODEL_PATH)
tokenizer = AutoTokenizer.from_pretrained(
MODEL_PATH,
trust_remote_code=True,
encode_special_tokens=True
)
model = AutoModel.from_pretrained(
MODEL_PATH,
trust_remote_code=True,
# attn_implementation="flash_attention_2", # Use Flash Attention
# torch_dtype=torch.bfloat16, #using flash-attn must use bfloat16 or float16
device_map="auto").eval()
class StopOnTokens(StoppingCriteria):
def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:
stop_ids = model.config.eos_token_id
for stop_id in stop_ids:
if input_ids[0][-1] == stop_id:
return True
return False
if __name__ == "__main__":
history = []
max_length = 8192
top_p = 0.8
temperature = 0.6
stop = StopOnTokens()
print("Welcome to the GLM-4-9B CLI chat. Type your messages below.")
while True:
user_input = input("nYou: ")
if user_input.lower() in ["exit", "quit"]:
break
history.append([user_input, ""])
messages = []
for idx, (user_msg, model_msg) in enumerate(history):
if idx == len(history) - 1 and not model_msg:
messages.append({"role": "user", "content": user_msg})
break
if user_msg:
messages.append({"role": "user", "content": user_msg})
if model_msg:
messages.append({"role": "assistant", "content": model_msg})
model_inputs = tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
tokenize=True,
return_tensors="pt"
).to(model.device)
streamer = TextIteratorStreamer(
tokenizer=tokenizer,
timeout=60,
skip_prompt=True,
skip_special_tokens=True
)
generate_kwargs = {
"input_ids": model_inputs,
"streamer": streamer,
"max_new_tokens": max_length,
"do_sample": True,
"top_p": top_p,
"temperature": temperature,
"stopping_criteria": StoppingCriteriaList([stop]),
"repetition_penalty": 1.2,
"eos_token_id": model.config.eos_token_id,
}
t = Thread(target=model.generate, kwargs=generate_kwargs)
t.start()
print("GLM-4:", end="", flush=True)
for new_token in streamer:
if new_token:
print(new_token, end="", flush=True)
history[-1][1] = new_token
history[-1][1] = history[-1][1].strip()
Demo可以跑起来,那么现在就开始DB-Chat本地环境变量配置了:
DB-GPT Demo
测试数据Linux
代码语言:txt复制bash ./scripts/examples/load_examples.sh
运行服务
代码语言:txt复制python dbgpt/app/dbgpt_server.py
DB-GPT默认开放的端口为5670,根据开放的IP打开这个端口地址即可看到使用DB-GPT,需要注意的是需要关注GPU和CPU是否能够支持你嵌入的大模型底座算力需要,还需要看你的GPU是否能负载,版本是否能对上,可以先使用Chat Excel,上传一个excel文件用于测试:
这个功能能运作了说明大模型调用是没问题的,基础的数据分析能力和RAG也都是没问题的,现在需要调通数据库模型能力,这部分我打算放到下一章对整个DB-GPT数据库层源码进行解读,本人之前做过较为底层的SQL Tree血缘解析,希望能够整合到开源项目里面中,共享出自己的一份力,加强AI数据合规方面能力。