TensorFlow - XLA_GPU не хватает памяти, а GPU_BFC содержит много свободных байтов
Я использую распределенную программу TensorFlow, и каждая машина оснащена графическим процессором Maxwell Titan X. Я получил ошибку OOM (сообщение об ошибке ниже) в начале программы:
tensorflow.python.framework.errors_impl.ResourceExhaustedError: Failed to allocate request for 48.00MiB (50331648B) on device ordinal 0
[[{{node cluster_303_1/xla_run}} = _XlaRun[Targs=[DT_BFLOAT16, DT_BFLOAT16], Tresults=[DT_BFLOAT16], _device="/job:ps/replica:0/task:0/device:XLA_GPU:0"](transformer/decoder/att_3/att/einsum/parallel_0/einsum/transpose_2_G1444, transformer/decoder/att_3/att/einsum_3/parallel_0/einsum/transpose_1_G1446, cluster_303_1/xla_compile)]]
Это показывает, что устройству XLA_GPU не хватает памяти. В то же время, GPU_BFC содержит более 11 ГБ памяти графического процессора, и большая часть этой памяти свободна. Это происходит потому, что по умолчанию GPU_BFC выделяет и хранит почти всю память GPU и таким образом избегает вызова cuMemAlloc
во время исполнения. Однако выделение памяти XLA_GPU не проходит через распределитель BFC для GPU и напрямую взаимодействует с драйвером CUDA. После GPU_BFC для использования XLA_GPU осталось всего несколько сотен МБ памяти графического процессора. Прежде всего, зачем XLA_GPU нужен другой способ выделения памяти вместо того, чтобы использовать тот же распределитель BFC, что и GPU_BFC?
Я знаю, что могу позволить GPU_BFC выделять память только тогда, когда это необходимо, включив allow_growth
в конфигурации сеанса. Поскольку динамическое выделение памяти может снизить производительность, существует ли лучший или более принципиальный способ разделения памяти GPU между XLA_GPU и GPU_BFC?