Розгортання нейронної мережі з Flask, Docker та AWS Beanstalk

pic

Частина I:
Створення моделі нейронної мережі, Flask додатку та включення HTML, CSS, js для голосового запису.

Частина II:
Як вибрати правильну конфігурацію для вашого Docker образу.

Частина III:
Розгортання на AWS Elastic Beanstalk та налаштування голосового запису.

Усі вищезазначені пункти включають загальні поради щодо вирішення проблем. Деякі з них ви знайдете на моєму StackOverflow.

Частина I:
Чому голосова сентимент-аналіза? Завдяки експоненційному розвитку технологій за останнє десятиліття, спосіб життя змінився, і люди вимагають швидших та зручніших сервісів. Багато компаній оновлюють контракти та отримують юридичне погодження клієнтів тільки через телефонний дзвінок. Не кажучи вже про маркетинг, успіх клієнтів та продажі. І стало необхідним передбачити сентимент клієнта з голосового вводу або телефонного дзвінка.

Тепер давайте розглянемо модель голосового сентименту.
Набір даних для навчання моделі: містить різних спікерів, в основному акторів, у контрольованому середовищі, що передають наступні сентименти для обох статей: злість, відраза, страх, радість, нейтрально, сум, здивування. (14 класів — оскільки завжди краще тренувати окремо жіночі та чоловічі голоси).

Для вилучення та трансформації характеристик даних (Мел-частотні кепстральні коефіцієнти: MFCC) з аудіо я використав LibROSA. Створення моделі за допомогою Keras: Sequential з шарами Conv1D, BatchNormalization, Dropout і MaxPooling1D. Сміливо спробуйте на моєму Kaggle kernel.

Flask додаток: запитує дані у користувача та зберігає їх як WAV файл, який потім обробляється та передбачає.
Декілька моментів, на які слід звернути увагу:

  • переконайтеся, що ім’я вашого файлу додатку: application.py і application=FLASK(__name__)
  • коли мова йде про Keras і Flask: ви помітите, що Keras не є потокобезпечним, і вам доведеться використовувати model._make_predict_function() Чому це відбувається і як вирішити проблему, читайте у моєму рішенні на StackOverflow (а ось і плюси і мінуси використання вищезазначеного).

Знайти Html, CSS та js для голосового запису можна в моєму Github репозиторії. Ви можете змінити час запису в recapp.js, просто пам’ятайте, що 1 секунда = 1000 мілісекунд: setTimeout(function(){console.log("Recording: time up"); stopRecording();}, 4000);

pic

Частина II:
Спочатку я розгорнув Flask додаток на AWS Beanstalk і помітив, що журнал помилок сервера не надто детальний і зрозумілий щодо помилок, тому я знайшов журнал помилок Docker досить корисним.

Звісно, Docker пропонує багато інших інструментів і функцій, які роблять роботу з ним дещо простішою та компактнішою для створення середовища.

Це допоможе вам зробити правильний вибір під час створення Docker образів і вирішення проблем:

  • думайте з самого початку про обмеження за розміром контейнера/образу та виберіть правильну версію для вашого Python образу. Це налаштується у вашому Dockerfile: FROM python:3.6-slim (зауважте: поки що уникатимемо Alpine Linux через деякі невідповідності: менше бібліотек, інша бібліотека C тощо).
    Єдине, що щодо вибору найтоншої версії — вам, ймовірно, доведеться встановлювати деякі бібліотеки/залежності. І це може бути досить обтяжливим ... залежності Python як SoundFile для LibROSA, GCC тощо.
  • вам може знадобитися встановити системні пакети, для чого треба буде встановити sudo.
    Side note: не забувайте використовувати -y при запиті Y/N, інакше установка буде перервана, якщо не буде можливості ввести відповідь з клавіатури.
  • для аудіо встановіть libsndfile1-dev (це повинно вирішити всі проблеми для Linux та Ubuntu).
  • переконайтесь, що все виконується в одному RUN, щоб уникнути створення проміжних образів:
RUN apt-get update && \  
 apt-get -y --no-install-recommends install sudo && \  
 sudo apt-get -y --no-install-recommends install libsndfile1-dev && \  
 pip install --no-cache-dir -r requirements.txt && \  
 sudo rm -rf /var/lib/apt/lists/*
  • щоб переконатися, що пакети не встановлюють непотрібні залежності:
  • sudo --no-install-recommends або pip install --no-deps # без залежностей, хоча це може бути важко при роботі з Tensorflow та Keras (як Scikit-learn, SciPy тощо)
  • pip install --no-cache-dir може допомогти з додатковим кешем,
  • а також для очищення залишків: sudo rm -rf /var/lib/apt/lists/*
  • інші рядки в вашому Dockerfile повинні охоплювати решту додатку, як-от:
WORKDIR /deploy/ # виберіть свою робочу директорію  
COPY . . # корисно для копіювання всіх папок та підпапок  
EXPOSE 5000 # встановіть порт 5000 для Flask додатку  
CMD [“python”, “application.py”] # додаток для запуску

pic

Частина III:
Amazon Web Services та Elastic Beanstalk здалися хорошим вибором.

Я слідував усім інструкціям для створення середовища з одним контейнером Docker тут.

Якщо ви використовуєте консоль AWS, то все досить просто. Якщо ви використовуєте AWS/EB CLI, то переконайтеся, що ви налаштували шлях після установки EB CLI:

echo 'export PATH="/Users/Daniel/.ebcli-virtual-env/executables:$PATH"' >> ~/.bash_profile && source ~/.bash_profile

Ви створюєте новий додаток та середовище в Beanstalk, завантажуючи архів/zip з вмістом папки вашого Docker додатку. З консольного інтерфейсу можна змінювати потужність, типи інстансів, тип середовища (балансування навантаження, автоскейлінг) і так далі.

Тепер давайте розглянемо можливі проблеми:

  • після того, як все було вирішено і розгорнуто, ви отримуєте доступ до AWS Beanstalk Http посилання, що веде до вашого додатку, і можете виявити, що ваша голосова програма працює чудово, за винятком моменту, коли потрібно попросити доступ до мікрофону користувача через веб-браузер. І відповідь проста: переконайтесь, що ви запускаєте на https.
  • далі використовуйте OpenSSL для реєстрації та отримання ключів, а також для підписання RSA самостійно (тільки для розробки). І додайте все це в YAML або JSON файл у папку ".ebextensions" вашого Docker контейнера. (знайдете на моєму GitHub)
  • якщо ви власник Mac і отримуєте помилку _MACOSX/, просто зробіть це, у вашому архіві, в командному рядку: `zip -d Archive.zip _MACOSX/*`
  • якщо ви отримуєте помилки на зразок Конфігураційний файл .ebextensions/filename.config у версії додатку… містить некоректний YAML або JSON. Виключення YAML: некоректний YAML: під час парсингу блоку в рядку … і т.д.
    : переконайтесь, що ваші рядки RSA-ключів вирівняні та сумісні з YAML.
  • Висновки щодо налаштування AWS Beanstalk для одиничного екземпляра SSL для HTTPS (для Docker середовища): після витраченого часу на з'ясування проблем з YAML і табуляцією проти пробілів (або відсутність пробілів після ключів footer, або ж..) у моєму редакторі (Atom/Packages/Whitespace), або навіть конвертація YAML в JSON (Atom/Packages/YAMLJSON Converter), я зрозумів, що початкові ключі були пошкоджені і мені довелося **створити новий набір ключів!!!_**

Усі наведені вище коди та інструкції можна знайти у моїй відповіді на StackOverflow.

Сподіваюся, що це допоможе (і збереже вам дні важкої роботи) і тепер ваш додаток працює без проблем, і ви насолоджуєтесь прогнозами. Модель, яку я надав на моєму GitHub, дає трохи менше за 50% точності — хоча це може бути досить добре для багатокласової класифікації на перший погляд.

Бережіть себе і бажаю вам чудового 2020 року,

Новий захоплюючий десятиліття для експоненціального зростання та інновацій!!!

Даніель

Перекладено з: Deploy Neural Network with Flask, Docker and AWS Beanstalk

Leave a Reply

Your email address will not be published. Required fields are marked *