【工程记录】金融大模型:DISC-FinLLM 部署的详细教程(Windows)


写在前面

仅作个人学习记录用。本文记录DISC-FinLLM在Windows操作系统中的部署实践。

1. 环境配置

Github地址:DISC-FinLLM

requirements.txt 中并没有注明依赖的安装版本要求,再加上模型权重说明不充分,这也导致了官方demo存在问题,本文提供了一个解决方案(3. Demo运行 中进一步阐述)

为了防止依赖之间的版本冲突,建议首先安装torch。同时先安装4.31.0版本的Transformers:

pip install transformers==4.31.0

Windows系统中gpu版本的torch的详细安装步骤可以参考我的另一篇记录文章:《【工程记录】conda虚拟环境配置+Pycharm使用pytorch-gpu环境(Windows)》

经过实测,Python≥ 3.9 都能够部署成功,低于3.9的Python 版本暂未测试过。

然后使用 pip 安装剩余的依赖(由于已经安装了torch,因此可以删掉requirements.txt中的 torchtransformers 两行):

pip install -r requirements.txt

除此之外若要部署LoRA微调模型还需下载依赖 peft 。如果 peft 无法调用,在代码开头添加:

import sys
sys.path.append(r'xxx\.conda\envs\[your_env_name]\Lib\site-packages')

2. 模型推理部署

2.1 模型介绍

DISC-FinLLM是一个专门针对金融场景下为用户提供专业、智能、全面的金融咨询服务的金融领域大模型,由复旦大学数据智能与社会计算实验室 (Fudan-DISC) 开发并开源。

DISC-FinLLM的基座模型是Baichuan-13B-Chat,采用LoRA分别使用不同数据进行微调训练,以及采用全量微调使用全部数据进行了微调训练。

在LORA训练上,DISC-FinLLM针对金融领域的不同功能,采用了多专家微调的训练策略。在特定的子数据集上训练模型的各个模组,使它们彼此互不干扰,独立完成不同任务。通过数据集的四个部分,分别训练4个LoRA专家模组:

  • 金融咨询(Consulting): 帮助用户完成金融问答任务(为用户解释金融专业的相关知识等),是由数据集中的金融咨询指令部分训练而来。
  • 金融文本分析(Task): 帮助用户完成金融文本信息抽取、情感分析、文本分类、文本生成等NLP任务,是由数据集中的金融任务指令部分训练而来。
  • 金融计算(Computing): 帮助用户完成金融数学计算相关的任务(利率、增长率、统计分析、Black-Scholes期权定价模型等),是由数据集中的金融计算指令部分训练而来。
  • 金融知识检索问答(Retrieval): 帮助用户完成基于金融新闻、研报和相关政策文件的投资建议、时事分析、政策解读任务,是由数据集中的检索增强指令部分训练而来。

部署时,用户只需更换在当前基座上的LoRA参数就可以切换功能。因此用户能够根据使用需求激活/停用模型的不同模组,而无需重新加载整个模型。

详细介绍见 官方文档

2.2 模型权重下载

直接从 Hugging Face 上下载DISC-FinLLM的LoRA模型权重和全参模型权重。

其中,由于LoRA采用多专家微调,因此不同功能的LoRA模型权重分别在Baichuan-13B-Chat-lora-Computing/Retrieval/Consulting/Task 文件夹中。

2.3 模型部署

部署全参模型:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation.utils import GenerationConfig
from peft import PeftModel, PeftConfig

model_path = "[你的模型下载路径]/DISC-FinLLM"
model = AutoModelForCausalLM.from_pretrained(
    model_path, torch_dtype=torch.float16, device_map="auto", trust_remote_code=True
)
model.generation_config = GenerationConfig.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(
    model_path, use_fast=False, trust_remote_code=True,
)

messages = [
    {"role": "user", "content": "xxx"},
]
response = model.chat(tokenizer, messages)
print(response)

部署LoRA模型:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation.utils import GenerationConfig
from peft import PeftModel, PeftConfig

model_path = "[你的模型下载路径]/DISC-FinLLM"
lora_path = "[你的模型下载路径]/DISC-FinLLM/Baichuan-13B-Chat-lora-xxx"
model = AutoModelForCausalLM.from_pretrained(
    model_path, torch_dtype=torch.float16, device_map="auto", trust_remote_code=True
)
model.generation_config = GenerationConfig.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(
    model_path, use_fast=False, trust_remote_code=True,
)
model = PeftModel.from_pretrained(model, lora_path
)

messages = [
    {"role": "user", "content": "xxx"},
]
response = model.chat(tokenizer, messages)
print(response)

lora_path即之前下载的四个不同功能的包含LoRA权重的文件夹路径,使用时将上述lora_path替换为下面路径即可:

lora_path='Go4miii/DISC-FinLLM/Baichuan-13B-Chat-lora-Computing/Retrieval/Consulting/Task'

3. Demo运行(已优化)

DISC-FinLLM部署完毕,接下来运行demo来验证是否部署成功。

DISC-FinLLM提供了网页demoweb_demo.py和命令行工具democli_demo.py但是demo存在问题,以下是我的解决方案

首先通过官方模型文件中的config.json可知

{
  "_from_model_config": true,
  "_name_or_path": "baichuan-inc/Baichuan-13B-Chat",
  "architectures": [
    "BaichuanForCausalLM"
  ],
  "auto_map": {
    "AutoConfig": "configuration_baichuan.BaichuanConfig",
    "AutoModel": "modeling_baichuan.BaichuanForCausalLM",
    "AutoModelForCausalLM": "baichuan-inc/Baichuan-13B-Chat--modeling_baichuan.BaichuanForCausalLM"
  },
  "bos_token_id": 1,
  "eos_token_id": 2,
  "hidden_act": "silu",
  "hidden_size": 5120,
  "initializer_range": 0.02,
  "intermediate_size": 13696,
  "model_max_length": 4096,
  "model_type": "baichuan",
  "num_attention_heads": 40,
  "num_hidden_layers": 40,
  "pad_token_id": 0,
  "rms_norm_eps": 1e-06,
  "tie_word_embeddings": false,
  "torch_dtype": "float16",
  "transformers_version": "4.31.0",
  "use_cache": false,
  "vocab_size": 64000
}

Transformers包的版本为4.31.0。而包中的get_class_from_dynamic_module函数(dynamic_module_utils.py文件内)存在代码块:

if "--" in class_reference:
	repo_id, class_reference = class_reference.split("--")
else:
    repo_id = pretrained_model_name_or_path
module_file, class_name = class_reference.split(".")

由于官方config文件中的定义:"AutoModelForCausalLM": "baichuan-inc/Baichuan-13B-Chat--modeling_baichuan.BaichuanForCausalLM",这会导致repo_id=baichuan-inc/Baichuan-13B-Chat。出现报错。

因此将判断去掉。同时module_file==baichuan-inc/Baichuan-13B-Chat--modeling_baichuan.py也是受到上述定义的影响。

因此,可以最终将代码块改为:

repo_id = pretrained_model_name_or_path
module_file, class_name = class_reference.split(".")
if '--' in module_file:
    _, module_file = module_file.split("--")

问题解决。

对于cli_demo.py,命令行工具demo可以直接运行,或者同样在终端输入以下命令:

python cli_demo.py

如图:
在这里插入图片描述

部署成功。

对于web_demo.py,由于Transformers版本冲突,仍然存在问题。Windows系统下实现启动基于Streamlit的网页demo,可以参考 【工程记录】ChatGLM3-6B 部署的详细教程(Windows) 第3部分中的步骤。接下来依靠 streamlit 工具在终端输入以下命令,会在本地启动一个 web 服务,把控制台给出的地址输入浏览器即可访问网页:

streamlit run web_demo.py --server.port 8888

此时出现报错'BaichuanTokenizer' object has no attribute 'sp_model'。修改tokenization_baichuan.py,把 super() 修改到最后执行:

		......
        self.add_eos_token = add_eos_token
        self.sp_model = spm.SentencePieceProcessor(**self.sp_model_kwargs)
        self.sp_model.Load(vocab_file)
        super().__init__(
            bos_token=bos_token,
            eos_token=eos_token,
            unk_token=unk_token,
            pad_token=pad_token,
            add_bos_token=add_bos_token,
            add_eos_token=add_eos_token,
            sp_model_kwargs=self.sp_model_kwargs,
            clean_up_tokenization_spaces=clean_up_tokenization_spaces,
            **kwargs,
        )

注意:Windows当中AutoModelForCausalLM.from_pretrained的路径识别可能会有异常。因为Linux下路径是/开头而且不会有冒号,而Windows则不是这样,而程序基本上都是针对Linux系统写的。若出现异常,请先检查在Windows操作系统中的路径是否正确。如果路径正确,则使用huggingface自动下载,省略步骤 2.2 模型权重下载 。若这种方法存在网络连接问题,则将步骤 2.2 模型权重下载 中下载的模型权重文移动到xxx/.cache/huggingface路径下。

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值