Загрузка предварительно обученной модели torch и предложения_transformers при запуске в докер-контейнере завершается ошибкой
Я получаю ошибку ниже при загрузке предварительно обученной модели факела и
sentence_transformers("distilbert-base-nli-stsb-mean-tokens")
при попытке запустить в докер-контейнере.
Error: Invalid value for '-A' / '--app':
Unable to load celery application.
While trying to load the module app.celery the following error occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/celery/bin/celery.py", line 53, in convert
return find_app(value)
File "/usr/local/lib/python3.8/site-packages/celery/app/utils.py", line 384, in find_app
sym = symbol_by_name(app, imp=imp)
File "/usr/local/lib/python3.8/site-packages/kombu/utils/imports.py", line 56, in symbol_by_name
module = imp(module_name, package=package, **kwargs)
File "/usr/local/lib/python3.8/site-packages/celery/utils/imports.py", line 100, in import_from_cwd
return imp(module, package=package)
File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 783, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/code/app.py", line 997, in <module>
load_model()
File "/code/app.py", line 255, in load_model
embedder = SentenceTransformer('distilbert-base-nli-stsb-mean-tokens')
File "/usr/local/lib/python3.8/site-packages/sentence_transformers/SentenceTransformer.py", line 48, in __init__
os.makedirs(model_path, exist_ok=True)
File "/usr/local/lib/python3.8/os.py", line 213, in makedirs
makedirs(head, exist_ok=exist_ok)
File "/usr/local/lib/python3.8/os.py", line 213, in makedirs
makedirs(head, exist_ok=exist_ok)
File "/usr/local/lib/python3.8/os.py", line 213, in makedirs
makedirs(head, exist_ok=exist_ok)
[Previous line repeated 1 more time]
File "/usr/local/lib/python3.8/os.py", line 223, in makedirs
mkdir(name, mode)
PermissionError: [Errno 13] Permission denied: '/nonexistent'
Здесь говорится об ошибке в разрешении отказано при создании папки. Но я попытался предоставить
USER root
в
Dockerfile
. Застрял в этой проблеме долгое время. Пожалуйста, помогите мне здесь.
Обновлено: Мой Dockerfile:
FROM python:3.8.5-slim
WORKDIR /code
ENV ENVIRONMENT='LOCAL'
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get install -y sudo netcat apt-utils
RUN apt-get install -y python3-dev build-essential python3-pip
COPY ./requirements_local.txt /code/requirements_local.txt
RUN pip install -r /code/requirements_local.txt
EXPOSE 8000
COPY . /code/
CMD [ "gunicorn", "app:app", "-b", "0.0.0.0:8000","--timeout","7200"]
Docker-compose :
services:
web:
build:
context: .
dockerfile: ./Dockerfile.prod
hostname: flaskapp
env_file:
- ./.env.prod
links:
- redis
- celery
depends_on:
- redis
volumes:
- data:/code
- type: bind
source: /home/ubuntu/models
target: /mnt/models
2 ответа
предложения-трансформеры загружают и сохраняют модель в каталоге ~ / .cache (или в любом другом месте, в котором находится cache_folder - https://github.com/UKPLab/sentence-transformers/blob/a13a4ec98b8fdda83855aca7992ea793444a207f/sentence_transformer.py#Ltransformer . Для вас это выглядит как каталог / nonexistant. Ошибка отказа в разрешении предполагает, что у вас нет разрешения на доступ к этому каталогу (для создания папки кеша).
Вы можете изменить Dockerfile, чтобы создать этот каталог и сделать его доступным для любого пользователя, которому требуется доступ к нему: -
RUN mkdir ~/.cache
RUN chmod -R 777 ~/.cache # don't do this in production - modify command to give permission to users who require it.
Или вы можете попробовать загрузить модель в самом Dockerfile -
RUN python -c 'from sentence-transformers import SentenceTransformer; embedder = SentenceTransformer("distilbert-base-nli-stsb-mean-tokens")'
Это сработало для меня, я использую bert-base-NER
RUN python3 -c 'from transformers import AutoTokenizer, AutoModelForTokenClassification; tokenizer = AutoTokenizer.from_pretrained("dslim/bert-base-NER"); model = AutoModelForTokenClassification.from_pretrained("dslim/bert-base-NER")'