模型下载
在你要工作的目录,按住shift
,点击鼠标右键,打开powerShell
,克隆项目
git clone https://www.modelscope.cn/tiansz/text_classification.git
环境准备
其实在windows上,还是比较简单,根据教程下载几个软件安装就行了
参考教程
模型地址 https://modelscope.cn/models/tiansz/text_classification
没有可用的显卡?
这里有个显卡的问题,如果没有找到显卡,可以参考此教程 https://blog.csdn.net/banlanggen1111/article/details/130566778
数据准备
我准备了五个TXT分类,垃圾信息:广告.txt
,正常聊天:其它.txt
,不太确定/软广:软广.txt
,许愿.txt
,业务.txt
分别丢进去已经第一次清洗过的数据,并且进行人工检查一遍
数据清洗
在拿到一份数据时,需要将数据集中的重复数据剔除,同时删除没有意义的句子,例如纯英文或者纯数字的句子。
python process/clean.py --origin_path datasets/msgcate/未清洗数据.csv --clean_path datasets/msgcate/已清洗数据.csv
因为我已经提前根据分类创建了不同的文件,所以这里应该依次
python process/clean.py --origin_path datasets/msgcate/待清洗_广告.csv --clean_path datasets/msgcate/已清洗_广告.csv
python process/clean.py --origin_path datasets/msgcate/待清洗_其它.csv --clean_path datasets/msgcate/已清洗_其它.csv
python process/clean.py --origin_path datasets/msgcate/待清洗_软广.csv --clean_path datasets/msgcate/已清洗_软广.csv
python process/clean.py --origin_path datasets/msgcate/待清洗_许愿.csv --clean_path datasets/msgcate/已清洗_许愿.csv
python process/clean.py --origin_path datasets/msgcate/待清洗_业务.csv --clean_path datasets/msgcate/已清洗_业务.csv
清洗编码错误
如果遇到清洗的时候提示编码错误,经过测试,可以先新建一个表格文件,然后把内容粘贴进去,保存为待清洗_其它.csv
格式的文件,再用记事本打开待清洗_其它.csv
文件,另存为的时候,选择UTF8的格式覆盖保存就OK了
语料库
我的理解是,把待清洗的几个文件的内容,合并到语料库.txt
增量预训练
目前分类效果较好的模型都是预训练模型,它们会在大量数据训练出一个模型,然后再用这个模型用于分类任务。听起来可能复杂,但总之我们会用该模型来学习句子之间的语义,让模型懂得句子之间的区别。因此我们会用预训练模型再在我们自己的数据上进行增量预训练,用于提升模型的效果。
python process/preprocess.py --corpus_path datasets/msgcate/语料库.txt --dataset_path datasets/msgcate/dataset.pt
python pretrain.py --dataset_path datasets/msgcate/dataset.pt --pretrained_model_path models/roberta_wwm_base/pretrain_model.bin --output_model_path models/new_pretrain_model.bin --world_size 1 --gpu_ranks 0 --total_steps 100 --save_checkpoint_steps 100 --batch_size 32 --data_processor mlm --target mlm
模型微调
首先需要将数据拆分成训练集和开发集,其中训练集就是模型需要学习的数据了,而开发集就是让模型在开发集来验证当前的拟合效果,所以开发集有时也称为验证集。如果以往接触过相关知识的同学可能要问我为什么不设置测试集,这是因为测试集虽然确实能判断当前模型是否存在过拟合的情况,但由于测试集比较小,所以也无法覆盖所有应用场景,因此不再划分测试集。
新建一个表格文件,按照下方的格式进行整理,然后另存为csv,再用记事本转换成UTF8格式
text_a,label
内容,分类名
成功后执行代码进行模型微调
python process/split.py --label_path datasets/msgcate/已分类数据.csv --train_path datasets/msgcate/train.tsv --dev_path datasets/msgcate/dev.tsv --label2id_path datasets/msgcate/label2id.json --id2label_path datasets/msgcate/id2label.json
得到拆分的数据后我们终于可以来训练分类模型了
python finetune.py --pretrained_model_path models/new_pretrain_model.bin --train_path datasets/msgcate/train.tsv --dev_path datasets/msgcate/dev.tsv --epochs_num 50 --batch_size 32
模型推理
我们在训练完模型后,还需要不断地迭代模型,所以需要在大量的未标注数据上进行推理。同时在推理完之后需要对推理后的数据重新进行标注,用以提升模型的准确率和泛化性。
python inference.py --load_model_path models/finetune_model.bin --test_path datasets/msgcate/test_nolabel.tsv --prediction_path datasets/msgcate/prediction.tsv --labels_num 5 --batch_size 32
这一步直接执行会提示test_nolabel.tsv
文件找不到,那么我是把已分类的数据,去掉第二列,然后保存为test_nolabel.tsv
,再之上上面的代码就OK
不过最终得到的推理结果是保存在 tsv 格式的文件中,为了更方便标注,后续需要将推理结果转换为 xlsx 文件
python process/merge.py --test_path datasets/msgcate/test_nolabel.tsv --prediction_path datasets/msgcate/prediction.tsv --mapping_path datasets/msgcate/label2id.json --merge_path datasets/msgcate/合并语料.xlsx
部署模型
模型文件部署
将models
文件夹上传到服务器,目录为/text/models/
我这里因为买的服务器系统只有CentOs 8 ,都是默认安装的python3.6,安装python3.7以上版本很麻烦,所以是先在本地测试,用内网穿透跑起来
启动脚本代码
python的运行文件代码,在/text/
目录保存文件,名称为app.py
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import AutoModelForSequenceClassification, AutoTokenizer, pipeline
# 加载模型和分词器
model_path = "models/classification_model_q" # 你的模型路径
model = AutoModelForSequenceClassification.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 创建 FastAPI 应用
app = FastAPI()
# 创建 pipeline
pipe = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)
# 定义一个数据模型用于验证请求体
class TextItem(BaseModel):
text: str
# 定义一个 API 端点,接收文本并返回情感分析结果
@app.post("/sentiment-analysis/")
async def sentiment_analysis(item: TextItem):
result = pipe(item.text)[0]
return {"text": item.text, "label": result['label'], "score": result['score']}
# 定义一个健康检查的 API 端点
@app.get("/health/")
async def health_check():
return {"status": "healthy"}
Python安装版本
需要安装3.7或以上版本的python
依赖环境安装
- 安装
PyTorch库
pip install torch torchvision
当遇到 pip: command not found 错误时,这通常意味着 pip 未被正确安装或未添加到系统的环境变量中。
对于 CentOS Stream 8 系统,您可以执行以下命令:sudo yum install python3-pip
安装完成后,再次尝试执行 pip install torch torchvision 命令经过实战,发现低版本的CentOs安装依赖的时候问题相当多,我在一个CentOs Stream 9 系统上面比较顺畅。
- 安装
transformers
,不然会报错ModuleNotFoundError: No module named 'transformers'
pip install transformers
- 需要在服务器安装
fastapi
,查了下资料,相比Flask
并发和性能好一些
pip install fastapi
运行fastapi
安装完之后,运行脚本的代码
uvicorn app:app --reload
或者,可以指定host
和端口
uvicorn app:app --host 0.0.0.0 --port 8000
PHP实例
public function analyzeSentiment(text) {url = "http://domain/sentiment-analysis/";
data = [
"text" =>text
];
options = [
'http' => [
'header' => "Content-type: application/json\r\n",
'method' => 'POST',
'content' => json_encode(data),
],
];
context = stream_context_create(options);
result = file_get_contents(url, false, context);
if (result === false) {
echo "Request failed.";
} else {
response = json_decode(result, true);
if (isset(response['error'])) {
echo "Request failed with status".response['status'];
echo "Error details: " . response['message'];
return false;
} else {
echo "Sentiment analysis result: ";
print_r(response);
return response;
}
}eTime = time();
echo "\n耗时:" . eTime -sTime;
}
Ubuntu系统说明
如果在Ubuntu系统安装,则有注意事项
通过 pip 命令安装 transformers 和 fastapi 等python包时,系统会报错安全问题,则需要创建并使用虚拟环境。
安装venv&full
首先,确保你已经安装了python3-venv和python3-full。你可以通过运行sudo apt install python3-venv python3-full来安装它们
创建虚拟环境
- 通过
python3 -m venv myenv
来创建一个虚拟环境,其中myenv
这里myenv是虚拟环境的名称,你可以根据需要更改它。
激活虚拟环境
- 激活虚拟环境。在终端中,运行以下命令来激活虚拟环境(根据你的shell类型,命令可能略有不同):
source myenv/bin/activate # 对于bash或zsh
# 或者
myenv\Scripts\activate # 如果你使用的是Windows的cmd