Tensorflow 1.14+: не работает и не останавливается док-станция с колбами на основе задач. - PullRequest
0 голосов
/ 20 октября 2019

Я сделал, обучил и сохранил простую tf.keras модель. Затем я настраиваю базовые API-интерфейсы для задач через флягу, Redis и RQ.

По сути, работает так:

  • API вызывается с помощью ввода
  • задача (оценка ввода с моделью) ставится в очередь
  • статус задачи проверяется до завершения.

За пределами докера это работает довольно хорошо.

Я использую docker-compose, чтобы раскрутить сервер Redis, рабочий сервис и API фляги.

Служба фляг и рабочих (которая оценивает модель) создается из Dockerfile, начиная с FROM tensorflow/tensorflow:1.15.0rc2-gpu-py3-jupyter или FROM debian:buster-slim.

Хотя в любом случае gpus не обнаружен, проблема связана с загруженной моделью, не желающей работать на ЦП (она работает вне докера). Это интересно, потому что часть задачи вызывает несколько операций тензорного потока (например, преобразование ввода для работы с tf.data). Если я закомментирую только оценку модели, но разрешу запускать другие функции tf, все будет работать так, как ожидалось.

Когда я раскручиваюсь через docker-compose, я вижу некоторые из журналов:

worker | 2019-10-20 12:58:48.602164: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 AVX512F FMA
worker | 2019-10-20 12:58:48.633121: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2400000000 Hz
worker | 2019-10-20 12:58:48.636200: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x3a82e10 executing computations on platform Host. Devices:
worker | 2019-10-20 12:58:48.636236: I tensorflow/compiler/xla/service/service.cc:175]   StreamExecutor device (0): <undefined>, <undefined>

когда задача находится в очереди worker logs:

worker | 2019-10-20 12:59:47.726320: W tensorflow/compiler/jit/mark_for_compilation_pass.cc:1412] (One-time warning): Not using XLA:CPU for cluster because envvar TF_XLA_FLAGS=--tf_xla_cpu_global_jit was not set.  If you want XLA:CPU, either set that envvar, or use experimental_jit_scope to enable XLA:CPU.  To confirm that XLA is active, pass --vmodule=xla_compilation_cache=1 (as a proper command-line flag, not via TF_XLA_FLAGS) or set the envvar XLA_FLAGS=--xla_hlo_profile.

Глядя на другие вопросы SO, я знаю, что могу отключить это предупреждение, если у меня есть графический процессор (который даже с tensorflow/tensorflow:1.15.0rc2-gpu-py3-jupyter, docker, похоже, не находит).

Я попытался добавить указанную переменную среды, например,

os.environ['TF_XLA_FLAGS'] = '--tf_xla_cpu_global_jit'

, но затем он жалуется на ALA и т. Д.

Интересно, что при вызове вне рамок задачи (например, print результаты в файле колбы views.py) докер регистрирует результаты почти мгновенно.

Обновление : На самом деле этонемного более странно, чем это.

Рассмотрим:

# views.py
# ...
print('toggle')

print('about to call')
results = evaluate_model(dummy_input) # model.predict(...)
print('called')
print(results)

, когда я звоню docker-compose up Я вижу

[flask] toggle
[flask] about to call
[flask] called

Затем, если я закомментирую print('toggle') Я вижу

[flask] toggle #<--- should not see this, it is commented out
[flask] about to call
[flask] called
[flask] [[...], [...], ..., [...]] #<--- matrix

Если я затем раскомментирую print('toggle') Я вижу

[flask] about to call # toggle should be printed but it isnt.
[flask] called
[flask] [[...], [...], ..., [...]] #<--- matrix

Это как если бы запущенный процесс был потерян ипотом нашли момент спустя? Обратите внимание, что это не влияет на другие конечные точки API, то есть, когда колба загружена, она не застревает в ожидании возврата модели.

MWE настройки докера можно найти здесь (не включает TF, только как колба, redis, rq и внешний интерфейс)

Есть идеи?

Обновление

MWE набораup.

Если вы клонируете этот репозиторий и запустите

docker-compose -f docker-compose.ai.development.yml build
docker-compose -f docker-compose.ai.development.yml up

, вы увидите супер простой ноутбук , который производит игрушечную модель tf.keras (прямо из документации TF). ).

Эта модель сохраняется и затем загружается в записную книжку, чтобы гарантировать, что проблема не в экспорте / импорте модели.

docker-compose -f docker-compose.web.development.yml build
docker-compose -f docker-compose.web.development.yml up

запускает внешний интерфейс (nuxt + ngx) ибэкэнд (flask + rq + redis).

Интерес представляет файл /backend/app/api/utils.py, который имеет очень простую задачу:

import tensorflow as tf, numpy as np, os

model_file = os.path.join('/app/models/', 'model.h5')
model = tf.keras.models.load_model(model_file)

def predict_model():
    dummy_input = np.zeros((28, 28)).reshape((-1, 28, 28))
    predicted   = model.predict(dummy_input) # line 2 of predict_model function
    predicted = None
    return {
        'results': predicted
    }

, идущий к localhost:9061/model-task, отправляет задачу(predict_model). закомментирование второй строки работает нормально, если держать ее в очереди, то задача запускается и никогда не заканчивается.

1 Ответ

0 голосов
/ 20 октября 2019

Если я правильно понимаю проблему, это может быть проблема с многопоточностью. Попробуйте установить threads = 1 в своем INI-файле, если вы хотите, вы всегда можете увеличить с увеличением числа processes, но не threads.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...