Если вы являетесь аналитиком, вы можете не разбираться в архитектуре веб-приложений, поэтому позвольте мне сначала проиллюстрировать это. Извините, если это чрезмерное упрощение и человеческое объяснение! Но я видел достаточно «развертываний модели ML», которые на самом деле представляют собой просто XGBoost, обернутый во Flask, и знаю, что это настоящая проблема.
Пользователь (здесь слева) использует браузер, в котором работают только Javascript, HTML и CSS. Это фронтэнд. Он может совершать вызовы на внутренний сервер для получения результатов, которые он затем может обрабатывать и отображать. Бэкенд-сервер должен как можно скорее отвечать на запросы внешнего интерфейса; но серверной части может потребоваться взаимодействие с базами данных, сторонними API и микросервисами. Серверная часть также может создавать медленные задания, такие как задания машинного обучения, по запросу пользователя, которые он должен помещать в очередь. (Имейте в виду, что обычно пользователь должен как-то аутентифицировать себя).
ChatGPT: как работать с нейросетью и как зарегистрироваться в ChatGPT из России
Теперь давайте поговорим об архитектуре распределенного веб-приложения.
В общем, мы хотим запускать как можно больше серверных экземпляров для масштабируемости. Вот почему на диаграмме выше из «сервера» выходят пузырьки; они представляют «больше таких». Таким образом, каждый экземпляр должен оставаться без состояния: закончить обработку HTTP-запроса и выйти. Не храните ничего в памяти между запросами, потому что первый запрос клиента может быть отправлен на один сервер, а последующий запрос — на другой.
Плохо, если у нас есть долго работающая конечная точка: она свяжет один из наших серверов (скажем… выполнение какой-то задачи машинного обучения), оставив его неспособным обрабатывать запросы других пользователей. Нам нужно поддерживать отзывчивость веб-сервера и передавать ему длительные задачи с каким-то общим постоянством, чтобы, когда пользователь проверяет ход выполнения или запрашивает результат, любой сервер мог сообщить об этом. Кроме того, работы и их части должны выполняться параллельно таким количеством workers, на которое есть ресурсы.
Ответ — очередь «первым пришел — первым вышел» (FIFO). Серверная часть просто ставит задания в очередь. Workers выбирают и обрабатывают задания из очереди, выполняя обучение или логические выводы и сохраняя модели или прогнозы в базе данных по завершении.
С библиотекой MLQ буквально все, что вам нужно для внутреннего веб-сервера, — конечная точка для постановки задания в очередь, конечная точка для проверки хода выполнения задания и конечная точка для обслуживания результата задания, если задание завершено.
Архитектура для настоящего развертывания модели машинного обучения такова:
Бэкенд-сервер получает запрос от веб-браузера пользователя. Он завернут в JSON, но семантически будет примерно таким: «Завтра среда, и сегодня мы продали 10 единиц. Сколько звонков в службу поддержки нам следует ожидать завтра?»
Серверная часть помещает задание <среда, 10>в очередь (какое-то место, отделенное от самой серверной части, например, Redis в случае MLQ). Очередь отвечает: «Спасибо, давайте назовем это заданием с идентификатором 562».
Как быстро и легко пользоваться нейросетью Midjourney? Инструкция
Бэкэнд отвечает пользователю: «Я сделаю этот расчет. У него ID 562. Пожалуйста, подождите». После этого серверная часть может свободно обслуживать других пользователей.
Веб-браузер пользователя начинает отображать счетчик «подождите».
Workers — по крайней мере, те, которые в данный момент не обрабатывают другое задание — постоянно опрашивают очередь на наличие заданий. Возможно, Workers существуют на другом сервере/компьютере, но они также могут быть разными потоками/процессами на том же компьютере. Workers могут иметь графические процессоры, тогда как внутреннему серверу, вероятно, это не нужно.
В конце концов, worker возьмет задание, удалит его из очереди и обработает (например, запустит через какую-нибудь модель XGBoost). Это сохранит прогноз в базе данных. Представьте, что этот шаг занимает 5 минут.
Между тем, веб-браузер пользователя каждые 30 секунд опрашивает серверную часть, чтобы узнать, выполнена ли еще задача 562. Серверная часть проверяет, есть ли в базе данных результат, сохраненный с идентификатором = 562, и отвечает соответствующим образом. Любой из наших многочисленных горизонтальных бэкэндов может обслуживать запрос пользователя. Вы можете подумать, что общая база данных — это единственная точка отказа, и вы будете правы! Но отдельно мы подготовили реплики и какой-то механизм аварийного переключения, возможно, сегментирование/балансировку нагрузки, так что все в порядке.
Через пять минут с лишним пользователь опрашивает результат, и мы можем его обслужить.
Здесь нужно немного больше, в основном для обеспечения отказоустойчивости и постоянства (что, если рабочий процесс отключится на полпути к выполнению задания? Что, если ввод пользователя будет ненужным и приведет к сбою задания?) Но это основы. Вот очень простой рабочий шаблон для MLQ.
Он просто ждет, пока не получит задание, затем запускает функцию с параметрами задания и сохраняет результат. Вы можете запускать столько этих вещей параллельно, сколько хотите, на одном и том же сервере или на распределенных серверах. Если вы посмотрите в репозиторий, вы найдете полный код для этого с моделью Nietzche/Tensorflow RNN.
Есть несколько хороших доступных фреймворков очередей или вещей, которые делают подходящие очереди, включая Celery, Dask, ZeroMQ, родной Redis и библиотеку, которую я недавно сделал, чтобы быть простой в использовании версией всего этого для развертывания побочных проектов без сложностей: MLQ . Кафка тоже вещь, но постоянные читатели знают, что я не поклонник сверхархитектурных проектов на основе Java. MLQ незрелый; Я не пытаюсь продать это здесь. Вместо этого используйте Celery для серьезных проектов.
На этой неделе я провел некоторое время с NVIDIA и спросил об их каноническом решении для организации очереди заданий (в частности, в моем случае, чтобы я мог сделать ферму графических процессоров доступной для всех на работе с ноутбуком Jupyter, чтобы все они не пытались отправлять задания). в то же время). Его пока нет, но меня уверили, что над ним работают. А до тех пор единственным способом будет вручную свернуть решение с помощью системы очередей.
(Также, возможно, представляет интерес с этой встречи: все согласились, что MXNet — действительно хороший фреймворк, возможно, лучший — но, к сожалению, он может исчезнуть).
Источник: yandex.ru
Как прикрутить нейросеть к сайту по-быстрому
В данном материале предлагается, приложив небольшие усилия, соединить python 3.7+flask+tensorflow 2.0+keras+небольшие вкрапления js и вывести на web-страницу определенный интерактив. Пользователь, рисуя на холсте, будет отправлять на распознавание цифры, а ранее обученная модель, использующая архитектуру CNN, будет распознавать полученный рисунок и выводить результат. Модель обучена на известном наборе рукописных цифр MNIST, поэтому и распознавать будет только цифры от 0 до 9 включительно. В качестве системы, на которой все это будет крутиться, используется windows 7.
Небольшое вступление
Чем печальны книги по машинному обучению, так, пожалуй, тем, что код устаревает почти с выходом самой книги. И хорошо, если автор издания поддерживает свое дитя, сопровождая и обновляя код, но, зачастую все ограничивается тем, что пишут — вот вам requirements.txt, ставьте устаревшие пакеты, и все заработает.
Так вышло и в этот раз. Читая «Hands-On Python Deep Learning for the Web» авторства Anubhav Singh, Sayak Paul, сначала все шло хорошо. Однако, после первой главы праздник закончился. Самое неприятное было то, что заявленные требования в requirements в целом соблюдались.
Масло в огонь подлили и сами разработчики пакетов tensorflow и keras. Один пакет работает только с определенным другим и, либо даунгрейд одного из них либо бубен шамана.
Но и это еще не все. Оказывается, что некоторые пакеты еще и зависимы от архитектуры используемого железа!
Так, за неимением алтернативы железа, устанавливался tensorflow 2.0 на платформу с Celeron j1900 и, как оказалось, там нет инструкции AVX2:
И вариант через pip install tensorflow не работал.
Но не все так грустно при наличии желания и интернета!
Вариант с tensorflow 2.0 удалось реализовать через wheel — github.com/fo40225/tensorflow-windows-wheel/tree/master/2.0.0/py37/CPU/sse2 и установку x86: vc_redist.x86.exe, x64: vc_redist.x64.exe (https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads).
Keras был установлен с минимальной версией, с которой он «стал совместим» с tensorflow — Keras==2.3.0.
pip install tensorflow-2.0.0-cp37-cp37m-win_amd64.whl
pip install keras==2.3.0
Основное приложение
Рассмотрим код основной программы.
flask_app.py
from flask import Flask, render_template, request import imageio #https://imageio.readthedocs.io/en/stable/examples.html #from scipy.misc import imread, imresize #from matplotlib.pyplot import imread import numpy as np import tensorflow as tf from tensorflow.keras.models import model_from_json from skimage import transform,io
Как выяснилось imread, imresize устарели еще со времен scipy==1.0. Непонятно, как у автора все работало, учитывая, что книга относительно нова (2019). С современной scipy==1.6.1 книжный вариант кода не работал.
Загружаем с диска, компилируем модель нейросети:
json_file = open(‘model.json’,’r’) model_json = json_file.read() json_file.close() model = model_from_json(model_json) model.load_weights(«weights.h5») model.compile(loss=’categorical_crossentropy’,optimizer=’adam’,metrics=[‘accuracy’]) #graph = tf.get_default_graph() graph = tf.compat.v1.get_default_graph()
Здесь произведена замена на tf.compat.v1.get_default_graph() в виду несовместимости.
Далее часть, относящаяся к серверу на flask. «Прорисовка» шаблона страницы:
Часть, преобразующая картинку в числовой массив:
import re import base64 def convertImage(imgData1): imgstr = re.search(r’base64,(.*)’, str(imgData1)).group(1) with open(‘output.png’, ‘wb’) as output: output.write(base64.b64decode(imgstr))
Основная функция предсказания:
def predict(): global model, graph imgData = request.get_data() convertImage(imgData) #print(imgData) #x = imread(‘output.png’, mode=’L’) #x.shape #(280, 280) x = imageio.imread(‘output.png’,pilmode=’L’) #x = imresize(x, (28, 28)) #x = x.resize(x, (28, 28)) x = transform.resize(x, (28,28), mode=’symmetric’, preserve_range=True) #(28, 28) #type(x) # x = x.reshape(1, 28, 28, 1) #(1, 28, 28, 1) x = tf.cast(x, tf.float32) # perform the prediction out = model.predict(x) #print(np.argmax(out, axis=1)) # convert the response to a string response = np.argmax(out, axis=1) return str(response[0])
Закоментированы строки, которые были заменены на рабочие, а также оставлены выводы отдельных строк для наглядности.
Как все работает
После запуска командой python flask_app.py запускается локальный flask-сервер, который выводит index.html с вкраплением js.
Пользователь рисует на холсте цифру, нажимает «predict». Картинка «улетает» на сервер, где сохраняется и преобразуется в цифровой массив. Далее в бой вступает CNN, распознающая цифру и возвращающая ответ в виде цифры.
Сеть не всегда дает верный ответ, т.к. обучалась всего на 10 эпохах. Это можно наблюдать, если нарисовать «спорную» цифру, которая может трактоваться по-разному.
*Можно покрутить слайдер, увеличивая или уменьшая толщину начертания цифры для целей распознавания.
Второй вариант программы — через API,curl
Поользователь загружает на сервер свое изображение с цифрой для распознавания и нажимает «отправить»:
Заменим index.js на следующий:
index.js:
$(«form»).submit(function(evt) < evt.preventDefault(); var formData = new FormData($(this)[0]); $.ajax(< url: ‘/predict/’, type: ‘POST’, data: formData, async: false, cache: false, contentType: false, enctype: ‘multipart/form-data’, processData: false, success: function (response) < $(‘#result’).empty().append(response); >>); return false; >);
Шаблон страницы также изменится:
Источник: habr.com
Как создать нейросеть с помощью chatGPT
ChatGPT – прекрасное средство для создания и обучения нейронных сетей, подготовки датасетов и проведения экспериментов.
erid: LjN8KRuAv
ИТ Медиа
erid: LjN8KRuAv
ИТ Медиа
Многие слышали о нашумевшей нейронной сети chatGPT от OpenAI, которая способна решать множество текстовых задач: отвечать на вопросы, генерировать идеи и т. д. ChatGPT успешно используется для программирования, так как умеет писать код, находить ошибки в коде, комментировать код и многое другое. Логично, что мы, как Университет искусственного интеллекта, специализируемся на искусственном интеллекте и, естественно, решили попробовать использовать chatGPT для генерации и обучения нейронных сетей и проведения экспериментов.
У нас это получилось: chatGPT не только применима, но и значительно упрощает работу по генерации архитектуры нейронных сетей и проведению экспериментов. Ниже приводен пример решения задачи классификации водителей на внимательных, засыпающих, отвлекающихся на телефон и т. п. — классификация изображений на 10 классов.
Типовая задача, решать ее мы будем комплексно, начиная с подготовки датасета, который необходим для обучения нейронных сетей. В нашем случае это zip-архив, который надо скачать, подготовить, превратить в обучающие выборки, нормировать и преобразовать перед тем, как подать в нейронную сеть. Часто это гораздо больший рутинный труд для разработчика, чем само обучение нейронной сети.
Мы сделаем и то, и другое исключительно с помощью запросов к chatGPT — вся статья представляет собой только запросы в chatGPT, без единой строчки рукописного кода – это был важный критерий. Приводим успешные запросы и пару ошибок для примера. При работе с chatGPT важно уметь правильно задать системе запрос.
Она умная и отлично понимает даже сложные комплексные запросы, но иногда человек формулирует запрос так, что системе он не понятен. Поэтому важный скил программирования с помощью chatGPT – промт-инжиниринг, умение правильно поставить задачу.
Вообще работа с chatGPT похожа на работу с очень умным junior’ом, который знает всё, что только можно знать в Интернете, но некоторые задачи понимает не так, как нужно. И, повторяю, результат зависит от умения правильно поставить ему задачу. Важный момент: мы будем обсуждать машинное обучение, создание нейронных сетей, поэтому аудитория может разделиться на две части.
Первая – те, кто разбирается в машинном обучении и в библиотеке Keras. Для них будут интересны и сами запросы к chatGPT, которые мы сформулировали, и код, который она создает. Вторая часть аудитории – это разработчики, которые не разбираются в машинном обучении и Keras.
Скорее всего, им будет не совсем понятно, что происходит (что такое слои, что такое эпохи, что такое батчи), но будет интересен сам формат запросов к chatGPT и то, как мы их формулируем. Возможно, в дальнейшем вы захотите либо изучать машинное обучение, либо программировать с помощью chatGPT, и тогда вам будет полезно посмотреть, какие бывают запросы, как мы их переструктурируем в случае ошибки, даже если вы не до конца будете понимать код созданной нейронной сети на Keras. Рассказываем, как устроены наши данные и как их нужно подготовить для подачи в сеть.
Запрос № 1 к chatGPT:
Напиши подготовку тренировочных данных для нейронной сети по классификации изображений, для чего напиши код скачивания датасета при помощи gdown по этой ссылке и код разархивации датасета из zip-формата в директорию ‘content/cars’. Датасет не поделен на train и test.
Он состоит из 10 папок (название каждой соответствует названию категории), каждый файл необходимо открыть при помощи Image.open, не используй генератор. Добавь в код масштабирование данных и приведи y_train к формату one hot encoding. Используй LabelEncoder для кодирования строковых меток в целые числа. Определи список названий классов и количество классов. Создай простую keras-модель на получившихся данных. Ответ chatGPT: import os import gdown import zipfile from PIL import Image from sklearn.preprocessing import LabelEncoder from sklearn.utils import shuffle from sklearn.model_selection import train_test_split import numpy as np from keras.utils import to_categorical from keras.models import Sequential from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D # Скачиваем датасет url = ‘ https://storage.yandexcloud.net/aiueducation/marketing/datasets/reality.zip gdown.download(url, ‘reality.zip’, quiet= False ) # Распаковываем набор данных with zipfile.ZipFile( «reality.zip»,»r» ) as zip_ref: zip_ref.extractall( «content/cars» ) # Загружаем изображения и ярлыки X = [] y = [] classes = os.listdir( «content/cars» ) for i, class_name in enumerate ( classes ): for image_name in os.listdir( «content/cars/» + class_name): image = Image. open ( «content/cars/» + class_name + «/» + image_name) image = image.resize(( 64, 64 )) X.append(np.array(image)) y.append(class_name) # Масштабируем данные X = np.array(X) / 255.0 # Кодируем ярлыки label_encoder = LabelEncoder() y = label_encoder.fit_transform(y) # Приводим ярлыки к формату One-hot encoding num_classes = len(np.unique(y)) y = to_categorical(y, num_classes) # Перемешиваем данные X, y = shuffle(X, y) # Делим набор данных на тренировочную и тестовую выборки X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Создаем простую модель keras model = Sequential() model.add(Conv2D( 32 , ( 3, 3 ), activation= ‘relu’ , input_shape=( 64, 64, 3 ))) model.add(MaxPooling2D(( 2, 2 ))) model.add(Flatten()) model.add(Dense(num_classes, activation= ‘softmax’ )) model. compile (optimizer= ‘adam’ , loss= ‘categorical_crossentropy’ ,
metrics=[ ‘accuracy’ ])
Запрос № 2 к chatGPT:
Теперь напиши, как дополнить этот код, чтобы запустить обучение модели на 10 эпохах, построй график точности по эпохам. Ответ chatGPT: import matplotlib.pyplot as plt # Обучаем модель history = model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test)) # Рисуем график точности по эпохам обучения plt.plot(history.history[ ‘accuracy’ ]) plt.plot(history.history[ ‘val_accuracy’ ]) plt.title( ‘Model accuracy’ ) plt.ylabel( ‘Accuracy’ ) plt.xlabel( ‘Epoch’ ) plt.legend([ ‘Train’ , ‘Test’ ], loc= ‘upper left’ ) plt.show()
Текстовый комментарий chatGPT: «Добавив этот код, мы запускаем обучение модели на 10 эпохах. Мы сохраняем результат обучения в переменной history, чтобы построить график точности модели по эпохам. Мы используем plt.plot() для отображения истории обучения из history.history[‘accuracy’] (точность на обучающем наборе) и history.history[‘val_accuracy’] (точность на тестовом наборе). И далее добавляем легенду и отображаем график».
Запрос № 3 к сhatGPT:
Это слишком простая модель. Создай более мощную модель, код запуска обучения, график точности, проверь в цикле различные batch_size (32, 64, 128). Ответ chatGPT: from keras.layers import Dropout, BatchNormalization # Создаем более мощную модель model = Sequential() model.add(Conv2D(32, (3, 3), activation= ‘relu’ , input_shape=( 64, 64, 3 ))) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Conv2D( 64 , ( 3, 3 ), activation= ‘relu’ )) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Conv2D( 128 , ( 3, 3 ), activation= ‘relu’ )) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Flatten()) model.add(Dropout( 0.5 )) model.add(Dense(num_classes, activation= ‘softmax ‘ )) model. compile (optimizer= ‘adam’ , loss= ‘categorical_crossentropy’ ,
metrics=[ ‘accuracy’ ]) batch_sizes = [ 32, 64, 128 ] for batch_size in batch_sizes: # Обучаем модель history = model.fit(X_train, y_train, epochs=10, batch_size=batch_size,
validation_data=(X_test, y_test)) # Рисуем график точности по эпохам обучения plt.plot(history.history[ ‘accuracy’ ]) plt.plot(history.history[ ‘val_accuracy’ ]) plt.title( f ‘Model accuracy with batch size ‘) plt.ylabel( ‘Accuracy’ ) plt.xlabel( ‘Epoch’ ) plt.legend([ ‘Train’ , ‘Test’ ], loc= ‘upper left’ ) plt.show()
Получилось не совсем то, что мы хотели: код, созданный chatGPT, не проверяет точность при разных batch_size, а дообучает модель на их разных размерах. Необходимо было более точно составить запрос.
Запрос № 4 к chatGPT:
Сделай код запуска этой модели в цикле с разными размерами batch_size (32, 64, 128), выведи график точности по каждому запуску. Ответ chatGPT: batch_size_list = [ 32, 64, 128 ] for batch_size in batch_size_list: # Создаем более мощную модель model = Sequential() model.add(Conv2D( 32 , ( 3, 3 ), activation= ‘relu’ , input_shape=( 64, 64, 3 ))) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Conv2D(64, ( 3, 3 ), activation= ‘relu’ )) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Conv2D( 128 , ( 3, 3 ), activation= ‘relu’ )) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Flatten()) model.add(Dropout( 0.5 )) model.add(Dense(num_classes, activation= ‘softmax’ )) model. compile (optimizer=’adam’, loss= ‘categorical_crossentropy’ , metrics=[ ‘accuracy’ ]) # Обучаем модель history = model.fit(X_train, y_train, epochs=10, batch_size=batch_size,
validation_data=(X_test, y_test))
# Рисуем график точности по эпохам обучения plt.plot(history.history[‘accuracy’], label= f ‘batch size : ‘ ) plt.title( ‘Model accuracy with different batch sizes’ ) plt.ylabel( ‘Accuracy’ ) plt.xlabel( ‘Epoch’ ) plt.legend(loc= ‘upper left’ ) plt.show()
Таким образом, мы получили (хоть и не с первого раза) то, что хотели (почти). Стоило добавить, что графики нужно было отрисовывать по точности на проверочной выборке.
Запрос № 5 к chatGPT:
- Использование более мощной модели: использование большего количества сверточных слоев, нейронов и слоев связи.
- Использование более большого датасета: использование большего количества данных для обучения модели может увеличить точность.
- Дополнительная аугментация данных: использование аугментации данных, такой как повороты, масштабирование и другие, может помочь модели обобщаться на новые данные.
- Использование сверточных сетей, предварительно обученных (Transfer Learning): использование предварительно обученных сверточных сетей может существенно увеличить точность модели.
- Использование другой оптимизации и другой функции потерь для обучения модели: использование более эффективных алгоритмов оптимизации, таких как Adam, RMSprop или Adagrad и использование более подходящей функции потерь для задачи классификации, такой как categorical_crossentropy или sparse_categorical_crossentropy, может помочь улучшить точность модели.
- Использование регуляризации: использование регуляризации, такой как L1 и L2, может помочь предотвратить переобучение модели.
- Использование стандартизации данных: использование стандартизации данных может помочь сделать данные более однородными и улучшить точность модели.
Запрос № 6
Сделай в цикле проверку точности последней модели с разными оптимизаторами и выведи график сравнения полученных точностей.
Ответ chatGPT:
from keras import optimizers
optimizer_list = [ ‘adam’, ‘sgd’, ‘rmsprop’, ‘adagrad’ ]
for optimizer in optimizer_list:
Источник: www.it-world.ru