#python-3.x #docker #docker-compose #pytorch #sentence-transformers
#python-3.x #docker #docker-compose #pytorch #предложение-трансформеры
Вопрос:
Я получаю ошибку ниже при загрузке предварительно обученной модели torch и sentence_transformers("distilbert-base-nli-stsb-mean-tokens")
при попытке запуска в контейнере docker.
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 amp;amp; 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
Комментарии:
1. Можете ли вы добавить Dockerfile? Как вы запускаете контейнер? (пожалуйста, укажите аргументы команды или создайте файл)
2. Привет @anemyte, я только что добавил Dockerfile. Я запускаю с помощью docker-compose на AWS EC2.
3. Похоже, что это
gunicorn
рабочие, выполняющие ваш скрипт (который создает каталог). Они не должны запускаться под root по соображениям безопасности, но для теста вы можете запустить как контейнер, так и gunicorn workers от имени root, чтобы проверить теорию.4. Как запустить gunicorn от имени root в Dockerfile. Я попытался использовать CMD [ «sudo», «gunicorn», «app: app», «-b», «0.0.0.0:8000″,»— тайм-аут», «7200»]. Но не получилось.
5. Я заставил его работать самостоятельно. На самом деле, я также использую celery и redis. Здесь сельдерей на самом деле вызывает проблему. Он также пытается загрузить все модели и не может создать правильные каталоги для sentence_transformers в docker для user: nobody. Я протестировал приложение, удалив celery и celery-beat. И теперь он работает отлично. Но я не смог заставить его работать с их помощью. Если вы знаете какое-либо решение, пожалуйста, дайте мне знать тоже. Кстати, я также попробую использовать ваш подход и дам вам знать. Спасибо.
Ответ №1:
sentence-transformers загружает и сохраняет модель в каталоге ~/.cache (или в любом другом каталоге cache_folder, который оценивается как находящийся в — https://github.com/UKPLab/sentence-transformers/blob/a13a4ec98b8fdda83855aca7992ea793444a207f/sentence_transformers/SentenceTransformer.py#L63). Для вас это выглядит как каталог /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")'
Ответ №2:
Это сработало для меня, я использую 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")'