Resolución de problemas de recurrencia de código MVSNet, estado fallido de llamada de cuBlas = problema 13

Introducción

Este artículo registra algunos problemas encontrados al reproducir MVSNet.

El código para reproducir MVSNet recientemente es un artículo de 2018, que utiliza el código de tensorflow-gpu>=1.5

Se recomienda utilizar cuda9.0 y cudnn7.0 en el código fuente, por lo tanto, de acuerdo con las versiones correspondientes de tensorflow y cuda, solo se pueden instalar las versiones 1.5~1.12. Finalmente, se eligió la versión GPU tensorflow con 1.5. instalado.

La versión de CUDA en el servidor es 11.2, por lo que debe instalar un CUDA9.0. Debido a que es un servidor que se usa en conjunto, CUDA9.0 se instala en el directorio personal en lugar del sistema y se puede cambiar más adelante cambiando el entorno. variables Siéntase libre de cambiar la versión de CUDA.

Para instalar varias versiones de CUDA y cuDNN en usuarios no root, consulte el siguiente artículo, un tutorial de nivel muy niñera.

https://blog.csdn.net/hizengbiao/article/details/88625044

Insertar descripción de la imagen aquí

Nota: La versión oficial correspondiente a tensorflow y cuda.

Pequeños cambios de código:

Después de instalar tensorflow, cuda, cudnn y otros paquetes, se informarán muchos errores al ejecutar el código.

Estos errores se deben a que algunos códigos pueden tener algunas diferencias en diferentes versiones. Los nombres de las funciones y los valores de retorno pueden cambiar, por lo que algunos códigos problemáticos deben cambiarse.

1)tf.compat.v1.logging —> tf.logging

# previous
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
# changed
tf.logging.set_verbosity(tf.logging.ERROR)

2)tf.random.shuffle —> tf.random_shuffle

Referencia: https://stackoverflow.com/questions/59017361/attributeerror-module-tensorflow-has-no-attribute-random-shuffle
Pero en este enlace, el problema es justo al revés. La versión 1.x del El código se ejecuta en la versión 2.x de tf.

# previous
indices = tf.random.shuffle(indices)
 # changed
indices = tf.random_shuffle(indices)

3) train.py: después de leer la imagen en train (), la imagen es de cinco dimensiones, pero la entrada de la función per_image_standardization es de cuatro dimensiones, por lo que se realiza una compresión antes de pasar la imagen y luego se obtiene la imagen estandarizada. expanded_dims para expandir la dimensión.

for view in range(0, FLAGS.view_num):
    image = tf.squeeze(tf.slice(images, [0, view, 0, 0, 0], [-1, 1, -1, -1, 3]), axis=1)
    if FLAGS.online_augmentation:
        image = tf.map_fn(online_augmentation, image, back_prop=False)
    # >>> add begin
    image = tf.squeeze(image, axis=0)
    # <<< add end
    
    image = tf.image.per_image_standardization(image)
    
    # >>> add begin
    image = tf.expand_dims(image, 0)
    # <<< add end
    arg_images.append(image)
images = tf.stack(arg_images, axis=1)

4) validar.py: validar_mvsnet(), el mismo problema que en 3) anterior

for view in range(0, FLAGS.view_num):
    image = tf.squeeze(tf.slice(images, [0, view, 0, 0, 0], [-1, 1, -1, -1, 3]), axis=1)
    # >>> add begin
    image = tf.squeeze(image, axis=0)
    # <<< add end
    
    image = tf.image.per_image_standardization(image)
    
    # >>> add begin
    image = tf.expand_dims(image, 0)
    # <<< add end
    normalized_images.append(image)
images = tf.stack(normalized_images, axis=1)

5)photometric_augmentation.py:motion_blur(),将tf.numpy_function—>tf.py_func

Referencia: https://blog.csdn.net/qq_27825451/article/details/106376173

# previous
blurred = tf.numpy_function(_py_motion_blur, [image], tf.float32)
# changed
blurred = tf.py_func(_py_motion_blur, [image], tf.float32)

CUDA y la tarjeta gráfica no son compatibles

Después de modificar el código, ejecute:

CUDA_VISIBLE_DEVICES=2,3 python train.py --regularization '3DCNNs' --train_dtu --max_w 640 --max_h 512 --max_d 128 --dtu_data_root "../data/dtu/training/dtu" --log_folder "../log/dtu" --model_folder "../model/dtu" --num_gpus 2

Se puede ejecutar, pero se informará un error y no es un error en el código. Olvidé tomar una captura de pantalla del error. El error aproximado es:

cuBlas call failed status=13

Busque en Internet soluciones al error que significa que la versión de CUDA no coincide con la tarjeta gráfica:

Referencia:
https://www.zhihu.com/question/424656505
https://tieba.baidu.com/p/7045399988

Hay varias soluciones:
1) Cambiar a una tarjeta gráfica más antigua, es decir, una tarjeta gráfica que admita CUDA9.0.
2) Cambiar el código y reconstruirlo a la versión tensorflow2.x. Esta versión debe adaptarse a lo que La nueva tarjeta gráfica puede admitir CUDA. (No recomendado)
3) Utilice la ventana acoplable

La tarjeta gráfica del servidor que uso es 3090, que solo admite CUDA 11.0 o superior, e incluso 11.0 no es estable. Nuestro código ya es relativamente antiguo y la versión más alta de tensorflow que se puede ejecutar corresponde a CUDA 10.0, por lo que No hay otra manera: cambie al servidor anterior y use 1080ti para experimentos.

También encontré otros métodos en Internet. Para ejecutar el código tf1.5 en 3090, puede usar Docker. No lo he probado. Los amigos que tengan tiempo pueden consultar este artículo para probarlo: https://zhuanlan.zhihu. com/p/341969571

Postprocesamiento de MVSNet: problemas de código al usar Fusibile para generar nubes de puntos

Después de cambiar al servicio anterior, instale CUDA9.0 y tensorflow1.5, y podrá ejecutar el código MVSNet.

MVSNet genera mapas de profundidad de múltiples vistas. Para generar nubes de puntos, se requiere algo de posprocesamiento. El autor utiliza código fusibile para generar nubes de puntos. El código está escrito en C++ y debe compilarse para generar un archivo ejecutable. La ruta del archivo ejecutable se pasa a Depthfusion.py de MVSNet para completar el trabajo de posprocesamiento.

La compilación de código fusibile solo requiere dos requisitos previos: 1) cuda>=6.0; 2) opencv

Acabo de instalar CUDA9.0. Durante el proceso de compilación, se me indicó que se requiere opencv. La instalación de opencv en el servicio anterior se realizó sin problemas y sin errores. Luego, cmake tuvo éxito nuevamente, pero al realizarlo, se me indicó que el código no es compatible con gnu posterior a 6.0. La versión de gcc y g++ en el servidor anterior es 7.4. Debido a que fusibile es el código del documento de 2015, es necesario instalar una versión de gcc y g++ inferior a 6.

En el proceso de instalación de gcc, luché durante mucho tiempo y no pude escribir este artículo en absoluto. Lo escribiré en otro artículo más adelante, en el que presentaré: 1) proceso de instalación de opencv, solución de problemas de errores
2
) proceso de instalación de gcc, solución de problemas de errores
3) proceso de reproducción de código fusibile, resolución de errores
4) solución de problemas de varios problemas menores
El artículo aún no se ha escrito, por lo que colocaré un enlace vacío aquí: instalación de opencv y gcc

Supongo que te gusta

Origin blog.csdn.net/qq_41340996/article/details/121442567
Recomendado
Clasificación