Я работаю над проектом машинного обучения, который включает в себя тяжелые операции ввода-вывода на диске.
В частности, для одного примера обучения необходимо загрузить 6 связанных сохраненных numpy
массивов разных размеров (от 100 КБ до 6 МБ в формате .npy
).В результате, когда в наборе данных имеется 10 тыс. Обучающих примеров, количество загружаемых файлов составляет 60 тыс.
После загрузки массивов с использованием tuple(np.load(item) for item in all_files)
мне нужно выполнить три numpy
операции, которыеявляются:
vstack
, для кортежа состоит из 10 тыс. массивов с формой (1000, 92, 50). concatenate
, для кортежа состоит из 10 тыс. массивовразличной длины. - Применение расширенного среза к векторизованным кортежам массивов
numpy
.
При тестировании сценария я обнаружил проблему: объем памяти в buff/cache
можетбыть в 2 раза больше памяти used
(я запускал скрипт на кластере slurm, каждый вычислительный узел имеет 128 ГБ памяти), в результате, когда я достигну третьего шага, я получу ошибку памяти.
В ответ на этот ответ я использую отдельный сценарий (в конце этого сценария добавляю sys.exit()
) для loading + vectorizing
массивов numpy
, сохраняя при этом шаг advanced slicing
в оригинальном сценарии.
Векторизованные массивы будут сначала сохранены на диск, затем они будут загружены оригинальным сценарием для расширенного среза.Это решает мою проблему, но я думаю, что это не так элегантно.
Есть ли лучшие решения?Для чего используется большая память в buff/cache
, когда я загружаю массивы numpy
, используя tuple(np.load(item) for item in all_files)
?Каковы хорошие практики при написании сценария с тяжелыми операциями numpy.load
?