Есть ли способ ускорить прогнозирование модели?Python

Программы на Python
Anonymous
Есть ли способ ускорить прогнозирование модели?

Сообщение Anonymous »

В настоящее время мы создаем нейронную сеть, используя keras и тензорный поток для оценки шахматных позиций. И мы столкнулись с проблемой скорости прогнозирования по одной выборке, которая используется в нашем дереве поиска. Использование дерева поиска заключается в проверке допустимых ходов в заданной позиции, оценке каждой позиции и получении лучшего хода в соответствии с наилучшей оценкой.
Для большей глубины важна скорость прогнозирования. это медленно. Стоит отметить, что наша нейронная сеть довольно мелкая — 3 слоя CNN и 2 плотных слоя. Мы обучили модель на ЦП и также используем ЦП в процессе прогнозирования. Мы предположили, что в этой конкретной (неглубокой) сети это не повлияет на производительность. Хотя в нашем случае параллелизма нет, следовательно, нет необходимости в вычислениях на графическом процессоре.
Версии:
Python 3.12.4
Tensorflow 2.16.1
Keras 3.3.3
Мы оцениваем один образец одновременно, используя любую модель. предсказать() или модель(х). Мы обнаружили, что при использовании в качестве Predict_on_batch() скорость примерно такая же, как и при прогнозировании по одной выборке. Наша цель — получить прогноз как можно быстрее, сохраняя при этом прогноз, используемый для одной выборки.
Мы попытались преобразовать модель в TFLite, как было предложено, чтобы получить немного лучшая производительность. Но мы не смогли преобразовать модель из-за несовместимости последних версий, да и понижение версии тоже не сработало.
Мы наблюдали за скоростью каждой функции прогнозирования при различных размерах пакетов.

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

model = keras.models.load_model('firstModel.keras')

print("Durations using model __call__() on small batch")
for i in range(5):
start = time.time()
prediction = model(bitboard)
end = time.time()
print(end - start)

print("Durations using model.predict_on_batch() on small batch")
for i in range(5):
start = time.time()
prediction = model.predict_on_batch(bitboard)
end = time.time()
print(end - start)

print("Durations using model.predict() on small batch")
for i in range(5):
start = time.time()
prediction = model.predict(bitboard, batch_size=1, verbose=0)
end = time.time()
print(end - start)

print("Durations using model.__call__() on larger batch (100 samples)")
for i in range(5):
start = time.time()
prediction = model(bitboards)
end = time.time()
print(end - start)

print("Durations using model.predict_on_batch() on larger batch (100 samples)")
for i in range(5):
start = time.time()
prediction = model.predict_on_batch(bitboards)
end = time.time()
print(end - start)

print("Durations using model.predict() on larger batch (100 samples)")
for i in range(5):
start = time.time()
prediction = model.predict(bitboards, batch_size=1, verbose=0)
end = time.time()
print(end - start)

А скорости были такие:

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

Durations using model __call__() on small batch
0.055520057678222656
0.007033586502075195
0.006206035614013672
0.007121562957763672
0.005555391311645508
Durations using model.predict_on_batch() on small batch
0.06325101852416992
0.0020132064819335938
0.0010013580322265625
0.0009975433349609375
0.0025305747985839844
Durations using model.predict() on small batch
0.1571955680847168
0.05691671371459961
0.05576348304748535
0.05414080619812012
0.05917525291442871
Durations using model.__call__() on larger batch (100 samples)
0.01164698600769043
0.00638890266418457
0.007528543472290039
0.006807804107666016
0.00751185417175293
Durations using model.predict_on_batch() on larger batch (100 samples)
0.04664158821105957
0.0025255680084228516
0.0010013580322265625
0.0020008087158203125
0.0025064945220947266
Durations using model.predict() on larger batch (100 samples)
0.05106091499328613
0.04923701286315918
0.06421136856079102
0.0651085376739502
0.055069923400878906
Что нас беспокоит, но мы пока не понимаем, как можно получить прогноз для пакета большего размера за меньшее время выполнения, чем прогнозирование на отдельных выборках. Мы предположили, что это может быть связано с неправильным использованием keras/tensorflow.
Основные вопросы:
Есть предложения, как ускорить прогнозирование?< /p>
Есть ли вероятность того, что выполнение кода с использованием графического процессора повысит производительность?
Можете ли вы порекомендовать какой-либо другой подход к проблеме или другой вариант использования? это подойдет для нашей проблемы?
РЕДАКТИРОВАТЬ:

Мы попробовали преобразовать модель в формат .onnx. Это действительно улучшило производительность функции оценки, и это здорово, но мы столкнулись с другой проблемой производительности. Проблема в том, что наш поиск по дереву (основанный на альфа-бета-обрезке) также очень медленный. Мы сейчас с трудом доходим до глубины 6 без вмешательства модели (поиск около 2 500 000 узлов за минуту, с вмешательством еще меньше), что ужасно.

До сих пор мы не добавляли ничего вроде таблицы транспонирования или порядка перемещения, это просто поиск по дереву. Сейчас мы рассматриваем возможность перевода его на C/C++. У нас очень мало опыта в настройке производительности, поэтому наш вопрос: насколько это поможет и сколько узлов в секунду мы сможем получить?

Мы также интересно, стоит ли использовать наши модели, обученные на Python, в наших будущих программах на C?

Подробнее здесь: https://stackoverflow.com/questions/786 ... of-a-model

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