快速搭建sentence_transformer方法

sentence transformer模型可以将句子进行Embedding。这里使用docker快速构建一个sentence transformer环境,小试牛刀。

准备镜像

这里Docker的安装就不介绍了,我们使用Dockerfile来构建我们的镜像,Dockerfile内容如下:

FROM python:3.10-slim

WORKDIR /app

RUN pip install transformers \
    && pip3 install torch --index-url https://download.pytorch.org/whl/cpu \
    && pip install sentence-transformers \
    && pip install Flask

Dockerfile里面的内容很简单,主要是安装pytorch以及sentence-transformers

构建镜像:docker build -t ddy_sentence_transformer .

下载模型

在官网https://www.sbert.net/的介绍中,通过下面的方式使用模型,如果模型不存在,则会自动下载:

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("hkunlp/instructor-large")

然而在使用的过程中,发现根本下载不下来,因此使用离线的方式下载模型,在https://public.ukp.informatik.tu-darmstadt.de/reimers/sentence-transformers/v0.2/中,找到我们需要的模型然后下载。

这里我们使用较小的模型,distiluse-base-multilingual-cased-v1.zip,模型支持中文。

将模型进行解压,得到:0_Transformer 1_Pooling 2_Dense config.json modules.json

构建一个简单的demo

新建一个main.py用于测试sentence_transformer:

from flask import Flask, request, jsonify
from sentence_transformers import SentenceTransformer, util

app = Flask(__name__)
model = SentenceTransformer('/app/distiluse-base-multilingual-cased-v1')

def encode_text(texts):    
    # Encode the texts and convert to list
    embeddings = model.encode(texts, convert_to_tensor=True, show_progress_bar=False)
    embeddings_list = embeddings.tolist()
    return embeddings_list

@app.route('/cal_distance', methods=['POST'])
def cal_distance():
    params = request.json
    sentence_1 = params['sentence_1']
    sentence_2 = params['sentence_2']
    embedding_1 = encode_text([sentence_1])[0]
    embedding_2 = encode_text([sentence_2])[0]
    distance = util.pytorch_cos_sim(embedding_1, embedding_2)
    print('sentence_1:', sentence_1, '|| sentence_2:' , sentence_2 , '===distance:', distance)
    return jsonify({'status': 'ok'})
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

程序的主要作用就是判断两句话的相似度

运行程序

docker run \
    -p 5000:5000 \
    -v /home/my_user/lib/ddy/sentence_transformer/distiluse-base-multilingual-cased-v1/:/app/distiluse-base-multilingual-cased-v1/ \
    -v /home/my_user/lib/ddy/sentence_transformer/code/main.py:/app/ \
    --name ddy \
    ddy_sentence_transformer \
    python -u main.py

测试

data = {"sentence_1": '教师', "sentence_2": '老师'}
requests.post('http://10.26.120.58:5000/cal_distance', json=data)

可以看出程序的输出结果:

sentence_1: 教师 || sentence_2: 老师 ===distance: tensor([[0.9625]])

可以看出来相似性还挺高的。

<think> 嗯,用户想要查找快速搭建LNSP环境的方法。注意到用户提到了"LNSP",这个缩写需要先明确含义。从引用内容看,引用[2]和[5]都提到了"NSP"(下一句预测任务),而引用[2]中特别出现了"L=αLMLM+βLNSP"的公式形式——用户可能是将"L_NSP"误简写成了"LNSP",实际应该指搭建NSP任务所需的环境。 用户似乎正在做自然语言处理相关的项目,需要搭建支持NSP任务的实验环境。从引用材料看,相关关键词包括:Python环境(引用[2]提到安装Python)、PyTorch(引用[4]代码示例)、预训练模型(引用[2][5])。用户强调"快速搭建",说明需要简洁高效的方案。 考虑到NSP任务通常与BERT等Transformer模型相关,基础环境应包括: 1. Python 3.8+环境(可用conda快速创建) 2. PyTorch最新稳定版 3. Hugging Face Transformers库 4. 可选Flask(引用[3]提到服务部署) 用户可能混淆了术语,需要明确:NSP是预训练任务,实际搭建的是能运行NSP模型的开发环境。准备在回复中先澄清术语,再分三步给出搭建方案:环境隔离→核心安装→验证测试。特别要强调用conda管理环境避免冲突,这是快速搭建的关键。 用户引用的资料显示ta已了解理论(如MLM/NSP),现在急需实践支持,回复要侧重操作而非理论。最后准备给出验证代码片段,直接调用Hugging Face的BertForPreTraining模型(含NSP任务头),这样用户能立即验证环境是否可用。 还需要提醒潜在的坑:GPU驱动匹配问题,以及权重下载可能需要的代理配置——虽然用户没提,但实际搭建常卡在这些环节。 </think> 根据您提供的引用上下文和需求,"LNSP" 应指自然语言处理(NLP)中 **下一句预测(Next Sentence Prediction, NSP)任务**的模型训练/测试环境。以下是快速搭建环境的完整方案: --- ### **快速搭建 NSP 环境指南** #### 1. **核心依赖安装**(Python 环境)[^2] ```bash # 创建虚拟环境(推荐 Python 3.8+) conda create -n nsp_env python=3.9 -y conda activate nsp_env # 安装 PyTorch(根据 CUDA 版本选择) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # CUDA 11.8 # 安装 Transformers 库(含预训练模型) pip install transformers datasets ``` #### 2. **验证环境与模型加载** ```python from transformers import BertTokenizer, BertForNextSentencePrediction import torch # 加载预训练模型和分词器 [^2][^5] tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertForNextSentencePrediction.from_pretrained('bert-base-uncased') # 输入样本(句子对) sentence_A = "The cat sits on the mat" sentence_B = "It enjoys sleeping in sunlight" # 编码输入并预测 inputs = tokenizer(sentence_A, sentence_B, return_tensors='pt') outputs = model(**inputs) logits = outputs.logits prediction = torch.argmax(logits, dim=1) # 0=连续句,1=随机句 ``` #### 3. **关键组件说明** | **组件** | **作用** | **引用依据** | |-----------------------|------------------------------------------------------------------------|------------------| | PyTorch | 深度学习框架基础 | [^2][^4] | | Transformers 库 | 提供 BERT 等预训练模型(内置 NSP 任务头) | [^2][^5] | | CUDA 驱动 | GPU 加速训练(可选,CPU 可运行但速度慢) | [^4] | #### 4. **优化技巧** - **轻量化部署**:使用 Flask 封装 API 服务 [^3] ```python from flask import Flask, request app = Flask(__name__) @app.route('/nsp', methods=['POST']) def predict(): data = request.json inputs = tokenizer(data['sentA'], data['sentB'], return_tensors='pt') with torch.no_grad(): # 关闭梯度提升推理速度 [^3] outputs = model(**inputs) return {'prob': torch.softmax(outputs.logits, dim=1).tolist()} ``` - **模型微调**:调整损失权重系数(引用[2]中的 $L = \alpha L_{MLM} + \beta L_{NSP}$) --- ### **环境验证结果** 运行上述代码后,若输出 `tensor([0])` 表示模型判定句子 B 是句子 A 的合理后续句(概率计算基于 softmax 结果)。 > **注**:完整流程可在 10 分钟内完成环境搭建,无需手动实现 NSP 逻辑(Transformers 库已封装)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值