煤礦安全大模型:微調internlm2模型實現針對煤礦事故和煤礦安全知識的智慧問答

汀、人工智能發表於2024-07-03

煤礦安全大模型————礦途智護者

使用煤礦歷史事故案例,事故處理報告、安全規程規章制度、技術文件、煤礦從業人員入職考試題庫等資料,微調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部署

git clone https://github.com/yaosenJ/CoalQA.git
cd CoalQA
conda create -n CoalQA python=3.10.0 -y
conda activate CoalQA
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia
pip install -r requirements.txt
cd web_app
streamlit run streamlit_app.py --server.address=127.0.0.1 --server.port 6006

2.2 線上體驗

CoalMineLLM_InternLM2-Chat-1_8版體驗地址:https://openxlab.org.cn/apps/detail/milowang/CoalQAv1

3.詳細指南

3.1 環境配置

git clone https://github.com/yaosenJ/CoalQA.git
cd CoalQA
conda create -n CoalQA python=3.10.0 -y
conda activate CoalQA
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia
pip install -r requirements.txt

3.2 資料構造

3.2.1 從規程規章制度等檔案中生成InternLM2模型Xtuner訓練資料格式

1.1 輸入如下命令,會在data目錄下生成CoalQA_data.json

python  Generate_QAdata.py  ../data/CoalQA_data.json

CoalQA_data.json內容結構形如:

[
  {
    "input": "請提供新建礦井立井井筒凍結法施工的具體要求。",
    "output": "新建礦井立井井筒凍結法施工需要遵守以下要求:凍結深度必須穿過風化帶延深至穩定的基岩10m以上,第一個凍結孔必須全孔取芯,鑽孔時必須測定鑽孔的方向和偏斜度,偏斜度超過規定時必須及時糾正,凍結管必須採用無縫鋼管並焊接或螺紋連線,開始凍結後必須經常觀察水文觀測孔的水位變化,並在確定凍結壁已交圈後才能進行試挖。"
  },
  ...
  
]

1.2 接上面生成json,處理成Xtuner可訓練資料格式,執行下面命令即可

python format_internlm2.py  
[
    {
        "conversation": [
            {
                "system": "你是一個煤礦安全領域的知識達人,你對相關煤礦安全規章規程制度、技術等文件非常熟悉。請你專業正確地解答使用者想問的煤礦安全相關問題。",
                "input": "請提供新建礦井立井井筒凍結法施工的具體要求。",
                "output": "新建礦井立井井筒凍結法施工需要遵守以下要求:凍結深度必須穿過風化帶延深至穩定的基岩10m以上,第一個凍結孔必須全孔取芯,鑽孔時必須測定鑽孔的方向和偏斜度,偏斜度超過規定時必須及時糾正,凍結管必須採用無縫鋼管並焊接或螺紋連線,開始凍結後必須經常觀察水文觀測孔的水位變化,並在確定凍結壁已交圈後才能進行試挖。"
            }
        ]
    },
    {
        "conversation": [
            {
                "system": "你是一個煤礦安全領域的知識達人,你對相關煤礦安全規章規程制度、技術等文件非常熟悉。請你專業正確地解答使用者想問的煤礦安全相關問題。",
                "input": "煤礦安全規程中,對於新建礦井的立井井筒凍結法施工有哪些具體要求?",
                "output": "新建礦井立井井筒凍結法施工需要遵守以下要求:凍結深度必須穿過風化帶延深至穩定的基岩10m以上,第一個凍結孔必須全孔取芯,鑽孔時必須測定鑽孔的方向和偏斜度,偏斜度超過規定時必須及時糾正,凍結管必須採用無縫鋼管並焊接或螺紋連線,開始凍結後必須經常觀察水文觀測孔的水位變化,並在確定凍結壁已交圈後才能進行試挖。"
            }
        ]
    },
...
]

3.2.2 從整理好的題庫生成InternLM2模型Xtuner訓練資料格式

輸入如下命令即可

python Generate_Question_bank.py

這裡展示多選題生成

[
    {
        "conversation": [
            {
                "system": "你是一個煤礦安全領域的知識達人,你會解答很多題。使用者給出一個多選題,你能從幾個選項中,選擇出多個正確選項。",
                "input": "掘進巷道在下列哪些情況下不能爆破()。\nA、掘進工作面或炮眼有突水預兆時\nB、探水孔超前距不夠時\nC、空頂距超過規定時\nD、掘進工作面支架不牢固時",
                "output": "ABCD"
            }
        ]
    },
    ...
]

若想生成其他題目型別訓練資料,請在相應位置替換成需要的內容

csv_filename = '../data/多選題.csv'
#csv_filename = '../data/單選題.csv'
#csv_filename = '../data/判斷題.csv'
#csv_filename = '../data/填空題.csv'
#csv_filename = '../data/簡答題.csv'

json_filename = '../data/multiple_choice.json'
#son_filename = '../data/single_choice.json'
#json_filename = '../data/true_or_false.json'
#json_filename = '../data/fill_in.json'
#json_filename = '../data/shot_answer.json'

 "system": "你是一個煤礦安全領域的知識達人,你會解答很多題。使用者給出一個多選題,你能從幾個選項中,選擇出多個正確選項。"
#"system": "你是一個煤礦安全領域的知識達人,你會解答很多題。使用者給出一個單選題,你能從幾個選項中,選擇出一個正確選項。"
#"system": "你是一個煤礦安全領域的知識達人,你會解答很多題。使用者給出一個判斷題,然後你作出判斷,是正確還是錯誤。"
#"system": "你是一個煤礦安全領域的知識達人,你會解答很多題。使用者給出一個填空題,然後你在題目中括號中,填寫合適的答案"
#"system": "你是一個煤礦安全領域的知識達人,你對相關煤礦安全規章規程制度、技術等文件非常熟悉。請你專業正確地解答使用者想問的煤礦安全相關問題。"

3.2.3 煤礦事故多輪對話生成

"""
""{accident}""
透過上面提供的事故調查事故報告,請你幫我生成多輪對話文字,格式為[
    {
        "conversation": [
            {
                "system": "你是一名煤礦安全領域的知識達人,提供有關煤礦安全規程、事故預防措施和應急響應的知識。",
                "input": "你好!",
                "output": "您好,我是一名煤礦安全領域的知識達人,請問有什麼可以幫助您?"
            },
            {
                "input": " ",
                "output": " "
            },...
        ]
    }
]
"""

{
        "conversation": [
            {
                "system": "你是一名煤礦安全領域的知識達人,提供有關煤礦安全規程、事故預防措施和應急響應的知識。",
                "input": "你好!",
                "output": "您好,我是一名煤礦安全領域的知識達人,請問有什麼可以幫助您?"
            },
            {
                "input": "2023年3月22日子長縣中達焦家溝煤業有限公司發生了什麼事故?",
                "output": "2023年3月22日2時56分左右,子長縣中達焦家溝煤業有限公司5309軌道順槽發生其他事故,造成1人死亡,直接經濟損失175萬元。"
            },
            {
                "input": "事故的直接原因是什麼?",
                "output": "事故的直接原因是礦井將不符合公稱壓力強度要求的管路作為瓦斯抽放管使用,在對瓦斯抽放管進行氣密性試驗的過程中瓦斯抽放管連線法蘭處漏氣,現場作業人員違反安全技術措施在瓦斯抽放管未洩壓完畢的情況下用梅花扳手緊固漏氣的法蘭螺絲,維修過程中管路受力失衡爆裂,作業人員被噴出的衝擊波擊中,導致事故發生。"
            },
            {
                "input": "事故的間接原因有哪些?",
                "output": "事故的間接原因包括:\n1. 安全生產責任落實不力,管理制度執行不嚴格。\n2. 現場安全管理差,違章冒險作業。\n3. 技術管理有漏洞,技術人員業務素質低。\n4. 安全教育培訓效果差,職工安全意識淡薄。\n5. 安全監管存在不足。"
            },
            {
                "input": "如何改進企業的安全生產責任落實?",
                "output": "改進企業的安全生產責任落實的方法包括:\n1. 明確裝置材料管理制度,確保採購把關嚴格,合同明確產品具體型號和使用範圍。\n2. 制定並落實管路使用和回收的管理制度,明確責任主體。\n3. 加強日常維護保養,確保裝置材料的安全使用。\n4. 嚴格執行《安全技術措施審批制度》等安全管理制度,確保安全生產責任落實到位。"
            },
            {
                "input": "如何加強現場安全管理,避免違章冒險作業?",
                "output": "加強現場安全管理的方法包括:\n1. 全面分析和辨識作業風險,制定詳細的安全技術措施。\n2. 確保現場作業人員嚴格遵守安全操作規程,禁止違章冒險作業。\n3. 增強現場監督管理,確保有安全員和負責人進行現場安全監督。\n4. 實現專業隊伍化,確保瓦斯抽放管路敷設和測試等工作由專業隊伍執行。"
            },
            {
                "input": "如何提高技術管理水平?",
                "output": "提高技術管理水平的方法包括:\n1. 加強安全技術規範的學習和掌握,確保技術人員瞭解相關標準和要求。\n2. 科學編制安全技術措施,選擇更安全的工藝和方法。\n3. 嚴格執行安全技術措施會審制度,確保措施科學合理。\n4. 確保作業人員嚴格執行安全技術措施,避免違章操作。\n5. 進行全面的風險分析和研判,辨識並防範可能的安全風險。"
            },
            {
                "input": "如何改進安全教育培訓效果?",
                "output": "改進安全教育培訓效果的方法包括:\n1. 制定詳細的培訓計劃,確保職工全面掌握安全技術措施。\n2. 提高培訓的實際操作性,透過實操訓練提高職工的安全意識和技能。\n3. 加強對作業環境的安全風險辨識培訓,提升職工的自保互保意識。\n4. 定期進行培訓考核,檢驗培訓效果,確保培訓內容深入人心。"
            },
            {
                "input": "如何增強安全監管力度?",
                "output": "增強安全監管力度的方法包括:\n1. 明確駐礦安檢員的職責,確保其全面掌握煤礦安全生產狀況。\n2. 加強安全監管分工,確保各項監管工作責任到人。\n3. 進行定期和不定期的安全檢查,發現並整改安全隱患。\n4. 建立健全安全監管考核制度,確保安全監管工作落實到位。"
            }
        ]
    }

使用GLM-4模型,構建煤礦事故知識圖譜。暫時不開源

  • 補充細節
  • 1.合併兩個json檔案的指令碼:merge_json.py

  • 2.格式化json文字的指令碼:format_json.py

  • 3.打亂json中資料順序的指令碼:shuffle.py

相關資料請見data目錄:安全知識的智慧問答

4. 模型微調

4.1 Internlm2微調

  • 環境配置

建立環境

conda create -n internlm2 python=3.10
conda activate internlm2
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia

環境包的安裝

cd ~
git clone -b v0.1.18 https://github.com/InternLM/XTuner
cd XTuner
pip install [-e .]
  • 下載本專案倉庫
git clone https://github.com/yaosenJ/CoalQA.git
  • 下載模型

進入finetune目錄

cd CoalQA/finetune

執行如下命令,下載internlm2-chat-7b模型引數檔案:

python download_model.py

4.2 模型微調過程詳細

本文件提供了使用 XTuner 工具進行模型微調過程的詳細指南。該過程包括轉換、合併、訓練以及為不同規模的模型(1.8B 和 20B)設定網路演示。

  • 要求
    • XTuner
    • DeepSpeed
    • Huggingface Transformers
    • 具備 SSH 和 Git 的使用許可權

4.2.1 環境安裝

#如果你是在 InternStudio 平臺,則從本地 clone 一個已有 pytorch 的環境:
#pytorch    2.0.1   py3.10_cuda11.7_cudnn8.5.0_0

studio-conda xtuner0.1.17
#如果你是在其他平臺:
#conda create --name xtuner0.1.17 python=3.10 -y

#啟用環境
conda activate xtuner0.1.17
#進入家目錄 (~的意思是 “當前使用者的home路徑”)
cd ~
#建立版本資料夾並進入,以跟隨本教程
mkdir -p /root/xtuner0117 && cd /root/xtuner0117

#拉取 0.1.17 的版本原始碼
git clone -b v0.1.17  https://github.com/InternLM/xtuner
#無法訪問github的使用者請從 gitee 拉取:
#git clone -b v0.1.15 https://gitee.com/Internlm/xtuner

#進入原始碼目錄
cd /root/xtuner0117/xtuner

#從原始碼安裝 XTuner
pip install -e '.[all]'

4.2.2 1.8B 模型訓練

  • 資料準備
#在ft這個資料夾裡再建立一個存放資料的data資料夾,儲存資料
mkdir -p /root/ft/data && cd /root/ft/data
  • 準備模型
#建立目標資料夾,確保它存在。
#-p選項意味著如果上級目錄不存在也會一併建立,且如果目標資料夾已存在則不會報錯。
mkdir -p /root/ft/model

#複製內容到目標資料夾。-r選項表示遞迴複製整個資料夾。
cp -r /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b/* /root/ft/model/

如果是需要自己下載,可以使用transformers庫

from transformers import AutoModel

#指定模型名稱
model_name = 'internlm/internlm2-chat-1_8b'

#載入模型
model = AutoModel.from_pretrained(model_name)

#指定儲存模型的目錄
model_save_path = '/root/ft/model'

#儲存模型
model.save_pretrained(model_save_path)

將這段程式碼儲存為 download_model.py,然後在命令列中執行這個指令碼:

python download_model.py

這個指令碼會自動下載模型並將其儲存到指定的 /root/ft/model 目錄中。

  • 下載配置檔案
#XTuner 提供多個開箱即用的配置檔案,使用者可以透過下列命令檢視:
#列出所有內建配置檔案
#xtuner list-cfg

#假如我們想找到 internlm2-1.8b 模型裡支援的配置檔案
xtuner list-cfg -p internlm2_1_8b

#建立一個存放 config 檔案的資料夾
mkdir -p /root/ft/config

#使用 XTuner 中的 copy-cfg 功能將 config 檔案複製到指定的位置
xtuner copy-cfg internlm2_1_8b_qlora_alpaca_e3 /root/ft/config
  • 修改配置引數
#修改模型地址(在第27行的位置)
- pretrained_model_name_or_path = 'internlm/internlm2-1_8b'
+ pretrained_model_name_or_path = '/root/ft/model'

#修改資料集地址為本地的json檔案地址(在第31行的位置)
- alpaca_en_path = 'tatsu-lab/alpaca'
+ alpaca_en_path = '/root/ft/data/personal_assistant.json'

#修改max_length來降低視訊記憶體的消耗(在第33行的位置)
- max_length = 2048
+ max_length = 1024

#減少訓練的輪數(在第44行的位置)
- max_epochs = 3
+ max_epochs = 2

#增加儲存權重檔案的總數(在第54行的位置)
- save_total_limit = 2
+ save_total_limit = 3

#修改每多少輪進行一次評估(在第57行的位置)
- evaluation_freq = 500
+ evaluation_freq = 300

#修改具體評估的問題(在第59到61行的位置)

#把 OpenAI 格式的 map_fn 載入進來(在第15行的位置)
- from xtuner.dataset.map_fns import alpaca_map_fn, template_map_fn_factory
+ from xtuner.dataset.map_fns import openai_map_fn, template_map_fn_factory

#將原本是 alpaca 的地址改為是 json 檔案的地址(在第102行的位置)
- dataset=dict(type=load_dataset, path=alpaca_en_path),
+ dataset=dict(type=load_dataset, path='json', data_files=dict(train=alpaca_en_path)),

#將 dataset_map_fn 改為通用的 OpenAI 資料集格式(在第105行的位置)
- dataset_map_fn=alpaca_map_fn,
+ dataset_map_fn=None,
  • 模型訓練
#指定儲存路徑
xtuner train /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/ft/train

#使用 deepspeed 來加速訓練
xtuner train /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/ft/train_deepspeed --deepspeed deepspeed_zero2
  • 轉換到 Huggingface 格式
  1. 建立目錄:為轉換後的 Huggingface 模型建立一個儲存目錄:

    mkdir -p /root/ft/huggingface/i8000
    
  2. 模型轉換:使用提供的配置和權重檔案進行模型轉換:

    xtuner convert pth_to_hf /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py /root/ft/train_deepspeed/iter_18000.pth /root/ft/huggingface/i8000 --fp32
    
  3. 合併模型:合併模型並解決依賴關係:

    mkdir -p /root/ft/final_model_8000
    export MKL_SERVICE_FORCE_INTEL=1
    xtuner convert merge /root/ft/model /root/ft/huggingface/1i8000 /root/ft/final_model_18000
    
  4. 測試模型:透過啟動對話來測試模型:

    xtuner chat /root/ft/final_model_18000 --prompt-template internlm2_chat
    
  • 模型續訓
xtuner train /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/ft/train_deepspeed --resume /root/ft/train_deepspeed/iter_8500.pth  --deepspeed deepspeed_zero1
  • 網路演示設定
  1. 準備環境

    mkdir -p /root/ft/web_demo && cd /root/ft/web_demo
    git clone https://github.com/InternLM/InternLM.git
    cd /root/ft/web_demo/InternLM
    
  2. 執行演示 使用 Streamlit:

    streamlit run /root/ft/web_demo/InternLM/chat/web_demo.py --server.address 127.0.0.1 --server.port 6006
    
  3. 透過 SSH 隧道訪問演示

    ssh -CNg -L 6006:127.0.0.1:6006 root@ssh.intern-ai.org.cn -p 開發機埠號
    

4.2.3. 20B 模型訓練

與1.8B模型訓練過程類似,20B模型訓練涉及到為配置、資料和最終模型建立相應的目錄。此外,這一過程還包括使用多個GPU進行模型訓練,並將模型轉換為Huggingface格式。

  • 資料準備

為大規模的20B模型訓練準備資料。

#建立一個專用於存放20B模型資料的目錄
mkdir -p /root/ft20b/data && cd /root/ft20b/data
  • 準備模型

準備模型包括建立目標資料夾並將預訓練的20B模型複製到指定位置。

#建立一個目錄用來存放20B模型檔案
mkdir -p /root/ft20b/model

#將預訓練的模型複製到新建立的目錄中
cp -r /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-20b/* /root/ft20b/model/
  • 下載配置檔案

下載並準備20B模型的配置檔案,以便進行訓練。

#列出所有支援20B模型的配置檔案
xtuner list-cfg -p internlm2_20b

#建立一個目錄用於存放20B模型的配置檔案
mkdir -p /root/ft20b/config

#複製所需的配置檔案到新建立的目錄中
xtuner copy-cfg internlm2_20b_qlora_alpaca_e3 /root/ft20b/config
  • 修改配置引數

根據訓練需求調整配置檔案,以最佳化20B模型的訓練。

#修改模型路徑和資料集路徑等關鍵引數以適配20B模型
- pretrained_model_name_or_path = 'internlm/internlm2-20b'
+ pretrained_model_name_or_path = '/root/ft20b/model'

- alpaca_en_path = 'tatsu-lab/alpaca'
+ alpaca_en_path = '/root/ft20b/data/specific_dataset.json'

- max_length = 2048
+ max_length = 1024

- max_epochs = 3
+ max_epochs = 2

- save_total_limit = 2
+ save_total_limit = 3

- evaluation_freq = 500
+ evaluation_freq = 300
  • 模型訓練

使用DeepSpeed和多GPU配置來加速20B模型的訓練過程。

#指定儲存路徑並開始訓練
xtuner train /root/ft20b/config/internlm2_20b_qlora_alpaca_e3_copy.py --work-dir /root/ft20b/train_deepspeed --deepspeed deepspeed_zero2
  • 轉換到 Huggingface 格式

為轉換後的Huggingface模型建立目錄並執行轉換。

#建立一個目錄用於存放轉換後的Huggingface模型
mkdir -p /root/ft20b/huggingface

#執行模型轉換
xtuner convert pth_to_hf /root/ft20b/config/internlm2_20b_qlora_alpaca_e3_copy.py /root/ft20b/train_deepspeed/iter_2600.pth /root/ft20b/huggingface
  • 2.7 模型合併

合併轉換後的模型並解決依賴關係。

#建立一個名為final_model的目錄以儲存合併後的模型檔案
mkdir -p /root/ft20b/final_model

#合併模型
xtuner convert merge /root/ft20b/model /root/ft20b/huggingface /root/ft20b/final_model
  • 測試模型

透過啟動對話來測試合併後的模型。

#啟動與模型的對話測試
xtuner chat /root/ft20b/final_model --prompt-template

 internlm2_chat

這一部分提供了詳細的指導,確保20B模型的訓練過程得到妥善管理和執行。

4.2.4 微調20b配置樣例

max_length = 4096
pack_to_max_length = True

#parallel
sequence_parallel_size = 1

#Scheduler & Optimizer
batch_size = 4  # per_device
accumulative_counts = 16
accumulative_counts *= sequence_parallel_size
dataloader_num_workers = 0
max_epochs = 50

=》

+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.54.03              Driver Version: 535.54.03    CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA A100-SXM4-80GB          On  | 00000000:89:00.0 Off |                    0 |
| N/A   65C    P0             334W / 400W |  59119MiB / 81920MiB |    100%      Default |
|                                         |                      |             Disabled |
+-----------------------------------------+----------------------+----------------------+
|   1  NVIDIA A100-SXM4-80GB          On  | 00000000:B3:00.0 Off |                    0 |
| N/A   66C    P0             358W / 400W |  59119MiB / 81920MiB |    100%      Default |
|                                         |                      |             Disabled |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
+---------------------------------------------------------------------------------------+

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 環境搭建:

git clone https://github.com/yaosenJ/CoalQA.git
cd rag
pip install -r requirements.txt

5.3 本地資料集向量化

PDF 資料

將需要向量化的pdf資料放到對應的目錄下

JSON 資料

構建 QA 對並生成 JSON 檔案(單輪/多輪對話),放入到對應目錄下

資料格式如下

#單輪對話
{
  "conversation": [
      {
          "system": "你是一個煤礦安全領域的知識達人,你會解答很多題。使用者給出一個判斷題,然後你作出判斷,是正確還是錯誤。",
          "input": "國家對在改善安全生產條件、防止生產安全事故、參加搶險救護等方面取得顯著成績的單位給予獎勵;個人給予鼓勵。",
          "output": "錯誤"
      }
  ]
},
#多輪對話
{
  "conversation": [
      {
          "system": "你是一名煤礦安全領域的知識達人,提供有關煤礦安全規程、事故預防措施和應急響應的知識。",
          "input": "你好!",
          "output": "您好,我是一名煤礦安全領域的知識達人,請問有什麼可以幫助您?"
      },
      {
          "input": "2022年9月11日晉能控股集團山西三元煤業股份有限公司下霍煤礦井下無軌膠輪車大巷車場發生了什麼事故?",
          "output": "2022年9月11日,晉能控股集團山西三元煤業股份有限公司下霍煤礦井下無軌膠輪車大巷車場發生了一起運輸事故,造成1人死亡。"
      },
      {
          "input": "請告訴我這起事故的直接原因是什麼?",
          "output": "事故直接原因是井下進行裝置換裝作業時,機電機運隊跟班副隊長池晶晶在未採取並確認有效防倒措施的情況下,違章指揮並參與卸車作業,且其本人處在豎裝裝置傾倒危險區域內,被突然傾倒的端頭支架前梁和側護板砸壓受傷致死。"
      },
      {
          "input": "那麼,這起事故的間接原因有哪些?",
          "output": "事故間接原因包括現場監督管理嚴重缺失、規程措施審批把關不嚴、職工安全風險意識淡薄、上級主體企業責任落實不到位、地方安全監管部門監管不到位。"
      },
      {
          "input": "為了避免類似事故,煤礦企業應該採取哪些措施?",
          "output": "為了避免類似事故,煤礦企業應嚴格執行安全規程,加強現場安全管理,確保安全技術措施到位,強化安全風險研判,建立完善的安全技術管理體系,落實安全生產主體責任,加強安全教育培訓,提高職工安全意識和風險辨識能力,同時加強安全監管,確保監管工作細緻認真。"
      },
      {
          "input": "感謝您的詳細解答!",
          "output": "不客氣,很高興能幫助到您。如果您還有其他問題,歡迎繼續提問。"
      }
  ]
},

5.4 構建向量資料庫

  • 1.配置檔案修改

根據需要改寫 config.config 檔案:

#llm存放位置
model_dir = os.path.join(base_dir, 'model')   

#向量化模型路徑以及模型名稱
embedding_path = os.path.join(model_dir, 'embedding_model')         # embedding
embedding_model_name = 'BAAI/bge-small-zh-v1.5'

#精排模型路徑以及模型名稱
rerank_path = os.path.join(model_dir, 'rerank_model')  	        	  # embedding
rerank_model_name = 'BAAI/bge-reranker-large'

#召回documents數量
retrieval_num = 3

#精排後最終選擇留下的documents數量
select_num = 3

prompt_template = """
    你是一個樂於助人的問答代理人。\n
    你的任務是分析並綜合檢索回來的資訊,從而提供有意義且高效的答案。
	{content}
	問題:{query}
"""
  • 2.本地呼叫

執行構建本地知識庫指令碼

python data_generate.py

向量化主要步驟如下:

  • 載入pdf資料集並提取文字

  • 利用RecursiveCharacterTextSplitter按照一定塊的大小以及塊之間的重疊大小對文字進行分割。

  • 載入 BAAI/bge-small-en-v1.5 模型

  • 根據文件集構建FAISS索引(即高效能向量資料庫)

5.5 相關文字召回與精排

利用faiss找出與使用者輸入的問題最相關的文件,然後將召回出來的文字與使用者原始輸入拼接輸入給llm。檢索程式碼如下:

def get_retrieval_content(self, querys) -> str:
        """
            Input: 使用者提問, 是否需要rerank
            ouput: 檢索後的內容        
        """
        #print(querys)
        output = []
        content = []
        for query in querys:
            
            documents = self.vectorstores.similarity_search(query, k=self.retrieval_num)
            
            for doc in documents:
                content.append(doc.page_content)
            logger.info(f'Contexts length:{len(content)}')
            if self.rerank_flag:
                model = self.data_processing_obj.load_rerank_model()
                documents = self.data_processing_obj.rerank(model, query, content, self.select_num)

                for doc in documents:
                    output.append(doc)
                logger.info(f'Selected contexts length:{len(output)}')
                logger.info(f'Selected contexts: {output}')
            else:
                logger.info(f'Selected contexts: {content}')
        return output if self.rerank_flag else content

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應用
   cd CoalQA
   conda create -n CoalQA python=3.10.0 -y
   conda activate CoalQA
   conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia
   pip install -r requirements.txt
   cd web_app
   streamlit run streamlit_app.py --server.address=127.0.0.1 --server.port 6006

6.2 openxlab部署:

直接使用pytorch原生載入streamlit應用

streamlit run app.py --server.address=127.0.0.1 --server.port 6006
  • 登陸 OpenXLab,建立 Streamlit 應用

  • 選擇配置,建立應用,如果需要更多的硬體資源,在這裡進行申請

6.3 基於LMDeploy的量化部署:

  • LMDeploy簡介

LMDeploy 由 MMDeployMMRazor 團隊聯合開發,是涵蓋了 LLM 任務的全套輕量化、部署和服務解決方案。 這個強大的工具箱提供以下核心功能:

  • 高效推理:LMDeploy 透過引入持久批處理(又稱連續批處理)、阻塞式 KV 快取、動態拆分與融合、張量並行、高效能 CUDA 核心等關鍵功能,將請求吞吐量提高到 vLLM 的 1.8 倍。

  • 有效量化:LMDeploy 支援只加權量化和 k/v 量化,4 位推理效能是 FP16 的 2.4 倍。量化質量已透過 OpenCompass 評估確認。

  • 輕鬆分發伺服器:利用請求分發服務,LMDeploy 可在多臺機器和卡上輕鬆高效地部署多模型服務。

  • 互動式推理模式:透過快取多輪對話過程中的關注度 k/v,引擎可記住對話歷史,從而避免重複處理歷史會話。

6.3.1 環境安裝

pip安裝:

pip install lmdeploy

自 v0.3.0 起,預設預編譯包在 CUDA 12 上編譯。不過,如果需要 CUDA 11+,可以透過以下方式安裝 lmdeploy:

export LMDEPLOY_VERSION=0.3.0
export PYTHON_VERSION=38
pip install https://github.com/InternLM/lmdeploy/releases/download/v${LMDEPLOY_VERSION}/lmdeploy-${LMDEPLOY_VERSION}+cu118-cp${PYTHON_VERSION}-cp${PYTHON_VERSION}-manylinux2014_x86_64.whl --extra-index-url https://download.pytorch.org/whl/cu118

6.3.2 使用LMDeploy與模型對話

使用LMDeploy與模型進行對話,可以執行如下命令執行下載的1.8B模型

lmdeploy chat /group_share/internlm2_chat_1_8b_qlora_18000

6.3.3 LMDeploy模型量化(lite)

  • 設定最大KV Cache快取大小

透過 --cache-max-entry-count引數,控制KV快取佔用剩餘視訊記憶體的最大比例為0.5

lmdeploy chat /group_share/internlm2_chat_1_8b_qlora_18000 --cache-max-entry-count 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 系列

執行前,首先安裝一個依賴庫。

pip install einops==0.7.0

僅需執行一條命令,就可以完成模型量化工作。

lmdeploy lite auto_awq \
   /group_share/internlm2_chat_1_8b_qlora_18000  \
  --calib-dataset 'ptb' \
  --calib-samples 128 \
  --calib-seqlen 1024 \
  --w-bits 4 \
  --w-group-size 128 \
  --work-dir /group_share/internlm2_chat_1_8b_qlora_18000-4bit

6.3.4 LMDeploy服務(serve)

透過以下lmdeploy命令啟動API伺服器,推理模型:

lmdeploy serve api_server \
    /group_share/internlm2_chat_1_8b_qlora_18000-4bit \
    --model-format hf \
    --quant-policy 0 \
    --server-name 0.0.0.0 \
    --server-port 23333 \
    --tp 1

即可以得到FastAPI的介面

7.案例展示

專案程式碼:

安全知識的智慧問答-安全大模型

更多優質內容請關注公號:汀丶人工智慧;會提供一些相關的資源和優質文章,免費獲取閱讀。

  • 參考連結

  • BGE Github

    • BAAI/bge-small-en-v1.5: embedding 模型,用於構建 vector DB

    • BAAI/bge-reranker-large: rerank 模型,用於對檢索回來的文章段落重排

  • InternLM2

    • Chat-1.8B模型

    • Chat-7B模型

    • Math-7B模型

    • Chat-20B模型

  • LangChain

    • 文件

    • Github 倉庫

  • FAISS

    • 文件

    • Github 倉庫

相關文章