Почему после перехода на Gunicorn моему приложению Django не хватает памяти?

При попытке запустить приложение ML/AI в Django/Docker я получил следующую ошибку. Приложение позволяет пользователю загружать аудиофайлы, которые затем транскрибируются. Я начал получать следующую ошибку после перехода на Gunicorn. Я понимаю, что это связано с ограничениями по распределению памяти, но не уверен, как это исправить. Ошибка непостоянна и происходит только с некоторыми файлами, но не с другими, и не всегда это одна и та же ошибка. Иногда я получаю только internal server error. Ошибка также происходит с более длинными аудиофайлами, даже если более короткий аудиофайл больше (так, аудиофайл размером 10 МБ, 20 секунд может быть успешным, но файл размером 2 МБ, 3 минуты никогда не будет успешным и всегда возвращает аналогичную ошибку):

 [2024-06-18 08:56:09 -0500] [19] [INFO] Worker exiting (pid: 19)
web-1  | [2024-06-18 13:56:10 +0000] [1] [ERROR] Worker (pid:19) was sent SIGKILL! Perhaps out of memory?
web-1  | [2024-06-18 13:56:10 +0000] [34] [INFO] Booting worker with pid: 34
web-1  | /usr/local/lib/python3.11/site-packages/whisper/__init__.py:63: UserWarning: /root/.cache/whisper/tiny.pt exists, but the SHA256 checksum does not match; re-downloading the file
web-1  |   warnings.warn(
 78%|█████████████████████████████        | 56.6M/72.1M [00:24<00:05, 2.74MiB/s][2024-06-18 13:57:18 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:34)
 79%|█████████████████████████████        | 56.7M/72.1M [00:24<00:06, 2.42MiB/s]
web-1  | [2024-06-18 08:57:18 -0500] [34] [INFO] Worker exiting (pid: 34)
web-1  | [2024-06-18 13:57:19 +0000] [1] [ERROR] Worker (pid:34) exited with code 1
web-1  | [2024-06-18 13:57:19 +0000] [1] [ERROR] Worker (pid:34) exited with code 1.
web-1  | [2024-06-18 13:57:19 +0000] [45] [INFO] Booting worker with pid: 45
web-1  | /usr/local/lib/python3.11/site-packages/whisper/__init__.py:63: UserWarning: /root/.cache/whisper/tiny.pt exists, but the SHA256 checksum does not match; re-downloading the file
web-1  |   warnings.warn(
 72%|██████████████████████████▊          | 52.2M/72.1M [00:24<00:10, 2.03MiB/s][2024-06-18 14:02:49 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:45)
 73%|██████████████████████████▉          | 52.4M/72.1M [00:24<00:09, 2.22MiB/s]
web-1  | [2024-06-18 09:02:49 -0500] [45] [INFO] Worker exiting (pid: 45)
web-1  | [2024-06-18 14:02:49 +0000] [1] [ERROR] Worker (pid:45) exited with code 1
web-1  | [2024-06-18 14:02:49 +0000] [1] [ERROR] Worker (pid:45) exited with code 1.
web-1  | [2024-06-18 14:02:49 +0000] [56] [INFO] Booting worker with pid: 56
web-1  | /usr/local/lib/python3.11/site-packages/whisper/__init__.py:63: UserWarning: /root/.cache/whisper/tiny.pt exists, but the SHA256 checksum does not match; re-downloading the file
web-1  |   warnings.warn(
100%|█████████████████████████████████████| 72.1M/72.1M [00:22<00:00, 3.39MiB/s]
web-1  | [2024-06-18 14:20:30 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:56)
web-1  | [2024-06-18 09:20:30 -0500] [56] [INFO] Worker exiting (pid: 56)
web-1  | [2024-06-18 14:20:31 +0000] [1] [ERROR] Worker (pid:56) exited with code 1
web-1  | [2024-06-18 14:20:31 +0000] [1] [ERROR] Worker (pid:56) exited with code 1.
web-1  | [2024-06-18 14:20:31 +0000] [79] [INFO] Booting worker with pid: 79

Я запустил docker stats для анализа использования памяти. Вот вывод:

Я вижу, что в разделе Net I/O использование памяти превышает установленный лимит. Однако я не уверен, как внести необходимые изменения, и не уверен, что проблема вообще в этом. Я также читал, что простое увеличение таймаута Gunicorn - это только пластырь. Вот мое требование.txt:

aiohttp==3.8.5
aiosignal==1.3.1
asgiref==3.7.2
async-timeout==4.0.3
attrs==23.1.0
certifi==2023.7.22
chardet==5.2.0
charset-normalizer==3.2.0
colorama==0.4.6
Django==4.2.1
django-environ==0.11.2
filelock==3.12.4
fire==0.5.0
fonttools==4.42.1
frozenlist==1.4.0
gunicorn==21.2.0
idna==3.4
Jinja2==3.1.2
llvmlite==0.41.0
lxml==4.9.3
MarkupSafe==2.1.3
more-itertools==10.1.0
mpmath==1.3.0
multidict==6.0.4
networkx==3.1
numba==0.58.0
numpy==1.25.2
openai==0.27.8
openai-whisper @ git+https://github.com/openai/whisper.git@0a60fcaa9b86748389a656aa013c416030287d47
opencv-python==4.9.0.80
packaging==23.2
Pillow==10.0.0
pypdf==3.15.4
PyPDF2==3.0.1
python-dotenv==1.0.0
python-magic==0.4.27
regex==2023.8.8
reportlab==4.0.4
requests==2.31.0
six==1.16.0
sqlparse==0.4.4
sympy==1.12
termcolor==2.3.0
tiktoken==0.3.3
torch==2.0.1
tqdm==4.66.1
typing_extensions==4.6.2
tzdata==2023.3
urllib3==2.0.4
yarl==1.9.2
psycopg2-binary==2.9.3
environs[django]==9.5.0
whitenoise==6.1.0
django-storages[s3]==1.14.2

Вот мой Dockerfile:

# Pull base image
FROM python:3.11.4-slim-bullseye

# Set environment variables
ENV PIP_NO_CACHE_DIR off
ENV PIP_DISABLE_PIP_VERSION_CHECK 1
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV COLUMNS 80

#install Debian and other dependencies that are required to run python apps(eg. git, python-magic).
RUN apt-get update \
  && apt-get install -y --force-yes nano python3-pip gettext chrpath libssl-dev libxft-dev libfreetype6 libfreetype6-dev libfontconfig1 libfontconfig1-dev ffmpeg git libmagic-dev libpq-dev gcc \
    && rm -rf /var/lib/apt/lists/*

# Set working directory for Docker image
WORKDIR /code/

# Install dependencies
COPY requirements.txt .
RUN pip install -r requirements.txt

# Copy project
COPY . .

Я в полном тупике. Любая помощь будет очень признательна.

Вернуться на верх