如何配置Azure ML的score.py文件以部署BERT+CatBoost文本分类模型?
修复Azure ML部署中的score.py脚本(文本分类:预处理+BERT编码+CatBoost)
问题根源
你的现有score.py仅加载了CatBoost模型,但完全缺失了模型流程中的文本预处理和BERT编码步骤——CatBoost模型接收的是BERT生成的向量,而非原始文本,直接传入原始文本必然导致预测失败。
解决方案步骤
1. 配置部署依赖环境
创建requirements.txt文件,确保部署环境安装所有必需依赖:
azureml-defaults catboost joblib numpy transformers==4.30.0 # 匹配你训练时使用的transformers版本 torch==2.0.0 # 对应BERT模型的PyTorch版本
2. 修改score.py脚本
需在脚本中集成预处理、BERT编码逻辑,同时加载所有模型组件(BERT tokenizer、BERT模型、CatBoost分类器)。注意:若你使用自定义/微调后的BERT模型,需将其tokenizer文件和权重与CatBoost模型一起注册到Azure ML;若用公开预训练模型(如bert-base-chinese),可直接通过模型名称加载。
修改后的score.py示例:
import json import joblib import numpy as np import os from transformers import AutoTokenizer, AutoModel import torch # 全局变量存储所有模型组件 global catboost_model, bert_tokenizer, bert_model def init(): """服务启动时加载模型组件""" global catboost_model, bert_tokenizer, bert_model model_dir = os.getenv('AZUREML_MODEL_DIR') # 加载CatBoost分类模型 catboost_path = os.path.join(model_dir, 'nlp_cla.pkl') catboost_model = joblib.load(catboost_path) # 加载BERT组件(若用预训练模型,替换为模型名如"bert-base-chinese") bert_tokenizer = AutoTokenizer.from_pretrained(os.path.join(model_dir, 'bert_tokenizer')) bert_model = AutoModel.from_pretrained(os.path.join(model_dir, 'bert_model')) def text_preprocessing(text): """文本预处理,完全对齐你训练时的预处理逻辑""" # 示例操作:转小写、去除特殊字符 text = text.lower().strip() text = text.replace(r'[^\w\s]', '') return text def get_bert_embedding(text): """生成BERT编码向量,对齐训练时的编码逻辑""" processed_text = text_preprocessing(text) inputs = bert_tokenizer( processed_text, padding=True, truncation=True, max_length=128, return_tensors='pt' ) # 禁用梯度计算提升效率 with torch.no_grad(): outputs = bert_model(**inputs) # 取<[BOS_never_used_51bce0c785ca2f68081bfa7d91973934]> token的向量作为文本表示(或取序列均值,按训练时的方式选择) embedding = outputs.last_hidden_state[:, 0, :].numpy().flatten() return embedding def run(raw_data): """处理请求并返回预测结果""" try: # 解析输入(默认输入格式为{"data": ["文本1", "文本2"]}) input_texts = json.loads(raw_data)['data'] # 批量生成BERT向量 embeddings = np.array([get_bert_embedding(text) for text in input_texts]) # CatBoost模型预测 predictions = catboost_model.predict(embeddings) # 返回结构化结果,可添加标签映射(如将数字转为类别名称) return {"predictions": predictions.tolist()} except Exception as e: # 返回错误信息便于调试 return {"error": str(e)}
3. 模型注册注意事项
- 若使用自定义BERT模型:将BERT的tokenizer文件夹(含
vocab.txt等)、模型权重文件夹(含pytorch_model.bin等)与CatBoost的nlp_cla.pkl打包为同一目录,再注册到Azure ML。 - 若使用公开预训练模型:直接在
from_pretrained中传入模型名称(如bert-base-chinese),无需打包文件,但服务首次启动会自动下载模型,耗时较长。
4. 测试部署服务
测试请求的JSON格式示例:
{ "data": ["这是一条待分类的测试文本", "另一条需要预测的内容"] }
内容的提问来源于stack exchange,提问作者Python-data
相关产品推荐
相关产品推荐

