You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:15:36