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

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

Сообщение Anonymous »

В настоящее время мы создаем нейронную сеть, используя keras и тензорный поток для оценки шахматных позиций. И мы столкнулись с проблемой скорости прогнозирования по одной выборке, которая используется в нашем дереве поиска. Использование в дереве поиска заключается в проверке допустимых ходов в заданной позиции, оценке каждой позиции и получении лучшего хода в соответствии с наилучшей оценкой.
На большей глубине скорость прогнозирования замедляет работу. Стоит отметить, что наша нейронная сеть довольно мелкая — 3 слоя CNN и 2 плотных слоя. Мы обучили модель на ЦП и также используем ЦП в процессе прогнозирования. Мы предположили, что в этой конкретной (неглубокой) сети это не повлияет на производительность. Хотя в нашем случае использования нет параллелизма, поэтому нет необходимости в вычислениях на графическом процессоре.
Версии:
Python 3.12.4
Tensorflow 2.16.1
Keras 3.3.3
Мы оцениваем один образец одновременно, используя либо model.predict(), либо model(x). Мы обнаружили, что при использовании в качестве 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.
Основные вопросы:
Есть предложения, как ускорить прогнозирование?
Есть ли вероятность того, что выполнение кода с использованием графического процессора повысит производительность?
Можете ли вы порекомендовать какой-либо другой подход к проблеме или другой вариант использования, который подойдет для нашей проблемы?
РЕДАКТИРОВАТЬ:

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

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

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

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

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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