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

调用SentenceTransformer的model.encode时触发Segmentation fault错误求助

问题排查与解决方案

核心原因分析

段错误(Segmentation fault)通常由底层库缺失、依赖版本不兼容或系统资源不足导致。结合你的Docker环境(python:3.8-slim-buster)和依赖版本,主要问题集中在:

  • Slim镜像精简了大量系统底层库,PyTorch/Transformers运行所需的核心依赖缺失
  • PyTorch 2.1.0与Python 3.8在Debian Slim环境下存在兼容性适配问题
  • OpenBLAS配置可能存在冲突,引发内存访问错误

解决方案步骤

1. 修复Dockerfile,补充系统依赖

修改你的Dockerfile,添加PyTorch和Transformers必需的系统库:

FROM python:3.8-slim-buster

RUN apt-get update && apt-get install -y --no-install-recommends \
    software-properties-common \
    build-essential \
    pkg-config \
    ninja-build \
    libopenblas-dev \
    libgomp1 \
    libssl-dev \
    python3-pip \
    curl \
    && rm -rf /var/lib/apt/lists/*  # 清理缓存减少镜像体积

COPY . .
CMD ["bash"]
  • libgomp1:PyTorch依赖OpenMP进行并行计算,Slim镜像默认缺失
  • libssl-dev:确保模型从HuggingFace Hub下载时的SSL支持
  • --no-install-recommends:避免安装不必要的依赖,缩小镜像体积

2. 调整PyTorch版本适配Python 3.8

PyTorch 2.1.0对Python 3.8的兼容性在Debian Slim环境下存在问题,降级到稳定兼容的版本:

pip uninstall -y torch
pip install torch==1.13.1+cpu torchvision==0.14.1+cpu torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cpu

也可以在requirements.txt中直接指定版本:

torch==1.13.1+cpu
transformers==4.34.1
sentence-transformers==2.2.2

3. 强制模型使用CPU模式(可选)

在代码中显式指定设备为CPU,避免自动设备检测可能引发的错误:

# SentenceTransformer版本
from sentence_transformers import SentenceTransformer
sentences = ["This is an example sentence", "Each sentence is converted"]

model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2', device='cpu')
embeddings = model.encode(sentences)
print(embeddings)
# 直接使用Transformers的版本
from transformers import AutoTokenizer, AutoModel
import torch
import torch.nn.functional as F

def mean_pooling(model_output, attention_mask):
    token_embeddings = model_output[0]
    input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
    return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)

sentences = ['This is an example sentence', 'Each sentence is converted']

tokenizer = AutoTokenizer.from_pretrained('sentence-transformers/all-MiniLM-L6-v2',cache_dir='models')
model = AutoModel.from_pretrained('sentence-transformers/all-MiniLM-L6-v2',cache_dir='models')
model.to('cpu')  # 强制指定CPU设备

encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')

with torch.no_grad():
    model_output = model(**encoded_input)

sentence_embeddings = mean_pooling(model_output, encoded_input['attention_mask'])
sentence_embeddings = F.normalize(sentence_embeddings, p=2, dim=1)

print("Sentence embeddings:")
print(sentence_embeddings)

4. 验证Docker容器资源(可选)

如果上述方案无效,检查Docker容器的内存限制:

# 查看容器资源配置
docker inspect <container-id> | grep -A 10 "Resources"

若内存不足,启动容器时增加内存分配:

docker run -it --memory=4g <your-image>

验证效果

重新构建Docker镜像并运行代码,段错误和资源泄漏警告会消失,模型能正常输出嵌入向量。

内容的提问来源于stack exchange,提问作者loretoparisi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:54:57