Obtengo esta misma tasa de utilización cuando entreno modelos con Tensorflow. La razón es bastante clara en mi caso, elijo manualmente un lote aleatorio de muestras y llamo a la optimización para cada lote por separado.
Eso significa que cada lote de datos está en la memoria principal, luego se copia en la memoria de la GPU donde está el resto del modelo, luego la propagación y actualización hacia adelante / atrás se realiza en la gpu, luego la ejecución se devuelve a mi código donde agarro otro lote y llame a optimizar en él.
Hay una forma más rápida de hacerlo si pasa algunas horas configurando Tensorflow para realizar la carga por lotes en paralelo desde los registros TF preparados previamente.
Me doy cuenta de que puede o no estar usando tensorflow bajo keras, pero dado que mi experiencia tiende a producir números de utilización muy similares, me estoy arriesgando sugiriendo que hay un vínculo causal razonablemente probable para extraer de estas correlaciones. Si su marco está cargando cada lote desde la memoria principal en la GPU sin la eficiencia / complejidad adicional de la carga asincrónica (que la GPU puede manejar), entonces este sería un resultado esperado.