Я профилирую свое обучение тензорному потоку и обнаружил, что некоторые операции выполнялись на CPU вместо GPU.
При форсировании устройства с помощью with graph.device("/gpu:0")
операция вырезания вызвала ошибку, говорящую
Не удалось удовлетворить явную спецификацию устройства '/ device: GPU: 0', поскольку не доступно поддерживаемое ядро для устройств с графическим процессором.
Я "решил" его, принудив устройство с помощью with graph.device("/device:XLA_GPU:0")
для указанной операции нарезки c. Однако при профилировании процесса я получаю (слишком) много переводов (MemcpyHtoD
и MemcpyDtoH
). Кроме того, даже все узлы графика назначены на GPU
(или XLA_GPU
для операции среза), похоже, что некоторые переменные располагаются на CPU
(см. Adam/VariableV2
на изображении ниже происходит сразу после MemcpyHtoD
и сопровождается MemcpyDtoH
)!
У меня проблемы с исследованием и пониманием того, как тензор потока обрабатывает данные, операции и устройство, на котором они выполняются.
- Почему тензор потока не может выполнять некоторые очень простые c операции (например, нарезку) на графическом процессоре?
- Почему передачи, необходимые между хостом и устройством для
Adam/VariableV2
? - Требуется ли передача данных между
GPU
и XLA_GPU
?