Recebo essa mesma taxa de utilização quando treino modelos usando o Tensorflow. O motivo é bem claro no meu caso: estou escolhendo manualmente um lote aleatório de amostras e chamando a otimização para cada lote separadamente.
Isso significa que cada lote de dados está na memória principal, é copiado na memória da GPU onde está o restante do modelo, a propagação / atualização e a atualização / retrocesso são executadas na gpu, e a execução é devolvida ao meu código, onde eu pego outro lote e ligue para otimizar.
Existe uma maneira mais rápida de fazer isso se você passar algumas horas configurando o Tensorflow para fazer carregamento em lote em paralelo a partir de registros TF pré-preparados.
Sei que você pode ou não estar usando o tensorflow sob keras, mas, como minha experiência tende a produzir números de utilização muito semelhantes, estou tentando sugerir que existe um nexo de causalidade razoavelmente provável a partir dessas correlações. Se sua estrutura estiver carregando cada lote da memória principal na GPU sem a eficiência / complexidade adicional do carregamento assíncrono (com o qual a própria GPU pode lidar), esse seria um resultado esperado.