es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Un modelo simple de tensorflow.js afecta negativamente el rendimiento del navegador.

He creado una aplicación para ejecutar un modelo simple de tfjs en la cámara en vivo en el navegador. El problema es que esto afecta completamente al rendimiento de la página web. La frecuencia de actualización es de alrededor de 1-2 fps y todo el navegador funciona con lentitud (otras pestañas, películas de YouTube, incluso la interfaz gráfica del sistema). Lo curioso es que, después de la primera ejecución del modelo, que es lenta (el modelo está compilado, por lo que es comprensible), el tiempo de ejecución del modelo está en el rango de 1.5-4 ms (medido como se muestra en el código a continuación). Por lo tanto, no debería ser un problema para el navegador.

if (navigator.mediaDevices.getUserMedia) {
    navigator.mediaDevices.getUserMedia({ video: true })
    .then(function (stream) {
        video.srcObject = stream;
    })
    .catch(function (_) {
        console.log("¡Algo salió mal!");
    });
}

let model = await tf.loadGraphModel('model/model.json')
let video = document.querySelector("#videoElement") as HTMLVideoElement;

async function do_inference()
{
  let startTime = performance.now();

  const image = tf.expandDims(tf.browser.fromPixels(video));
  const image_fl32 = tf.cast(image, 'float32');

  let final_pred = tf.tidy(() => 
  {
    return model.predict(image_fl32) as tf.Tensor4D;
  });

  image.dispose();
  image_fl32.dispose();
  final_pred.dispose();
  let total = performance.now() - startTime;
  console.log(total);

  if (running)
  {
    requestAnimationFrame(do_inference);
  }
}

Notas adicionales:

  • El modelo es un modelo de convolución completamente simple. Básicamente, tiene unas pocas capas de convoluciones 3×3 y 5×5. También hice una prueba con un modelo aún más pequeño (2 capas) y presenta los mismos problemas.
  • tfjs se ejecuta utilizando el backend “webgl”. Si se cambia a “wasm”, el tiempo de ejecución es mucho mayor (alrededor de 150-200 ms), pero el video es fluido. En producción, me gustaría utilizar un modelo aún más grande, por lo que no puedo aceptar ese tiempo de ejecución.
  • Lo he probado en una RTX 3060, Ryzen de 32 hilos, 128 GB de RAM. Por lo tanto, la PC no debería ser un problema.
  • Parece que no hay fugas de memoria en el lado de tfjs.
  • El modelo se convierte desde un modelo “tensorflow.keras.Model” utilizando el método “Model.save” y luego utilizando tensorflowjs_converter@3.9 con “–output_format=tfjs_graph_model”.

¿Estoy haciendo algo mal? ¿Hay alguna forma de hacer que el video sea fluido?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según la información proporcionada, parece que el uso intensivo del modelo tfjs está causando una disminución en el rendimiento de la página web. Esto se evidencia en el hecho de que la transmisión de video se ejecuta a 1-2fps y afecta a otras pestañas, películas de YouTube y la interfaz gráfica del sistema.

    Una posible solución es intentar reducir aún más el tamaño del modelo para mejorar el rendimiento. Si esto no es posible, otra solución es intentar utilizar un backend wasm, aunque esto podría resultar en tiempos de ejecución más largos.

    Además, también se puede intentar optimizar el código utilizando tf.tidy() para gestionar la memoria y evitar fugas de memoria. Además, se puede reducir el tamaño del elemento video para disminuir la carga computacional sobre el modelo tfjs.

    Por último, es importante tener en cuenta que puede haber factores externos que podrían afectar el rendimiento, como problemas de compatibilidad del navegador u otros procesos en segundo plano que podrían estar ejecutándose en el ordenador. Por lo tanto, puede ser beneficioso probar la aplicación en diferentes navegadores o dispositivos para ver si el problema de rendimiento persiste.

Comments are closed.