Работник Celery вышел преждевременно, сигнал 11: попытка запустить скрипт Python при нажатии кнопки из представления DjaPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Работник Celery вышел преждевременно, сигнал 11: попытка запустить скрипт Python при нажатии кнопки из представления Dja

Сообщение Anonymous »

Я работаю над приложением Django, частичный процесс которого заключается в расшифровке аудио с временными метками. Когда пользователь нажимает кнопку в веб-интерфейсе, сервер Django запускает скрипт Python, который помогает с расшифровкой.
Теперь вот несколько подходов, которые я уже опробовал:
У меня есть отдельный файл transcribe.py. Когда пользователь нажимает кнопку расшифровки на веб-странице, он получает доступ к представлению из приложения проекта. Однако после частичного запуска сценария сервер Django завершает работу с терминала.
Поскольку сценарий Python представляет собой длительный процесс, я решил, что мне следует запустить программу в фоновом режиме, чтобы Сервер Django не завершает работу. Итак, я реализовал Celery и Redis. Во-первых, скрипт transcribe.py работает отлично, когда я запускаю его из оболочки Django. Однако он снова завершается, когда я пытаюсь выполнить его из представления/веб-страницы.

оболочка Python Manage.py

Поскольку я реализовал рабочую часть сельдерея, сервер не завершает работу, но рабочий выдает следующую ошибку.

Код: Выделить всё

[tasks]
. transcribeApp.tasks.run_transcription

[2024-11-25 03:26:04,500: INFO/MainProcess] Connected to redis://localhost:6379/0
[2024-11-25 03:26:04,514: INFO/MainProcess] mingle: searching for neighbors
[2024-11-25 03:26:05,520: INFO/MainProcess] mingle: all alone
[2024-11-25 03:26:05,544: INFO/MainProcess] celery@user.local ready.
[2024-11-25 03:26:16,253: INFO/MainProcess] Task searchApp.tasks.run_transcription[c684bdfa-ec21-4b4e-9542-0ca1f7729682] received
[2024-11-25 03:26:16,255: INFO/ForkPoolWorker-15] Starting transcription process.
[2024-11-25 03:26:16,509: WARNING/ForkPoolWorker-15] /Users/user/Desktop/project/django_app/django_venv/lib/python3.12/site-packages/whisper/__init__.py:150: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.
checkpoint = torch.load(fp, map_location=device)

[2024-11-25 03:26:16,670: ERROR/MainProcess] Process 'ForkPoolWorker-15' pid:38956 exited with 'signal 11 (SIGSEGV)'
[2024-11-25 03:26:16,683: ERROR/MainProcess] Task handler raised error: WorkerLostError('Worker exited prematurely: signal 11 (SIGSEGV) Job: 0.')
Traceback (most recent call last):
File "/Users/user/Desktop/project/django_app/django_venv/lib/python3.12/site-packages/billiard/pool.py", line 1265, in mark_as_worker_lost
raise WorkerLostError(
billiard.einfo.ExceptionWithTraceback:
"""
Traceback (most recent call last):
File "/Users/user/Desktop/project/django_app/django_venv/lib/python3.12/site-packages/billiard/pool.py", line 1265, in mark_as_worker_lost
raise WorkerLostError(
billiard.exceptions.WorkerLostError: Worker exited prematurely: signal 11 (SIGSEGV) Job: 0.
"""
Реализация выглядит следующим образом:

Код: Выделить всё

# Views.py
from .  import tasks
from django.shortcuts import render
from django.http import HttpResponse, JsonResponse

def trainVideos(request):
try:
tasks.run_transcription.delay()
return JsonResponse({"status": "success", "message": "Transcription has started check back later."})
# return render(request, 'embed.html', {'data': data})
except Exception as e:
JsonResponse({"status": "error", "message": str(e)})
Вот как выглядит функция транскрипции, где работник сельдерея выдает ошибку преждевременного выхода работника.

Код: Выделить всё

# Add one or two audios possibly .wav, .mp3 in a folder,
# and provide the file path here.
# transcribe.py

import whisper_timestamped as whisper
import os
def transcribeTexts(model_id, filePath):
result = []
fileNames = os.listdir()

model = whisper.load_model(model_id)

for files in fileNames:
audioPath = filePath + "/" + files

audio = whisper.load_audio(audioPath)

result.append(model.transcribe(audio, language="en"))

return result
model_id = "tiny"
audioFilePath = path/to/audio
transcribeTexts(model_id, audioFilePath)
Чтобы воспроизвести проблему, установите следующие библиотеки:

Код: Выделить всё

 pip install openai-whisper
pip3 install whisper-timestamped
pip install Django
pip install celery redis
pip install redis-server
Реализация Celery: # celery.py из каталога main_app проекта

Код: Выделить всё

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'main_app.settings')

app = Celery('main_app')

app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()

def debug_tasks(self):
print(f"Request: {self.request!r}")
tasks.py из каталога transcribe_app:

Код: Выделить всё

from __future__ import absolute_import, unicode_literals
from . import transcribe
from celery import shared_task

@shared_task
def run_transcription():
transcribe.transcribe()
return "Transcription Completed..."
В файл settings.py также добавлено следующее:

Код: Выделить всё

CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True
Кроме того, изменен файл init.py из django_app

Код: Выделить всё

from __future__ import absolute_import, unicode_literals

from .celery import app as celery_app

__all__ = ('celery_app',)
Для этого приложения некоторые библиотеки зависят от определенных версий. Все библиотеки и пакеты перечислены ниже:

Код: Выделить всё

Package              Version
-------------------- -----------
amqp                 5.3.1
asgiref              3.8.1
billiard             4.2.1
celery               5.4.0
certifi              2024.8.30
charset-normalizer   3.3.2
click                8.1.7
click-didyoumean     0.3.1
click-plugins        1.1.1
click-repl           0.3.0
Cython               3.0.11
Django               5.1.2
django-widget-tweaks 1.5.0
dtw-python           1.5.3
faiss-cpu            1.9.0
ffmpeg               1.4
filelock             3.16.1
fsspec               2024.9.0
huggingface-hub      0.25.2
idna                 3.10
Jinja2               3.1.4
kombu                5.4.2
lfs                  0.2
llvmlite             0.43.0
MarkupSafe           3.0.1
more-itertools       10.5.0
mpmath               1.3.0
msgpack              1.1.0
networkx             3.3
numba                0.60.0
numpy                2.0.2
packaging            24.1
panda                0.3.1
pillow               10.4.0
pip                  24.3.1
prompt_toolkit       3.0.48
pydub                0.25.1
python-dateutil      2.9.0.post0
PyYAML               6.0.2
redis                5.2.0
regex                2024.9.11
requests             2.32.3
safetensors          0.4.5
scipy                1.14.1
semantic-version     2.10.0
setuptools           75.1.0
setuptools-rust      1.10.2
six                  1.16.0
sqlparse             0.5.1
sympy                1.13.3
tiktoken             0.8.0
tokenizers           0.20.1
torch                2.4.1
torchaudio           2.4.1
torchvision          0.19.1
tqdm                 4.66.5
transformers         4.45.2
txtai                7.4.0
typing_extensions    4.12.2
tzdata               2024.2
urllib3              2.2.3
vine                 5.1.0
wcwidth              0.2.13
whisper-timestamped  1.15.4
В целом, когда я запускаю программу самостоятельно, она работает отлично. Но в Django он просто завершается, как бы я его ни выполнял. Я подумал, что одна из причин может заключаться в том, что я загружаю длинные аудиозаписи, поэтому я разбил их на части и попытался запустить программу transcribe.py, используя пользовательский интерфейс; однако это то же самое, что рабочий завершился преждевременно, сигнал 11 (SIGSEGV) Задание: 0. Я попробовал изменить размер пула памяти на более высокий уровень для рабочего, не сработало. Я не уверен, что именно нужно сделать, чтобы запустить файл transcribe.py в Django, поскольку большинство известных методов у меня не работают. Возможно я что-то упустил, помогите пожалуйста разобраться. Спасибо, что уделили время.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ipt-on-but
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»