Частина 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);
Частина 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”] # додаток для запуску
Частина 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