煤矿安全大模型————矿途智护者
使用煤矿历史事故案例,事故处理报告、安全规程规章制度、技术文档、煤矿从业人员入职考试题库等数据,微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答。
本项目简介:
近年来,国家对煤矿安全生产的重视程度不断提升。为了确保煤矿作业的安全,提高从业人员的安全知识水平显得尤为重要。鉴于此,目前迫切需要一个高效、集成化的解决方案,该方案能够整合煤矿安全相关的各类知识,为煤矿企业负责人、安全管理人员、矿工提供一个精确、迅速的信息查询、学习与决策支持平台。
为实现这一目标,我们利用包括煤矿历史事故案例、事故处理报告、安全操作规程、规章制度、技术文档以及煤矿从业人员入职考试题库等在内的丰富数据资源,通过微调InternLM2模型,构建出一个专门针对煤矿事故和煤矿安全知识智能问答的煤矿安全大模型。
- 项目代码: 安全知识的智能问答-安全大模型
更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。
本项目的特点如下:
- 支持煤矿安全领域常规题型解答,如:单选题、多选题、判断题、填空题等 (针对煤矿主要负责人及安管人员、煤矿各种作业人员)
- 支持针对安全规程规章制度、技术等文档内容回答(如《中华人民共和国矿山安全法》、《煤矿建设安全规程》)
- 支持煤矿历史事故案例,事故处理报告查询,提供事故原因详细分析、事故预防措施以及应急响应知识
类别 | 底座 | 名称 | 版本 | 下载链接 | 微调方法 |
---|---|---|---|---|---|
对话模型 | InternLM2-Chat-1_8B | CoalMineLLM_InternLM2-Chat-1_8B | V1.0 | OpenXLab | QLora |
对话模型 | InternLM2-Chat-7B | CoalMineLLM_InternLM2-Chat-7B | V1.0 | OpenXLab | QLora |
对话模型 | InternLM2-Math-7B | CoalMineLLM_InternLM2-Math-7B | V1.0 | OpenXLab | QLora |
对话模型 | InternLM2-Chat-20B | CoalMineLLM_InternLM2-Chat-20B | V1.0 | OpenXLab | QLora |
对话模型 | InternLM2-Chat-1_8B | CoalMineLLM_InternLM2-Chat-1_8B-full | V1.0 | OpenXLab | 全参微调 |
对话模型 | CoalMineLLM_InternLM2-Chat-7B | CoalMineLLM_InternLM2-Chat-7B-4bit | V1.0 | OpenXLab | W4A16量化 |
1.架构图
2. 快速使用
2.1 本地Demo部署
2.2 在线体验
CoalMineLLM_InternLM2-Chat-1_8版体验地址: https://openxlab.org.cn/apps/detail/milowang/CoalQAv1
3.详细指南
3.1 环境配置
3.2 数据构造
3.2.1 从规程规章制度等文件中生成InternLM2模型Xtuner训练数据格式
1.1 输入如下命令,会在data目录下生成CoalQA_data.json
CoalQA_data.json内容结构形如:
1.2 接上面生成json,处理成Xtuner可训练数据格式,运行下面命令即可
3.2.2 从整理好的题库生成InternLM2模型Xtuner训练数据格式
输入如下命令即可
这里展示多选题生成
若想生成其他题目类型训练数据,请在相应位置替换成需要的内容
3.2.3 煤矿事故多轮对话生成
使用GLM-4模型,构建煤矿事故知识图谱。暂时不开源
- 补充细节
-
1.合并两个json文件的脚本:merge_json.py
-
2.格式化json文本的脚本:format_json.py
-
3.打乱json中数据顺序的脚本:shuffle.py
相关数据请见data目录:[安全知识的智能问答]
4. 模型微调
4.1 Internlm2微调
- 环境配置
创建环境
环境包的安装
- 下载本项目仓库
- 下载模型
进入finetune目录
执行如下命令,下载internlm2-chat-7b模型参数文件:
4.2 模型微调过程详细
本文档提供了使用 XTuner 工具进行模型微调过程的详细指南。该过程包括转换、合并、训练以及为不同规模的模型(1.8B 和 20B)设置网络演示。
- 要求
- XTuner
- DeepSpeed
- Huggingface Transformers
- 具备 SSH 和 Git 的使用权限
4.2.1 环境安装
4.2.2 1.8B 模型训练
- 数据准备
- 准备模型
如果是需要自己下载,可以使用transformers库
将这段代码保存为 download_model.py
,然后在命令行中运行这个脚本:
这个脚本会自动下载模型并将其保存到指定的 /root/ft/model
目录中。
- 下载配置文件
- 修改配置参数
- 模型训练
- 转换到 Huggingface 格式
-
创建目录:为转换后的 Huggingface 模型创建一个存储目录:
-
模型转换:使用提供的配置和权重文件进行模型转换:
-
合并模型:合并模型并解决依赖关系:
-
测试模型:通过启动对话来测试模型:
- 模型续训
- 网络演示设置
-
准备环境:
-
运行演示 使用 Streamlit:
-
通过 SSH 隧道访问演示:
4.2.3. 20B 模型训练
与1.8B模型训练过程类似,20B模型训练涉及到为配置、数据和最终模型创建相应的目录。此外,这一过程还包括使用多个GPU进行模型训练,并将模型转换为Huggingface格式。
- 数据准备
为大规模的20B模型训练准备数据。
- 准备模型
准备模型包括创建目标文件夹并将预训练的20B模型复制到指定位置。
- 下载配置文件
下载并准备20B模型的配置文件,以便进行训练。
- 修改配置参数
根据训练需求调整配置文件,以优化20B模型的训练。
- 模型训练
使用DeepSpeed和多GPU配置来加速20B模型的训练过程。
- 转换到 Huggingface 格式
为转换后的Huggingface模型创建目录并执行转换。
- 2.7 模型合并
合并转换后的模型并解决依赖关系。
- 测试模型
通过启动对话来测试合并后的模型。
这一部分提供了详细的指导,确保20B模型的训练过程得到妥善管理和执行。
4.2.4 微调20b配置样例
4.2.5 其他注意事项
- 单卡训完的,不可以在双卡上续训
原因是:
问题的根源:尝试加载的模型检查点是在数据并行(DP)世界大小为1(即单个GPU或单个训练进程)的环境中保存的。但当前尝试恢复训练的环境具有数据并行世界大小为2(即两个GPU或两个训练进程)。
ZeRO的限制:DeepSpeed的ZeRO优化器分区(ZeRO-Optimizer State Partitioning)依赖于特定的世界大小配置,并且目前不支持自动调整新的世界大小。换句话说,如果你在一个GPU上训练并保存了检查点,那么在加载这个检查点进行恢复训练时,你必须在相同数量的GPU上进行。
- 性能最优配置包括设置最大序列长度、批量大小及其他 DeepSpeed 特定设置。
5. 检索增强生成RAG
模块目的:根据用户的问题,检索对应信息以增强回答的专业性, 使CoalQA的回答更加专业可靠。检索内容包括但不限于以下几点:
-
煤矿安全相关的问答对
-
煤矿安全相关的案例
5.1 技术路线:
这个RAG系统各部分的技术路线分别是:
-
Embedding 模型:BAAI/bge-small-en-v1.5
-
LLM基座:InternLM2-Chat-1.8B InternLM2-Chat-7B InternLM2-Chat-20B InternLM2-Math-7B
-
使用BAAI/bge-reranker-large做检索后精排
-
向量数据库:
- FAISS:是Facebook开源的一个高效的向量相似性搜索库。它为大规模向量检索提供了多种索引结构和搜索算法,能够快速查找与给定向量最相似的向量。FAISS擅长处理超高维度的向量数据,在图像检索、推荐系统等场景有广泛应用。
5.2 环境搭建:
5.3 本地数据集向量化
PDF 数据
将需要向量化的pdf数据放到对应的目录下
JSON 数据
构建 QA 对并生成 JSON 文件(单轮/多轮对话),放入到对应目录下
数据格式如下
5.4 构建向量数据库
- 1.配置文件修改
根据需要改写 config.config 文件:
- 2.本地调用
运行构建本地知识库脚本
向量化主要步骤如下:
-
加载pdf数据集并提取文本
-
利用RecursiveCharacterTextSplitter按照一定块的大小以及块之间的重叠大小对文本进行分割。
-
加载 BAAI/bge-small-en-v1.5 模型
-
根据文档集构建FAISS索引(即高性能向量数据库)
5.5 相关文本召回与精排
利用faiss找出与用户输入的问题最相关的文档,然后将召回出来的文本与用户原始输入拼接输入给llm。检索代码如下:
5.6 RAG具体流程小结
-
根据数据集构建 vector DB
-
对用户输入的问题进行 embedding
-
基于 embedding 结果在向量数据库中进行检索
-
对召回数据重排序
-
依据用户问题和召回数据生成最后的结果
5.7 使用Neo4j和Langchain集成非结构化和图知识增强煤矿事故QA
- 使用Neo4j和Langchain集成非结构化和图知识增强煤矿事故QA,见[CoalMineLLM-InternLM2-Chat-1_8B版-CoalMineLLM-InternLM2_Chat-1_8B-integrated-qa-neo4j-langchain.ipynb]
6. 部署
6.1 本地部署
- 直接使用pytorch原生加载streamlit应用
6.2 openxlab部署:
直接使用pytorch原生加载streamlit应用
- 登陆 OpenXLab,创建 Streamlit 应用
- 选择配置,创建应用,如果需要更多的硬件资源,在这里进行申请
6.3 基于 LMDeploy的量化部署:
- LMDeploy简介
LMDeploy 由 MMDeploy 和 MMRazor 团队联合开发,是涵盖了 LLM 任务的全套轻量化、部署和服务解决方案。 这个强大的工具箱提供以下核心功能:
-
高效推理:LMDeploy 通过引入持久批处理(又称连续批处理)、阻塞式 KV 缓存、动态拆分与融合、张量并行、高性能 CUDA 内核等关键功能,将请求吞吐量提高到 vLLM 的 1.8 倍。
-
有效量化:LMDeploy 支持只加权量化和 k/v 量化,4 位推理性能是 FP16 的 2.4 倍。量化质量已通过 OpenCompass 评估确认。
-
轻松分发服务器:利用请求分发服务,LMDeploy 可在多台机器和卡上轻松高效地部署多模型服务。
-
交互式推理模式:通过缓存多轮对话过程中的关注度 k/v,引擎可记住对话历史,从而避免重复处理历史会话。
6.3.1 环境安装
pip安装:
自 v0.3.0 起,默认预编译包在 CUDA 12 上编译。不过,如果需要 CUDA 11+,可以通过以下方式安装 lmdeploy:
6.3.2 使用LMDeploy与模型对话
使用LMDeploy与模型进行对话,可以执行如下命令运行下载的1.8B模型
6.3.3 LMDeploy模型量化(lite)
- 设置最大KV Cache缓存大小
通过 --cache-max-entry-count参数,控制KV缓存占用剩余显存的最大比例为0.5
- 使用W4A16量化
LMDeploy使用AWQ算法,实现模型4bit权重量化。推理引擎TurboMind提供了非常高效的4bit推理cuda kernel,性能是FP16的2.4倍以上。它支持以下NVIDIA显卡:
- 图灵架构(sm75):20系列、T4
- 安培架构(sm80,sm86):30系列、A10、A16、A30、A100
- Ada Lovelace架构(sm90):40 系列
运行前,首先安装一个依赖库。
仅需执行一条命令,就可以完成模型量化工作。
6.3.4 LMDeploy服务(serve)
通过以下lmdeploy命令启动API服务器,推理模型:
即可以得到FastAPI的接口
7.案例展示
项目代码:
[安全知识的智能问答-安全大模型]
更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。
-
参考链接
-
BGE Github
-
BAAI/bge-small-en-v1.5: embedding 模型,用于构建 vector DB
-
BAAI/bge-reranker-large: rerank 模型,用于对检索回来的文章段落重排
-
-
InternLM2
-
LangChain
-
FAISS