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