На большей глубине скорость прогнозирования замедляет работу. Стоит отметить, что наша нейронная сеть довольно мелкая — 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
Основные вопросы:
Есть предложения, как ускорить прогнозирование?
Есть ли вероятность того, что выполнение кода с использованием графического процессора повысит производительность?
Можете ли вы порекомендовать какой-либо другой подход к проблеме или другой вариант использования, который подойдет для нашей проблемы?
РЕДАКТИРОВАТЬ:
Мы попытались преобразовать модель в формат .onnx. Это действительно улучшило производительность функции оценки, и это здорово, но мы столкнулись с другой проблемой производительности. Проблема в том, что наш поиск по дереву (основанный на альфа-бета-обрезке) также очень медленный. Сейчас мы едва достигаем глубины 6 без вмешательства модели (ищем около 2 500 000 узлов в минуту, с вмешательством еще меньше), что ужасно.
Пока мы не добавили ничего вроде таблицы транспонирования или порядка перемещения, просто это обычный поиск по дереву. Сейчас мы рассматриваем возможность перевода его на C/C++. У нас очень мало опыта в настройке производительности, поэтому наш вопрос: насколько это поможет и сколько узлов в секунду мы можем получить?
Мы также задаемся вопросом, стоит ли использовать наши модели, обученные с помощью Python, в наших будущих программах на C?
Подробнее здесь: https://stackoverflow.com/questions/786 ... of-a-model
Мобильная версия