Outils pour utilisateurs

Outils du site


darknet_letters_unload_gpu_ram_in_python_script

Yolo Darknet unload GPU RAM in python script

  • Ajout de la Libération de la RAM GPU à la fin d'une détection en gardant le script python actif.
  • unload network in python script https://github.com/AlexeyAB/darknet/issues/3467
  • Cette modification ne marche qu'avec CUDA. Sur une machine sans CUDA (pour des tests), il ne faut pas modifier darknet.py

Modifications des fichiers

./include/darknet.h

void show_total_time();
 
// ajout serge pour vider la memoire ligne 904
LIB_API void free_network(network net);
 
#ifdef __cplusplus
}
#endif  // __cplusplus
#endif  // DARKNET_API

./src/network.c

// ajout serge pour vider la memoire ligne 1252
void api_free_network(network *net)
{
    int i;
    for (i = 0; i < (*net).n; ++i) {
        free_layer((*net).layers[i]);
    }
    free((*net).layers);
 
    free((*net).seq_scales);
    free((*net).scales);
    free((*net).steps);
    free((*net).seen);
 
#ifdef GPU
    if (gpu_index >= 0) cuda_free((*net).workspace);
    else free((*net).workspace);
    if ((*net).input_state_gpu) cuda_free((*net).input_state_gpu);
    if ((*net).input_pinned_cpu) {   // CPU
        if ((*net).input_pinned_cpu_flag) cudaFreeHost((*net).input_pinned_cpu);
        else free((*net).input_pinned_cpu);
    }
    if (*(*net).input_gpu) cuda_free(*(*net).input_gpu);
    if (*(*net).truth_gpu) cuda_free(*(*net).truth_gpu);
    if ((*net).input_gpu) free((*net).input_gpu);
    if ((*net).truth_gpu) free((*net).truth_gpu);
 
    if (*(*net).input16_gpu) cuda_free(*(*net).input16_gpu);
    if (*(*net).output16_gpu) cuda_free(*(*net).output16_gpu);
    if ((*net).input16_gpu) free((*net).input16_gpu);
    if ((*net).output16_gpu) free((*net).output16_gpu);
    if ((*net).max_input16_size) free((*net).max_input16_size);
    if ((*net).max_output16_size) free((*net).max_output16_size);
#else
    free((*net).workspace);
#endif
}

./src/network.h

void restore_network_recurrent_state(network net);
 
// ajout serge pour vider la memoire ligne 173
void api_free_network(network *net);
 
#ifdef __cplusplus
}
#endif
#endif

./darknet.py

...
...
predict_image_letterbox.restype = POINTER(c_float)
 
# ajout serge pour vider la memoire ligne 210
free_network = lib.api_free_network
free_network.argtypes = [c_void_p]
 
def array_to_image(arr):
    import numpy as np
 
    :

Dans votre script personnel qui appelle darknet.py

Exemple: voir le fichier complet play_letters.py sur GitHub

class YOLO:
    ...
    ...
    def set_darknet(self):
        ...
        ...
        # Définition du network
        self.netMain = darknet.load_net_custom(configPath.encode("ascii"),
                                                weightPath.encode("ascii"),
                                                0,
                                                1)

En fin de boucle opencv:

            # Echap pour finir le script python
            if cv2.waitKey(1) == 27:
                os._exit(0)
 
        cv2.destroyAllWindows()
 
        # Libération de la mémoire GPU
        self.free_network(self.netMain)

Fichiers modifiés

Les fichiers modifiés le 29/11/2019 sont dans le dossier issue_3467

Compilation

Voir Installation de YOLO Darknet

Dans le dossier darknet,

make clean
make -j8

Copier les fichiers darknet.py et libdarknet.so dans le dossier avec votre fichier python de détection.

darknet_letters_unload_gpu_ram_in_python_script.txt · Dernière modification: 2020/09/04 18:09 par serge