You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
4.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 煤矿安全大模型——矿途智护者
## 项目背景
- 国家高度重视煤矿安全生产工作,提高从业人员的安全知识水平,是煤矿安全管理的重要基础。
- 安全管理领域积累了海量数据,但难以为安全决策所利用。
- 根据国家矿山安监局统计90%以上煤矿事故都与人的不安全行为有关。
## 主要功能
- 支持煤矿安全领域常规题型解答,如:单选题、多选题、判断题、填空题等 (针对煤矿主要负责人及安管人员、煤矿各种作业人员)
- 支持针对安全规程规章制度、技术等文档内容回答(如《中华人民共和国矿山安全法》、《煤矿建设安全规程》)
- 支持煤矿历史事故案例,事故处理报告查询,提供事故原因详细分析、事故预防措施以及应急响应知识
## 创建环境
```shell
conda create -n CoalLLM python=3.10
conda activate CoalLLM
```
## 依赖包安装
```shell
pip install modelscope[framework] # 模型库
pip install py-data-juicer[sci] # 数据处理库
pip install ms-swift[llm] # 训练库
pip install ms-swift[eval] # 评测库
```
## 数据构建
输入如下命令会在data目录下生成CoalQA_data.json
```shell
git clone https://gitlink.org.cn/yaosenJ/Coal_Mine_SAFETY.git
cd Coal_Mine_SAFETY/data_process
python Generate_QAdata.py ../data/CoalQA_data.json
```
CoalQA_data.json内容结构形如
```json
[
{
"instruction": "请提供新建矿井立井井筒冻结法施工的具体要求。",
"output": "新建矿井立井井筒冻结法施工需要遵守以下要求冻结深度必须穿过风化带延深至稳定的基岩10m以上第一个冻结孔必须全孔取芯钻孔时必须测定钻孔的方向和偏斜度偏斜度超过规定时必须及时纠正冻结管必须采用无缝钢管并焊接或螺纹连接开始冻结后必须经常观察水文观测孔的水位变化并在确定冻结壁已交圈后才能进行试挖。"
},
...
]
```
## 模型训练
安装 flash-attention 加快推理速度
```shell
pip install flash-attn --no-build-isolation
```
使用ms-swift训练模型
```shell
!CUDA_VISIBLE_DEVICES=0 swift sft \
--sft_type lora \
--model_type internlm2_5-7b-chat \
--model_id_or_path /root/share/new_models/Shanghai_AI_Laboratory/internlm2_5-7b-chat \
--dataset /root/Coal_Mine_SAFETY/data/data.json\
--system "你是一个煤矿安全领域的知识达人,你对相关煤矿安全规章规程制度、技术等文档非常熟悉。请你专业正确地解答用户想问的煤矿安全相关问题。" \
--dataset_test_ratio 0.01 \
--output_dir output \
--lora_target_modules ALL \
--lora_rank 8 \
--dtype bf16 \
--seed 42 \
--learning_rate 1e-4 \
--warmup_ratio 0.05 \
--max_length 2048 \
--batch_size 4 \
--eval_batch_size 4 \
--num_train_epochs 3 \
--gradient_accumulation_steps 4 \
--save_total_limit 5 \
--eval_steps 100 \
--save_steps 100
```
**显存占用**
<p align="center">
<br>
<img src="https://code.educoder.net/api/yaosenJ/CoalLLM/raw/img%2F%E6%98%BE%E5%AD%98%E5%8D%A0%E7%94%A8.png?ref=main"/>
<br>
</p>
**训练日志**
<p align="center">
<br>
<img src="https://code.educoder.net/api/yaosenJ/CoalLLM/raw/img%2Ftrain_log.png?ref=main"/>
<br>
</p>
## 使用evalscope评估模型
### 1. 自定义数据集评估
```shell
!CUDA_VISIBLE_DEVICES=0 swift eval \
--ckpt_dir /root/Coal_Mine_SAFETY/output/internlm2_5-7b-chat/v4-20240909-222741/checkpoint-1113 \
--eval_dataset no \
--infer_backend pt \
--eval_backend Native \
--eval_limit 10 \
--seed 42 \
--eval_batch_size 8 \
--custom_eval_config custom_eval_config.json \
--temperature 0.7 \
--top_k 20 \
--top_p 0.9
```
<p align="center">
<br>
<img src="https://code.educoder.net/api/yaosenJ/CoalLLM/raw/img%2F%E8%AF%84%E6%B5%8B.png?ref=main"/>
<br>
</p>
## 项目展示
<p align="center">
<br>
<img src="https://code.educoder.net/api/yaosenJ/CoalLLM/raw/img%2F%E5%9B%BE%E7%89%871.png?ref=main"/>
<br>
</p>
<p align="center">
<br>
<img src="https://code.educoder.net/api/yaosenJ/CoalLLM/raw/img%2F%E5%9B%BE%E7%89%874.png?ref=main"/>
<br>
</p>
<p align="center">
<br>
<img src="https://code.educoder.net/api/yaosenJ/CoalLLM/raw/img%2F%E5%9B%BE%E7%89%875.png?ref=main"/>
<br>
</p>
<p align="center">
<br>
<img src="https://code.educoder.net/api/yaosenJ/CoalLLM/raw/img%2F%E5%9B%BE%E7%89%876.png?ref=main"/>
<br>
</p>