還在用BERT做文本分類?分享一套基于預訓練模型ERNIR3.0的文本多分類全流程實例【文本分類】_ernir 文本分類-CSDN博客
/usr/bin/python3 -m pip install --upgrade pip
python3-c"import platform;print(platform.architecture()[0]);print(platform.machine())"
python3 -m pip install paddlepaddle==2.5.2 -i https://mirror.baidu.com/pypi/simple??
python3 -m? pip install --upgrade paddlenlp -i https://mirror.baidu.com/pypi/simple
echo 'export PATH="/usr/local/python3/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
pip3 install --upgrade paddlenlp -i https://mirror.baidu.com/pypi/simple
echo 'export PATH="/usr/local/python3/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
pip3 install scikit-learn==1.0.2
3.2 文心ERNIE系列模型介紹
?????最新開源ERNIE 3.0系列預訓練模型:
- 110M參數通用模型ERNIE 3.0 Base
- 280M參數重量級通用模型ERNIE 3.0 XBase
- 74M輕量級通用模型ERNIE 3.0 Medium
文檔鏈接: https://github.com/PaddlePaddle/ERNIE
ERNIE模型匯總
ERNIE模型匯總
3.3 預訓練模型加載
PaddleNLP內置了ERNIE、BERT、RoBERTa、Electra等40多個的預訓練模型,并且內置了各種預訓練模型對于不同下游任務的Fine-tune網絡。用戶可以使用PaddleNLP提供的模型,完成問答、序列分類、token分類等任務。
這里以ERNIE 3.0模型為例,介紹如何將預訓練模型Fine-tune完成文本分類任務。
PaddleNLP采用AutoModelForSequenceClassification,AutoTokenizer提供了簡單易用的接口,可以用過from_pretrained() 方法來加載不同的預訓練模型,在輸出層上疊加一層線性層,且相應預訓練模型權重下載速度快、穩定。
下面以ERNIE 3.0中文base模型為基礎,演示如何添加預訓練語言模型和分詞器:
-------------------------------------------------------------------------------------------------------------------------
sudo yum install git
git clone https://github.com/PaddlePaddle/PaddleNLP.git
pip3 install --upgrade paddlenlp
pip install paddlepaddle
參考:
PaddleNLP/applications/text_classification at develop · PaddlePaddle/PaddleNLP · GitHub
如何選擇合適的方案和預訓練模型、數據標注質量差、效果調優困難、AI入門成本高、如何高效訓練部署等問題使部分開發者望而卻步
文本分類應用針對多分類、多標簽、層次分類等高頻場景開源了產業級分類應用方案,打通數據標注-模型訓練-模型調優-模型壓縮-預測部署全流程,旨在解決細分場景應用的痛點和難點,快速實現文本分類產品落地。
- 方案全面🎓:?涵蓋多分類、多標簽、層次分類等高頻分類場景,提供預訓練模型微調、提示學習(小樣本學習)、語義索引三種端到端全流程分類方案,滿足開發者多樣文本分類落地需求。
- 高效調優?:?文本分類應用依托TrustAI可信增強能力和數據增強API,提供模型分析模塊助力開發者實現模型分析,并提供稀疏數據篩選、臟數據清洗、數據增強等多種解決方案。
2.1 文本分類方案全覆蓋
文本分類應用涵蓋多分類(multi class)、多標簽(multi label)、層次分類(hierarchical)三種場景
多分類🚶:?數據集的標簽集含有兩個或兩個以上的類別,所有輸入句子/文本有且只有一個標簽。在文本多分類場景中,我們需要預測輸入句子/文本最可能來自?n
?個標簽類別中的哪一個類別。以上圖多分類中新聞文本為例,該新聞文本的標簽為?娛樂
。
二分類/多分類數據集的標簽集含有兩個或兩個以上的類別,所有輸入句子/文本有且只有一個標簽。在文本多分類場景中,我們需要預測輸入句子/文本最可能來自?n
?個標簽類別中的哪一個類別。在本項目中二分類任務被視為多分類任務中標簽集包含兩個類別的情況,以下統一稱為多分類任務。。多分類任務在商品分類、網頁標簽、新聞分類、醫療文本分類等各種現實場景中具有廣泛的適用性。
問題 ---- lable --- {新聞,娛樂}
問題? ? ? ?lable? ? ? ?分類
-------------------------------
多分類數據標注-模型訓練-模型分析-模型壓縮-預測部署流程圖
接下來我們將以CBLUE公開數據集KUAKE-QIC任務為示例,演示多分類全流程方案使用。下載數據集:
wget https://paddlenlp.bj.bcebos.com/datasets/KUAKE_QIC.tar.gz
tar -zxvf KUAKE_QIC.tar.gz
mv KUAKE_QIC data rm -rf KUAKE_QIC.tar.gz
訓練需要準備指定格式的本地數據集,如果沒有已標注的數據集,可以參考文本分類任務doccano數據標注使用指南進行文本分類數據標注。指定格式本地數據集目錄結構:
訓練、開發、測試數據集?文件中文本與標簽類別名用tab符'\t'
分隔開,文本中避免出現tab符'\t'
。
2.4 模型訓練
推薦使用 Trainer API 對模型進行微調。只需輸入模型、數據集等就可以使用 Trainer API 高效快速地進行預訓練、微調和模型壓縮等任務,可以一鍵啟動多卡訓練、混合精度訓練、梯度累積、斷點重啟、日志顯示等功能,Trainer API 還針對訓練過程的通用訓練配置做了封裝,比如:優化器、學習率調度等。
2.4.1 預訓練模型微調
https://github.com/PaddlePaddle/PaddleNLP/blob/develop/applications/text_classification/multi_class/README.md
使用CPU訓練只需將設備參數配置改為--device cpu
,可以使用--device gpu:0
指定GPU卡號:
python3 train.py --do_train --do_eval --do_export --model_name_or_path ernie-3.0-tiny-medium-v2-zh --output_dir checkpoint --device cpu --num_train_epochs 100 --early_stopping True --early_stopping_patience 5 --learning_rate 3e-5 --max_length 128 --per_device_eval_batch_size 32 --per_device_train_batch_size 32 --metric_for_best_model accuracy --load_best_model_at_end --logging_steps 5 --evaluation_strategy epoch --save_strategy epoch --save_total_limit 1
python3 train.py --do_train --do_eval --do_export --model_name_or_path ernie-3.0-tiny-medium-v2-zh --output_dir checkpoint --device gpu:0?--early_stopping True --early_stopping_patience 5 --learning_rate 3e-5 --max_length 128 --per_device_eval_batch_size 32 --per_device_train_batch_size 32 --metric_for_best_model accuracy --load_best_model_at_end --logging_steps 5 --evaluation_strategy epoch --save_strategy epoch --save_total_limit 1
train
paddle.device.set_device('cpu') ?
找個gpu的服務
https://aistudio.baidu.com/bd-cpu-01/user/7541663/7506482/lab
conda install cudatoolkit=10.2
參考:安裝paddlepadddle-gpu的正確方式_please use paddlepaddle with gpu version-CSDN博客
python -m pip install paddlepaddle-gpu==2.5.2.post102 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
?python -m pip install paddlepaddle-gpu==2.5.2.post102 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
這個是好事gpu的,
find . -name "libcudart.so.10.2"
參考:https://blog.csdn.net/weixin_45742602/article/details/129386113
成功的命令:
python3 train.py --do_train --do_eval --do_export --model_name_or_path ernie-3.0-tiny-medium-v2-zh --output_dir checkpoint --device gpu:0?--early_stopping True --early_stopping_patience 5 --learning_rate 3e-5 --max_length 128 --per_device_eval_batch_size 32 --per_device_train_batch_size 32 --metric_for_best_model accuracy --load_best_model_at_end --logging_steps 5 --evaluation_strategy epoch --save_strategy epoch --save_total_limit 1
python3 train.py --do_train --do_eval --do_export --model_name_or_path ernie-3.0-tiny-medium-v2-zh --output_dir checkpoint --device gpu:0 --early_stopping_patience 5 --learning_rate 3e-5 --max_length 128 --per_device_eval_batch_size 16 --per_device_train_batch_size 16 --metric_for_best_model accuracy --load_best_model_at_end --logging_steps 5 --evaluation_strategy epoch --save_strategy epoch --save_total_limit 1
python3 train.py --do_train --do_eval --do_export --model_name_or_path ernie-3.0-tiny-medium-v2-zh --output_dir checkpoint --device gpu:0 --early_stopping_patience 5 --learning_rate 3e-5 --max_length 128 --metric_for_best_model accuracy --load_best_model_at_end --logging_steps 5 --evaluation_strategy epoch --save_strategy epoch --save_total_limit 1
終于跑成功了? 要吐血了。。。!
nvidia-smi
命令查看GPU使用情況:
主要的配置的參數為:
do_train
: 是否進行訓練。do_eval
: 是否進行評估。debug
: 與do_eval
配合使用,是否開啟debug模型,對每一個類別進行評估。do_export
: 訓練結束后是否導出靜態圖。do_compress
: 訓練結束后是否進行模型裁剪。model_name_or_path
: 內置模型名,或者模型參數配置目錄路徑。默認為ernie-3.0-tiny-medium-v2-zh
。output_dir
: 模型參數、訓練日志和靜態圖導出的保存目錄。device
: 使用的設備,默認為gpu
。num_train_epochs
: 訓練輪次,使用早停法時可以選擇100。early_stopping
: 是否使用早停法,也即一定輪次后評估指標不再增長則停止訓練。early_stopping_patience
: 在設定的早停訓練輪次內,模型在開發集上表現不再上升,訓練終止;默認為4。learning_rate
: 預訓練語言模型參數基礎學習率大小,將與learning rate scheduler產生的值相乘作為當前學習率。max_length
: 最大句子長度,超過該長度的文本將被截斷,不足的以Pad補全。提示文本不會被截斷。per_device_train_batch_size
: 每次訓練每張卡上的樣本數量。可根據實際GPU顯存適當調小/調大此配置。per_device_eval_batch_size
: 每次評估每張卡上的樣本數量。可根據實際GPU顯存適當調小/調大此配置。max_length
: 最大句子長度,超過該長度的文本將被截斷,不足的以Pad補全。提示文本不會被截斷。train_path
: 訓練集路徑,默認為"./data/train.txt"。dev_path
: 開發集集路徑,默認為"./data/dev.txt"。test_path
: 測試集路徑,默認為"./data/dev.txt"。label_path
: 標簽路徑,默認為"./data/label.txt"。bad_case_path
: 錯誤樣本保存路徑,默認為"./data/bad_case.txt"。width_mult_list
:裁剪寬度(multi head)保留的比例列表,表示對self_attention中的?q
、k
、v
?以及?ffn
?權重寬度的保留比例,保留比例乘以寬度(multi haed數量)應為整數;默認是None。 訓練腳本支持所有TrainingArguments
的參數,更多參數介紹可參考
https://github.com/PaddlePaddle/PaddleNLP/blob/develop/applications/text_classification/multi_class/README.md
程序運行時將會自動進行訓練,評估。同時訓練過程中會自動保存開發集上最佳模型在指定的?output_dir
?中,保存模型文件結構如下所示:
- 中文訓練任務(文本支持含部分英文)推薦使用"ernie-1.0-large-zh-cw"、"ernie-3.0-tiny-base-v2-zh"、"ernie-3.0-tiny-medium-v2-zh"、"ernie-3.0-tiny-micro-v2-zh"、"ernie-3.0-tiny-mini-v2-zh"、"ernie-3.0-tiny-nano-v2-zh"、"ernie-3.0-tiny-pico-v2-zh"。
2.4.2 訓練評估
訓練后的模型我們可以開啟debug
模式,對每個類別分別進行評估,并打印錯誤預測樣本保存在bad_case.txt
。
python train.py \
? ? --do_eval \
? ? --debug True \
? ? --device gpu \
? ? --model_name_or_path checkpoint \
? ? --output_dir checkpoint \
? ? --per_device_eval_batch_size 32 \
? ? --max_length 128 \
? ? --test_path './data/dev.txt'
python train.py --do_eval --debug --device gpu:0 --model_name_or_path checkpoint --output_dir checkpoint --per_device_eval_batch_size 32 --max_length 128 --test_path './data/dev.txt'
文本分類預測過程中常會遇到諸如"模型為什么會預測出錯誤的結果","如何提升模型的表現"等問題。Analysis模塊?提供了可解釋性分析、數據優化等功能,旨在幫助開發者更好地分析文本分類模型預測結果和對模型效果進行優化。
2.4.3 模型裁剪(可選)
如果有模型部署上線的需求,需要進一步壓縮模型體積,可以使用 PaddleNLP 的?壓縮API, 一行命令即可啟動模型裁剪。
pip install paddleslim==2.4.1
python train.py \--do_compress \--device gpu \--model_name_or_path checkpoint \--output_dir checkpoint/prune \--learning_rate 3e-5 \--per_device_train_batch_size 32 \--per_device_eval_batch_size 32 \--num_train_epochs 1 \--max_length 128 \--logging_steps 5 \--save_steps 100 \--width_mult_list '3/4' '2/3' '1/2'
還是沒有成功。。。
?nvcc -V
https://gitee.com/paddlepaddle/PaddleSlim
還是有問題? 尚未解決
2.5 模型預測
可配置參數說明
task_path
:自定義任務路徑,默認為None。is_static_model
:task_path中是否為靜態圖模型參數,默認為False。max_length
:最長輸入長度,包括所有標簽的長度,默認為512。batch_size
:批處理大小,請結合機器情況進行調整,默認為1。id2label
:標簽映射字典,如果task_path
中包含id2label.json或加載動態圖參數無需定義。precision
:選擇模型精度,默認為fp32
,可選有fp16
和fp32
。fp16
推理速度更快。如果選擇fp16
,請先確保機器正確安裝NVIDIA相關驅動和基礎軟件,確保CUDA>=11.2,cuDNN>=8.1.1,初次使用需按照提示安裝相關依賴。
用這個服務器即可,環境已搭建好了:
ERNIE 3.0_體驗1 (baidu.com)
2.6 模型效果
在線服務化部署搭建請參考: